ServeManagementController.py 80 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import calendar
  4. import datetime
  5. import hashlib
  6. import time
  7. import uuid
  8. import paypalrestsdk
  9. import xlrd
  10. import xlwt
  11. from django.db import transaction, connection
  12. from django.db.models import F, Sum, Count, Q
  13. from django.http import HttpResponse, StreamingHttpResponse
  14. from django.utils.encoding import escape_uri_path
  15. from django.views.generic.base import View
  16. from Ansjer.config import PAYPAL_CRD
  17. from Controller.Cron.CronTaskController import CronUpdateDataView
  18. from Model.models import VodBucketModel, CDKcontextModel, Store_Meal, Order_Model, \
  19. UID_Bucket, ExperienceContextModel, Lang, CloudLogModel, UidSetModel, Unused_Uid_Meal, \
  20. Device_Info, DeviceTypeModel, UnicomComboOrderInfo, AiService
  21. from Object.ResponseObject import ResponseObject
  22. from Object.TokenObject import TokenObject
  23. from Service.CommonService import CommonService
  24. class serveManagement(View):
  25. def get(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. operation = kwargs.get('operation')
  28. return self.validation(request.GET, request, operation)
  29. def post(self, request, *args, **kwargs):
  30. request.encoding = 'utf-8'
  31. operation = kwargs.get('operation')
  32. return self.validation(request.POST, request, operation)
  33. def validation(self, request_dict, request, operation):
  34. language = request_dict.get('language', 'en')
  35. response = ResponseObject(language, 'pc')
  36. if operation == 'exportCloudUserList': # 导出云存用户信息
  37. return self.exportCloudUserList(request_dict, response)
  38. elif operation == 'getCloudDataList':
  39. return self.getCloudDataList(request_dict, response)
  40. elif operation == 'vodOrderReconcile':
  41. return self.vodOrderReconcile(request, request_dict, response)
  42. elif operation == 'cloudDataExport': # 导出流失预警
  43. return self.cloudDataExport(request, response)
  44. else:
  45. tko = TokenObject(
  46. request.META.get('HTTP_AUTHORIZATION'),
  47. returntpye='pc')
  48. if tko.code != 0:
  49. return response.json(tko.code)
  50. response.lang = tko.lang
  51. userID = tko.userID
  52. if operation == 'getVodBucketList':
  53. return self.getVodBucketList(userID, request_dict, response)
  54. elif operation == 'addOrEditVodBucket':
  55. return self.addOrEditVodBucket(userID, request_dict, response)
  56. elif operation == 'deleteVodBucket':
  57. return self.deleteVodBucket(userID, request_dict, response)
  58. elif operation == 'getStoreMealList':
  59. return self.getStoreMealList(userID, request_dict, response)
  60. elif operation == 'addOrEditStoreMeal':
  61. return self.addOrEditStoreMeal(userID, request_dict, response)
  62. elif operation == 'deleteStoreMeal':
  63. return self.deleteStoreMeal(userID, request_dict, response)
  64. elif operation == 'getStoreMealLanguage':
  65. return self.getStoreMealLanguage(
  66. userID, request_dict, response)
  67. elif operation == 'addOrEditStoreMealLanguage':
  68. return self.addOrEditStoreMealLanguage(
  69. userID, request_dict, response)
  70. elif operation == 'deleteStoreMealLanguage':
  71. return self.deleteStoreMealLanguage(
  72. userID, request_dict, response)
  73. elif operation == 'getCdkList':
  74. return self.getCdkList(userID, request_dict, response)
  75. elif operation == 'createCdk':
  76. return self.createCdk(request_dict, response)
  77. elif operation == 'getVodStoreMeal':
  78. return self.getVodStoreMeal(response)
  79. elif operation == 'editExpress':
  80. return self.editExpress(request_dict, response)
  81. elif operation == 'deleteCdk':
  82. return self.deleteCdk(request_dict, response)
  83. elif operation == 'downloadCDK':
  84. return self.downloadCDK(request_dict, response)
  85. elif operation == 'getDeviceOrderList':
  86. return self.getDeviceOrderList(request_dict, response)
  87. elif operation == 'deleteDeviceOrder':
  88. return self.deleteDeviceOrder(userID, request_dict, response)
  89. elif operation == 'getDevicePackageList': # 云存设备套餐
  90. return self.getDevicePackageList(request_dict, response)
  91. elif operation == 'deleteDevicePackage':
  92. return self.deleteDevicePackage(userID, request_dict, response)
  93. elif operation == 'experiencereset': # 重置设备云存体验
  94. return self.do_experience_reset(request_dict, userID, response)
  95. elif operation == 'getCloudUserList': # 获取云存用户信息
  96. return self.getCloudUserList(request_dict, response)
  97. elif operation == 'deviceAttritionAlert': # 流失预警
  98. return self.deviceAttritionAlert(request_dict, response, request)
  99. elif operation == 'deactivationPackage': # 停用套餐
  100. return self.deactivationPackage(request_dict, response)
  101. elif operation == 'paypal-cycle-cancel': # 取消循环扣款
  102. return self.paypal_cycle_cancel(request_dict, response)
  103. else:
  104. return response.json(404)
  105. @staticmethod
  106. def paypal_cycle_cancel(request_dict, response):
  107. """
  108. 取消云存循环扣款
  109. """
  110. order_id = request_dict.get('orderID', None)
  111. if not order_id:
  112. return response.json(444)
  113. order_qs = Order_Model.objects.filter(orderID=order_id)
  114. order_qs = order_qs.filter(~Q(agreement_id='')).values("agreement_id")
  115. if not order_qs.exists():
  116. return response.json(800)
  117. paypalrestsdk.configure(PAYPAL_CRD)
  118. agreement_id = order_qs[0]['agreement_id']
  119. try:
  120. now_time = int(time.time())
  121. billing_agreement = paypalrestsdk.BillingAgreement.find(agreement_id)
  122. if billing_agreement.state != 'Active':
  123. Order_Model.objects.filter(agreement_id=agreement_id).update(agreement_id='', updTime=now_time)
  124. return response.json(0)
  125. cancel_note = {"note": "Canceling the agreement"}
  126. if billing_agreement.cancel(cancel_note):
  127. Order_Model.objects.filter(agreement_id=agreement_id).update(agreement_id='', updTime=now_time)
  128. return response.json(0)
  129. else:
  130. return response.json(10052)
  131. except Exception as e:
  132. print(repr(e))
  133. return response.json(10052)
  134. def getVodBucketList(self, userID, request_dict, response):
  135. # 查询存储桶数据
  136. print('request_dict: ', request_dict)
  137. isSelect = request_dict.get('isSelect', None)
  138. if isSelect:
  139. # 获取全部数据作为存储桶选项
  140. vod_bucket_qs = VodBucketModel.objects.all().values('id', 'bucket')
  141. return response.json(
  142. 0, {'list': CommonService.qs_to_list(vod_bucket_qs)})
  143. bucket = request_dict.get('bucket', None)
  144. mold = request_dict.get('mold', None)
  145. is_free = request_dict.get('is_free', None)
  146. pageNo = request_dict.get('pageNo', None)
  147. pageSize = request_dict.get('pageSize', None)
  148. if not all([pageNo, pageSize]):
  149. return response.json(444)
  150. page = int(pageNo)
  151. line = int(pageSize)
  152. try:
  153. if bucket or mold or is_free: # 条件查询
  154. if bucket:
  155. vod_bucket_qs = VodBucketModel.objects.filter(
  156. bucket=bucket)
  157. elif mold:
  158. vod_bucket_qs = VodBucketModel.objects.filter(
  159. mold=int(mold))
  160. elif is_free:
  161. vod_bucket_qs = VodBucketModel.objects.filter(
  162. is_free=int(is_free))
  163. else: # 查询全部
  164. vod_bucket_qs = VodBucketModel.objects.filter().all()
  165. total = len(vod_bucket_qs)
  166. vod_buckets = vod_bucket_qs[(page - 1) * line:page * line]
  167. vod_bucket_list = []
  168. for vod_bucket in vod_buckets:
  169. vod_bucket_list.append({
  170. 'bucketID': vod_bucket.id,
  171. 'bucket': vod_bucket.bucket,
  172. 'content': vod_bucket.content,
  173. 'mold': vod_bucket.mold,
  174. 'area': vod_bucket.area,
  175. 'region': vod_bucket.region,
  176. 'endpoint': vod_bucket.endpoint,
  177. 'is_free': vod_bucket.is_free,
  178. 'storeDay': vod_bucket.storeDay,
  179. 'region_id': vod_bucket.region_id,
  180. 'addTime': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(vod_bucket.addTime)),
  181. 'updTime': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(vod_bucket.updTime)),
  182. })
  183. print('vod_bucket_list: ', vod_bucket_list)
  184. return response.json(
  185. 0, {'list': vod_bucket_list, 'total': total})
  186. except Exception as e:
  187. print(e)
  188. return response.json(500, repr(e))
  189. def addOrEditVodBucket(self, userID, request_dict, response):
  190. # 添加/编辑存储桶
  191. print('request_dict: ', request_dict)
  192. bucketID = request_dict.get('bucketID', None)
  193. bucket = request_dict.get('bucket', '').strip() # 移除字符串头尾的空格
  194. content = request_dict.get('content', '').strip()
  195. mold = int(request_dict.get('mold', 1))
  196. area = request_dict.get('area', '').strip()
  197. region = request_dict.get('region', '').strip()
  198. endpoint = request_dict.get('endpoint', '').strip()
  199. is_free = int(request_dict.get('is_free', 0))
  200. storeDay = int(request_dict.get('storeDay', 0))
  201. region_id = int(request_dict.get('region_id', 1))
  202. isEdit = request_dict.get('isEdit', None)
  203. if not all([bucket, content, area, region, endpoint]):
  204. return response.json(444)
  205. try:
  206. now_time = int(time.time())
  207. vod_bucket_data = {
  208. 'bucket': bucket,
  209. 'content': content,
  210. 'mold': mold,
  211. 'area': area,
  212. 'region': region,
  213. 'endpoint': endpoint,
  214. 'is_free': is_free,
  215. 'storeDay': storeDay,
  216. 'region_id': region_id,
  217. }
  218. if isEdit:
  219. if not bucketID:
  220. return response.json(444)
  221. vod_bucket_data['updTime'] = now_time
  222. VodBucketModel.objects.filter(
  223. id=bucketID).update(
  224. **vod_bucket_data)
  225. else:
  226. vod_bucket_data['addTime'] = now_time
  227. VodBucketModel.objects.create(**vod_bucket_data)
  228. return response.json(0)
  229. except Exception as e:
  230. print(e)
  231. return response.json(500, repr(e))
  232. def deleteVodBucket(self, userID, request_dict, response):
  233. # 删除存储桶
  234. print('request_dict: ', request_dict)
  235. bucketID = request_dict.get('bucketID', None)
  236. if not bucketID:
  237. return response.json(444)
  238. try:
  239. VodBucketModel.objects.filter(id=bucketID).delete()
  240. return response.json(0)
  241. except Exception as e:
  242. print(e)
  243. return response.json(500, repr(e))
  244. def getStoreMealList(self, userID, request_dict, response):
  245. # 获取云存套餐信息数据
  246. print('request_dict: ', request_dict)
  247. isSelect = request_dict.get('isSelect', None)
  248. if isSelect:
  249. # 获取套餐ID作为选项
  250. store_meal_qs = Store_Meal.objects.all().values('id', 'bucket__bucket')
  251. return response.json(
  252. 0, {'list': CommonService.qs_to_list(store_meal_qs)})
  253. bucket = request_dict.get('bucket', None)
  254. pageNo = request_dict.get('pageNo', None)
  255. pageSize = request_dict.get('pageSize', None)
  256. if not all([pageNo, pageSize]):
  257. return response.json(444)
  258. page = int(pageNo)
  259. line = int(pageSize)
  260. try:
  261. if bucket: # 条件查询
  262. bucket_id = VodBucketModel.objects.filter(
  263. bucket=bucket).values('id')[0]['id']
  264. store_meal_qs = Store_Meal.objects.filter(
  265. bucket_id=bucket_id)
  266. else: # 查询全部
  267. store_meal_qs = Store_Meal.objects.filter()
  268. store_meal_val = store_meal_qs.values(
  269. 'id',
  270. 'bucket__bucket',
  271. 'day',
  272. 'expire',
  273. 'commodity_type',
  274. 'commodity_code',
  275. 'is_discounts',
  276. 'discount_price',
  277. 'virtual_price',
  278. 'price',
  279. 'currency',
  280. 'symbol',
  281. 'is_show',
  282. 'add_time',
  283. 'update_time')
  284. total = len(store_meal_val)
  285. store_meals = store_meal_val[(page - 1) * line:page * line]
  286. store_meal_list = []
  287. for store_meal in store_meals:
  288. # 获取支付方式列表
  289. pay_type_list = [
  290. pay_type['id'] for pay_type in Store_Meal.objects.get(
  291. id=store_meal['id']).pay_type.values('id')]
  292. # 组织响应数据
  293. store_meal_list.append({
  294. 'storeMealID': store_meal['id'],
  295. 'bucket': store_meal['bucket__bucket'],
  296. 'day': store_meal['day'],
  297. 'expire': store_meal['expire'],
  298. 'commodity_type': store_meal['commodity_type'],
  299. 'pay_type': pay_type_list,
  300. 'commodity_code': store_meal['commodity_code'],
  301. 'is_discounts': store_meal['is_discounts'],
  302. 'discount_price': store_meal['discount_price'],
  303. 'virtual_price': store_meal['virtual_price'],
  304. 'price': store_meal['price'],
  305. 'currency': store_meal['currency'],
  306. 'symbol': store_meal['symbol'],
  307. 'is_show': store_meal['is_show'],
  308. 'addTime': store_meal['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  309. 'updTime': store_meal['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  310. })
  311. print('store_meal_list: ', store_meal_list)
  312. return response.json(
  313. 0, {'list': store_meal_list, 'total': total})
  314. except Exception as e:
  315. print(e)
  316. return response.json(500, repr(e))
  317. def addOrEditStoreMeal(self, userID, request_dict, response):
  318. # 添加/编辑套餐
  319. print('request_dict: ', request_dict)
  320. storeMealID = request_dict.get('storeMealID', None)
  321. bucket = request_dict.get('bucket', '')
  322. day = int(request_dict.get('day', 0))
  323. expire = int(request_dict.get('expire', 0))
  324. commodity_type = int(request_dict.get('commodity_type', 0))
  325. pay_type = request_dict.get(
  326. 'pay_type', '')[
  327. 1:-1].split(',') # '[1,2]' -> ['1','2']
  328. commodity_code = request_dict.get('commodity_code', '')
  329. is_discounts = int(request_dict.get('is_discounts', 0))
  330. discount_price = request_dict.get('discount_price', '')
  331. virtual_price = request_dict.get('virtual_price', '')
  332. price = request_dict.get('price', '')
  333. currency = request_dict.get('currency', '')
  334. symbol = request_dict.get('symbol', '')
  335. is_show = int(request_dict.get('is_show', 0))
  336. isEdit = request_dict.get('isEdit', None)
  337. if not all([bucket, pay_type, price, currency, symbol]):
  338. return response.json(444)
  339. try:
  340. bucket_id = VodBucketModel.objects.filter(
  341. bucket=bucket).values('id')[0]['id']
  342. store_meal_data = {
  343. 'bucket_id': bucket_id,
  344. 'day': day,
  345. 'expire': expire,
  346. 'commodity_type': commodity_type,
  347. 'commodity_code': commodity_code,
  348. 'is_discounts': is_discounts,
  349. 'discount_price': discount_price,
  350. 'virtual_price': virtual_price,
  351. 'price': price,
  352. 'currency': currency,
  353. 'symbol': symbol,
  354. 'is_show': is_show,
  355. }
  356. if isEdit:
  357. if not storeMealID:
  358. return response.json(444)
  359. Store_Meal.objects.filter(
  360. id=storeMealID).update(
  361. **store_meal_data)
  362. Store_Meal.objects.get(id=storeMealID).pay_type.set(pay_type)
  363. else:
  364. Store_Meal.objects.create(
  365. **store_meal_data).pay_type.set(pay_type)
  366. return response.json(0)
  367. except Exception as e:
  368. print(e)
  369. return response.json(500, repr(e))
  370. def deleteStoreMeal(self, userID, request_dict, response):
  371. # 删除套餐信息
  372. print('request_dict: ', request_dict)
  373. storeMealID = request_dict.get('storeMealID', None)
  374. if not storeMealID:
  375. return response.json(444)
  376. try:
  377. Store_Meal.objects.filter(id=storeMealID).delete()
  378. return response.json(0)
  379. except Exception as e:
  380. print(e)
  381. return response.json(500, repr(e))
  382. def getStoreMealLanguage(self, userID, request_dict, response):
  383. # 获取套餐语言
  384. print('request_dict: ', request_dict)
  385. storeMealID = request_dict.get('storeMealID', None)
  386. pageNo = request_dict.get('pageNo', None)
  387. pageSize = request_dict.get('pageSize', None)
  388. if not all([pageNo, pageSize]):
  389. return response.json(444)
  390. page = int(pageNo)
  391. line = int(pageSize)
  392. try:
  393. if storeMealID: # 条件查询
  394. store_meal_lang_qs = Store_Meal.objects.filter(id=storeMealID)
  395. else: # 查询全部
  396. store_meal_lang_qs = Store_Meal.objects.filter(
  397. lang__isnull=False)
  398. store_meal_lang_val = store_meal_lang_qs.values(
  399. 'id',
  400. 'lang__id',
  401. 'lang__lang',
  402. 'lang__title',
  403. 'lang__content',
  404. 'lang__discount_content',
  405. )
  406. total = len(store_meal_lang_val)
  407. store_meal_langs = store_meal_lang_val[(
  408. page - 1) * line:page * line]
  409. store_meal_lang_list = []
  410. for store_meal_lang in store_meal_langs:
  411. store_meal_lang_list.append({
  412. 'storeMealID': store_meal_lang['id'],
  413. 'langID': store_meal_lang['lang__id'],
  414. 'lang': store_meal_lang['lang__lang'],
  415. 'title': store_meal_lang['lang__title'],
  416. 'content': store_meal_lang['lang__content'],
  417. 'discountContent': store_meal_lang['lang__discount_content'],
  418. })
  419. print('store_meal_lang_list: ', store_meal_lang_list)
  420. return response.json(
  421. 0, {'list': store_meal_lang_list, 'total': total})
  422. except Exception as e:
  423. print(e)
  424. return response.json(500, repr(e))
  425. def addOrEditStoreMealLanguage(self, userID, request_dict, response):
  426. # 添加/编辑套餐语言
  427. print('request_dict: ', request_dict)
  428. storeMealID = request_dict.get('storeMealID', None)
  429. lang = request_dict.get('lang', None)
  430. title = request_dict.get('title', None)
  431. content = request_dict.get('content', None)
  432. discount_content = request_dict.get('discount_content', '')
  433. isEdit = request_dict.get('isEdit', None)
  434. if not all([storeMealID, lang, title, content]):
  435. return response.json(444)
  436. try:
  437. # 查询套餐是否存在
  438. store_meal_qs = Store_Meal.objects.get(id=storeMealID)
  439. if not store_meal_qs:
  440. return response.json(173)
  441. if isEdit: # 编辑
  442. langID = request_dict.get('langID', None)
  443. if not langID:
  444. return response.json(444)
  445. Lang.objects.filter(
  446. id=langID).update(
  447. lang=lang,
  448. title=title,
  449. content=content,
  450. discount_content=discount_content)
  451. else: # 添加
  452. lang_obj = Lang.objects.filter(
  453. lang=lang,
  454. title=title,
  455. content=content,
  456. discount_content=discount_content)
  457. if not lang_obj.exists():
  458. # 数据不存在,lang表创建数据
  459. Lang.objects.create(
  460. lang=lang,
  461. title=title,
  462. content=content,
  463. discount_content=discount_content)
  464. lang_obj = Lang.objects.filter(
  465. lang=lang,
  466. title=title,
  467. content=content,
  468. discount_content=discount_content)
  469. store_meal_qs.lang.add(*lang_obj) # store_meal表添加语言数据
  470. return response.json(0)
  471. except Exception as e:
  472. print(e)
  473. return response.json(500, repr(e))
  474. def deleteStoreMealLanguage(self, userID, request_dict, response):
  475. # 删除套餐语言
  476. storeMealID = request_dict.get('storeMealID', None)
  477. langID = request_dict.get('langID', None)
  478. if not all([storeMealID, langID]):
  479. return response.json(444)
  480. try:
  481. storeMeal_qs = Store_Meal.objects.get(id=storeMealID)
  482. if not storeMeal_qs:
  483. return response.json(173)
  484. lang_qs = Lang.objects.filter(id=langID)
  485. storeMeal_qs.lang.remove(*lang_qs)
  486. return response.json(0)
  487. except Exception as e:
  488. print(e)
  489. return response.json(500, repr(e))
  490. def getCdkList(self, userID, request_dict, response):
  491. # 获取激活码列表
  492. pageNo = request_dict.get('pageNo', None)
  493. pageSize = request_dict.get('pageSize', None)
  494. cdk = request_dict.get('cdk', None)
  495. order = request_dict.get('order', None)
  496. is_activate = request_dict.get('is_activate', None)
  497. mold = request_dict.get('mold', None)
  498. lang = request_dict.get('lang', 'cn')
  499. if not all([pageNo, pageSize]):
  500. return response.json(444)
  501. page = int(pageNo)
  502. line = int(pageSize)
  503. try:
  504. if cdk:
  505. searchVal = cdk.strip()
  506. if order:
  507. searchVal = order.strip()
  508. if is_activate:
  509. searchVal = is_activate.strip()
  510. cdk_qs = CDKcontextModel.objects.filter().all()
  511. if cdk:
  512. cdk_qs = cdk_qs.filter(cdk__contains=searchVal)
  513. if order:
  514. cdk_qs = cdk_qs.filter(order__contains=searchVal)
  515. if is_activate:
  516. cdk_qs = cdk_qs.filter(is_activate=searchVal)
  517. if mold:
  518. cdk_qs = cdk_qs.filter(rank__bucket__mold=mold)
  519. cdk_qs = cdk_qs.filter(rank__lang__lang=lang)
  520. cdk_qs = cdk_qs.annotate(rank__title=F('rank__lang__title'))
  521. cdk_qs = cdk_qs.values(
  522. 'id',
  523. 'cdk',
  524. 'create_time',
  525. 'valid_time',
  526. 'is_activate',
  527. 'is_down',
  528. 'rank__id',
  529. 'rank__title',
  530. 'order',
  531. 'create_time',
  532. 'rank__bucket__mold')
  533. cdk_qs = cdk_qs.order_by('-create_time') # 根据CDK创建时间降序排序
  534. count = cdk_qs.count()
  535. cdk_qs = cdk_qs[(page - 1) * line:page * line]
  536. return response.json(
  537. 0, {'list': list(cdk_qs), 'total': count})
  538. except Exception as e:
  539. print(e)
  540. return response.json(500, repr(e))
  541. def editExpress(self, request_dict, response):
  542. order_id = request_dict.get('orderID', None)
  543. express_id = request_dict.get('express_id', None)
  544. if not all([order_id, express_id]):
  545. return response.json(444, {'error param': 'orderID or express_id'})
  546. try:
  547. CDKcontextModel.objects.filter(order=order_id).update(express_id=express_id)
  548. return response.json(0)
  549. except Exception as e:
  550. return response.json(500, repr(e))
  551. def getVodStoreMeal(self, response):
  552. try:
  553. store_meal = Store_Meal.objects.filter(Q(is_show=0), ~Q(commodity_code='paypal_cycle'),
  554. Q(lang__lang='cn')).values('id', 'lang__title', 'lang__content')
  555. if not store_meal.exists():
  556. return response.json(0, [])
  557. store_meal_list = []
  558. for item in store_meal:
  559. store_meal_list.append({'id': item['id'], 'title': item['lang__title'] + '--' + item['lang__content']})
  560. return response.json(0, store_meal_list)
  561. except Exception as e:
  562. return response.json(500, repr(e))
  563. def createCdk(self, request_dict, response):
  564. cdk_num = request_dict.get("cdknum", None)
  565. mold = request_dict.get('mold', None)
  566. order = request_dict.get('order', None)
  567. rank = request_dict.get('rank', None)
  568. if not all([cdk_num, rank]):
  569. return response.json(444, {'error param': 'cdknum or rank'})
  570. store_meal = Store_Meal.objects.filter(id=rank)
  571. # sm_qs = Store_Meal.objects.filter(
  572. # pay_type__payment='cdk_pay', bucket__mold=mold, is_show=0)
  573. if not store_meal.exists():
  574. return response.json(173)
  575. cdk_list = []
  576. for i in range(int(cdk_num)):
  577. now_time = int(time.time())
  578. cdk = hashlib.md5((str(uuid.uuid1()) +
  579. str(now_time)).encode('utf-8')).hexdigest()
  580. cdk_model = CDKcontextModel(
  581. cdk=cdk,
  582. create_time=now_time,
  583. valid_time=0,
  584. is_activate=0,
  585. is_down=0,
  586. rank_id=rank,
  587. order=order,
  588. )
  589. cdk_list.append(cdk_model)
  590. try:
  591. CDKcontextModel.objects.bulk_create(cdk_list)
  592. except Exception as e:
  593. return response.json(404, repr(e))
  594. else:
  595. return response.json(0)
  596. def deleteCdk(self, request_dict, response):
  597. cdk_id = request_dict.get("id", None)
  598. try:
  599. CDKcontextModel.objects.get(id=cdk_id).delete()
  600. return response.json(0)
  601. except Exception as e:
  602. return response.json(500, repr(e))
  603. def downloadCDK(self, request_dict, response):
  604. region = request_dict.get('region', None)
  605. content = ''
  606. if region == 'cn':
  607. # 下载国内未使用激活码
  608. content += '激活码(国内)\n'
  609. cdk_inactivate_qs = CDKcontextModel.objects.filter(is_down=0, is_activate=0, rank__bucket__mold=0,
  610. rank__is_show=0).values('cdk')
  611. else:
  612. # 下载国外未使用激活码
  613. content += '激活码(国外)\n'
  614. cdk_inactivate_qs = CDKcontextModel.objects.filter(is_down=0, is_activate=0, rank__bucket__mold=1,
  615. rank__is_show=0).values('cdk')
  616. for cdk_inactivate in cdk_inactivate_qs:
  617. content += cdk_inactivate['cdk'] + '\n'
  618. # print(content)
  619. cdk_inactivate_qs.update(is_down=1)
  620. response = StreamingHttpResponse(content)
  621. response['Content-Type'] = 'application/octet-stream'
  622. response['Content-Disposition'] = 'attachment;filename="CDK.txt"'
  623. return response
  624. def getDeviceOrderList(self, request_dict, response):
  625. print('request_dict: ', request_dict)
  626. pageNo = request_dict.get('pageNo', None)
  627. pageSize = request_dict.get('pageSize', None)
  628. uid = request_dict.get('uid', None)
  629. channel = request_dict.get('channel', None)
  630. orderID = request_dict.get('orderID', None)
  631. userID__username = request_dict.get('userID__username', None)
  632. currency = request_dict.get('currency', None)
  633. payType = request_dict.get('payType', None)
  634. status = request_dict.get('status', None)
  635. timeRange = request_dict.getlist('timeRange[]', None)
  636. orderType = request_dict.get('orderType', None)
  637. serialNumber = request_dict.get('serialNumber', None)
  638. if not all([pageNo, pageSize]):
  639. return response.json(444)
  640. page = int(pageNo)
  641. line = int(pageSize)
  642. try:
  643. omqs = Order_Model.objects.all()
  644. # 筛选指定设备id的订单
  645. if uid:
  646. omqs = omqs.filter(UID=uid)
  647. if channel:
  648. omqs = omqs.filter(channel=channel)
  649. if orderID:
  650. omqs = omqs.filter(orderID=orderID)
  651. if userID__username:
  652. omqs = omqs.filter(userID__username=userID__username)
  653. if currency:
  654. omqs = omqs.filter(currency=currency)
  655. if payType:
  656. omqs = omqs.filter(payType=payType)
  657. if status:
  658. omqs = omqs.filter(status=status)
  659. if orderType:
  660. omqs = omqs.filter(order_type=int(orderType))
  661. if serialNumber:
  662. device_info_qs = Device_Info.objects.filter(serial_number=serialNumber).values('UID')
  663. uid = device_info_qs[0]['UID'] if device_info_qs.exists() else 'N/A'
  664. omqs = omqs.filter(UID=uid)
  665. if timeRange:
  666. startTime, endTime = int(
  667. timeRange[0][:-3]), int(timeRange[1][:-3])
  668. omqs = omqs.filter(
  669. addTime__gte=startTime,
  670. addTime__lte=endTime)
  671. if not omqs.exists():
  672. return response.json(0, [])
  673. order_list = []
  674. count = omqs.count()
  675. order_ql = omqs.values("orderID", "UID", "userID__username", "userID__NickName", "channel", "desc", "price",
  676. "refunded_amount", "currency", "addTime", "updTime", "paypal", "payType",
  677. "rank__day", "rank__price", "status", "order_type", "paymentID", "trade_no")
  678. order_ql = order_ql.order_by('-addTime') # 根据CDK创建时间降序排序
  679. order_ql = order_ql[(page - 1) * line:page * line]
  680. for order in order_ql:
  681. data = {
  682. 'orderID': order['orderID'],
  683. 'UID': order['UID'],
  684. 'userID__username': order['userID__username'],
  685. 'userID__NickName': order['userID__NickName'],
  686. 'channel': order['channel'],
  687. 'desc': order['desc'],
  688. 'price': order['price'],
  689. 'refunded_amount': order['refunded_amount'],
  690. 'currency': order['currency'],
  691. 'addTime': order['addTime'],
  692. 'updTime': order['updTime'],
  693. 'paypal': order['paypal'],
  694. 'payType': order['payType'],
  695. 'rank__day': order['rank__day'],
  696. 'rank__price': order['rank__price'],
  697. 'status': order['status'],
  698. 'order_type': order['order_type'],
  699. }
  700. # 订单显示(或不显示)停用/退款功能
  701. if order['order_type'] == 0: # 云存
  702. uid_bucket = UID_Bucket.objects.filter(uid=order['UID']).values('use_status')
  703. user_status = uid_bucket[0]['use_status'] if uid_bucket.exists() else ''
  704. if user_status != '':
  705. data['user_status'] = user_status
  706. else:
  707. data['user_status'] = 2
  708. elif order['order_type'] == 1: # ai
  709. ai_service_qs = AiService.objects.filter(
  710. Q(orders_id=order['orderID']) & ~Q(use_status=2))
  711. if ai_service_qs.exists():
  712. data['user_status'] = 1
  713. else:
  714. data['user_status'] = 2
  715. elif order['order_type'] == 2: # 联通4G
  716. unicom_combor_order_qs = UnicomComboOrderInfo.objects.filter(
  717. Q(order_id=order['orderID']) & ~Q(status=2))
  718. if unicom_combor_order_qs.exists():
  719. data['user_status'] = 1
  720. else:
  721. data['user_status'] = 2
  722. # 添加序列号
  723. data['serial_number'] = 'N/A'
  724. device_info_qs = Device_Info.objects.filter(UID=order['UID']).values('serial_number')
  725. if device_info_qs.exists():
  726. data['serial_number'] = device_info_qs[0]['serial_number'] if device_info_qs[0][
  727. 'serial_number'] else 'N/A'
  728. # 添加PayPal交易号字段
  729. data['trade_no'] = 'N/A'
  730. if data['payType'] == 1:
  731. data['trade_no'] = order['trade_no'] if order['trade_no'] else 'N/A'
  732. data['express_id'] = ''
  733. if data['payType'] == 11:
  734. cdk_context_qs = CDKcontextModel.objects.filter(order=data['orderID']).values('express_id')
  735. if cdk_context_qs.exists():
  736. data['express_id'] = cdk_context_qs[0]['express_id']
  737. order_list.append(data)
  738. return response.json(
  739. 0, {'list': order_list, 'total': count})
  740. except Exception as e:
  741. print(e)
  742. return response.json(500, repr(e))
  743. def vodOrderReconcile(self, request, request_dict, response):
  744. file = request.FILES.get('file', None)
  745. if not all([file]):
  746. return response.json(444, {'error param': 'file'})
  747. try:
  748. rd_book = xlrd.open_workbook(filename=None, file_contents=file.read())
  749. rd_sheet = rd_book.sheet_by_index(0)
  750. date = rd_sheet.cell_value(1, 0)
  751. month = int(date.split('/')[0])
  752. year = int(date.split('/')[2])
  753. last_day = calendar.monthrange(year, month)[1]
  754. start_time = datetime.datetime(year, month, 1)
  755. end_time = datetime.datetime(year, month, last_day) + datetime.timedelta(hours=24)
  756. start_time = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
  757. end_time = CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S'))
  758. wt_book = xlwt.Workbook(encoding='utf-8')
  759. wt_sheet = wt_book.add_sheet('对账结果', cell_overwrite_ok=True)
  760. row_start = 0
  761. # 第一部分表格填写
  762. first_header = ['支付类型', '销售总金额', '销售总数量', '退款总额', '退款总数量', '应收金额', '平台手续费', '账务实收', '金额相差']
  763. for index, content in enumerate(first_header):
  764. wt_sheet.write(row_start, index, content)
  765. row_start += 1
  766. all_order_qs = Order_Model.objects.filter(addTime__gte=start_time, addTime__lt=end_time,
  767. status__in=[1, 5, 6])
  768. trade_no_list = []
  769. paid_order_qs = all_order_qs.filter(status=1)
  770. for i in paid_order_qs:
  771. if i.trade_no not in rd_sheet.col_values(9, 1):
  772. trade_no_list.append(i.trade_no)
  773. # 已付款订单
  774. paid = all_order_qs.filter(payType=1, status=1).aggregate(total=Sum('price'),
  775. count=Count('UID'))
  776. paid_total = paid['total'] if paid['total'] else 0
  777. paid_count = paid['count'] if paid['count'] else 0
  778. # 全额退款订单
  779. refund = all_order_qs.filter(payType=1, status__in=[5, 6]).aggregate(total=Sum('refunded_amount'),
  780. count=Count('UID'))
  781. refund_total = refund['total'] if refund['total'] else 0
  782. refund_count = refund['count'] if refund['count'] else 0
  783. wt_sheet.write(row_start, 0, 'PayPal')
  784. wt_sheet.write(row_start, 1, paid_total + refund_total)
  785. wt_sheet.write(row_start, 2, paid_count + refund_count)
  786. wt_sheet.write(row_start, 3, refund_total)
  787. wt_sheet.write(row_start, 4, refund_count)
  788. wt_sheet.write(row_start, 5, paid_total)
  789. wt_sheet.write(row_start, 8, label=xlwt.Formula('f{row}-h{row}+g{row}'.format(row=row_start + 1)))
  790. row_start += 1
  791. # 第二部分表格填写
  792. row_start += 2
  793. paypal_money = 0
  794. fee_money = 0
  795. for row in range(rd_sheet.nrows):
  796. if row == 0:
  797. wt_sheet.write(row_start, 0, '是否匹配账单')
  798. for col in range(rd_sheet.ncols):
  799. value = rd_sheet.cell_value(row, col)
  800. temp_col = col + 1
  801. wt_sheet.write(row_start, temp_col, str(value))
  802. row_start += 1
  803. continue
  804. if rd_sheet.cell_value(row, 0) == '合计':
  805. break
  806. paypal_money += rd_sheet.cell_value(row, 7)
  807. fee_money += rd_sheet.cell_value(row, 6)
  808. transaction_id = rd_sheet.cell_value(row, 9)
  809. order_qs = all_order_qs.filter(trade_no=transaction_id)
  810. if not order_qs.exists():
  811. col_value_list = rd_sheet.row_values(row)
  812. col_value_list.insert(0, '否')
  813. for index, value in enumerate(col_value_list):
  814. wt_sheet.write(row_start, index, str(value))
  815. row_start += 1
  816. # 第三部分表格填写
  817. row_start += 1
  818. third_header = ['是否匹配账单', '交易ID', '订单ID', '设备UID', '用户名', '账号昵称', '通道', '商品描述', '支付方式', '价格', '支付状态',
  819. '已退金额', '添加时间', '更新时间']
  820. diff_order_qs = all_order_qs.filter(trade_no__in=trade_no_list).values('trade_no', 'orderID', 'UID',
  821. 'userID__username',
  822. 'userID__NickName', 'channel',
  823. 'desc', 'payType',
  824. 'price', 'status',
  825. 'refunded_amount', 'addTime',
  826. 'updTime')
  827. for index, content in enumerate(third_header):
  828. wt_sheet.write(row_start, index, content)
  829. row_start += 1
  830. for item in diff_order_qs:
  831. values_list = item.values()
  832. for col, content in enumerate(values_list):
  833. if col == 0:
  834. wt_sheet.write(row_start, col, '否')
  835. if col == 7:
  836. content = 'PayPal'
  837. if col == 9:
  838. if content == 1:
  839. content = '支付成功'
  840. elif content == 5:
  841. content = '全额退款'
  842. elif content == 6:
  843. content = '部分退款'
  844. if col in [11, 12]:
  845. content = CommonService.timestamp_to_str(int(content))
  846. wt_sheet.write(row_start, col + 1, str(content))
  847. row_start += 1
  848. wt_sheet.write(1, 6, fee_money)
  849. wt_sheet.write(1, 7, paypal_money)
  850. res = HttpResponse(content_type='application/vnd.ms-excel')
  851. res['Content-Disposition'] = 'attachment; filename={}'.format(escape_uri_path(file.name))
  852. wt_book.save(res)
  853. return res
  854. except Exception as e:
  855. print(e)
  856. return response.json(500, repr(e))
  857. def deleteDeviceOrder(self, userID, request_dict, response):
  858. orderID = request_dict.get('orderID', None)
  859. if orderID:
  860. Order_Model.objects.filter(orderID=orderID).delete()
  861. return response.json(0)
  862. else:
  863. return response.json(444)
  864. def getDevicePackageList(self, request_dict, response):
  865. pageNo = request_dict.get('pageNo', None)
  866. pageSize = request_dict.get('pageSize', None)
  867. uid = request_dict.get('uid', None)
  868. if not all([pageNo, pageSize]):
  869. return response.json(444)
  870. page = int(pageNo)
  871. line = int(pageSize)
  872. try:
  873. ubqs = UID_Bucket.objects.all()
  874. if uid:
  875. ubqs = ubqs.filter(uid__contains=uid)
  876. if not ubqs.exists():
  877. return response.json(0, [])
  878. count = ubqs.count()
  879. ubqs = ubqs.values(
  880. 'id',
  881. 'uid',
  882. 'channel',
  883. 'status',
  884. 'endTime',
  885. 'bucket__bucket',
  886. 'bucket__storeDay',
  887. 'bucket__area')
  888. ubqs = ubqs.order_by('-addTime') # 根据CDK创建时间降序排序
  889. ubqs = ubqs[(page - 1) * line:page * line]
  890. return response.json(
  891. 0, {'list': list(ubqs), 'total': count})
  892. except Exception as e:
  893. print(e)
  894. return response.json(500, repr(e))
  895. def deleteDevicePackage(self, userID, request_dict, response):
  896. orderID = request_dict.get('orderID', None)
  897. if orderID:
  898. Order_Model.objects.filter(orderID=orderID).delete()
  899. return response.json(0)
  900. else:
  901. return response.json(444)
  902. # 重置设备云存体验
  903. def do_experience_reset(self, request_dict, userID, response):
  904. bid = request_dict.get("id", None)
  905. ubq = UID_Bucket.objects.filter(id=bid)
  906. if ubq:
  907. eq = ExperienceContextModel.objects.filter(uid=ubq[0].uid)
  908. if eq:
  909. eq.delete()
  910. Order_Model.objects.filter(uid_bucket_id=bid).delete()
  911. ubq.delete()
  912. return response.json(0)
  913. else:
  914. return response.json(10007)
  915. else:
  916. return response.json(0, '重置云存体验失败')
  917. @classmethod
  918. def getCloudUserList(cls, request_dict, response):
  919. print('request_dict: ', request_dict)
  920. # UID_Bucket表查询数据
  921. uid = request_dict.get('uid', None)
  922. status = request_dict.get('status', None)
  923. use_status = request_dict.get('use_status', None)
  924. has_unused = request_dict.get('has_unused', None)
  925. addTimeRange = request_dict.getlist('addTimeRange[]', None)
  926. endTimeRange = request_dict.getlist('endTimeRange[]', None)
  927. # Order_Model表查询数据
  928. username = request_dict.get('username', None)
  929. phone = request_dict.get('phone', None)
  930. userEmail = request_dict.get('userEmail', None)
  931. payType = request_dict.get('payType', None)
  932. # uid_set 表查询
  933. ucode = request_dict.getlist('ucode', None)
  934. version = request_dict.getlist('version', None)
  935. # 日志表查询
  936. logTimeRange = request_dict.getlist('logTimeRange[]', None)
  937. # 序列号查询
  938. serialNumber = request_dict.get('serialNumber', None)
  939. pageNo = request_dict.get('pageNo', None)
  940. pageSize = request_dict.get('pageSize', None)
  941. if not all([pageNo, pageSize]):
  942. return response.json(444)
  943. page = int(pageNo)
  944. line = int(pageSize)
  945. try:
  946. uid_bucket_qs = UID_Bucket.objects.all()
  947. if uid:
  948. uid_bucket_qs = uid_bucket_qs.filter(uid__icontains=uid)
  949. if status:
  950. uid_bucket_qs = uid_bucket_qs.filter(status=status)
  951. if use_status:
  952. uid_bucket_qs = uid_bucket_qs.filter(use_status=use_status)
  953. if has_unused:
  954. uid_bucket_qs = uid_bucket_qs.filter(has_unused=has_unused)
  955. if serialNumber:
  956. device_info_qs = Device_Info.objects.filter(serial_number=serialNumber).values('UID')
  957. uid = device_info_qs[0]['UID'] if device_info_qs.exists() else 'N/A'
  958. uid_bucket_qs = uid_bucket_qs.filter(uid__icontains=uid)
  959. if addTimeRange:
  960. addStartTime, addEndTime = int(
  961. addTimeRange[0][:-3]), int(addTimeRange[1][:-3])
  962. uid_bucket_qs = uid_bucket_qs.filter(
  963. addTime__gte=addStartTime,
  964. addTime__lte=addEndTime)
  965. if endTimeRange:
  966. endStartTime, endEndTime = int(
  967. endTimeRange[0][:-3]), int(endTimeRange[1][:-3])
  968. uid_bucket_qs = uid_bucket_qs.filter(
  969. addTime__gte=endStartTime,
  970. addTime__lte=endEndTime)
  971. uid_list = []
  972. uid_set_dict = {}
  973. if ucode and ucode != ['']:
  974. uid_set_qs = UidSetModel.objects.filter(ucode__in=ucode).values('uid', 'ucode', 'version').distinct()
  975. for uid_set in uid_set_qs:
  976. uid_list.append(uid_set['uid'])
  977. uid_set_dict[uid_set['uid']] = {
  978. 'ucode': uid_set['ucode'],
  979. 'version': uid_set['version']
  980. }
  981. uid_bucket_qs = uid_bucket_qs.filter(uid__in=uid_list)
  982. else:
  983. uid_set_qs = UidSetModel.objects.filter().values('uid', 'ucode', 'version').distinct()
  984. for uid_set in uid_set_qs:
  985. uid_list.append(uid_set['uid'])
  986. uid_set_dict[uid_set['uid']] = {
  987. 'ucode': uid_set['ucode'],
  988. 'version': uid_set['version']
  989. }
  990. if not uid_bucket_qs.exists():
  991. return response.json(0, [])
  992. order_qs = Order_Model.objects.filter(uid_bucket_id__in=uid_bucket_qs.values('id'))
  993. if username or phone or userEmail or payType:
  994. if username:
  995. order_qs = order_qs.filter(userID__username=username)
  996. if phone:
  997. order_qs = order_qs.filter(userID__phone__contains=phone)
  998. if userEmail:
  999. order_qs = order_qs.filter(
  1000. userID__userEmail__contains=userEmail)
  1001. if payType:
  1002. order_qs = order_qs.filter(payType=int(payType))
  1003. # 过滤套餐关联的UID_Bucket数据
  1004. uid_bucket_qs = uid_bucket_qs.filter(
  1005. id__in=order_qs.values_list(
  1006. 'uid_bucket_id', flat=True))
  1007. cg_qs = CloudLogModel.objects.filter(
  1008. operation='cloudstorage/queryvodlist')
  1009. if logTimeRange:
  1010. logStartTime, logEndTime = int(
  1011. logTimeRange[0][:-3]), int(logTimeRange[1][:-3])
  1012. cg_qs = cg_qs.filter(
  1013. time__gte=logStartTime,
  1014. time__lte=logEndTime)
  1015. # 过滤套餐关联的UID_Bucket数据
  1016. uid_bucket_qs = uid_bucket_qs.filter(
  1017. uid__in=cg_qs.values('uid'))
  1018. list_data = []
  1019. count = uid_bucket_qs.count()
  1020. uid_bucket_qs = uid_bucket_qs.order_by('-addTime')[(page - 1) * line:page * line]
  1021. for uid_bucket in uid_bucket_qs:
  1022. for order in order_qs.filter(uid_bucket_id=uid_bucket.id) \
  1023. .values('orderID', 'uid_bucket_id', 'desc', 'userID__userID',
  1024. 'UID', 'price', 'payType', 'userID__username', 'userID__phone',
  1025. 'userID__userEmail', 'userID__data_joined', 'agreement_id'):
  1026. # 套餐到期时间累加未使用套餐
  1027. unused_qs = Unused_Uid_Meal.objects.filter(uid=uid_bucket.uid).values('num', 'expire')
  1028. if unused_qs.exists():
  1029. addMonth = 0
  1030. for unused in unused_qs:
  1031. addMonth += unused['num'] * unused['expire']
  1032. endTime = CommonService.calcMonthLater(addMonth, uid_bucket.endTime)
  1033. endTime = time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(endTime))
  1034. else:
  1035. endTime = time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(uid_bucket.endTime))
  1036. uid = uid_bucket.uid.upper()
  1037. data = {
  1038. 'id': uid_bucket.id,
  1039. 'orderId': order['orderID'],
  1040. 'uid': uid,
  1041. 'agreementId': order['agreement_id'] if order['agreement_id'] else 'N/A',
  1042. 'channel': uid_bucket.channel,
  1043. 'status': uid_bucket.status,
  1044. 'endTime': endTime,
  1045. 'addTime': time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(uid_bucket.addTime)),
  1046. 'use_status': uid_bucket.use_status,
  1047. 'has_unused': uid_bucket.has_unused,
  1048. 'desc': order['desc'],
  1049. 'payType': order['payType'],
  1050. 'price': order['price'],
  1051. 'username': order['userID__username'],
  1052. 'phone': order['userID__phone'],
  1053. 'userEmail': order['userID__userEmail'],
  1054. 'data_joined': order['userID__data_joined'].strftime("%Y-%m-%d %H:%M:%S"),
  1055. 'playcount': cg_qs.filter(operation='cloudstorage/queryvodlist', uid=order['UID']).count(),
  1056. 'serial_number': 'N/A'
  1057. }
  1058. device_info_qs = Device_Info.objects.filter(UID=uid).values('serial_number')
  1059. if device_info_qs.exists():
  1060. data['serial_number'] = device_info_qs[0]['serial_number'] if device_info_qs[0][
  1061. 'serial_number'] else 'N/A'
  1062. if uid in uid_set_dict:
  1063. data['ucode'] = uid_set_dict[uid]['ucode']
  1064. data['version'] = uid_set_dict[uid]['version']
  1065. list_data.append(data)
  1066. return response.json(
  1067. 0, {'list': list_data, 'total': count})
  1068. except Exception as e:
  1069. print(e)
  1070. return response.json(500, repr(e))
  1071. def exportCloudUserList(self, request_dict, response):
  1072. # UID_Bucket表查询数据
  1073. uid = request_dict.get('uid', None)
  1074. status = request_dict.get('status', None)
  1075. use_status = request_dict.get('use_status', None)
  1076. has_unused = request_dict.get('has_unused', None)
  1077. addTimeRange = request_dict.getlist('addTimeRange[]', None)
  1078. endTimeRange = request_dict.getlist('endTimeRange[]', None)
  1079. # Order_Model表查询数据
  1080. username = request_dict.get('username', None)
  1081. phone = request_dict.get('phone', None)
  1082. userEmail = request_dict.get('userEmail', None)
  1083. payType = request_dict.get('payType', None)
  1084. # uid_set 表查询
  1085. ucode = request_dict.getlist('ucode', None)
  1086. version = request_dict.getlist('version', None)
  1087. # 日志表查询
  1088. logTimeRange = request_dict.getlist('logTimeRange[]', None)
  1089. pageNo = request_dict.get('pageNo', None)
  1090. pageSize = request_dict.get('pageSize', None)
  1091. if not all([pageNo, pageSize]):
  1092. return response.json(444)
  1093. page = int(pageNo)
  1094. line = int(pageSize)
  1095. try:
  1096. uid_bucket_qs = UID_Bucket.objects.all()
  1097. if uid:
  1098. uid_bucket_qs = uid_bucket_qs.filter(uid__contains=uid)
  1099. if status:
  1100. uid_bucket_qs = uid_bucket_qs.filter(status=status)
  1101. if use_status:
  1102. uid_bucket_qs = uid_bucket_qs.filter(use_status=use_status)
  1103. if has_unused:
  1104. uid_bucket_qs = uid_bucket_qs.filter(has_unused=has_unused)
  1105. if addTimeRange:
  1106. addStartTime, addEndTime = int(
  1107. addTimeRange[0][:-3]), int(addTimeRange[1][:-3])
  1108. uid_bucket_qs = uid_bucket_qs.filter(
  1109. addTime__gte=addStartTime,
  1110. addTime__lte=addEndTime)
  1111. if endTimeRange:
  1112. endStartTime, endEndTime = int(
  1113. endTimeRange[0][:-3]), int(endTimeRange[1][:-3])
  1114. uid_bucket_qs = uid_bucket_qs.filter(
  1115. addTime__gte=endStartTime,
  1116. addTime__lte=endEndTime)
  1117. if not uid_bucket_qs.exists():
  1118. return response.json(0, [])
  1119. order_qs = Order_Model.objects.filter(
  1120. uid_bucket_id__in=uid_bucket_qs.values('id'))
  1121. if username or phone or userEmail or payType:
  1122. if username:
  1123. order_qs = order_qs.filter(userID__username=username)
  1124. if phone:
  1125. order_qs = order_qs.filter(userID__phone__contains=phone)
  1126. if userEmail:
  1127. order_qs = order_qs.filter(
  1128. userID__userEmail__contains=userEmail)
  1129. if payType:
  1130. order_qs = order_qs.filter(payType=int(payType))
  1131. # 过滤套餐关联的UID_Bucket数据
  1132. uid_bucket_qs = uid_bucket_qs.filter(
  1133. id__in=order_qs.values_list(
  1134. 'uid_bucket_id', flat=True))
  1135. uidset_qs = UidSetModel.objects.filter(
  1136. uid__in=uid_bucket_qs.values('uid'))
  1137. if ucode or version:
  1138. if ucode:
  1139. uidset_qs = uidset_qs.filter(ucode=ucode)
  1140. if version:
  1141. uidset_qs = uidset_qs.filter(version=version)
  1142. cg_qs = CloudLogModel.objects.filter(
  1143. operation='cloudstorage/queryvodlist')
  1144. if logTimeRange:
  1145. logStartTime, logEndTime = int(
  1146. logTimeRange[0][:-3]), int(logTimeRange[1][:-3])
  1147. cg_qs = cg_qs.filter(
  1148. time__gte=logStartTime,
  1149. time__lte=logEndTime)
  1150. list_data = []
  1151. count = uid_bucket_qs.count()
  1152. uid_bucket_qs = uid_bucket_qs.order_by('-addTime')[(page - 1) * line:page * line]
  1153. for uid_bucket in uid_bucket_qs:
  1154. data = {
  1155. 'id': uid_bucket.id,
  1156. 'uid': uid_bucket.uid,
  1157. 'channel': uid_bucket.channel,
  1158. 'status': uid_bucket.status,
  1159. 'endTime': time.strftime(
  1160. "%Y--%m--%d %H:%M:%S",
  1161. time.localtime(
  1162. uid_bucket.endTime)),
  1163. 'addTime': time.strftime(
  1164. "%Y--%m--%d %H:%M:%S",
  1165. time.localtime(
  1166. uid_bucket.addTime)),
  1167. 'use_status': uid_bucket.use_status,
  1168. 'has_unused': uid_bucket.has_unused}
  1169. for order in order_qs.filter(
  1170. uid_bucket_id=uid_bucket.id).values(
  1171. 'uid_bucket_id',
  1172. 'desc',
  1173. 'userID__userID',
  1174. 'UID',
  1175. 'price',
  1176. 'payType',
  1177. 'userID__username',
  1178. 'userID__phone',
  1179. 'userID__userEmail',
  1180. 'userID__data_joined'):
  1181. data['desc'] = order['desc']
  1182. data['payType'] = order['payType']
  1183. data['price'] = order['price']
  1184. data['username'] = order['userID__username']
  1185. data['phone'] = order['userID__phone']
  1186. data['userEmail'] = order['userID__userEmail']
  1187. data['data_joined'] = order['userID__data_joined'].strftime(
  1188. "%Y-%m-%d %H:%M:%S")
  1189. data['playcount'] = cg_qs.filter(
  1190. operation='cloudstorage/queryvodlist', uid=order['UID']).count()
  1191. for uidset in uidset_qs.filter(
  1192. uid=uid_bucket.uid).values(
  1193. 'ucode',
  1194. 'version'):
  1195. data['ucode'] = uidset['ucode']
  1196. data['version'] = uidset['version']
  1197. list_data.append(data)
  1198. response = HttpResponse(content_type='application/vnd.ms-excel')
  1199. response['Content-Disposition'] = 'attachment; filename=userinfo.xls'
  1200. workbook = xlwt.Workbook(encoding='utf-8')
  1201. sheet1 = workbook.add_sheet('UID')
  1202. headtitle = [
  1203. 'id',
  1204. '用户账号',
  1205. '用户手机号',
  1206. '用户邮箱',
  1207. '注册时间',
  1208. '设备UID',
  1209. '设备通道',
  1210. '云存状态',
  1211. '添加时间',
  1212. '到期时间',
  1213. '使用状态',
  1214. '是否有未使用套餐',
  1215. '套餐描述',
  1216. '支付方式',
  1217. '价格',
  1218. '播放次数',
  1219. '产品编码',
  1220. '版本'
  1221. ]
  1222. headnum = 0
  1223. for title in headtitle:
  1224. sheet1.write(0, headnum, title)
  1225. headnum = headnum + 1
  1226. fields = [
  1227. 'id',
  1228. 'username',
  1229. 'phone',
  1230. 'userEmail',
  1231. 'data_joined',
  1232. 'uid',
  1233. 'channel',
  1234. 'status',
  1235. 'addTime',
  1236. 'endTime',
  1237. 'use_status',
  1238. 'has_unused',
  1239. 'desc',
  1240. 'payType',
  1241. 'price',
  1242. 'playcount',
  1243. 'ucode',
  1244. 'version'
  1245. ]
  1246. num = 1
  1247. for item in list_data:
  1248. fieldnum = 0
  1249. for key in fields:
  1250. val = item[key]
  1251. if key == 'payType':
  1252. if val == 1:
  1253. val = 'PayPal'
  1254. if val == 2:
  1255. val = '支付宝'
  1256. if val == 3:
  1257. val = '微信支付'
  1258. if val == 10:
  1259. val = '免费体验'
  1260. if val == 11:
  1261. val = '激活码'
  1262. sheet1.write(num, fieldnum, val)
  1263. fieldnum = fieldnum + 1
  1264. num = num + 1
  1265. workbook.save(response)
  1266. return response
  1267. except Exception as e:
  1268. print(e)
  1269. return response.json(500, repr(e))
  1270. def getCloudDataList(self, request_dict, response):
  1271. year = request_dict.get('year', None)
  1272. Jan = int(time.mktime(time.strptime(year + '-1-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1273. Feb = int(time.mktime(time.strptime(year + '-2-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1274. Mar = int(time.mktime(time.strptime(year + '-3-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1275. Apr = int(time.mktime(time.strptime(year + '-4-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1276. May = int(time.mktime(time.strptime(year + '-5-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1277. Jun = int(time.mktime(time.strptime(year + '-6-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1278. Jul = int(time.mktime(time.strptime(year + '-7-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1279. Aug = int(time.mktime(time.strptime(year + '-8-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1280. Sep = int(time.mktime(time.strptime(year + '-9-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1281. Oct = int(time.mktime(time.strptime(year + '-10-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1282. Nov = int(time.mktime(time.strptime(year + '-11-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1283. Dec = int(time.mktime(time.strptime(year + '-12-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1284. Jan_next = int(time.mktime(time.strptime(str(int(year) + 1) + '-1-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  1285. list_data = []
  1286. vod_bucket_qs = VodBucketModel.objects.filter()
  1287. if not vod_bucket_qs.exists():
  1288. return response.json(173)
  1289. try:
  1290. for vod_bucket in vod_bucket_qs:
  1291. vod_bucket_id = vod_bucket.id
  1292. store_meal = Store_Meal.objects.filter(bucket_id=vod_bucket_id, lang__lang='cn').values('lang__title',
  1293. 'lang__content')
  1294. if not store_meal.exists():
  1295. continue
  1296. name = store_meal[0]['lang__title'] + '-' + store_meal[0]['lang__content']
  1297. order = Order_Model.objects.filter(rank__bucket_id=vod_bucket_id)
  1298. Jan_count = order.filter(status=1, addTime__range=[Jan, Feb]).count()
  1299. Feb_count = order.filter(status=1, addTime__range=[Feb, Mar]).count()
  1300. Mar_count = order.filter(status=1, addTime__range=[Mar, Apr]).count()
  1301. Apr_count = order.filter(status=1, addTime__range=[Apr, May]).count()
  1302. May_count = order.filter(status=1, addTime__range=[May, Jun]).count()
  1303. Jun_count = order.filter(status=1, addTime__range=[Jun, Jul]).count()
  1304. Jul_count = order.filter(status=1, addTime__range=[Jul, Aug]).count()
  1305. Aug_count = order.filter(status=1, addTime__range=[Aug, Sep]).count()
  1306. Sep_count = order.filter(status=1, addTime__range=[Sep, Oct]).count()
  1307. Oct_count = order.filter(status=1, addTime__range=[Oct, Nov]).count()
  1308. Nov_count = order.filter(status=1, addTime__range=[Nov, Dec]).count()
  1309. Dec_count = order.filter(status=1, addTime__range=[Dec, Jan_next]).count()
  1310. data = [Jan_count, Feb_count, Mar_count, Apr_count, May_count, Jun_count, Jul_count, Aug_count,
  1311. Sep_count,
  1312. Oct_count, Nov_count, Dec_count]
  1313. cloud_data = {
  1314. 'name': name,
  1315. 'type': 'line',
  1316. 'data': data,
  1317. }
  1318. list_data.append(cloud_data)
  1319. return response.json(0, {'list': list_data})
  1320. except Exception as e:
  1321. print(e)
  1322. return response.json(500, repr(e))
  1323. @classmethod
  1324. def deviceAttritionAlert(cls, request_dict, response, request):
  1325. """
  1326. 流失预警界面
  1327. @param request_dict:
  1328. @param response:
  1329. @param userName:用户名
  1330. @param uid:设备uid
  1331. @param grade:预警等级
  1332. """
  1333. userName = request_dict.get('userName', None)
  1334. uid = request_dict.get('uid', None)
  1335. grade = request_dict.get('grade', None)
  1336. pageNo = request_dict.get('pageNo', None)
  1337. pageSize = request_dict.get('pageSize', None)
  1338. if not all({pageNo, pageSize}):
  1339. return response.json(444)
  1340. # 获取云存套餐信息表内的设备uid
  1341. page = int(pageNo)
  1342. line = int(pageSize)
  1343. if userName == '' or uid == '' or grade == '': # 判断是否为空
  1344. if userName == '':
  1345. userName = None
  1346. if uid == '':
  1347. uid = None
  1348. if grade == '':
  1349. grade = None
  1350. para_list = [userName, uid, grade]
  1351. not_upload_list = []
  1352. para_count = para_list.count(None)
  1353. try:
  1354. # 筛选数据
  1355. cursor = connection.cursor()
  1356. sql = "SELECT t1.userID_id, du.username, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`,(CASE WHEN t1.`day` >= '15' AND t1.`day` < '25' THEN '一号预警' WHEN t1.use_status = '1' AND t1.`day` >= '25' THEN '二号预警' WHEN t1.use_status = 2 AND t1.`day` >= '25' THEN '八号预警' ELSE '预警取消' END ) AS grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day` FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, TIMESTAMPDIFF(DAY,FROM_UNIXTIME(t1.addTime, '%Y-%m-%d' ),DATE_FORMAT( NOW(), '%Y-%m-%d' )) AS 'day' FROM (SELECT di.userID_id, vub.uid, vub.addTime, vub.use_status FROM vod_uid_bucket AS vub, device_info AS di WHERE vub.uid = di.UID AND vub.addTime > '1669824000' GROUP BY di.userID_id) AS t1 WHERE t1.uid NOT IN (SELECT uid FROM uid_cloud_storage_count)) AS t1 WHERE t1.`day`>='15' AND t1.userID_id is NOT NULL) AS t1 ORDER BY t1.userID_id)AS t1 WHERE t1.userID_id NOT IN (SELECT di.userID_id FROM `uid_cloud_storage_count` AS vcsc LEFT JOIN device_info AS di ON vcsc.uid = di.UID WHERE di.userID_id is NOT NULL))AS t1 LEFT JOIN device_user AS du ON t1.userID_id = du.userID order by t1.addTime "
  1357. cursor.execute(sql)
  1358. uid_type_tuple = cursor.fetchall()
  1359. total = len(uid_type_tuple)
  1360. cursor.close() # 执行完,关闭
  1361. connection.close()
  1362. result_list = []
  1363. more_list = [] # 多个参数查询结果
  1364. new_list = [] # 单独一个参数查询结果
  1365. col_names = [desc[0] for desc in cursor.description]
  1366. for uid_type in uid_type_tuple:
  1367. uid_dict = dict(zip(col_names, uid_type))
  1368. result_list.append(uid_dict)
  1369. if para_count != 2 and para_count != 3: # 两个及以上参数进行筛查
  1370. if userName and uid and grade == None:
  1371. for result in result_list:
  1372. if result['username'] == userName and result['uid'] == uid:
  1373. more_list.append(result)
  1374. if userName and grade and uid == None:
  1375. for result in result_list:
  1376. if result['username'] == userName and result['grade'] == grade:
  1377. more_list.append(result)
  1378. if uid and grade and userName == None:
  1379. for result in result_list:
  1380. if result['uid'] == uid and result['grade'] == grade:
  1381. more_list.append(result)
  1382. if userName and uid and grade:
  1383. for result in result_list:
  1384. if result['username'] == userName and result['uid'] == uid and result['grade'] == grade:
  1385. more_list.append(result)
  1386. result_list = more_list
  1387. if para_count == 2: # 一个参数进行筛查
  1388. if userName:
  1389. for result in result_list:
  1390. if result['username'] == userName:
  1391. new_list.append(result)
  1392. if uid:
  1393. for result in result_list:
  1394. if result['uid'] == uid:
  1395. new_list.append(result)
  1396. if grade:
  1397. for result in result_list:
  1398. if result['grade'] == grade:
  1399. new_list.append(result)
  1400. result_list = new_list
  1401. else:
  1402. result_list = result_list
  1403. result_list = result_list[(page - 1) * line:page * line]
  1404. for item in result_list: # 获取账号下的云存设备数量
  1405. userID_id = item['userID_id']
  1406. device_info_qs = Device_Info.objects.filter(userID_id=userID_id).annotate(count=Count('UID')).values(
  1407. 'UID')
  1408. count = device_info_qs.count()
  1409. if count == 1 or count == 0:
  1410. item['device_number'] = count
  1411. else:
  1412. device_number = 0
  1413. for device_info in device_info_qs:
  1414. uid = device_info['UID']
  1415. uid_set_qs = UidSetModel.objects.filter(uid=uid).values('ucode', 'device_type')
  1416. ucode = uid_set_qs[0]['ucode'] if uid_set_qs.exists() else ''
  1417. device_type = uid_set_qs[0]['device_type'] if uid_set_qs.exists() else ''
  1418. if len(ucode) > 4:
  1419. number = ucode[-4]
  1420. else:
  1421. continue
  1422. device_type_qs = DeviceTypeModel.objects.filter(type=device_type).values('model')
  1423. model = device_type_qs[0]['model'] if device_type_qs.exists() else ''
  1424. # 判断设备是否为ipc设备和是否支持云存
  1425. if model == 2 and number in ['4', '5']:
  1426. device_number += 1
  1427. item['device_number'] = device_number
  1428. item['other_device'] = 0
  1429. not_upload_list.append(item)
  1430. return response.json(0, {'result_list': not_upload_list, 'total': total})
  1431. except Exception as e:
  1432. meg = '异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e))
  1433. return response.json(500, meg)
  1434. def deactivationPackage(self, request_dict, response):
  1435. """
  1436. 停用套餐
  1437. @param request_dict:
  1438. @param response:
  1439. """
  1440. status = request_dict.get('status', None)
  1441. if status in [1, 5, 6, 7]: # 付款状态
  1442. return response.json(10059)
  1443. uid = request_dict.get('uid', None)
  1444. orderID = request_dict.get('orderID', None)
  1445. orderType = request_dict.get('orderType', None)
  1446. payType = request_dict.get('payType', None)
  1447. userName = request_dict.get('userName', None)
  1448. # 查询订单
  1449. if not all([orderID, orderType, uid, userName]):
  1450. return response.json(444)
  1451. nowTime = int(time.time())
  1452. try:
  1453. with transaction.atomic():
  1454. # 云存套餐
  1455. if orderType == '0' and payType != '10':
  1456. order_qs = Order_Model.objects.filter(orderID=orderID, userID__username=userName, UID=uid).values(
  1457. 'rank__bucket_id')
  1458. if not order_qs.exists():
  1459. return response.json(14)
  1460. uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, use_status=1).values('has_unused')
  1461. has_unused = uid_bucket_qs[0]['has_unused'] if uid_bucket_qs.exists() else ''
  1462. # 判断套餐是否唯一
  1463. if has_unused == 0:
  1464. uid_bucket_qs.update(endTime=nowTime)
  1465. CronUpdateDataView.updateUnusedUidBucket(response)
  1466. return response.json(0)
  1467. # 当设备套餐不唯一时
  1468. # 判断停用套餐是否是为未使用套餐
  1469. unused_uid_Meal_qs = Unused_Uid_Meal.objects.filter(uid=uid,
  1470. bucket_id=order_qs[0]['rank__bucket_id'])
  1471. unused_uid_Meal_number = unused_uid_Meal_qs.count()
  1472. if unused_uid_Meal_number == 1:
  1473. unused_uid_Meal_qs.delete()
  1474. return response.json(0)
  1475. return response.json(10059) # 未使用套餐类型重复
  1476. # AI套餐
  1477. if orderType == '1' and payType != '10':
  1478. return response.json(10059)
  1479. # order_qs = Order_Model.objects.filter(orderID=orderID, userID__username=userName, UID=uid).values(
  1480. # 'ai_rank_id')
  1481. # order_qs = order_qs.objects.filter(UID=uid)
  1482. # ai_service_qs = AiService.objects.filter(uid=uid, use_status=1).values('addTime', 'endTime')
  1483. # ai_service_number = ai_service_qs.count()
  1484. # if ai_service_number <= 1:
  1485. # ai_service_qs.update(endTime=nowTime)
  1486. # return response.json(0)
  1487. # # 当设备套餐不唯一时
  1488. # ai_service_qs = AiService.objects.filter(uid=uid, bucket_id=order_qs[0]['ai_rank_id'])
  1489. # ai_serverice_number = ai_service_qs.count()
  1490. # if ai_serverice_number == 1:
  1491. # ai_service_qs.update(endTime=nowTime)
  1492. # return response.json(0)
  1493. # return response.json(10059) # 未使用套餐类型重复
  1494. # 联通4G套餐
  1495. if orderType == '2' and payType != '10':
  1496. return response.json(10059)
  1497. # unicom_combo_order_info_qs = UnicomComboOrderInfo.objects.filter(order_id=orderID & ~Q(status=2)).values(
  1498. # 'expire_time')
  1499. # if not unicom_combo_order_info_qs.exists():
  1500. # return response.json(173)
  1501. # unicom_combo_order_info_qs.update(expire_time=nowTime)
  1502. # return response.json(0)
  1503. return response.json(173)
  1504. except Exception as e:
  1505. print(e)
  1506. return response.json(500, repr(e))
  1507. def cloudDataExport(self, request_dict, response):
  1508. """
  1509. 流失预警导出功能
  1510. """
  1511. cursor = connection.cursor()
  1512. sql = "SELECT t1.userID_id, du.username, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`,(CASE WHEN t1.`day` >= '15' AND t1.`day` < '25' THEN '一号预警' WHEN t1.use_status = '1' AND t1.`day` >= '25' THEN '二号预警' WHEN t1.use_status = 2 AND t1.`day` >= '25' THEN '八号预警' ELSE '预警取消' END ) AS grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day` FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, TIMESTAMPDIFF(DAY,FROM_UNIXTIME(t1.addTime, '%Y-%m-%d' ),DATE_FORMAT( NOW(), '%Y-%m-%d' )) AS 'day' FROM (SELECT di.userID_id, vub.uid, vub.addTime, vub.use_status FROM vod_uid_bucket AS vub, device_info AS di WHERE vub.uid = di.UID AND vub.addTime > '1669824000' GROUP BY di.userID_id) AS t1 WHERE t1.uid NOT IN (SELECT uid FROM uid_cloud_storage_count)) AS t1 WHERE t1.`day`>='15' AND t1.userID_id is NOT NULL) AS t1 ORDER BY t1.userID_id)AS t1 WHERE t1.userID_id NOT IN (SELECT di.userID_id FROM `uid_cloud_storage_count` AS vcsc LEFT JOIN device_info AS di ON vcsc.uid = di.UID WHERE di.userID_id is NOT NULL))AS t1 LEFT JOIN device_user AS du ON t1.userID_id = du.userID order by t1.addTime "
  1513. cursor.execute(sql)
  1514. uid_type_tuple = cursor.fetchall()
  1515. cursor.close() # 执行完,关闭
  1516. connection.close()
  1517. result_list = []
  1518. not_upload_list = []
  1519. try:
  1520. with transaction.atomic():
  1521. col_names = [desc[0] for desc in cursor.description]
  1522. for uid_type in uid_type_tuple:
  1523. uid_dict = dict(zip(col_names, uid_type))
  1524. result_list.append(uid_dict)
  1525. for item in result_list: # 获取账号下的云存设备数量
  1526. device_info_qs = Device_Info.objects.filter(userID_id=item['userID_id']).values('UID')
  1527. count = device_info_qs.count()
  1528. if count == 1 or count == 0:
  1529. item['device_number'] = count
  1530. else:
  1531. device_number = 0
  1532. for device_info in device_info_qs:
  1533. uid_set_qs = UidSetModel.objects.filter(uid=device_info['UID']).values('ucode',
  1534. 'device_type')
  1535. device_type_qs = DeviceTypeModel.objects.filter(type=uid_set_qs[0]['device_type']).values(
  1536. 'model')
  1537. model = device_type_qs[0]['model'] if device_type_qs.exists() else ''
  1538. # 判断设备是否为ipc设备和是否支持云存
  1539. if model == 2:
  1540. if len(uid_set_qs[0]['ucode']) > 4:
  1541. number = uid_set_qs[0]['ucode'][-4]
  1542. else:
  1543. continue
  1544. if number in ['4', '5']:
  1545. device_number += 1
  1546. else:
  1547. continue
  1548. item['device_number'] = device_number
  1549. item['other_device'] = 0
  1550. not_upload_list.append(item)
  1551. # 创建Excel,导出所有流失预警数据
  1552. file_name = "流失预警.xls"
  1553. if not_upload_list:
  1554. ws = xlwt.Workbook(encoding="UTF-8")
  1555. w = ws.add_sheet('流失预警', cell_overwrite_ok=True)
  1556. w.write(0, 0, u'用户名')
  1557. w.write(0, 1, u'用户ID')
  1558. w.write(0, 2, u'设备UID')
  1559. w.write(0, 3, u'设备自云存开通起多少天没有上传数据')
  1560. w.write(0, 4, u'设备数量')
  1561. w.write(0, 5, u'用户有无上传过数据')
  1562. w.write(0, 6, u'是否有有效期内的付费套餐')
  1563. w.write(0, 7, u'预警级别')
  1564. excel_row = 1
  1565. for obj in not_upload_list:
  1566. data_username = obj['username']
  1567. data_userID_id = obj['userID_id']
  1568. data_uid = obj['uid']
  1569. data_day = obj['day']
  1570. data_device_number = obj['device_number']
  1571. if data_device_number == 1:
  1572. data_device_number = 'N/A'
  1573. data_use_status = obj['use_status']
  1574. if data_use_status == 1:
  1575. data_use_status = '有'
  1576. else:
  1577. data_use_status = '无'
  1578. data_other_device = '无'
  1579. data_grade = obj['grade']
  1580. w.write(excel_row, 0, data_username)
  1581. w.write(excel_row, 1, data_userID_id)
  1582. w.write(excel_row, 2, data_uid)
  1583. w.write(excel_row, 3, data_day)
  1584. w.write(excel_row, 4, data_device_number)
  1585. w.write(excel_row, 5, data_other_device)
  1586. w.write(excel_row, 6, data_use_status)
  1587. w.write(excel_row, 7, data_grade)
  1588. excel_row += 1
  1589. # 生成相应格式给前端
  1590. res = HttpResponse(content_type='application/vnd.ms-excel')
  1591. res['Content-Disposition'] = 'attachment; filename={}'.format(escape_uri_path(file_name))
  1592. ws.save(res)
  1593. return res
  1594. except Exception as e:
  1595. meg = '异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e))
  1596. return response.json(500, meg)