ServeManagementController.py 65 KB

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