ServeManagementController.py 66 KB

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