ServeManagementController.py 64 KB

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