ServeManagementController.py 152 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import calendar
  4. import datetime
  5. import hashlib
  6. import time
  7. import uuid
  8. import json
  9. import logging
  10. from collections import defaultdict
  11. import paypalrestsdk
  12. import requests
  13. import xlrd
  14. import xlwt
  15. from django.core.paginator import Paginator
  16. from django.db import transaction, connection
  17. from django.db.models import F, Sum, Count, Q
  18. from django.http import HttpResponse, StreamingHttpResponse
  19. from django.utils.encoding import escape_uri_path
  20. from django.views.generic.base import View
  21. from Ansjer.config import PAYPAL_CRD
  22. from Controller.Cron.CronTaskController import CronUpdateDataView
  23. from Controller.UnicomCombo.UnicomComboTaskController import UnicomComboTaskView
  24. from Model.models import VodBucketModel, CDKcontextModel, Store_Meal, Order_Model, \
  25. UID_Bucket, ExperienceContextModel, Lang, CloudLogModel, UidSetModel, Unused_Uid_Meal, \
  26. Device_Info, DeviceTypeModel, UnicomComboOrderInfo, AiService, CountryModel, CouponLang, CouponConfigModel, \
  27. CouponCombo, CouponModel, Device_User, AbnormalOrder, DailyReconciliation, StsCrdModel, LogModel, \
  28. InAppPurchasePackage, InAppRefund
  29. from Object.AppleInAppPurchaseSubscriptionObject import InAppPurchase
  30. from Object.Enums.RedisKeyConstant import RedisKeyConstant
  31. from Object.RedisObject import RedisObject
  32. from Object.ResponseObject import ResponseObject
  33. from Object.TokenObject import TokenObject
  34. from Object.UnicomObject import UnicomObjeect
  35. from Object.utils.PayPalUtil import PayPalService
  36. from Service.CommonService import CommonService
  37. LOGGER = logging.getLogger('info')
  38. class serveManagement(View):
  39. def get(self, request, *args, **kwargs):
  40. request.encoding = 'utf-8'
  41. operation = kwargs.get('operation')
  42. return self.validation(request.GET, request, operation)
  43. def post(self, request, *args, **kwargs):
  44. request.encoding = 'utf-8'
  45. operation = kwargs.get('operation')
  46. return self.validation(request.POST, request, operation)
  47. def validation(self, request_dict, request, operation):
  48. language = request_dict.get('language', 'en')
  49. response = ResponseObject(language, 'pc')
  50. if operation == 'exportCloudUserList': # 导出云存用户信息
  51. return self.exportCloudUserList(request_dict, response)
  52. elif operation == 'getCloudDataList':
  53. return self.getCloudDataList(request_dict, response)
  54. elif operation == 'paypalOrderReconcile':
  55. return self.paypalOrderReconcile(request, request_dict, response)
  56. elif operation == 'wechatOrderReconcile':
  57. return self.wechatOrderReconcile(request, request_dict, response)
  58. elif operation == 'alipayOrderReconcile':
  59. return self.alipayOrderReconcile(request, request_dict, response)
  60. elif operation == 'cloudDataExport': # 导出流失预警
  61. return self.cloudDataExport(request, response)
  62. elif operation == 'getDeviceOrderList':
  63. return self.getDeviceOrderList(request_dict, response)
  64. elif operation == 'todayCloudPackageQueryNum':
  65. return self.today_cloud_package_query_num(response)
  66. else:
  67. tko = TokenObject(
  68. request.META.get('HTTP_AUTHORIZATION'),
  69. returntpye='pc')
  70. if tko.code != 0:
  71. return response.json(tko.code)
  72. response.lang = tko.lang
  73. userID = tko.userID
  74. if operation == 'getVodBucketList':
  75. return self.getVodBucketList(userID, request_dict, response)
  76. elif operation == 'addOrEditVodBucket':
  77. return self.addOrEditVodBucket(userID, request_dict, response)
  78. elif operation == 'deleteVodBucket':
  79. return self.deleteVodBucket(userID, request_dict, response)
  80. elif operation == 'getStoreMealList':
  81. return self.getStoreMealList(userID, request_dict, response)
  82. elif operation == 'addOrEditStoreMeal':
  83. return self.addOrEditStoreMeal(userID, request_dict, response)
  84. elif operation == 'deleteStoreMeal':
  85. return self.deleteStoreMeal(userID, request_dict, response)
  86. elif operation == 'getStoreMealLanguage':
  87. return self.getStoreMealLanguage(
  88. userID, request_dict, response)
  89. elif operation == 'addOrEditStoreMealLanguage':
  90. return self.addOrEditStoreMealLanguage(
  91. userID, request_dict, response)
  92. elif operation == 'deleteStoreMealLanguage':
  93. return self.deleteStoreMealLanguage(
  94. userID, request_dict, response)
  95. # CDK
  96. elif operation == 'getCdkList':
  97. return self.getCdkList(userID, request_dict, response)
  98. elif operation == 'createCdk':
  99. return self.createCdk(request_dict, response)
  100. elif operation == 'getVodStoreMeal':
  101. return self.getVodStoreMeal(response)
  102. elif operation == 'editExpress':
  103. return self.editExpress(request_dict, response)
  104. elif operation == 'deleteCdk':
  105. return self.deleteCdk(request_dict, response)
  106. elif operation == 'downloadCDK':
  107. return self.downloadCDK(request_dict, response)
  108. # 优惠券
  109. elif operation == 'getCouponList': # 查询优惠券
  110. return self.getCouponList(request_dict, response)
  111. elif operation == 'getCouponId': # 查询优惠券id
  112. return self.getCouponId(response)
  113. elif operation == 'addOrEditCoupon': # 添加/编辑优惠券
  114. return self.addOrEditCoupon(request_dict, response)
  115. elif operation == 'deleteCoupon': # 删除优惠券
  116. return self.deleteCoupon(request_dict, response)
  117. # 优惠券语言
  118. elif operation == 'getCouponLangList': # 查询优惠券语言
  119. return self.getCouponLangList(request_dict, response)
  120. elif operation == 'addOrEditCouponLang': # 添加/编辑优惠券语言
  121. return self.addOrEditCouponLang(request_dict, response)
  122. elif operation == 'deleteCouponLang': # 删除优惠券语言
  123. return self.deleteCouponLang(request_dict, response)
  124. elif operation == 'addCouponLangConfig': # 添加优惠券语言
  125. return self.add_coupon_lang_config(request_dict, response)
  126. # 优惠券使用
  127. elif operation == 'getCouponUsingList': # 查询优惠券使用
  128. return self.getCouponUsingList(request_dict, response)
  129. elif operation == 'editCouponUsing': # 编辑优惠券使用
  130. return self.editCouponUsing(request_dict, response)
  131. elif operation == 'deleteCouponUsing': # 删除优惠券使用
  132. return self.deleteCouponUsing(request_dict, response)
  133. elif operation == 'getAbnormalOrderList':
  134. return self.getAbnormalOrderList(request_dict, response)
  135. elif operation == 'updateAbnormalOrder':
  136. return self.updateAbnormalOrder(request_dict, response)
  137. elif operation == 'getDailyReconciliation':
  138. return self.getDailyReconciliation(request_dict, response)
  139. elif operation == 'deleteDeviceOrder':
  140. return self.deleteDeviceOrder(userID, request_dict, response)
  141. elif operation == 'getDevicePackageList': # 云存设备套餐
  142. return self.getDevicePackageList(request_dict, response)
  143. elif operation == 'deleteDevicePackage':
  144. return self.deleteDevicePackage(userID, request_dict, response)
  145. elif operation == 'experiencereset': # 重置设备云存体验
  146. return self.do_experience_reset(request_dict, userID, response)
  147. elif operation == 'mealTransfer':
  148. return self.meal_transfer(request, request_dict, response)
  149. # 云存用户信息
  150. elif operation == 'getCloudUserList': # 获取云存用户信息
  151. return self.getCloudUserList(request_dict, response)
  152. elif operation == 'paypal-cycle-cancel': # 取消循环扣款
  153. return self.paypal_cycle_cancel(request_dict, response)
  154. elif operation == 'distributeCoupons': # 发放云存优惠券
  155. return self.distributeCoupons(request_dict, response)
  156. # 流失预警
  157. elif operation == 'deviceAttritionAlert':
  158. return self.deviceAttritionAlert(request_dict, response)
  159. elif operation == 'deactivationPackage': # 停用套餐
  160. return self.deactivationPackage(request_dict, response)
  161. # 苹果内购退款
  162. elif operation == 'purchaseRefundList':
  163. return self.purchase_refund_list(request_dict, response)
  164. elif operation == 'editRefundPreference':
  165. return self.edit_refund_preference(request_dict, response)
  166. elif operation == 'addRefundOrder':
  167. return self.add_refund_order(request_dict, response)
  168. # 查询每日云存列表界面访问次数
  169. elif operation == 'callTodayCloudPackageQueryNum':
  170. return self.call_today_cloud_package_query_num(response)
  171. else:
  172. return response.json(404)
  173. @staticmethod
  174. def paypal_cycle_cancel(request_dict, response):
  175. """
  176. 取消云存循环扣款
  177. """
  178. order_id = request_dict.get('orderID', None)
  179. if not order_id:
  180. return response.json(444)
  181. order_qs = Order_Model.objects.filter(orderID=order_id)
  182. order_qs = order_qs.filter(~Q(agreement_id='')).values("agreement_id", "app_type")
  183. if not order_qs.exists():
  184. return response.json(800)
  185. if order_qs[0]['app_type'] == 1:
  186. paypalrestsdk.configure(PAYPAL_CRD['Zosi'])
  187. elif order_qs[0]['app_type'] == 2:
  188. paypalrestsdk.configure(PAYPAL_CRD['Vsees'])
  189. agreement_id = order_qs[0]['agreement_id']
  190. try:
  191. now_time = int(time.time())
  192. billing_agreement = paypalrestsdk.BillingAgreement.find(agreement_id)
  193. if billing_agreement.state != 'Active':
  194. Order_Model.objects.filter(agreement_id=agreement_id).update(agreement_id='', updTime=now_time)
  195. return response.json(0)
  196. cancel_note = {"note": "Canceling the agreement"}
  197. if billing_agreement.cancel(cancel_note):
  198. Order_Model.objects.filter(agreement_id=agreement_id).update(agreement_id='', updTime=now_time)
  199. return response.json(0)
  200. else:
  201. return response.json(10052)
  202. except Exception as e:
  203. print(repr(e))
  204. return response.json(10052)
  205. @staticmethod
  206. def distributeCoupons(request_dict, response):
  207. user_id = request_dict.get('userID', None)
  208. coupon_id = request_dict.get('couponID', None)
  209. valid_time = request_dict.get('validTime', None)
  210. if not all([user_id, coupon_id]):
  211. return response.json(444)
  212. now_time = int(time.time())
  213. try:
  214. CouponModel.objects.create(userID=user_id, coupon_config_id=coupon_id, valid_time=valid_time,
  215. distribute_time=now_time, create_time=now_time, update_time=now_time)
  216. return response.json(0)
  217. except Exception as e:
  218. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  219. def getVodBucketList(self, userID, request_dict, response):
  220. # 查询存储桶数据
  221. print('request_dict: ', request_dict)
  222. isSelect = request_dict.get('isSelect', None)
  223. if isSelect:
  224. # 获取全部数据作为存储桶选项
  225. vod_bucket_qs = VodBucketModel.objects.all().values('id', 'bucket')
  226. return response.json(
  227. 0, {'list': CommonService.qs_to_list(vod_bucket_qs)})
  228. bucket = request_dict.get('bucket', None)
  229. mold = request_dict.get('mold', None)
  230. is_free = request_dict.get('is_free', None)
  231. pageNo = request_dict.get('pageNo', None)
  232. pageSize = request_dict.get('pageSize', None)
  233. if not all([pageNo, pageSize]):
  234. return response.json(444)
  235. page = int(pageNo)
  236. line = int(pageSize)
  237. try:
  238. if bucket or mold or is_free: # 条件查询
  239. if bucket:
  240. vod_bucket_qs = VodBucketModel.objects.filter(
  241. bucket=bucket)
  242. elif mold:
  243. vod_bucket_qs = VodBucketModel.objects.filter(
  244. mold=int(mold))
  245. elif is_free:
  246. vod_bucket_qs = VodBucketModel.objects.filter(
  247. is_free=int(is_free))
  248. else: # 查询全部
  249. vod_bucket_qs = VodBucketModel.objects.filter().all()
  250. total = len(vod_bucket_qs)
  251. vod_buckets = vod_bucket_qs[(page - 1) * line:page * line]
  252. vod_bucket_list = []
  253. for vod_bucket in vod_buckets:
  254. vod_bucket_list.append({
  255. 'bucketID': vod_bucket.id,
  256. 'bucket': vod_bucket.bucket,
  257. 'content': vod_bucket.content,
  258. 'mold': vod_bucket.mold,
  259. 'area': vod_bucket.area,
  260. 'region': vod_bucket.region,
  261. 'endpoint': vod_bucket.endpoint,
  262. 'is_free': vod_bucket.is_free,
  263. 'storeDay': vod_bucket.storeDay,
  264. 'region_id': vod_bucket.region_id,
  265. 'addTime': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(vod_bucket.addTime)),
  266. 'updTime': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(vod_bucket.updTime)),
  267. })
  268. print('vod_bucket_list: ', vod_bucket_list)
  269. return response.json(
  270. 0, {'list': vod_bucket_list, 'total': total})
  271. except Exception as e:
  272. print(e)
  273. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  274. def addOrEditVodBucket(self, userID, request_dict, response):
  275. # 添加/编辑存储桶
  276. print('request_dict: ', request_dict)
  277. bucketID = request_dict.get('bucketID', None)
  278. bucket = request_dict.get('bucket', '').strip() # 移除字符串头尾的空格
  279. content = request_dict.get('content', '').strip()
  280. mold = int(request_dict.get('mold', 1))
  281. area = request_dict.get('area', '').strip()
  282. region = request_dict.get('region', '').strip()
  283. endpoint = request_dict.get('endpoint', '').strip()
  284. is_free = int(request_dict.get('is_free', 0))
  285. storeDay = int(request_dict.get('storeDay', 0))
  286. region_id = int(request_dict.get('region_id', 1))
  287. isEdit = request_dict.get('isEdit', None)
  288. if not all([bucket, content, area, region, endpoint]):
  289. return response.json(444)
  290. try:
  291. now_time = int(time.time())
  292. vod_bucket_data = {
  293. 'bucket': bucket,
  294. 'content': content,
  295. 'mold': mold,
  296. 'area': area,
  297. 'region': region,
  298. 'endpoint': endpoint,
  299. 'is_free': is_free,
  300. 'storeDay': storeDay,
  301. 'region_id': region_id,
  302. }
  303. if isEdit:
  304. if not bucketID:
  305. return response.json(444)
  306. vod_bucket_data['updTime'] = now_time
  307. VodBucketModel.objects.filter(
  308. id=bucketID).update(
  309. **vod_bucket_data)
  310. else:
  311. vod_bucket_data['addTime'] = now_time
  312. VodBucketModel.objects.create(**vod_bucket_data)
  313. return response.json(0)
  314. except Exception as e:
  315. print(e)
  316. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  317. def deleteVodBucket(self, userID, request_dict, response):
  318. # 删除存储桶
  319. print('request_dict: ', request_dict)
  320. bucketID = request_dict.get('bucketID', None)
  321. if not bucketID:
  322. return response.json(444)
  323. try:
  324. VodBucketModel.objects.filter(id=bucketID).delete()
  325. return response.json(0)
  326. except Exception as e:
  327. print(e)
  328. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  329. def getStoreMealList(self, userID, request_dict, response):
  330. # 获取云存套餐信息数据
  331. print('request_dict: ', request_dict)
  332. isSelect = request_dict.get('isSelect', None)
  333. if isSelect:
  334. # 获取套餐ID作为选项
  335. store_meal_qs = Store_Meal.objects.all().values('id', 'bucket__bucket')
  336. return response.json(
  337. 0, {'list': CommonService.qs_to_list(store_meal_qs)})
  338. bucket = request_dict.get('bucket', None)
  339. pageNo = request_dict.get('pageNo', None)
  340. pageSize = request_dict.get('pageSize', None)
  341. if not all([pageNo, pageSize]):
  342. return response.json(444)
  343. page = int(pageNo)
  344. line = int(pageSize)
  345. try:
  346. if bucket: # 条件查询
  347. bucket_id = VodBucketModel.objects.filter(
  348. bucket=bucket).values('id')[0]['id']
  349. store_meal_qs = Store_Meal.objects.filter(
  350. bucket_id=bucket_id)
  351. else: # 查询全部
  352. store_meal_qs = Store_Meal.objects.filter()
  353. store_meal_val = store_meal_qs.values(
  354. 'id',
  355. 'bucket__bucket',
  356. 'day',
  357. 'expire',
  358. 'commodity_type',
  359. 'commodity_code',
  360. 'is_discounts',
  361. 'discount_price',
  362. 'virtual_price',
  363. 'price',
  364. 'currency',
  365. 'symbol',
  366. 'is_show',
  367. 'is_ai',
  368. 'pixel_level',
  369. 'add_time',
  370. 'update_time')
  371. total = len(store_meal_val)
  372. store_meals = store_meal_val[(page - 1) * line:page * line]
  373. store_meal_list = []
  374. for store_meal in store_meals:
  375. store_meal_id = store_meal['id']
  376. # 获取支付方式列表
  377. pay_type_list = [
  378. pay_type['id'] for pay_type in Store_Meal.objects.get(
  379. id=store_meal_id).pay_type.values('id')]
  380. # 查询product_id
  381. product_id = ''
  382. subscription_group = ''
  383. subscription_group_id = ''
  384. package_type = 0
  385. in_app_purchase_qs = InAppPurchasePackage.objects.filter(rank__id=store_meal_id).\
  386. values('product_id', 'subscription_group', 'subscription_group_id', 'package_type')
  387. if in_app_purchase_qs.exists():
  388. product_id = in_app_purchase_qs[0]['product_id']
  389. subscription_group = in_app_purchase_qs[0]['subscription_group']
  390. subscription_group_id = in_app_purchase_qs[0]['subscription_group_id']
  391. package_type = in_app_purchase_qs[0]['package_type']
  392. # 组织响应数据
  393. store_meal_list.append({
  394. 'storeMealID': store_meal_id,
  395. 'bucket': store_meal['bucket__bucket'],
  396. 'day': store_meal['day'],
  397. 'expire': store_meal['expire'],
  398. 'commodity_type': store_meal['commodity_type'],
  399. 'pay_type': pay_type_list,
  400. 'commodity_code': store_meal['commodity_code'],
  401. 'is_discounts': store_meal['is_discounts'],
  402. 'discount_price': store_meal['discount_price'],
  403. 'virtual_price': store_meal['virtual_price'],
  404. 'price': store_meal['price'],
  405. 'currency': store_meal['currency'],
  406. 'symbol': store_meal['symbol'],
  407. 'is_show': store_meal['is_show'],
  408. 'is_ai': store_meal['is_ai'],
  409. 'pixel_level': store_meal['pixel_level'],
  410. 'product_id': product_id,
  411. 'subscription_group': subscription_group,
  412. 'subscription_group_id': subscription_group_id,
  413. 'package_type': package_type,
  414. 'addTime': store_meal['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  415. 'updTime': store_meal['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  416. })
  417. print('store_meal_list: ', store_meal_list)
  418. return response.json(
  419. 0, {'list': store_meal_list, 'total': total})
  420. except Exception as e:
  421. print(e)
  422. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  423. def addOrEditStoreMeal(self, userID, request_dict, response):
  424. # 添加/编辑套餐
  425. print('request_dict: ', request_dict)
  426. storeMealID = request_dict.get('storeMealID', None)
  427. bucket = request_dict.get('bucket', '')
  428. day = int(request_dict.get('day', 0))
  429. expire = int(request_dict.get('expire', 0))
  430. commodity_type = int(request_dict.get('commodity_type', 0))
  431. pay_type = request_dict.get(
  432. 'pay_type', '')[
  433. 1:-1].split(',') # '[1,2]' -> ['1','2']
  434. commodity_code = request_dict.get('commodity_code', '')
  435. is_discounts = int(request_dict.get('is_discounts', 0))
  436. discount_price = request_dict.get('discount_price', '')
  437. virtual_price = request_dict.get('virtual_price', '')
  438. price = request_dict.get('price', '')
  439. currency = request_dict.get('currency', '')
  440. symbol = request_dict.get('symbol', '')
  441. is_show = int(request_dict.get('is_show', 0))
  442. is_ai = int(request_dict.get('is_ai', 0))
  443. pixel_level = int(request_dict.get('pixel_level', 0))
  444. product_id = request_dict.get('product_id', '')
  445. subscription_group = request_dict.get('subscription_group', '')
  446. subscription_group_id = request_dict.get('subscription_group_id', '')
  447. package_type = int(request_dict.get('package_type', 0))
  448. isEdit = request_dict.get('isEdit', None)
  449. if not all([bucket, pay_type, price, currency, symbol]):
  450. return response.json(444)
  451. try:
  452. bucket_id = VodBucketModel.objects.filter(
  453. bucket=bucket).values('id')[0]['id']
  454. now_time = int(time.time())
  455. store_meal_data = {
  456. 'bucket_id': bucket_id,
  457. 'day': day,
  458. 'expire': expire,
  459. 'commodity_type': commodity_type,
  460. 'commodity_code': commodity_code,
  461. 'is_discounts': is_discounts,
  462. 'discount_price': discount_price,
  463. 'virtual_price': virtual_price,
  464. 'price': price,
  465. 'currency': currency,
  466. 'symbol': symbol,
  467. 'is_show': is_show,
  468. 'is_ai': is_ai,
  469. 'pixel_level': pixel_level
  470. }
  471. if isEdit:
  472. if not storeMealID:
  473. return response.json(444)
  474. Store_Meal.objects.filter(
  475. id=storeMealID).update(
  476. **store_meal_data)
  477. Store_Meal.objects.get(id=storeMealID).pay_type.set(pay_type)
  478. # 更新苹果内购套餐
  479. in_app_purchase_qs = InAppPurchasePackage.objects.filter(rank__id=storeMealID)
  480. if in_app_purchase_qs.exists():
  481. in_app_purchase_qs.update(
  482. product_id=product_id, subscription_group=subscription_group,
  483. subscription_group_id=subscription_group_id, package_type=package_type, update_time=now_time)
  484. else:
  485. if any([product_id, subscription_group, subscription_group_id, package_type]):
  486. InAppPurchasePackage.objects.create(
  487. rank_id=storeMealID, subscription_group=subscription_group,
  488. subscription_group_id=subscription_group_id, package_type=package_type,
  489. created_time=now_time, update_time=now_time
  490. )
  491. else:
  492. store_meal = Store_Meal.objects.create(**store_meal_data).pay_type.set(pay_type)
  493. # 新增苹果内购套餐
  494. if any([product_id, subscription_group, subscription_group_id, package_type]):
  495. store_meal_id = store_meal.id
  496. InAppPurchasePackage.objects.create(
  497. rank_id=store_meal_id, subscription_group=subscription_group,
  498. subscription_group_id=subscription_group_id, package_type=package_type,
  499. created_time=now_time, update_time=now_time
  500. )
  501. return response.json(0)
  502. except Exception as e:
  503. print(e)
  504. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  505. def deleteStoreMeal(self, userID, request_dict, response):
  506. # 删除套餐信息
  507. print('request_dict: ', request_dict)
  508. storeMealID = request_dict.get('storeMealID', None)
  509. if not storeMealID:
  510. return response.json(444)
  511. try:
  512. InAppPurchasePackage.objects.filter(rank_id=storeMealID).delete()
  513. Store_Meal.objects.filter(id=storeMealID).delete()
  514. return response.json(0)
  515. except Exception as e:
  516. print(e)
  517. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  518. def getStoreMealLanguage(self, userID, request_dict, response):
  519. # 获取套餐语言
  520. print('request_dict: ', request_dict)
  521. storeMealID = request_dict.get('storeMealID', None)
  522. pageNo = request_dict.get('pageNo', None)
  523. pageSize = request_dict.get('pageSize', None)
  524. if not all([pageNo, pageSize]):
  525. return response.json(444)
  526. page = int(pageNo)
  527. line = int(pageSize)
  528. try:
  529. if storeMealID: # 条件查询
  530. store_meal_lang_qs = Store_Meal.objects.filter(id=storeMealID)
  531. else: # 查询全部
  532. store_meal_lang_qs = Store_Meal.objects.filter(
  533. lang__isnull=False)
  534. store_meal_lang_val = store_meal_lang_qs.values(
  535. 'id',
  536. 'lang__id',
  537. 'lang__lang',
  538. 'lang__title',
  539. 'lang__content',
  540. 'lang__discount_content',
  541. 'lang__new_title'
  542. )
  543. total = len(store_meal_lang_val)
  544. store_meal_langs = store_meal_lang_val[(page - 1) * line:page * line]
  545. store_meal_lang_list = []
  546. for store_meal_lang in store_meal_langs:
  547. store_meal_lang_list.append({
  548. 'storeMealID': store_meal_lang['id'],
  549. 'langID': store_meal_lang['lang__id'],
  550. 'lang': store_meal_lang['lang__lang'],
  551. 'title': store_meal_lang['lang__title'],
  552. 'content': store_meal_lang['lang__content'],
  553. 'discountContent': store_meal_lang['lang__discount_content'],
  554. 'new_title': str(store_meal_lang['lang__new_title']),
  555. })
  556. print('store_meal_lang_list: ', store_meal_lang_list)
  557. return response.json(
  558. 0, {'list': store_meal_lang_list, 'total': total})
  559. except Exception as e:
  560. print(e)
  561. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  562. def addOrEditStoreMealLanguage(self, userID, request_dict, response):
  563. # 添加/编辑套餐语言
  564. print('request_dict: ', request_dict)
  565. storeMealID = request_dict.get('storeMealID', None)
  566. lang = request_dict.get('lang', None)
  567. title = request_dict.get('title', None)
  568. content = request_dict.get('content', None)
  569. discount_content = request_dict.get('discount_content', '')
  570. new_title = request_dict.get('new_title', '')
  571. isEdit = request_dict.get('isEdit', None)
  572. if not all([storeMealID, lang, title, content]):
  573. return response.json(444)
  574. try:
  575. if new_title != '':
  576. new_title = eval(new_title)
  577. # 查询套餐是否存在
  578. store_meal_qs = Store_Meal.objects.get(id=storeMealID)
  579. if not store_meal_qs:
  580. return response.json(173)
  581. if isEdit: # 编辑
  582. langID = request_dict.get('langID', None)
  583. if not langID:
  584. return response.json(444)
  585. Lang.objects.filter(
  586. id=langID).update(
  587. lang=lang,
  588. title=title,
  589. content=content,
  590. discount_content=discount_content,
  591. new_title=new_title
  592. )
  593. else: # 添加
  594. lang_obj = Lang.objects.filter(
  595. lang=lang,
  596. title=title,
  597. content=content,
  598. discount_content=discount_content,
  599. new_title=new_title
  600. )
  601. if not lang_obj.exists():
  602. # 数据不存在,lang表创建数据
  603. Lang.objects.create(
  604. lang=lang,
  605. title=title,
  606. content=content,
  607. discount_content=discount_content,
  608. new_title=new_title
  609. )
  610. lang_obj = Lang.objects.filter(
  611. lang=lang,
  612. title=title,
  613. content=content,
  614. discount_content=discount_content,
  615. new_title=new_title
  616. )
  617. store_meal_qs.lang.add(*lang_obj) # store_meal表添加语言数据
  618. return response.json(0)
  619. except Exception as e:
  620. print(e)
  621. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  622. def deleteStoreMealLanguage(self, userID, request_dict, response):
  623. # 删除套餐语言
  624. storeMealID = request_dict.get('storeMealID', None)
  625. langID = request_dict.get('langID', None)
  626. if not all([storeMealID, langID]):
  627. return response.json(444)
  628. try:
  629. storeMeal_qs = Store_Meal.objects.get(id=storeMealID)
  630. if not storeMeal_qs:
  631. return response.json(173)
  632. lang_qs = Lang.objects.filter(id=langID)
  633. storeMeal_qs.lang.remove(*lang_qs)
  634. return response.json(0)
  635. except Exception as e:
  636. print(e)
  637. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  638. def getCdkList(self, userID, request_dict, response):
  639. # 获取激活码列表
  640. pageNo = request_dict.get('pageNo', None)
  641. pageSize = request_dict.get('pageSize', None)
  642. cdk = request_dict.get('cdk', None)
  643. order = request_dict.get('order', None)
  644. is_activate = request_dict.get('is_activate', None)
  645. mold = request_dict.get('mold', None)
  646. lang = request_dict.get('lang', 'cn')
  647. if not all([pageNo, pageSize]):
  648. return response.json(444)
  649. page = int(pageNo)
  650. line = int(pageSize)
  651. try:
  652. if cdk:
  653. searchVal = cdk.strip()
  654. if order:
  655. searchVal = order.strip()
  656. if is_activate:
  657. searchVal = is_activate.strip()
  658. cdk_qs = CDKcontextModel.objects.filter().all()
  659. if cdk:
  660. cdk_qs = cdk_qs.filter(cdk__contains=searchVal)
  661. if order:
  662. cdk_qs = cdk_qs.filter(order__contains=searchVal)
  663. if is_activate:
  664. cdk_qs = cdk_qs.filter(is_activate=searchVal)
  665. if mold:
  666. cdk_qs = cdk_qs.filter(rank__bucket__mold=mold)
  667. cdk_qs = cdk_qs.filter(rank__lang__lang=lang)
  668. cdk_qs = cdk_qs.annotate(rank__title=F('rank__lang__title'))
  669. cdk_qs = cdk_qs.values(
  670. 'id',
  671. 'cdk',
  672. 'create_time',
  673. 'valid_time',
  674. 'is_activate',
  675. 'is_down',
  676. 'rank__id',
  677. 'rank__title',
  678. 'order',
  679. 'create_time',
  680. 'rank__bucket__mold')
  681. cdk_qs = cdk_qs.order_by('-create_time') # 根据CDK创建时间降序排序
  682. count = cdk_qs.count()
  683. cdk_qs = cdk_qs[(page - 1) * line:page * line]
  684. return response.json(
  685. 0, {'list': list(cdk_qs), 'total': count})
  686. except Exception as e:
  687. print(e)
  688. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  689. def editExpress(self, request_dict, response):
  690. order_id = request_dict.get('orderID', None)
  691. express_id = request_dict.get('express_id', None)
  692. if not all([order_id, express_id]):
  693. return response.json(444, {'error param': 'orderID or express_id'})
  694. try:
  695. CDKcontextModel.objects.filter(order=order_id).update(express_id=express_id)
  696. return response.json(0)
  697. except Exception as e:
  698. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  699. def getVodStoreMeal(self, response):
  700. try:
  701. store_meal = Store_Meal.objects.filter(Q(is_show=0), ~Q(commodity_code='paypal_cycle'), ~Q(pay_type=10),
  702. Q(lang__lang='cn')).values('id', 'lang__title', 'lang__content',
  703. 'pixel_level', 'is_ai', 'pay_type')
  704. if not store_meal.exists():
  705. return response.json(0, [])
  706. store_meal_list = []
  707. for item in store_meal:
  708. pixel_content = ''
  709. if item['pay_type'] != 11:
  710. pixel_content = '(4k)' if item['pixel_level'] == 1 else '(4k以下)'
  711. ai_content = '+AI套餐' if item['is_ai'] == 1 else ''
  712. store_meal_list.append({'id': item['id'], 'title': item['lang__title'] + '-' + item[
  713. 'lang__content'] + ai_content + pixel_content})
  714. return response.json(0, store_meal_list)
  715. except Exception as e:
  716. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  717. def createCdk(self, request_dict, response):
  718. cdk_num = request_dict.get("cdknum", None)
  719. mold = request_dict.get('mold', None)
  720. order = request_dict.get('order', None)
  721. rank = request_dict.get('rank', None)
  722. if not all([cdk_num, rank]):
  723. return response.json(444, {'error param': 'cdknum or rank'})
  724. store_meal = Store_Meal.objects.filter(id=rank)
  725. # sm_qs = Store_Meal.objects.filter(
  726. # pay_type__payment='cdk_pay', bucket__mold=mold, is_show=0)
  727. if not store_meal.exists():
  728. return response.json(173)
  729. cdk_list = []
  730. for i in range(int(cdk_num)):
  731. now_time = int(time.time())
  732. cdk = hashlib.md5((str(uuid.uuid1()) +
  733. str(now_time)).encode('utf-8')).hexdigest()
  734. cdk_model = CDKcontextModel(
  735. cdk=cdk,
  736. create_time=now_time,
  737. valid_time=0,
  738. is_activate=0,
  739. is_down=0,
  740. rank_id=rank,
  741. order=order,
  742. )
  743. cdk_list.append(cdk_model)
  744. try:
  745. CDKcontextModel.objects.bulk_create(cdk_list)
  746. except Exception as e:
  747. return response.json(404, repr(e))
  748. else:
  749. return response.json(0)
  750. def deleteCdk(self, request_dict, response):
  751. cdk_id = request_dict.get("id", None)
  752. try:
  753. CDKcontextModel.objects.get(id=cdk_id).delete()
  754. return response.json(0)
  755. except Exception as e:
  756. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  757. def downloadCDK(self, request_dict, response):
  758. region = request_dict.get('region', None)
  759. content = ''
  760. if region == 'cn':
  761. # 下载国内未使用激活码
  762. content += '激活码(国内)\n'
  763. cdk_inactivate_qs = CDKcontextModel.objects.filter(is_down=0, is_activate=0, rank__bucket__mold=0,
  764. rank__is_show=0).values('cdk')
  765. else:
  766. # 下载国外未使用激活码
  767. content += '激活码(国外)\n'
  768. cdk_inactivate_qs = CDKcontextModel.objects.filter(is_down=0, is_activate=0, rank__bucket__mold=1,
  769. rank__is_show=0).values('cdk')
  770. for cdk_inactivate in cdk_inactivate_qs:
  771. content += cdk_inactivate['cdk'] + '\n'
  772. # print(content)
  773. cdk_inactivate_qs.update(is_down=1)
  774. response = StreamingHttpResponse(content)
  775. response['Content-Type'] = 'application/octet-stream'
  776. response['Content-Disposition'] = 'attachment;filename="CDK.txt"'
  777. return response
  778. @staticmethod
  779. def getCouponList(request_dict, response):
  780. combo_ids = request_dict.get('comboID', None)
  781. pageNo = request_dict.get('pageNo', None)
  782. pageSize = request_dict.get('pageSize', None)
  783. if not all([pageNo, pageSize]):
  784. return response.json(444)
  785. page = int(pageNo)
  786. line = int(pageSize)
  787. try:
  788. if combo_ids: # 根据套餐id查询
  789. combo_id_list = combo_ids.split(",")
  790. coupon_id_list = CouponCombo.objects.filter(combo_id=combo_id_list).values_list('coupon_id', flat=True)
  791. coupon_qs = CouponConfigModel.objects.filter(id__in=coupon_id_list).values(
  792. 'id', 'type', 'use_range', 'coupon_discount')
  793. else:
  794. coupon_qs = CouponConfigModel.objects.filter().values(
  795. 'id', 'type', 'use_range', 'coupon_discount')
  796. count = coupon_qs.count()
  797. coupon_list = list(coupon_qs[(page - 1) * line:page * line])
  798. for coupon in coupon_list:
  799. coupon['combo_id'] = 'NA'
  800. coupon_combo_qs = CouponCombo.objects.filter(coupon_id=coupon['id']).values_list('combo_id', flat=True)
  801. if coupon_combo_qs.exists():
  802. coupon['combo_id'] = list(set(list(coupon_combo_qs)))
  803. return response.json(0, {'list': coupon_list, 'total': count})
  804. except Exception as e:
  805. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  806. @staticmethod
  807. def getCouponId(response):
  808. coupon_qs = CouponConfigModel.objects.all().values('id')
  809. return response.json(0, {'list': list(coupon_qs)})
  810. @staticmethod
  811. def addOrEditCoupon(request_dict, response):
  812. coupon_id = request_dict.get('couponID', None)
  813. combo_ids = request_dict.get('comboID', None)
  814. coupon_type = int(request_dict.get('type', 0))
  815. use_range = request_dict.get('useRange', 0)
  816. coupon_discount = request_dict.get('couponDiscount', '')
  817. is_edit = request_dict.get('isEdit', None)
  818. if not all([coupon_type, coupon_discount]):
  819. return response.json(444)
  820. try:
  821. now_time = int(time.time())
  822. coupon_data = {
  823. 'type': coupon_type,
  824. 'use_range': use_range,
  825. 'coupon_discount': coupon_discount
  826. }
  827. combo_id_list = combo_ids.split(",")
  828. if is_edit:
  829. if not coupon_id:
  830. return response.json(444)
  831. CouponConfigModel.objects.filter(id=coupon_id).update(**coupon_data)
  832. CouponCombo.objects.filter(coupon_id=coupon_id).delete()
  833. for combo_id in combo_id_list:
  834. CouponCombo.objects.create(coupon_id=coupon_id, combo_id=combo_id,
  835. create_time=now_time, update_time=now_time)
  836. else:
  837. coupon = CouponConfigModel.objects.create(**coupon_data)
  838. coupon_id = coupon.id
  839. # 关联套餐
  840. for combo_id in combo_id_list:
  841. CouponCombo.objects.create(coupon_id=coupon_id, combo_id=combo_id,
  842. create_time=now_time, update_time=now_time)
  843. return response.json(0)
  844. except Exception as e:
  845. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  846. @staticmethod
  847. def deleteCoupon(request_dict, response):
  848. coupon_id = request_dict.get('couponID', None)
  849. if not coupon_id:
  850. return response.json(444)
  851. try:
  852. CouponConfigModel.objects.filter(id=coupon_id).delete()
  853. return response.json(0)
  854. except Exception as e:
  855. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  856. @staticmethod
  857. def getCouponLangList(request_dict, response):
  858. coupon_id = request_dict.get('couponID', None)
  859. page = request_dict.get('pageNo', None)
  860. line = request_dict.get('pageSize', None)
  861. if not all([page, line]):
  862. return response.json(444)
  863. page = int(page)
  864. line = int(line)
  865. try:
  866. if coupon_id: # 条件查询
  867. coupon_qs = CouponConfigModel.objects.filter(id=coupon_id)
  868. else: # 查询语言id非空数据
  869. coupon_qs = CouponConfigModel.objects.filter(~Q(lang__id=None))
  870. coupon_lang_qs = coupon_qs.values(
  871. 'id',
  872. 'lang__id',
  873. 'lang__lang',
  874. 'lang__instruction',
  875. 'lang__quota',
  876. 'lang__unit',
  877. 'lang__remark'
  878. )
  879. total = len(coupon_lang_qs)
  880. coupon_lang_qs = coupon_lang_qs[(page - 1) * line:page * line]
  881. coupon_lang_list = []
  882. for coupon_lang in coupon_lang_qs:
  883. coupon_lang_list.append({
  884. 'couponID': coupon_lang['id'],
  885. 'langID': coupon_lang['lang__id'],
  886. 'lang': coupon_lang['lang__lang'],
  887. 'instruction': coupon_lang['lang__instruction'],
  888. 'quota': coupon_lang['lang__quota'],
  889. 'unit': coupon_lang['lang__unit'],
  890. 'remark': coupon_lang['lang__remark']
  891. })
  892. return response.json(0, {'list': coupon_lang_list, 'total': total})
  893. except Exception as e:
  894. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  895. @staticmethod
  896. def addOrEditCouponLang(request_dict, response):
  897. coupon_id = request_dict.get('couponID', None)
  898. lang = request_dict.get('lang', None)
  899. instruction = request_dict.get('instruction', '')
  900. quota = request_dict.get('quota', '')
  901. unit = request_dict.get('unit', '')
  902. unit = request_dict.get('unit', '')
  903. remark = request_dict.get('remark', None)
  904. is_edit = request_dict.get('isEdit', None)
  905. if not all([coupon_id, lang]):
  906. return response.json(444)
  907. try:
  908. # 查询优惠券是否存在
  909. coupon_qs = CouponConfigModel.objects.get(id=coupon_id)
  910. if not coupon_qs:
  911. return response.json(173)
  912. if is_edit: # 编辑
  913. lang_id = request_dict.get('langID', None)
  914. if not lang_id:
  915. return response.json(444)
  916. CouponLang.objects.filter(
  917. id=lang_id).update(
  918. lang=lang,
  919. instruction=instruction,
  920. quota=quota,
  921. unit=unit,
  922. remark=remark
  923. )
  924. else: # 添加
  925. lang_obj = CouponLang.objects.filter(
  926. lang=lang,
  927. instruction=instruction,
  928. quota=quota,
  929. unit=unit,
  930. remark=remark
  931. )
  932. if not lang_obj.exists():
  933. # 数据不存在,lang表创建数据
  934. CouponLang.objects.create(
  935. lang=lang,
  936. instruction=instruction,
  937. quota=quota,
  938. unit=unit,
  939. remark=remark
  940. )
  941. lang_obj = CouponLang.objects.filter(
  942. lang=lang,
  943. instruction=instruction,
  944. quota=quota,
  945. unit=unit,
  946. remark=remark
  947. )
  948. coupon_qs.lang.add(*lang_obj) # coupon_config表添加语言数据
  949. return response.json(0)
  950. except Exception as e:
  951. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  952. @staticmethod
  953. def deleteCouponLang(request_dict, response):
  954. coupon_id = request_dict.get('couponID', None)
  955. lang_id = request_dict.get('langID', None)
  956. if not all([coupon_id, lang_id]):
  957. return response.json(444)
  958. try:
  959. coupon_qs = CouponConfigModel.objects.get(id=coupon_id)
  960. if not coupon_qs:
  961. return response.json(173)
  962. lang_qs = CouponLang.objects.filter(id=lang_id)
  963. coupon_qs.lang.remove(*lang_qs)
  964. return response.json(0)
  965. except Exception as e:
  966. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  967. @staticmethod
  968. def add_coupon_lang_config(request_dict, response):
  969. coupon_id = request_dict.get('couponID')
  970. lang_configs = request_dict.get('langConfig')
  971. # 校验 coupon_id 和 langConfig 是否存在
  972. if not coupon_id or not lang_configs:
  973. return response.json(444)
  974. try:
  975. # 解析 langConfig 字段
  976. lang_configs = json.loads(lang_configs)
  977. coupon = CouponConfigModel.objects.filter(id=coupon_id).first()
  978. if not coupon:
  979. return response.json(173)
  980. # 先查询所有现有的语言配置
  981. existing_langs = {lang.lang: lang for lang in coupon.lang.all()}
  982. for lang_config in lang_configs:
  983. lang = lang_config.get("lang")
  984. if not lang:
  985. continue
  986. if lang in existing_langs:
  987. # 更新已有的语言配置
  988. lang_obj = existing_langs[lang]
  989. lang_obj.instruction = lang_config.get("instruction")
  990. lang_obj.quota = lang_config.get("quota")
  991. lang_obj.unit = lang_config.get("unit")
  992. lang_obj.remark = lang_config.get("remark")
  993. lang_obj.save() # 使用 save() 方法保存更改
  994. else:
  995. # 创建新的语言配置
  996. coupon_lang = CouponLang(
  997. lang=lang,
  998. instruction=lang_config.get("instruction"),
  999. quota=lang_config.get("quota"),
  1000. unit=lang_config.get("unit"),
  1001. remark=lang_config.get("remark")
  1002. )
  1003. coupon_lang.save() # 使用 save() 方法保存新配置
  1004. coupon.lang.add(coupon_lang) # 添加到 coupon 的 lang 关联
  1005. return response.json(0)
  1006. except json.JSONDecodeError as e:
  1007. return response.json(500, f"JSON Decode Error: {repr(e)}")
  1008. except Exception as e:
  1009. return response.json(500, f"error_line: {e.__traceback__.tb_lineno}, error_msg: {repr(e)}")
  1010. @staticmethod
  1011. def getCouponUsingList(request_dict, response):
  1012. username = request_dict.get('username', None)
  1013. phone = request_dict.get('phone', None)
  1014. user_email = request_dict.get('userEmail', None)
  1015. use_status = request_dict.get('useStatus', None)
  1016. page_no = request_dict.get('pageNo', None)
  1017. page_size = request_dict.get('pageSize', None)
  1018. if not all([page_no, page_size]):
  1019. return response.json(444)
  1020. page = int(page_no)
  1021. line = int(page_size)
  1022. try:
  1023. coupon_qs = CouponModel.objects.all()
  1024. if use_status:
  1025. coupon_qs = coupon_qs.filter(use_status=use_status)
  1026. if not coupon_qs.exists():
  1027. return response.json(0, [])
  1028. device_user_qs = Device_User.objects.filter().values(
  1029. 'userID', 'username', 'phone', 'userEmail')
  1030. if username:
  1031. device_user_qs = device_user_qs.filter(username=username)
  1032. if not device_user_qs.exists():
  1033. return response.json(0, [])
  1034. user_id = device_user_qs.first()['userID']
  1035. coupon_qs = coupon_qs.filter(userID=user_id)
  1036. if phone:
  1037. device_user_qs = device_user_qs.filter(phone__contains=phone)
  1038. if not device_user_qs.exists():
  1039. return response.json(0, [])
  1040. user_id = device_user_qs.first()['userID']
  1041. coupon_qs = coupon_qs.filter(userID=user_id)
  1042. if user_email:
  1043. device_user_qs = device_user_qs.filter(userEmail__contains=user_email)
  1044. if not device_user_qs.exists():
  1045. return response.json(0, [])
  1046. user_id = device_user_qs.first()['userID']
  1047. coupon_qs = coupon_qs.filter(userID=user_id)
  1048. coupon_qs = coupon_qs.values(
  1049. 'id', 'use_status', 'distribute_time', 'valid_time', 'update_time', 'create_time', 'userID',
  1050. 'coupon_config__id', 'userID')
  1051. count = coupon_qs.count()
  1052. coupons = coupon_qs[(page - 1) * line:page * line]
  1053. coupon_list = []
  1054. for coupon in coupons:
  1055. device_user_qs = Device_User.objects.filter(userID=coupon['userID']).values('username', 'phone',
  1056. 'userEmail')
  1057. username = device_user_qs[0]['username'] if device_user_qs.exists() else ''
  1058. phone = device_user_qs[0]['phone'] if device_user_qs.exists() else ''
  1059. user_email = device_user_qs[0]['userEmail'] if device_user_qs.exists() else ''
  1060. coupon_list.append({
  1061. 'id': coupon['id'],
  1062. 'useStatus': coupon['use_status'],
  1063. 'distributeTime': coupon['distribute_time'],
  1064. 'validTime': coupon['valid_time'],
  1065. 'updateTime': coupon['update_time'],
  1066. 'createTime': coupon['create_time'],
  1067. 'couponID': coupon['coupon_config__id'],
  1068. 'username': username,
  1069. 'phone': phone,
  1070. 'userEmail': user_email,
  1071. })
  1072. return response.json(0, {'list': coupon_list, 'total': count})
  1073. except Exception as e:
  1074. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1075. @staticmethod
  1076. def editCouponUsing(request_dict, response):
  1077. id = request_dict.get('id', None)
  1078. use_status = request_dict.get('useStatus', 0)
  1079. valid_time = request_dict.get('validTime', None)
  1080. if not all([id, use_status, valid_time]):
  1081. return response.json(444)
  1082. try:
  1083. now_time = int(time.time())
  1084. CouponModel.objects.filter(id=id).update(use_status=use_status, valid_time=valid_time, update_time=now_time)
  1085. return response.json(0)
  1086. except Exception as e:
  1087. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1088. @staticmethod
  1089. def deleteCouponUsing(request_dict, response):
  1090. id = request_dict.get('id', None)
  1091. if not id:
  1092. return response.json(444)
  1093. try:
  1094. CouponModel.objects.filter(id=id).delete()
  1095. return response.json(0)
  1096. except Exception as e:
  1097. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1098. def getDeviceOrderList(self, request_dict, response):
  1099. print('request_dict: ', request_dict)
  1100. pageNo = request_dict.get('pageNo', None)
  1101. pageSize = request_dict.get('pageSize', None)
  1102. uid = request_dict.get('uid', None)
  1103. channel = request_dict.get('channel', None)
  1104. orderID = request_dict.get('orderID', None)
  1105. order_ids = request_dict.get('order_ids', None)
  1106. userID__username = request_dict.get('userID__username', None)
  1107. currency = request_dict.get('currency', None)
  1108. payType = request_dict.get('payType', None)
  1109. status = request_dict.get('status', None)
  1110. timeRange = request_dict.getlist('timeRange[]', None)
  1111. orderType = request_dict.get('orderType', None)
  1112. serialNumber = request_dict.get('serialNumber', None)
  1113. trade_no = request_dict.get('tradeNo', None)
  1114. userID__phone = request_dict.get('userID__phone', None)
  1115. if not all([pageNo, pageSize]):
  1116. return response.json(444)
  1117. page = int(pageNo)
  1118. line = int(pageSize)
  1119. try:
  1120. omqs = Order_Model.objects.all()
  1121. # 筛选指定设备id的订单
  1122. if uid:
  1123. omqs = omqs.filter(UID=uid)
  1124. if channel:
  1125. omqs = omqs.filter(channel=channel)
  1126. if orderID:
  1127. omqs = omqs.filter(orderID=orderID)
  1128. if userID__username:
  1129. omqs = omqs.filter(userID__username=userID__username)
  1130. if currency:
  1131. omqs = omqs.filter(currency=currency)
  1132. if payType:
  1133. omqs = omqs.filter(payType=payType)
  1134. if status:
  1135. omqs = omqs.filter(status=status)
  1136. if orderType:
  1137. omqs = omqs.filter(order_type=int(orderType))
  1138. if trade_no:
  1139. omqs = omqs.filter(trade_no=trade_no)
  1140. if userID__phone:
  1141. omqs = omqs.filter(userID__phone=userID__phone)
  1142. if order_ids:
  1143. order_ids = order_ids.split(',')
  1144. omqs = omqs.filter(Q(orderID__in=order_ids) | Q(trade_no__in=order_ids))
  1145. if serialNumber:
  1146. device_uid = CommonService.query_uid_with_serial(serialNumber)
  1147. omqs = omqs.filter(UID=device_uid)
  1148. if timeRange:
  1149. startTime, endTime = int(
  1150. timeRange[0][:-3]), int(timeRange[1][:-3])
  1151. omqs = omqs.filter(
  1152. addTime__gte=startTime,
  1153. addTime__lte=endTime)
  1154. if not omqs.exists():
  1155. return response.json(0, [])
  1156. order_list = []
  1157. count = omqs.count()
  1158. order_ql = omqs.values("orderID", "UID", "userID__username", "userID__NickName", "channel", "desc", "price",
  1159. "refunded_amount", "currency", "addTime", "updTime", "paypal", "payType",
  1160. "rank__day", "rank__price", "status", "order_type", "paymentID", "trade_no",
  1161. "payTime", "userID__region_country", "userID__phone")
  1162. order_ql = order_ql.order_by('-addTime') # 根据CDK创建时间降序排序
  1163. order_ql = order_ql[(page - 1) * line:page * line]
  1164. for order in order_ql:
  1165. # 查询国家信息
  1166. country = 'N/A'
  1167. country_qs = CountryModel.objects.filter(id=order['userID__region_country']).values('country_name')
  1168. if country_qs.exists():
  1169. country = country_qs[0]['country_name']
  1170. serialNumber = CommonService.query_serial_with_uid(order['UID'])
  1171. data = {
  1172. 'orderID': order['orderID'],
  1173. 'UID': order['UID'],
  1174. 'userID__username': order['userID__username'],
  1175. 'userID__NickName': order['userID__NickName'],
  1176. 'channel': order['channel'],
  1177. 'desc': order['desc'],
  1178. 'price': order['price'],
  1179. 'refunded_amount': order['refunded_amount'],
  1180. 'currency': order['currency'],
  1181. 'addTime': order['addTime'],
  1182. 'updTime': order['updTime'],
  1183. 'paypal': order['paypal'],
  1184. 'payType': order['payType'],
  1185. 'rank__day': order['rank__day'],
  1186. 'rank__price': order['rank__price'],
  1187. 'status': order['status'],
  1188. 'refund_status': 1 if order['status'] in [1, 4, 6] else 2, # 订单显示(或不显示)退款功能
  1189. 'order_type': order['order_type'],
  1190. 'payTime': order['payTime'] if order['payTime'] else 'N/A',
  1191. 'serialNumber': 'N/A' if serialNumber == order['UID'] else serialNumber,
  1192. 'country': country,
  1193. 'userID__phone': order['userID__phone'],
  1194. }
  1195. # 订单显示(或不显示)停用
  1196. if order['order_type'] == 0: # 云存
  1197. uid_bucket = UID_Bucket.objects.filter(uid=order['UID']).values('use_status')
  1198. user_status = uid_bucket[0]['use_status'] if uid_bucket.exists() else ''
  1199. if user_status != '':
  1200. data['user_status'] = user_status
  1201. else:
  1202. data['user_status'] = 2
  1203. elif order['order_type'] == 1: # ai
  1204. ai_service_qs = AiService.objects.filter(
  1205. Q(orders_id=order['orderID']) & ~Q(use_status=2))
  1206. if ai_service_qs.exists():
  1207. data['user_status'] = 1
  1208. else:
  1209. data['user_status'] = 2
  1210. elif order['order_type'] == 2: # 联通4G
  1211. unicom_combor_order_qs = UnicomComboOrderInfo.objects.filter(
  1212. Q(order_id=order['orderID']) & ~Q(status=2))
  1213. if unicom_combor_order_qs.exists():
  1214. data['user_status'] = 1
  1215. else:
  1216. data['user_status'] = 2
  1217. # 添加PayPal交易号字段
  1218. data['trade_no'] = 'N/A'
  1219. if data['payType'] == 1:
  1220. data['trade_no'] = order['trade_no'] if order['trade_no'] else 'N/A'
  1221. data['express_id'] = ''
  1222. if data['payType'] == 11:
  1223. cdk_context_qs = CDKcontextModel.objects.filter(order=data['orderID']).values('express_id')
  1224. if cdk_context_qs.exists():
  1225. data['express_id'] = cdk_context_qs[0]['express_id']
  1226. order_list.append(data)
  1227. return response.json(
  1228. 0, {'list': order_list, 'total': count})
  1229. except Exception as e:
  1230. print(e)
  1231. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1232. def getAbnormalOrderList(self, request_dict, response):
  1233. print('request_dict: ', request_dict)
  1234. pageNo = request_dict.get('page_no', None)
  1235. pageSize = request_dict.get('page_size', None)
  1236. order_id = request_dict.get('order_id', None)
  1237. username = request_dict.get('username', None)
  1238. pay_type = request_dict.get('pay_type', None)
  1239. status = request_dict.get('status', None)
  1240. trade_no = request_dict.get('trade_no', None)
  1241. agreement_id = request_dict.get('agreement_id', None)
  1242. start_time = request_dict.get('start_time', None)
  1243. end_time = request_dict.get('end_time', None)
  1244. if not all([pageNo, pageSize]):
  1245. return response.json(444)
  1246. page = int(pageNo)
  1247. line = int(pageSize)
  1248. try:
  1249. order_qs = AbnormalOrder.objects.all()
  1250. # 筛选指定订单
  1251. if order_id:
  1252. order_qs = order_qs.filter(order_id=order_id)
  1253. if username:
  1254. order_qs = order_qs.filter(username=username)
  1255. if pay_type:
  1256. order_qs = order_qs.filter(pay_type=pay_type)
  1257. if status:
  1258. order_qs = order_qs.filter(status=status)
  1259. if trade_no:
  1260. order_qs = order_qs.filter(trade_no=trade_no)
  1261. if agreement_id:
  1262. order_qs = order_qs.filter(agreement_id=agreement_id)
  1263. if start_time and end_time:
  1264. order_qs = order_qs.filter(pay_time__gte=start_time, pay_time__lt=end_time)
  1265. if not order_qs.exists():
  1266. return response.json(0, [])
  1267. count = order_qs.count()
  1268. order_qs = order_qs.values("id", "order_id", "username", "pay_type", "status", "trade_no", "agreement_id",
  1269. "price", "pay_time", "meal_name").order_by('-pay_time')[
  1270. (page - 1) * line:page * line]
  1271. return response.json(0, {'list': list(order_qs), 'total': count})
  1272. except Exception as e:
  1273. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1274. def updateAbnormalOrder(self, request_dict, response):
  1275. abnormal_order_id = request_dict.get('id', None)
  1276. if not all([abnormal_order_id]):
  1277. return response.json(444)
  1278. abnormal_order = AbnormalOrder.objects.filter(id=abnormal_order_id)
  1279. if not abnormal_order.exists():
  1280. return response.json(173)
  1281. try:
  1282. abnormal_order_qs = abnormal_order.values('trade_no', 'pay_time', 'pay_type')
  1283. trade_no = abnormal_order_qs[0]['trade_no']
  1284. pay_time = abnormal_order_qs[0]['pay_time']
  1285. pay_type = abnormal_order_qs[0]['pay_type']
  1286. if pay_type in [0, 1]: # 处理paypal订单
  1287. order_qs = Order_Model.objects.filter(trade_no=trade_no)
  1288. if order_qs.exists():
  1289. order_qs.update(payTime=pay_time, addTime=pay_time)
  1290. abnormal_order.update(status=1)
  1291. return response.json(0)
  1292. params = {'trade_no': trade_no, 'pay_time': pay_time}
  1293. eur_response = requests.get('https://www.zositeche.com/testApi/checkOrderExist', params=params)
  1294. if eur_response.status_code == 200:
  1295. result = eur_response.json()
  1296. if result['result_code'] == 0 and result['result']['is_exist']:
  1297. abnormal_order.update(status=1)
  1298. elif pay_type == 3: # 处理微信订单
  1299. pass
  1300. return response.json(0)
  1301. except Exception as e:
  1302. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1303. def getDailyReconciliation(self, request_dict, response):
  1304. print('request_dict: ', request_dict)
  1305. page_no = request_dict.get('page_no', None)
  1306. page_size = request_dict.get('page_size', None)
  1307. start_time = request_dict.get('start_time', None)
  1308. end_time = request_dict.get('end_time', None)
  1309. if not all([page_no, page_size]):
  1310. return response.json(444)
  1311. page = int(page_no)
  1312. line = int(page_size)
  1313. try:
  1314. daily_reconciliation = DailyReconciliation.objects.all()
  1315. # 筛选指定订单
  1316. if start_time and end_time:
  1317. daily_reconciliation = daily_reconciliation.filter(time__gte=start_time, time__lt=end_time)
  1318. if not daily_reconciliation.exists():
  1319. return response.json(0, [])
  1320. count = daily_reconciliation.count()
  1321. daily_reconciliation_qs = daily_reconciliation.values("id", "order_ids", "ansjer_total", "ansjer_num",
  1322. "paypal_num", "paypal_total", "time").order_by(
  1323. '-time')[(page - 1) * line:page * line]
  1324. for item in daily_reconciliation_qs:
  1325. item['ansjer_handle'] = 0 if item['ansjer_total'] and item['ansjer_num'] else 1
  1326. item['paypal_handle'] = 0 if item['paypal_total'] and item['paypal_num'] else 1
  1327. item['order_info'] = []
  1328. if not item['order_ids']:
  1329. continue
  1330. order_list = item['order_ids'].split(',')
  1331. order_qs = Order_Model.objects.filter(Q(orderID__in=order_list) | Q(trade_no__in=order_list)).values(
  1332. "orderID", "UID", "userID__username", "userID__NickName", "channel", "desc", "price",
  1333. "refunded_amount", "currency", "addTime", "updTime", "paypal", "payType", "rank__day",
  1334. "rank__price", "status", "order_type", "paymentID", "trade_no", "payTime", "userID__region_country",
  1335. "userID__phone").order_by('-addTime')
  1336. while True:
  1337. params = {'pageNo': 1, 'pageSize': 100, 'order_ids': item['order_ids']}
  1338. eur_response = requests.get('https://www.zositeche.com/serveManagement/getDeviceOrderList', params)
  1339. if eur_response.status_code == 200:
  1340. result = eur_response.json()
  1341. if result['code'] == 0:
  1342. item['order_info'] = result['data']['list'] if result['data'] else result['data']
  1343. break
  1344. for order in order_qs:
  1345. # 查询国家信息
  1346. country = 'N/A'
  1347. country_qs = CountryModel.objects.filter(id=order['userID__region_country']).values('country_name')
  1348. if country_qs.exists():
  1349. country = country_qs[0]['country_name']
  1350. serial_number = CommonService.query_serial_with_uid(order['UID'])
  1351. data = {'orderID': order['orderID'], 'UID': order['UID'],
  1352. 'userID__username': order['userID__username'],
  1353. 'userID__NickName': order['userID__NickName'], 'channel': order['channel'],
  1354. 'desc': order['desc'], 'price': order['price'], 'refunded_amount': order['refunded_amount'],
  1355. 'currency': order['currency'], 'addTime': order['addTime'], 'updTime': order['updTime'],
  1356. 'paypal': order['paypal'], 'payType': order['payType'], 'rank__day': order['rank__day'],
  1357. 'rank__price': order['rank__price'], 'status': order['status'],
  1358. 'order_type': order['order_type'],
  1359. 'payTime': order['payTime'] if order['payTime'] else 'N/A',
  1360. 'serialNumber': 'N/A' if serial_number == order['UID'] else serial_number,
  1361. 'country': country, 'userID__phone': order['userID__phone'], 'trade_no': 'N/A'}
  1362. # 添加PayPal交易号字段
  1363. if data['payType'] == 1:
  1364. data['trade_no'] = order['trade_no'] if order['trade_no'] else 'N/A'
  1365. data['express_id'] = ''
  1366. if data['payType'] == 11:
  1367. cdk_context_qs = CDKcontextModel.objects.filter(order=data['orderID']).values('express_id')
  1368. if cdk_context_qs.exists():
  1369. data['express_id'] = cdk_context_qs[0]['express_id']
  1370. item['order_info'].append(data)
  1371. return response.json(0, {'list': list(daily_reconciliation_qs), 'total': count})
  1372. except Exception as e:
  1373. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1374. def paypalOrderReconcile(self, request, request_dict, response):
  1375. file = request.FILES.get('file', None)
  1376. if not all([file]):
  1377. return response.json(444, {'error param': 'file'})
  1378. try:
  1379. rd_book = xlrd.open_workbook(filename=None, file_contents=file.read())
  1380. rd_sheet = rd_book.sheet_by_index(0)
  1381. date = rd_sheet.cell_value(1, 0)
  1382. month = int(date.split('/')[0])
  1383. year = int(date.split('/')[2])
  1384. last_day = calendar.monthrange(year, month)[1]
  1385. start_time = datetime.datetime(year, month, 1)
  1386. end_time = datetime.datetime(year, month, last_day) + datetime.timedelta(hours=24)
  1387. start_time = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
  1388. end_time = CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S'))
  1389. wt_book = xlwt.Workbook(encoding='utf-8')
  1390. wt_sheet = wt_book.add_sheet('paypal对账结果', cell_overwrite_ok=True)
  1391. row_start = 0
  1392. # 第一部分表格填写
  1393. first_header = ['支付类型', '销售总金额', '销售总数量', '退款总额', '退款总数量', '应收金额', '平台手续费', '账务实收', '金额相差']
  1394. for index, content in enumerate(first_header):
  1395. wt_sheet.write(row_start, index, content)
  1396. row_start += 1
  1397. us_order_qs = Order_Model.objects.filter(addTime__gte=start_time, addTime__lt=end_time, payType=1,
  1398. status__in=[1, 5, 6]).values('trade_no', 'orderID', 'UID',
  1399. 'userID__username',
  1400. 'userID__NickName', 'channel',
  1401. 'desc', 'payType',
  1402. 'price', 'status',
  1403. 'refunded_amount', 'addTime',
  1404. 'updTime')
  1405. while True:
  1406. eur_response = requests.get('https://www.zositeche.com/cron/compared/AnsjerOrder',
  1407. params={'time': start_time, 'end_time': end_time})
  1408. if eur_response.status_code == 200:
  1409. result = eur_response.json()
  1410. if result['result_code'] == 0:
  1411. eur_order_list = result['result']
  1412. break
  1413. all_order_qs = list(us_order_qs) + eur_order_list
  1414. deletion_trade_no_list = []
  1415. trade_no_list = []
  1416. for i in all_order_qs:
  1417. trade_no_list.append(i['trade_no'])
  1418. if i['trade_no'] not in rd_sheet.col_values(9, 1):
  1419. deletion_trade_no_list.append(i)
  1420. wt_sheet.write(row_start, 0, 'PayPal')
  1421. # 第二部分表格填写
  1422. row_start += 2
  1423. paypal_money = 0
  1424. paypal_count = 0
  1425. fee_money = 0
  1426. refund_money = 0
  1427. refund_count = 0
  1428. for row in range(rd_sheet.nrows):
  1429. if row == 0:
  1430. wt_sheet.write(row_start, 0, '是否匹配账单')
  1431. for col in range(rd_sheet.ncols):
  1432. value = rd_sheet.cell_value(row, col)
  1433. temp_col = col + 1
  1434. wt_sheet.write(row_start, temp_col, str(value))
  1435. row_start += 1
  1436. continue
  1437. if rd_sheet.cell_value(row, 1) == '' and rd_sheet.cell_value(row, 2) == '' and rd_sheet.cell_value(row,
  1438. 3) == '':
  1439. break
  1440. fee_money += rd_sheet.cell_value(row, 6)
  1441. if rd_sheet.cell_value(row, 5) < 0:
  1442. refund_money += rd_sheet.cell_value(row, 5)
  1443. refund_count += 1
  1444. continue
  1445. paypal_money += rd_sheet.cell_value(row, 5)
  1446. paypal_count += 1
  1447. if rd_sheet.cell_value(row, 9) not in trade_no_list:
  1448. col_value_list = rd_sheet.row_values(row)
  1449. col_value_list.insert(0, '否')
  1450. for index, value in enumerate(col_value_list):
  1451. wt_sheet.write(row_start, index, str(value))
  1452. row_start += 1
  1453. # 第三部分表格填写
  1454. row_start += 1
  1455. third_header = ['是否匹配账单', '交易ID', '订单ID', '设备UID', '用户名', '账号昵称', '通道', '商品描述', '支付方式', '价格', '支付状态',
  1456. '已退金额', '添加时间', '更新时间']
  1457. for index, content in enumerate(third_header):
  1458. wt_sheet.write(row_start, index, content)
  1459. row_start += 1
  1460. for item in deletion_trade_no_list:
  1461. values_list = item.values()
  1462. for col, content in enumerate(values_list):
  1463. if col == 0:
  1464. wt_sheet.write(row_start, col, '否')
  1465. if col == 7:
  1466. content = 'PayPal'
  1467. if col == 9:
  1468. if content == 1:
  1469. content = '支付成功'
  1470. elif content == 5:
  1471. content = '全额退款'
  1472. elif content == 6:
  1473. content = '部分退款'
  1474. if col in [11, 12]:
  1475. content = CommonService.timestamp_to_str(int(content))
  1476. wt_sheet.write(row_start, col + 1, str(content))
  1477. row_start += 1
  1478. wt_sheet.write(1, 1, paypal_money)
  1479. wt_sheet.write(1, 2, paypal_count + refund_count)
  1480. wt_sheet.write(1, 3, refund_money)
  1481. wt_sheet.write(1, 4, refund_count)
  1482. wt_sheet.write(1, 5, paypal_money + refund_money)
  1483. wt_sheet.write(1, 6, fee_money)
  1484. wt_sheet.write(1, 7, paypal_money + refund_money + fee_money)
  1485. wt_sheet.write(1, 8, refund_money + fee_money)
  1486. res = HttpResponse(content_type='application/vnd.ms-excel')
  1487. res['Content-Disposition'] = 'attachment; filename={}'.format(escape_uri_path(file.name))
  1488. wt_book.save(res)
  1489. return res
  1490. except Exception as e:
  1491. print(e)
  1492. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1493. def wechatOrderReconcile(self, request, request_dict, response):
  1494. file = request.FILES.get('file', None)
  1495. if not all([file]):
  1496. return response.json(444, {'error param': 'file'})
  1497. try:
  1498. rd_book = xlrd.open_workbook(filename=None, file_contents=file.read())
  1499. rd_sheet = rd_book.sheet_by_index(0)
  1500. date = rd_sheet.cell_value(1, 0)
  1501. year = int(date.split('-')[0].replace('`', ''))
  1502. month = int(date.split('-')[1])
  1503. last_day = calendar.monthrange(year, month)[1]
  1504. start_time = datetime.datetime(year, month, 1)
  1505. end_time = datetime.datetime(year, month, last_day) + datetime.timedelta(hours=24)
  1506. start_time = int(start_time.timestamp())
  1507. end_time = int(end_time.timestamp())
  1508. wt_book = xlwt.Workbook(encoding='utf-8')
  1509. wt_sheet = wt_book.add_sheet('微信对账结果', cell_overwrite_ok=True)
  1510. row_start = 0
  1511. # 第一部分表格填写
  1512. first_header = ['支付类型', '销售总金额', '销售总数量', '退款总额', '退款总数量', '应收金额', '平台手续费', '账务实收', '金额相差']
  1513. for index, content in enumerate(first_header):
  1514. wt_sheet.write(row_start, index, content)
  1515. row_start += 1
  1516. all_order_qs = Order_Model.objects.filter(payTime__gte=start_time, payTime__lt=end_time, payType=3,
  1517. status__in=[1, 5, 6])
  1518. trade_no_list = []
  1519. order_id_list = []
  1520. for item in rd_sheet.col_values(6):
  1521. order_id_list.append(item.replace('`', ''))
  1522. for i in all_order_qs:
  1523. if i.orderID not in order_id_list:
  1524. trade_no_list.append(i.orderID)
  1525. wt_sheet.write(row_start, 0, '微信')
  1526. # 第二部分表格填写
  1527. row_start += 2
  1528. wechat_money = 0
  1529. fee_money = 0
  1530. refund_money = 0
  1531. refund_count = 0
  1532. wechat_count = 0
  1533. for row in range(rd_sheet.nrows):
  1534. if row == 0:
  1535. wt_sheet.write(row_start, 0, '是否匹配账单')
  1536. for col in range(rd_sheet.ncols):
  1537. value = rd_sheet.cell_value(row, col)
  1538. temp_col = col + 1
  1539. wt_sheet.write(row_start, temp_col, str(value))
  1540. row_start += 1
  1541. continue
  1542. if rd_sheet.cell_value(row, 0) == '总交易单数':
  1543. break
  1544. fee_money += float(rd_sheet.cell_value(row, 22).replace('`', ''))
  1545. if rd_sheet.cell_value(row, 9) == '`REFUND':
  1546. refund_money += float(rd_sheet.cell_value(row, 16).replace('`', ''))
  1547. refund_count += 1
  1548. continue
  1549. wechat_count += 1
  1550. wechat_money += float(rd_sheet.cell_value(row, 12).replace('`', ''))
  1551. transaction_id = rd_sheet.cell_value(row, 6).replace('`', '')
  1552. order_qs = all_order_qs.filter(orderID=transaction_id)
  1553. if not order_qs.exists():
  1554. col_value_list = rd_sheet.row_values(row)
  1555. col_value_list.insert(0, '否')
  1556. for index, value in enumerate(col_value_list):
  1557. wt_sheet.write(row_start, index, str(value))
  1558. row_start += 1
  1559. # 第三部分表格填写
  1560. row_start += 1
  1561. third_header = ['是否匹配账单', '交易ID', '订单ID', '设备UID', '用户名', '账号昵称', '通道', '商品描述', '支付方式', '价格', '支付状态',
  1562. '已退金额', '添加时间', '更新时间']
  1563. diff_order_qs = all_order_qs.filter(orderID__in=trade_no_list).values('trade_no', 'orderID', 'UID',
  1564. 'userID__username',
  1565. 'userID__NickName', 'channel',
  1566. 'desc', 'payType',
  1567. 'price', 'status',
  1568. 'refunded_amount', 'addTime',
  1569. 'updTime')
  1570. for index, content in enumerate(third_header):
  1571. wt_sheet.write(row_start, index, content)
  1572. row_start += 1
  1573. for item in diff_order_qs:
  1574. values_list = item.values()
  1575. for col, content in enumerate(values_list):
  1576. if col == 0:
  1577. wt_sheet.write(row_start, col, '否')
  1578. if col == 7:
  1579. content = '微信'
  1580. if col == 9:
  1581. if content == 1:
  1582. content = '支付成功'
  1583. elif content == 5:
  1584. content = '全额退款'
  1585. elif content == 6:
  1586. content = '部分退款'
  1587. if col in [11, 12]:
  1588. content = CommonService.timestamp_to_str(int(content))
  1589. wt_sheet.write(row_start, col + 1, str(content))
  1590. row_start += 1
  1591. wt_sheet.write(1, 1, wechat_money + refund_money)
  1592. wt_sheet.write(1, 2, wechat_count)
  1593. wt_sheet.write(1, 3, refund_money)
  1594. wt_sheet.write(1, 4, refund_count)
  1595. wt_sheet.write(1, 5, wechat_money)
  1596. wt_sheet.write(1, 6, fee_money)
  1597. wt_sheet.write(1, 7, wechat_money - fee_money)
  1598. wt_sheet.write(1, 8, fee_money + refund_money)
  1599. res = HttpResponse(content_type='application/vnd.ms-excel')
  1600. res['Content-Disposition'] = 'attachment; filename={}'.format(escape_uri_path(file.name))
  1601. wt_book.save(res)
  1602. return res
  1603. except Exception as e:
  1604. print(e)
  1605. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1606. def alipayOrderReconcile(self, request, request_dict, response):
  1607. file = request.FILES.get('file', None)
  1608. if not all([file]):
  1609. return response.json(444, {'error param': 'file'})
  1610. try:
  1611. rd_book = xlrd.open_workbook(filename=None, file_contents=file.read())
  1612. rd_sheet = rd_book.sheet_by_index(0)
  1613. date = rd_sheet.cell_value(3, 1)
  1614. year = int(date.split('-')[0])
  1615. month = int(date.split('-')[1])
  1616. last_day = calendar.monthrange(year, month)[1]
  1617. start_time = datetime.datetime(year, month, 1)
  1618. end_time = datetime.datetime(year, month, last_day) + datetime.timedelta(hours=24)
  1619. start_time = int(start_time.timestamp())
  1620. end_time = int(end_time.timestamp())
  1621. wt_book = xlwt.Workbook(encoding='utf-8')
  1622. wt_sheet = wt_book.add_sheet('支付宝对账结果', cell_overwrite_ok=True)
  1623. row_start = 0
  1624. # 第一部分表格填写
  1625. first_header = ['支付类型', '销售总金额', '销售总数量', '退款总额', '退款总数量', '应收金额', '平台手续费', '账务实收', '金额相差']
  1626. for index, content in enumerate(first_header):
  1627. wt_sheet.write(row_start, index, content)
  1628. row_start += 1
  1629. all_order_qs = Order_Model.objects.filter(payTime__gte=start_time, payTime__lt=end_time, payType=2,
  1630. status__in=[1, 5, 6])
  1631. trade_no_list = []
  1632. order_id_list = []
  1633. for item in rd_sheet.col_values(4, 3):
  1634. if item not in order_id_list:
  1635. order_id_list.append(item)
  1636. for i in all_order_qs:
  1637. if i.orderID not in order_id_list:
  1638. trade_no_list.append(i.orderID)
  1639. wt_sheet.write(row_start, 0, '支付宝')
  1640. # 第二部分表格填写
  1641. row_start += 2
  1642. alipay_money = 0
  1643. fee_money = 0
  1644. refund_money = 0
  1645. refund_count = 0
  1646. alipay_count = 0
  1647. for row in range(2, rd_sheet.nrows):
  1648. if row == 2:
  1649. wt_sheet.write(row_start, 0, '是否匹配账单')
  1650. for col in range(rd_sheet.ncols):
  1651. value = rd_sheet.cell_value(row, col)
  1652. temp_col = col + 1
  1653. wt_sheet.write(row_start, temp_col, str(value))
  1654. row_start += 1
  1655. continue
  1656. if rd_sheet.cell_value(row, 1) == '' and rd_sheet.cell_value(row, 2) == '':
  1657. break
  1658. if rd_sheet.cell_value(row, 5) == '收费':
  1659. continue
  1660. if rd_sheet.cell_value(row, 5) == '退款(交易退款)':
  1661. refund_money += float(rd_sheet.cell_value(row, 10))
  1662. refund_count += 1
  1663. continue
  1664. fee_money += float(rd_sheet.cell_value(row, 12))
  1665. alipay_count += 1
  1666. alipay_money += float(rd_sheet.cell_value(row, 9))
  1667. transaction_id = rd_sheet.cell_value(row, 4)
  1668. order_qs = all_order_qs.filter(orderID=transaction_id)
  1669. if not order_qs.exists():
  1670. col_value_list = rd_sheet.row_values(row)
  1671. col_value_list.insert(0, '否')
  1672. for index, value in enumerate(col_value_list):
  1673. wt_sheet.write(row_start, index, str(value))
  1674. row_start += 1
  1675. # 第三部分表格填写
  1676. row_start += 1
  1677. third_header = ['是否匹配账单', '交易ID', '订单ID', '设备UID', '用户名', '账号昵称', '通道', '商品描述', '支付方式', '价格', '支付状态',
  1678. '已退金额', '添加时间', '更新时间']
  1679. diff_order_qs = all_order_qs.filter(orderID__in=trade_no_list).values('trade_no', 'orderID', 'UID',
  1680. 'userID__username',
  1681. 'userID__NickName', 'channel',
  1682. 'desc', 'payType',
  1683. 'price', 'status',
  1684. 'refunded_amount', 'addTime',
  1685. 'updTime')
  1686. for index, content in enumerate(third_header):
  1687. wt_sheet.write(row_start, index, content)
  1688. row_start += 1
  1689. for item in diff_order_qs:
  1690. values_list = item.values()
  1691. for col, content in enumerate(values_list):
  1692. if col == 0:
  1693. wt_sheet.write(row_start, col, '否')
  1694. if col == 7:
  1695. content = '支付宝'
  1696. if col == 9:
  1697. if content == 1:
  1698. content = '支付成功'
  1699. elif content == 5:
  1700. content = '全额退款'
  1701. elif content == 6:
  1702. content = '部分退款'
  1703. if col in [11, 12]:
  1704. content = CommonService.timestamp_to_str(int(content))
  1705. wt_sheet.write(row_start, col + 1, str(content))
  1706. row_start += 1
  1707. wt_sheet.write(1, 1, alipay_money)
  1708. wt_sheet.write(1, 2, alipay_count)
  1709. wt_sheet.write(1, 3, refund_money)
  1710. wt_sheet.write(1, 4, refund_count)
  1711. wt_sheet.write(1, 5, alipay_money - refund_money)
  1712. wt_sheet.write(1, 6, fee_money)
  1713. wt_sheet.write(1, 7, alipay_money - fee_money - refund_money)
  1714. wt_sheet.write(1, 8, fee_money + refund_money)
  1715. res = HttpResponse(content_type='application/vnd.ms-excel')
  1716. res['Content-Disposition'] = 'attachment; filename={}'.format(escape_uri_path(file.name))
  1717. wt_book.save(res)
  1718. return res
  1719. except Exception as e:
  1720. print(e)
  1721. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1722. def deleteDeviceOrder(self, userID, request_dict, response):
  1723. orderID = request_dict.get('orderID', None)
  1724. if orderID:
  1725. Order_Model.objects.filter(orderID=orderID).delete()
  1726. return response.json(0)
  1727. else:
  1728. return response.json(444)
  1729. def getDevicePackageList(self, request_dict, response):
  1730. pageNo = request_dict.get('pageNo', None)
  1731. pageSize = request_dict.get('pageSize', None)
  1732. uid = request_dict.get('uid', None)
  1733. if not all([pageNo, pageSize]):
  1734. return response.json(444)
  1735. page = int(pageNo)
  1736. line = int(pageSize)
  1737. try:
  1738. ubqs = UID_Bucket.objects.all()
  1739. if uid:
  1740. ubqs = ubqs.filter(uid__contains=uid)
  1741. if not ubqs.exists():
  1742. return response.json(0, [])
  1743. count = ubqs.count()
  1744. ubqs = ubqs.values(
  1745. 'id',
  1746. 'uid',
  1747. 'channel',
  1748. 'status',
  1749. 'endTime',
  1750. 'bucket__bucket',
  1751. 'bucket__storeDay',
  1752. 'bucket__area')
  1753. ubqs = ubqs.order_by('-addTime') # 根据CDK创建时间降序排序
  1754. ubqs = ubqs[(page - 1) * line:page * line]
  1755. return response.json(
  1756. 0, {'list': list(ubqs), 'total': count})
  1757. except Exception as e:
  1758. print(e)
  1759. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1760. def deleteDevicePackage(self, userID, request_dict, response):
  1761. orderID = request_dict.get('orderID', None)
  1762. if orderID:
  1763. Order_Model.objects.filter(orderID=orderID).delete()
  1764. return response.json(0)
  1765. else:
  1766. return response.json(444)
  1767. # 重置设备云存体验
  1768. def do_experience_reset(self, request_dict, userID, response):
  1769. bid = request_dict.get("id", None)
  1770. ubq = UID_Bucket.objects.filter(id=bid)
  1771. if ubq:
  1772. eq = ExperienceContextModel.objects.filter(uid=ubq[0].uid)
  1773. if eq:
  1774. eq.delete()
  1775. # Order_Model.objects.filter(uid_bucket_id=bid).delete()
  1776. ubq.delete()
  1777. return response.json(0)
  1778. else:
  1779. return response.json(10007)
  1780. else:
  1781. return response.json(0, '重置云存体验失败')
  1782. def meal_transfer(self, request, request_dict, response):
  1783. try:
  1784. orderID = request_dict.get("orderID", None)
  1785. old_uid = request_dict.get("old_uid", None)
  1786. new_uid = request_dict.get("new_uid", None)
  1787. nowTime = int(time.time())
  1788. if not all([orderID, old_uid, new_uid]):
  1789. return response.json(444)
  1790. # 查订单表查看订单类型
  1791. order_type = Order_Model.objects.values_list('order_type', flat=True).get(orderID=orderID)
  1792. if order_type not in [0, 1]:
  1793. return response.json(10017)
  1794. # 查老设备 orderID
  1795. old_using_uid_bucket = UID_Bucket.objects.filter(orderId=orderID)
  1796. old_unusing_uid_bucket = Unused_Uid_Meal.objects.filter(order_id=orderID)
  1797. if old_using_uid_bucket.exists():
  1798. if old_using_uid_bucket.first().endTime < nowTime:
  1799. return response.json(10013)
  1800. if not old_using_uid_bucket.exists() and not old_unusing_uid_bucket.exists():
  1801. return response.json(10017)
  1802. if old_using_uid_bucket.exists() and old_unusing_uid_bucket.exists():
  1803. LOGGER.info(f'云存转移, orderID:{orderID}, 该订单同时出现在已使用和未使用数据库')
  1804. return response.json(10018)
  1805. # 订单套餐未使用
  1806. elif old_unusing_uid_bucket.exists():
  1807. LOGGER.info(f'云存转移, orderID:{orderID}, 该订单套餐在原设备未使用')
  1808. with transaction.atomic():
  1809. # 旧设备不包含 ai
  1810. if old_unusing_uid_bucket.filter(is_ai=1).exists():
  1811. new_uid_set = UidSetModel.objects.filter(uid=new_uid).values('is_ai')
  1812. if new_uid_set[0]['is_ai'] == 2:
  1813. return response.json(10016)
  1814. old_unusing_uid_bucket.update(uid=new_uid)
  1815. new_unused_uid_bucket = Unused_Uid_Meal.objects.filter(order_id=orderID).values(
  1816. 'id', 'channel', 'bucket_id', 'addTime', 'expire', 'is_ai', 'order_id'
  1817. )
  1818. # 转移后如果没有未使用套餐则把 has_unused 改为 0
  1819. unused_uid_meal_qs = Unused_Uid_Meal.objects.filter(uid=old_uid)
  1820. if not unused_uid_meal_qs.exists():
  1821. UID_Bucket.objects.filter(uid=old_uid).update(has_unused=0)
  1822. # 判断新设备是否有正在使用的套餐
  1823. new_uid_bucket_qs = UID_Bucket.objects.filter(uid=new_uid, endTime__gte=nowTime, use_status=1)
  1824. if new_uid_bucket_qs.exists():
  1825. new_uid_bucket_qs.update(has_unused=1)
  1826. else:
  1827. # 激活转移的套餐
  1828. unused = new_unused_uid_bucket[0]
  1829. endTime = CommonService.calcMonthLater(unused['expire'])
  1830. LOGGER.info(f'云存转移, orderID:{orderID}, 激活转移之后的套餐, endTime: {endTime}')
  1831. # 判断是否有已过期套餐
  1832. if UID_Bucket.objects.filter(uid=new_uid).exists():
  1833. UID_Bucket.objects.filter(uid=new_uid).update(status=1, orderId=orderID, updateTime=nowTime,
  1834. use_status=1, has_unused=0, endTime=endTime,
  1835. bucket_id=unused['bucket_id'],
  1836. channel=unused['channel'])
  1837. new_bucket_id = UID_Bucket.objects.filter(uid=new_uid).first().id
  1838. else:
  1839. data_dict = {
  1840. 'uid': new_uid,
  1841. 'channel': unused['channel'],
  1842. 'bucket_id': unused['bucket_id'],
  1843. 'addTime': unused['addTime'],
  1844. 'endTime': endTime,
  1845. 'updateTime': nowTime,
  1846. 'status': 1,
  1847. 'use_status': 1,
  1848. 'has_unused': 0,
  1849. 'orderId': orderID
  1850. }
  1851. new_bucket = UID_Bucket.objects.create(**data_dict) # 正在使用套餐表添加数据
  1852. new_bucket_id = new_bucket.id
  1853. if unused['is_ai']: # 开通AI服务
  1854. new_aiservice = AiService.objects.filter(uid=new_uid)
  1855. if new_aiservice.filter(use_status=1 or 0).exists():
  1856. return response.json(10014)
  1857. if new_aiservice.exists():
  1858. new_aiservice.update(channel=unused['channel'], detect_status=1, addTime=nowTime,
  1859. updTime=nowTime, endTime=endTime, use_status=1,
  1860. orders_id=unused['order_id'])
  1861. else:
  1862. AiService.objects.create(uid=new_uid, channel=unused['channel'], detect_status=1,
  1863. addTime=nowTime,
  1864. updTime=nowTime, endTime=endTime, use_status=1,
  1865. orders_id=unused['order_id'])
  1866. Unused_Uid_Meal.objects.filter(order_id=orderID).delete()
  1867. # 修改订单表
  1868. Order_Model.objects.filter(orderID=orderID).update(UID=new_uid, updTime=nowTime,
  1869. uid_bucket_id=int(new_bucket_id))
  1870. # 订单套餐已使用
  1871. else:
  1872. LOGGER.info(f'云存转移, orderID:{orderID}, 该订单套餐在原设备已使用')
  1873. old_using_uid_bucket = old_using_uid_bucket.values('id', 'bucket_id', 'has_unused',
  1874. 'bucket__content').order_by('addTime')
  1875. old_ai_service = AiService.objects.filter(uid=old_uid, endTime__gte=nowTime, use_status=1).values('id',
  1876. 'detect_interval',
  1877. 'detect_status',
  1878. 'detect_group')
  1879. new_uid_set = UidSetModel.objects.filter(uid=new_uid).values('is_ai')
  1880. if old_ai_service.exists() and new_uid_set[0]['is_ai'] == 2: # 转出设备有开通AI,但是转入设备不支持AI,不能转
  1881. return response.json(10016)
  1882. # 查询转入设备是否存在正在使用的套餐
  1883. new_using_uid_bucket = UID_Bucket.objects.filter(uid=new_uid, endTime__gte=nowTime).first()
  1884. is_delete = 0
  1885. if new_using_uid_bucket:
  1886. vod_bucket = VodBucketModel.objects.get(id=new_using_uid_bucket.bucket_id)
  1887. if vod_bucket.is_free:
  1888. # 是免费套餐则删除
  1889. is_delete = 1
  1890. else:
  1891. # 非免费套餐不可转移
  1892. return response.json(10014)
  1893. with transaction.atomic():
  1894. if is_delete == 1:
  1895. if AiService.objects.filter(orders_id=orderID).exists():
  1896. ai_service = AiService.objects.filter(uid=old_uid).first()
  1897. if ai_service:
  1898. ai_service.delete()
  1899. new_using_uid_bucket.delete()
  1900. # 更新正在使用套餐的uid,重置拥有未使用套餐
  1901. old_using_uid_bucket_id = old_using_uid_bucket[0]['id']
  1902. ord_uid_bucket = UID_Bucket.objects.filter(id=old_using_uid_bucket_id).first()
  1903. # 旧套餐云存转移到新设备
  1904. if ord_uid_bucket:
  1905. if not UID_Bucket.objects.filter(uid=new_uid).exists():
  1906. new_bucket = UID_Bucket.objects.create(
  1907. uid=new_uid,
  1908. channel=ord_uid_bucket.channel,
  1909. bucket_id=ord_uid_bucket.bucket_id,
  1910. addTime=nowTime,
  1911. endTime=ord_uid_bucket.endTime,
  1912. updateTime=nowTime,
  1913. status=1,
  1914. use_status=1,
  1915. has_unused=0,
  1916. orderId=orderID
  1917. )
  1918. new_bucket_id = new_bucket.id
  1919. else:
  1920. UID_Bucket.objects.filter(uid=new_uid).update(
  1921. bucket_id=ord_uid_bucket.bucket_id,
  1922. addTime=nowTime,
  1923. endTime=ord_uid_bucket.endTime,
  1924. updateTime=nowTime,
  1925. status=1,
  1926. use_status=1,
  1927. has_unused=0,
  1928. orderId=orderID
  1929. )
  1930. new_bucket_id = UID_Bucket.objects.filter(uid=new_uid).first().id
  1931. # 修改旧设备正在使用中套餐
  1932. ord_order = Order_Model.objects.filter(UID=old_uid).exclude(
  1933. orderID=orderID).order_by("-addTime").first()
  1934. # ord_device_has_unused 如果放在 旧套餐保存旧orderID之后 会发生改变所以提前保持变量
  1935. ord_device_has_unused = old_using_uid_bucket[0]['has_unused']
  1936. # 旧套餐保存旧orderID
  1937. if ord_order:
  1938. ord_uid_bucket.orderId = ord_order.orderID
  1939. ord_uid_bucket.save()
  1940. elif not ord_order and ord_uid_bucket["has_unused"] == 0:
  1941. ord_uid_bucket.delete()
  1942. else:
  1943. return response.json(10017)
  1944. StsCrdModel.objects.filter(uid=old_uid).delete() # 删除转出设备stscrd表关联数据
  1945. # 转移AI服务
  1946. if old_ai_service.exists() and new_uid_set[0]['is_ai'] != 2:
  1947. AiService.objects.filter(id=old_ai_service[0]['id']).update(uid=new_uid, detect_status=0,
  1948. detect_group='',
  1949. detect_interval=60)
  1950. msg = {'commandType': 'AIDisable'}
  1951. thing_name = CommonService.query_serial_with_uid(old_uid) # 存在序列号则为使用序列号作为物品名
  1952. topic_name = 'ansjer/generic/{}'.format(thing_name)
  1953. req_success = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
  1954. if not req_success:
  1955. return response.json(10044)
  1956. # 如果转出设备有未使用套餐,更改第一个未使用套餐为正在使用
  1957. if ord_device_has_unused == 1:
  1958. old_unused_uid_bucket = Unused_Uid_Meal.objects.filter(uid=old_uid).values('id', 'channel',
  1959. 'bucket_id',
  1960. 'addTime', 'expire',
  1961. 'is_ai',
  1962. 'order_id')
  1963. count = old_unused_uid_bucket.count()
  1964. unused = old_unused_uid_bucket[0]
  1965. has_unused = 1 if count > 1 else 0 # 如果存在不止一个未使用套餐,has_unused=1
  1966. endTime = CommonService.calcMonthLater(unused['expire'])
  1967. UID_Bucket.objects.filter(id=old_using_uid_bucket_id).update(bucket_id=unused['bucket_id'],
  1968. addTime=unused['addTime'],
  1969. endTime=endTime,
  1970. updateTime=nowTime, status=1,
  1971. use_status=1,
  1972. has_unused=has_unused,
  1973. orderId=unused['order_id'])
  1974. Unused_Uid_Meal.objects.filter(order_id=unused['order_id']).delete() # 删除未使用套餐表中的数据
  1975. if unused['is_ai']: # 开通AI服务
  1976. AiService.objects.create(uid=old_uid, channel=unused['channel'],
  1977. detect_status=old_ai_service[0]['detect_status'],
  1978. addTime=nowTime, updTime=nowTime, endTime=endTime, use_status=1,
  1979. orders_id=unused['order_id'],
  1980. detect_group=old_ai_service[0]['detect_group'],
  1981. detect_interval=old_ai_service[0]['detect_interval'])
  1982. # 修改订单表
  1983. Order_Model.objects.filter(orderID=orderID).update(UID=new_uid, updTime=nowTime,
  1984. uid_bucket_id=int(new_bucket_id))
  1985. ip = CommonService.get_ip_address(request)
  1986. content = json.loads(json.dumps(request_dict))
  1987. log = {
  1988. 'ip': ip,
  1989. 'user_id': 1,
  1990. 'status': 200,
  1991. 'time': int(time.time()),
  1992. 'url': 'serveManagement/mealTransfer',
  1993. 'content': json.dumps(content),
  1994. 'operation': f'订单号:{orderID}套餐从设备{old_uid}转移到设备{new_uid}'
  1995. }
  1996. LogModel.objects.create(**log)
  1997. return response.json(0)
  1998. except Exception as e:
  1999. print(e)
  2000. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  2001. @classmethod
  2002. def getCloudUserList(cls, request_dict, response):
  2003. print('request_dict: ', request_dict)
  2004. # UID_Bucket表查询数据
  2005. uid = request_dict.get('uid', None)
  2006. status = request_dict.get('status', None)
  2007. use_status = request_dict.get('use_status', None)
  2008. has_unused = request_dict.get('has_unused', None)
  2009. addTimeRange = request_dict.getlist('addTimeRange[]', None)
  2010. endTimeRange = request_dict.getlist('endTimeRange[]', None)
  2011. # Order_Model表查询数据
  2012. username = request_dict.get('username', None)
  2013. phone = request_dict.get('phone', None)
  2014. userEmail = request_dict.get('userEmail', None)
  2015. payType = request_dict.get('payType', None)
  2016. # uid_set 表查询
  2017. ucode = request_dict.getlist('ucode', None)
  2018. version = request_dict.getlist('version', None)
  2019. # 日志表查询
  2020. logTimeRange = request_dict.getlist('logTimeRange[]', None)
  2021. # 序列号查询
  2022. serialNumber = request_dict.get('serialNumber', None)
  2023. pageNo = request_dict.get('pageNo', None)
  2024. pageSize = request_dict.get('pageSize', None)
  2025. if not all([pageNo, pageSize]):
  2026. return response.json(444)
  2027. page = int(pageNo)
  2028. line = int(pageSize)
  2029. try:
  2030. uid_bucket_qs = UID_Bucket.objects.all()
  2031. if uid:
  2032. uid_bucket_qs = uid_bucket_qs.filter(uid__icontains=uid)
  2033. if status:
  2034. uid_bucket_qs = uid_bucket_qs.filter(status=status)
  2035. if use_status:
  2036. uid_bucket_qs = uid_bucket_qs.filter(use_status=use_status)
  2037. if has_unused:
  2038. uid_bucket_qs = uid_bucket_qs.filter(has_unused=has_unused)
  2039. if serialNumber:
  2040. device_info_qs = Device_Info.objects.filter(serial_number=serialNumber).values('UID')
  2041. uid = device_info_qs[0]['UID'] if device_info_qs.exists() else 'N/A'
  2042. uid_bucket_qs = uid_bucket_qs.filter(uid__icontains=uid)
  2043. if addTimeRange:
  2044. addStartTime, addEndTime = int(
  2045. addTimeRange[0][:-3]), int(addTimeRange[1][:-3])
  2046. uid_bucket_qs = uid_bucket_qs.filter(
  2047. addTime__gte=addStartTime,
  2048. addTime__lte=addEndTime)
  2049. if endTimeRange:
  2050. endStartTime, endEndTime = int(
  2051. endTimeRange[0][:-3]), int(endTimeRange[1][:-3])
  2052. uid_bucket_qs = uid_bucket_qs.filter(
  2053. addTime__gte=endStartTime,
  2054. addTime__lte=endEndTime)
  2055. uid_list = []
  2056. uid_set_dict = {}
  2057. if ucode and ucode != ['']:
  2058. uid_set_qs = UidSetModel.objects.filter(ucode__in=ucode).values('uid', 'ucode', 'version').distinct()
  2059. for uid_set in uid_set_qs:
  2060. uid_list.append(uid_set['uid'])
  2061. uid_set_dict[uid_set['uid']] = {
  2062. 'ucode': uid_set['ucode'],
  2063. 'version': uid_set['version']
  2064. }
  2065. uid_bucket_qs = uid_bucket_qs.filter(uid__in=uid_list)
  2066. else:
  2067. uid_set_qs = UidSetModel.objects.filter().values('uid', 'ucode', 'version').distinct()
  2068. for uid_set in uid_set_qs:
  2069. uid_list.append(uid_set['uid'])
  2070. uid_set_dict[uid_set['uid']] = {
  2071. 'ucode': uid_set['ucode'],
  2072. 'version': uid_set['version']
  2073. }
  2074. if not uid_bucket_qs.exists():
  2075. return response.json(0, [])
  2076. order_qs = Order_Model.objects.filter(uid_bucket_id__in=uid_bucket_qs.values('id'))
  2077. if username or phone or userEmail or payType:
  2078. if username:
  2079. order_qs = order_qs.filter(userID__username=username)
  2080. if phone:
  2081. order_qs = order_qs.filter(userID__phone__contains=phone)
  2082. if userEmail:
  2083. order_qs = order_qs.filter(
  2084. userID__userEmail__contains=userEmail)
  2085. if payType:
  2086. order_qs = order_qs.filter(payType=int(payType))
  2087. # 过滤套餐关联的UID_Bucket数据
  2088. uid_bucket_qs = uid_bucket_qs.filter(
  2089. id__in=order_qs.values_list(
  2090. 'uid_bucket_id', flat=True))
  2091. cg_qs = CloudLogModel.objects.filter(
  2092. operation='cloudstorage/queryvodlist')
  2093. if logTimeRange:
  2094. logStartTime, logEndTime = int(
  2095. logTimeRange[0][:-3]), int(logTimeRange[1][:-3])
  2096. cg_qs = cg_qs.filter(
  2097. time__gte=logStartTime,
  2098. time__lte=logEndTime)
  2099. # 过滤套餐关联的UID_Bucket数据
  2100. uid_bucket_qs = uid_bucket_qs.filter(
  2101. uid__in=cg_qs.values('uid'))
  2102. list_data = []
  2103. count = uid_bucket_qs.count()
  2104. uid_bucket_qs = uid_bucket_qs.order_by('-addTime')[(page - 1) * line:page * line]
  2105. for uid_bucket in uid_bucket_qs:
  2106. for order in order_qs.filter(uid_bucket_id=uid_bucket.id) \
  2107. .values('orderID', 'uid_bucket_id', 'desc', 'userID__userID',
  2108. 'UID', 'price', 'payType', 'userID__username', 'userID__phone',
  2109. 'userID__userEmail', 'userID__data_joined', 'agreement_id'):
  2110. # 套餐到期时间累加未使用套餐
  2111. unused_qs = Unused_Uid_Meal.objects.filter(uid=uid_bucket.uid).values('expire')
  2112. if unused_qs.exists():
  2113. addMonth = 0
  2114. for unused in unused_qs:
  2115. addMonth += unused['expire']
  2116. endTime = CommonService.calcMonthLater(addMonth, uid_bucket.endTime)
  2117. endTime = time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(endTime))
  2118. else:
  2119. endTime = time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(uid_bucket.endTime))
  2120. uid = uid_bucket.uid.upper()
  2121. data = {
  2122. 'id': uid_bucket.id,
  2123. 'orderId': order['orderID'],
  2124. 'uid': uid,
  2125. 'agreementId': order['agreement_id'] if order['agreement_id'] else 'N/A',
  2126. 'channel': uid_bucket.channel,
  2127. 'status': uid_bucket.status,
  2128. 'endTime': endTime,
  2129. 'addTime': time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(uid_bucket.addTime)),
  2130. 'use_status': uid_bucket.use_status,
  2131. 'has_unused': uid_bucket.has_unused,
  2132. 'desc': order['desc'],
  2133. 'payType': order['payType'],
  2134. 'price': order['price'],
  2135. 'username': order['userID__username'],
  2136. 'userID': order['userID__userID'],
  2137. 'phone': order['userID__phone'],
  2138. 'userEmail': order['userID__userEmail'],
  2139. 'data_joined': order['userID__data_joined'].strftime("%Y-%m-%d %H:%M:%S"),
  2140. 'playcount': cg_qs.filter(operation='cloudstorage/queryvodlist', uid=order['UID']).count(),
  2141. 'serial_number': 'N/A'
  2142. }
  2143. device_info_qs = Device_Info.objects.filter(UID=uid).values('serial_number')
  2144. if device_info_qs.exists():
  2145. data['serial_number'] = device_info_qs[0]['serial_number'] if device_info_qs[0][
  2146. 'serial_number'] else 'N/A'
  2147. if uid in uid_set_dict:
  2148. data['ucode'] = uid_set_dict[uid]['ucode']
  2149. data['version'] = uid_set_dict[uid]['version']
  2150. list_data.append(data)
  2151. return response.json(
  2152. 0, {'list': list_data, 'total': count})
  2153. except Exception as e:
  2154. print(e)
  2155. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  2156. def exportCloudUserList(self, request_dict, response):
  2157. # UID_Bucket表查询数据
  2158. uid = request_dict.get('uid', None)
  2159. status = request_dict.get('status', None)
  2160. use_status = request_dict.get('use_status', None)
  2161. has_unused = request_dict.get('has_unused', None)
  2162. addTimeRange = request_dict.getlist('addTimeRange[]', None)
  2163. endTimeRange = request_dict.getlist('endTimeRange[]', None)
  2164. # Order_Model表查询数据
  2165. username = request_dict.get('username', None)
  2166. phone = request_dict.get('phone', None)
  2167. userEmail = request_dict.get('userEmail', None)
  2168. payType = request_dict.get('payType', None)
  2169. # uid_set 表查询
  2170. ucode = request_dict.getlist('ucode', None)
  2171. version = request_dict.getlist('version', None)
  2172. # 日志表查询
  2173. logTimeRange = request_dict.getlist('logTimeRange[]', None)
  2174. pageNo = request_dict.get('pageNo', None)
  2175. pageSize = request_dict.get('pageSize', None)
  2176. if not all([pageNo, pageSize]):
  2177. return response.json(444)
  2178. page = int(pageNo)
  2179. line = int(pageSize)
  2180. try:
  2181. uid_bucket_qs = UID_Bucket.objects.all()
  2182. if uid:
  2183. uid_bucket_qs = uid_bucket_qs.filter(uid__contains=uid)
  2184. if status:
  2185. uid_bucket_qs = uid_bucket_qs.filter(status=status)
  2186. if use_status:
  2187. uid_bucket_qs = uid_bucket_qs.filter(use_status=use_status)
  2188. if has_unused:
  2189. uid_bucket_qs = uid_bucket_qs.filter(has_unused=has_unused)
  2190. if addTimeRange:
  2191. addStartTime, addEndTime = int(
  2192. addTimeRange[0][:-3]), int(addTimeRange[1][:-3])
  2193. uid_bucket_qs = uid_bucket_qs.filter(
  2194. addTime__gte=addStartTime,
  2195. addTime__lte=addEndTime)
  2196. if endTimeRange:
  2197. endStartTime, endEndTime = int(
  2198. endTimeRange[0][:-3]), int(endTimeRange[1][:-3])
  2199. uid_bucket_qs = uid_bucket_qs.filter(
  2200. addTime__gte=endStartTime,
  2201. addTime__lte=endEndTime)
  2202. if not uid_bucket_qs.exists():
  2203. return response.json(0, [])
  2204. order_qs = Order_Model.objects.filter(
  2205. uid_bucket_id__in=uid_bucket_qs.values('id'))
  2206. if username or phone or userEmail or payType:
  2207. if username:
  2208. order_qs = order_qs.filter(userID__username=username)
  2209. if phone:
  2210. order_qs = order_qs.filter(userID__phone__contains=phone)
  2211. if userEmail:
  2212. order_qs = order_qs.filter(
  2213. userID__userEmail__contains=userEmail)
  2214. if payType:
  2215. order_qs = order_qs.filter(payType=int(payType))
  2216. # 过滤套餐关联的UID_Bucket数据
  2217. uid_bucket_qs = uid_bucket_qs.filter(
  2218. id__in=order_qs.values_list(
  2219. 'uid_bucket_id', flat=True))
  2220. uidset_qs = UidSetModel.objects.filter(
  2221. uid__in=uid_bucket_qs.values('uid'))
  2222. if ucode or version:
  2223. if ucode:
  2224. uidset_qs = uidset_qs.filter(ucode=ucode)
  2225. if version:
  2226. uidset_qs = uidset_qs.filter(version=version)
  2227. cg_qs = CloudLogModel.objects.filter(
  2228. operation='cloudstorage/queryvodlist')
  2229. if logTimeRange:
  2230. logStartTime, logEndTime = int(
  2231. logTimeRange[0][:-3]), int(logTimeRange[1][:-3])
  2232. cg_qs = cg_qs.filter(
  2233. time__gte=logStartTime,
  2234. time__lte=logEndTime)
  2235. list_data = []
  2236. count = uid_bucket_qs.count()
  2237. uid_bucket_qs = uid_bucket_qs.order_by('-addTime')[(page - 1) * line:page * line]
  2238. for uid_bucket in uid_bucket_qs:
  2239. data = {
  2240. 'id': uid_bucket.id,
  2241. 'uid': uid_bucket.uid,
  2242. 'channel': uid_bucket.channel,
  2243. 'status': uid_bucket.status,
  2244. 'endTime': time.strftime(
  2245. "%Y--%m--%d %H:%M:%S",
  2246. time.localtime(
  2247. uid_bucket.endTime)),
  2248. 'addTime': time.strftime(
  2249. "%Y--%m--%d %H:%M:%S",
  2250. time.localtime(
  2251. uid_bucket.addTime)),
  2252. 'use_status': uid_bucket.use_status,
  2253. 'has_unused': uid_bucket.has_unused}
  2254. for order in order_qs.filter(
  2255. uid_bucket_id=uid_bucket.id).values(
  2256. 'uid_bucket_id',
  2257. 'desc',
  2258. 'userID__userID',
  2259. 'UID',
  2260. 'price',
  2261. 'payType',
  2262. 'userID__username',
  2263. 'userID__phone',
  2264. 'userID__userEmail',
  2265. 'userID__data_joined'):
  2266. data['desc'] = order['desc']
  2267. data['payType'] = order['payType']
  2268. data['price'] = order['price']
  2269. data['username'] = order['userID__username']
  2270. data['phone'] = order['userID__phone']
  2271. data['userEmail'] = order['userID__userEmail']
  2272. data['data_joined'] = order['userID__data_joined'].strftime(
  2273. "%Y-%m-%d %H:%M:%S")
  2274. data['playcount'] = cg_qs.filter(
  2275. operation='cloudstorage/queryvodlist', uid=order['UID']).count()
  2276. for uidset in uidset_qs.filter(
  2277. uid=uid_bucket.uid).values(
  2278. 'ucode',
  2279. 'version'):
  2280. data['ucode'] = uidset['ucode']
  2281. data['version'] = uidset['version']
  2282. list_data.append(data)
  2283. response = HttpResponse(content_type='application/vnd.ms-excel')
  2284. response['Content-Disposition'] = 'attachment; filename=userinfo.xls'
  2285. workbook = xlwt.Workbook(encoding='utf-8')
  2286. sheet1 = workbook.add_sheet('UID')
  2287. headtitle = [
  2288. 'id',
  2289. '用户账号',
  2290. '用户手机号',
  2291. '用户邮箱',
  2292. '注册时间',
  2293. '设备UID',
  2294. '设备通道',
  2295. '云存状态',
  2296. '添加时间',
  2297. '到期时间',
  2298. '使用状态',
  2299. '是否有未使用套餐',
  2300. '套餐描述',
  2301. '支付方式',
  2302. '价格',
  2303. '播放次数',
  2304. '产品编码',
  2305. '版本'
  2306. ]
  2307. headnum = 0
  2308. for title in headtitle:
  2309. sheet1.write(0, headnum, title)
  2310. headnum = headnum + 1
  2311. fields = [
  2312. 'id',
  2313. 'username',
  2314. 'phone',
  2315. 'userEmail',
  2316. 'data_joined',
  2317. 'uid',
  2318. 'channel',
  2319. 'status',
  2320. 'addTime',
  2321. 'endTime',
  2322. 'use_status',
  2323. 'has_unused',
  2324. 'desc',
  2325. 'payType',
  2326. 'price',
  2327. 'playcount',
  2328. 'ucode',
  2329. 'version'
  2330. ]
  2331. num = 1
  2332. for item in list_data:
  2333. fieldnum = 0
  2334. for key in fields:
  2335. val = item[key]
  2336. if key == 'payType':
  2337. if val == 1:
  2338. val = 'PayPal'
  2339. if val == 2:
  2340. val = '支付宝'
  2341. if val == 3:
  2342. val = '微信支付'
  2343. if val == 10:
  2344. val = '免费体验'
  2345. if val == 11:
  2346. val = '激活码'
  2347. sheet1.write(num, fieldnum, val)
  2348. fieldnum = fieldnum + 1
  2349. num = num + 1
  2350. workbook.save(response)
  2351. return response
  2352. except Exception as e:
  2353. print(e)
  2354. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  2355. def getCloudDataList(self, request_dict, response):
  2356. year = request_dict.get('year', None)
  2357. Jan = int(time.mktime(time.strptime(year + '-1-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2358. Feb = int(time.mktime(time.strptime(year + '-2-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2359. Mar = int(time.mktime(time.strptime(year + '-3-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2360. Apr = int(time.mktime(time.strptime(year + '-4-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2361. May = int(time.mktime(time.strptime(year + '-5-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2362. Jun = int(time.mktime(time.strptime(year + '-6-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2363. Jul = int(time.mktime(time.strptime(year + '-7-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2364. Aug = int(time.mktime(time.strptime(year + '-8-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2365. Sep = int(time.mktime(time.strptime(year + '-9-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2366. Oct = int(time.mktime(time.strptime(year + '-10-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2367. Nov = int(time.mktime(time.strptime(year + '-11-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2368. Dec = int(time.mktime(time.strptime(year + '-12-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2369. Jan_next = int(time.mktime(time.strptime(str(int(year) + 1) + '-1-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  2370. list_data = []
  2371. vod_bucket_qs = VodBucketModel.objects.filter()
  2372. if not vod_bucket_qs.exists():
  2373. return response.json(173)
  2374. try:
  2375. for vod_bucket in vod_bucket_qs:
  2376. vod_bucket_id = vod_bucket.id
  2377. store_meal = Store_Meal.objects.filter(bucket_id=vod_bucket_id, lang__lang='cn').values('lang__title',
  2378. 'lang__content')
  2379. if not store_meal.exists():
  2380. continue
  2381. name = store_meal[0]['lang__title'] + '-' + store_meal[0]['lang__content']
  2382. order = Order_Model.objects.filter(rank__bucket_id=vod_bucket_id)
  2383. Jan_count = order.filter(status=1, addTime__range=[Jan, Feb]).count()
  2384. Feb_count = order.filter(status=1, addTime__range=[Feb, Mar]).count()
  2385. Mar_count = order.filter(status=1, addTime__range=[Mar, Apr]).count()
  2386. Apr_count = order.filter(status=1, addTime__range=[Apr, May]).count()
  2387. May_count = order.filter(status=1, addTime__range=[May, Jun]).count()
  2388. Jun_count = order.filter(status=1, addTime__range=[Jun, Jul]).count()
  2389. Jul_count = order.filter(status=1, addTime__range=[Jul, Aug]).count()
  2390. Aug_count = order.filter(status=1, addTime__range=[Aug, Sep]).count()
  2391. Sep_count = order.filter(status=1, addTime__range=[Sep, Oct]).count()
  2392. Oct_count = order.filter(status=1, addTime__range=[Oct, Nov]).count()
  2393. Nov_count = order.filter(status=1, addTime__range=[Nov, Dec]).count()
  2394. Dec_count = order.filter(status=1, addTime__range=[Dec, Jan_next]).count()
  2395. data = [Jan_count, Feb_count, Mar_count, Apr_count, May_count, Jun_count, Jul_count, Aug_count,
  2396. Sep_count,
  2397. Oct_count, Nov_count, Dec_count]
  2398. cloud_data = {
  2399. 'name': name,
  2400. 'type': 'line',
  2401. 'data': data,
  2402. }
  2403. list_data.append(cloud_data)
  2404. return response.json(0, {'list': list_data})
  2405. except Exception as e:
  2406. print(e)
  2407. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  2408. @classmethod
  2409. def deviceAttritionAlert(cls, request_dict, response):
  2410. """
  2411. 流失预警界面
  2412. @param request_dict:
  2413. @param response:
  2414. @param userName:用户名
  2415. @param uid:设备uid
  2416. @param grade:预警等级
  2417. """
  2418. userName = request_dict.get('userName', None)
  2419. uid = request_dict.get('uid', None)
  2420. grade = request_dict.get('grade', None)
  2421. pageNo = request_dict.get('pageNo', None)
  2422. pageSize = request_dict.get('pageSize', None)
  2423. if not all({pageNo, pageSize}):
  2424. return response.json(444)
  2425. # 获取云存套餐信息表内的设备uid
  2426. page = int(pageNo)
  2427. line = int(pageSize)
  2428. if userName == '' or uid == '' or grade == '': # 判断是否为空
  2429. if userName == '':
  2430. userName = None
  2431. if uid == '':
  2432. uid = None
  2433. if grade == '':
  2434. grade = None
  2435. para_list = [userName, uid, grade]
  2436. not_upload_list = []
  2437. para_count = para_list.count(None)
  2438. try:
  2439. # 筛选数据
  2440. cursor = connection.cursor()
  2441. sql = "SELECT t1.userID_id, du.username, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`,(CASE WHEN t1.`day` >= '15' AND t1.`day` < '25' THEN '一号预警' WHEN t1.use_status = '1' AND t1.`day` >= '25' THEN '二号预警' WHEN t1.use_status = 2 AND t1.`day` >= '25' THEN '八号预警' ELSE '预警取消' END ) AS grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day` FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, TIMESTAMPDIFF(DAY,FROM_UNIXTIME(t1.addTime, '%Y-%m-%d' ),DATE_FORMAT( NOW(), '%Y-%m-%d' )) AS 'day' FROM (SELECT di.userID_id, vub.uid, vub.addTime, vub.use_status FROM vod_uid_bucket AS vub, device_info AS di WHERE vub.uid = di.UID AND vub.addTime > '1669824000' GROUP BY di.userID_id) AS t1 WHERE t1.uid NOT IN (SELECT uid FROM uid_cloud_storage_count)) AS t1 WHERE t1.`day`>='15' AND t1.userID_id is NOT NULL) AS t1 ORDER BY t1.userID_id)AS t1 WHERE t1.userID_id NOT IN (SELECT di.userID_id FROM `uid_cloud_storage_count` AS vcsc LEFT JOIN device_info AS di ON vcsc.uid = di.UID WHERE di.userID_id is NOT NULL))AS t1 LEFT JOIN device_user AS du ON t1.userID_id = du.userID order by t1.addTime "
  2442. cursor.execute(sql)
  2443. uid_type_tuple = cursor.fetchall()
  2444. total = len(uid_type_tuple)
  2445. cursor.close() # 执行完,关闭
  2446. connection.close()
  2447. result_list = []
  2448. more_list = [] # 多个参数查询结果
  2449. new_list = [] # 单独一个参数查询结果
  2450. col_names = [desc[0] for desc in cursor.description]
  2451. for uid_type in uid_type_tuple:
  2452. uid_dict = dict(zip(col_names, uid_type))
  2453. result_list.append(uid_dict)
  2454. if para_count != 2 and para_count != 3: # 两个及以上参数进行筛查
  2455. if userName and uid and grade == None:
  2456. for result in result_list:
  2457. if result['username'] == userName and result['uid'] == uid:
  2458. more_list.append(result)
  2459. if userName and grade and uid == None:
  2460. for result in result_list:
  2461. if result['username'] == userName and result['grade'] == grade:
  2462. more_list.append(result)
  2463. if uid and grade and userName == None:
  2464. for result in result_list:
  2465. if result['uid'] == uid and result['grade'] == grade:
  2466. more_list.append(result)
  2467. if userName and uid and grade:
  2468. for result in result_list:
  2469. if result['username'] == userName and result['uid'] == uid and result['grade'] == grade:
  2470. more_list.append(result)
  2471. result_list = more_list
  2472. if para_count == 2: # 一个参数进行筛查
  2473. if userName:
  2474. for result in result_list:
  2475. if result['username'] == userName:
  2476. new_list.append(result)
  2477. if uid:
  2478. for result in result_list:
  2479. if result['uid'] == uid:
  2480. new_list.append(result)
  2481. if grade:
  2482. for result in result_list:
  2483. if result['grade'] == grade:
  2484. new_list.append(result)
  2485. result_list = new_list
  2486. else:
  2487. result_list = result_list
  2488. result_list = result_list[(page - 1) * line:page * line]
  2489. for item in result_list: # 获取账号下的云存设备数量
  2490. userID_id = item['userID_id']
  2491. device_info_qs = Device_Info.objects.filter(userID_id=userID_id).annotate(count=Count('UID')).values(
  2492. 'UID')
  2493. count = device_info_qs.count()
  2494. if count == 1 or count == 0:
  2495. item['device_number'] = count
  2496. else:
  2497. device_number = 0
  2498. for device_info in device_info_qs:
  2499. uid = device_info['UID']
  2500. uid_set_qs = UidSetModel.objects.filter(uid=uid).values('ucode', 'device_type')
  2501. ucode = uid_set_qs[0]['ucode'] if uid_set_qs.exists() else ''
  2502. device_type = uid_set_qs[0]['device_type'] if uid_set_qs.exists() else ''
  2503. cloud_vod = CommonService.is_cloud_device(ucode, device_type)
  2504. # 判断设备是否为ipc设备和是否支持云存
  2505. if cloud_vod:
  2506. device_number += 1
  2507. item['device_number'] = device_number
  2508. item['other_device'] = 0
  2509. not_upload_list.append(item)
  2510. return response.json(0, {'result_list': not_upload_list, 'total': total})
  2511. except Exception as e:
  2512. meg = '异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e))
  2513. return response.json(500, meg)
  2514. def deactivationPackage(self, request_dict, response):
  2515. """
  2516. 停用套餐
  2517. @param request_dict:
  2518. @param response:
  2519. """
  2520. uid = request_dict.get('uid', None)
  2521. orderID = request_dict.get('orderID', None)
  2522. orderType = request_dict.get('orderType', None)
  2523. payType = request_dict.get('payType', None)
  2524. userName = request_dict.get('userName', None)
  2525. # 查询订单
  2526. if not all([orderID, orderType, uid, userName]):
  2527. return response.json(444)
  2528. nowTime = int(time.time())
  2529. try:
  2530. with transaction.atomic():
  2531. # 云存套餐
  2532. if orderType in ['0', '1'] and payType != '10':
  2533. AiService.objects.filter(orders=orderID).delete() # 删除AI服务
  2534. order_qs = Order_Model.objects.filter(orderID=orderID, userID__username=userName, UID=uid).values(
  2535. 'rank__bucket_id', 'payTime', 'rank__expire')
  2536. if not order_qs.exists():
  2537. return response.json(14)
  2538. pay_time = order_qs[0]['payTime']
  2539. bucket_id = order_qs[0]['rank__bucket_id']
  2540. expire = order_qs[0]['rank__expire']
  2541. unused_uid_Meal_qs = Unused_Uid_Meal.objects.filter(order_id=orderID)
  2542. if unused_uid_Meal_qs.exists(): # 如果能通过订单id查询到未使用套餐则删除套餐
  2543. unused_uid_Meal_qs.delete()
  2544. unused_meal_qs = Unused_Uid_Meal.objects.filter(uid=uid)
  2545. if not unused_meal_qs.exists():
  2546. UID_Bucket.objects.filter(uid=uid).update(has_unused=0, updateTime=nowTime)
  2547. return response.json(0)
  2548. unused_uid_Meal_qs = Unused_Uid_Meal.objects.filter(uid=uid, bucket_id=bucket_id, order_id='')
  2549. if unused_uid_Meal_qs.exists(): # 如果通过uid查询到未使用套餐则删除套餐
  2550. unused_uid_Meal_qs.first().delete()
  2551. unused_meal_qs = Unused_Uid_Meal.objects.filter(uid=uid)
  2552. if not unused_meal_qs.exists():
  2553. UID_Bucket.objects.filter(uid=uid).update(has_unused=0, updateTime=nowTime)
  2554. return response.json(0)
  2555. uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, use_status=1, orderId=orderID)
  2556. if uid_bucket_qs.exists(): # 如果通过订单号查询正在使用的套餐,则删除套餐
  2557. uid_bucket_qs.update(use_status=2, endTime=nowTime, updateTime=nowTime)
  2558. return response.json(0)
  2559. uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, use_status=1, orderId='').values('endTime')
  2560. if uid_bucket_qs.exists(): # 如果通过uid查询正在使用的套餐,则更新过期时间和使用状态
  2561. end_time = pay_time + uid_bucket_qs[0]['endTime'] - CommonService.calcMonthLater(expire,
  2562. pay_time)
  2563. use_status = 2 if end_time < nowTime else 1
  2564. uid_bucket_qs.update(endTime=end_time, use_status=use_status, updateTime=nowTime)
  2565. return response.json(0)
  2566. return response.json(10059) # 未使用套餐类型重复
  2567. # AI套餐
  2568. # if orderType == '1' and payType != '10':
  2569. # return response.json(10059)
  2570. # order_qs = Order_Model.objects.filter(orderID=orderID, userID__username=userName, UID=uid).values(
  2571. # 'ai_rank_id')
  2572. # order_qs = order_qs.objects.filter(UID=uid)
  2573. # ai_service_qs = AiService.objects.filter(uid=uid, use_status=1).values('addTime', 'endTime')
  2574. # ai_service_number = ai_service_qs.count()
  2575. # if ai_service_number <= 1:
  2576. # ai_service_qs.update(endTime=nowTime)
  2577. # return response.json(0)
  2578. # # 当设备套餐不唯一时
  2579. # ai_service_qs = AiService.objects.filter(uid=uid, bucket_id=order_qs[0]['ai_rank_id'])
  2580. # ai_serverice_number = ai_service_qs.count()
  2581. # if ai_serverice_number == 1:
  2582. # ai_service_qs.update(endTime=nowTime)
  2583. # return response.json(0)
  2584. # return response.json(10059) # 未使用套餐类型重复
  2585. # 联通4G套餐
  2586. if orderType == '2' and payType != '10':
  2587. now_time = int(time.time())
  2588. combo_info_qs = UnicomComboOrderInfo.objects.filter(~Q(status=2), order_id=orderID)
  2589. if not combo_info_qs.exists():
  2590. return response.json(10059)
  2591. iccid = combo_info_qs.first().iccid
  2592. combo_info_qs.update(status=2, updated_time=now_time)
  2593. combo_info_qs = UnicomComboOrderInfo.objects.filter(status=1)
  2594. if combo_info_qs:
  2595. return response.json(10059)
  2596. unicom_api = UnicomObjeect()
  2597. usage_flow = unicom_api.get_flow_usage_total(iccid)
  2598. today = datetime.datetime.today()
  2599. year = today.year
  2600. month = today.month
  2601. task_view = UnicomComboTaskView()
  2602. result = task_view.query_unused_combo_and_activate(iccid, year, month, usage_flow)
  2603. if not result:
  2604. # 停用设备
  2605. unicom_api.change_device_to_disable(iccid)
  2606. else:
  2607. unicom_api.change_device_to_activate(iccid)
  2608. return response.json(0)
  2609. return response.json(173)
  2610. except Exception as e:
  2611. print(e)
  2612. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  2613. def cloudDataExport(self, request_dict, response):
  2614. """
  2615. 流失预警导出功能
  2616. """
  2617. cursor = connection.cursor()
  2618. sql = "SELECT t1.userID_id, du.username, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`, t1.grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day`,(CASE WHEN t1.`day` >= '15' AND t1.`day` < '25' THEN '一号预警' WHEN t1.use_status = '1' AND t1.`day` >= '25' THEN '二号预警' WHEN t1.use_status = 2 AND t1.`day` >= '25' THEN '八号预警' ELSE '预警取消' END ) AS grade FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, t1.`day` FROM(SELECT t1.userID_id, t1.uid, t1.addTime, t1.use_status, TIMESTAMPDIFF(DAY,FROM_UNIXTIME(t1.addTime, '%Y-%m-%d' ),DATE_FORMAT( NOW(), '%Y-%m-%d' )) AS 'day' FROM (SELECT di.userID_id, vub.uid, vub.addTime, vub.use_status FROM vod_uid_bucket AS vub, device_info AS di WHERE vub.uid = di.UID AND vub.addTime > '1669824000' GROUP BY di.userID_id) AS t1 WHERE t1.uid NOT IN (SELECT uid FROM uid_cloud_storage_count)) AS t1 WHERE t1.`day`>='15' AND t1.userID_id is NOT NULL) AS t1 ORDER BY t1.userID_id)AS t1 WHERE t1.userID_id NOT IN (SELECT di.userID_id FROM `uid_cloud_storage_count` AS vcsc LEFT JOIN device_info AS di ON vcsc.uid = di.UID WHERE di.userID_id is NOT NULL))AS t1 LEFT JOIN device_user AS du ON t1.userID_id = du.userID order by t1.addTime "
  2619. cursor.execute(sql)
  2620. uid_type_tuple = cursor.fetchall()
  2621. cursor.close() # 执行完,关闭
  2622. connection.close()
  2623. result_list = []
  2624. not_upload_list = []
  2625. try:
  2626. with transaction.atomic():
  2627. col_names = [desc[0] for desc in cursor.description]
  2628. for uid_type in uid_type_tuple:
  2629. uid_dict = dict(zip(col_names, uid_type))
  2630. result_list.append(uid_dict)
  2631. for item in result_list: # 获取账号下的云存设备数量
  2632. device_info_qs = Device_Info.objects.filter(userID_id=item['userID_id']).values('UID')
  2633. count = device_info_qs.count()
  2634. if count == 1 or count == 0:
  2635. item['device_number'] = count
  2636. else:
  2637. device_number = 0
  2638. for device_info in device_info_qs:
  2639. uid_set_qs = UidSetModel.objects.filter(uid=device_info['UID']).values('ucode',
  2640. 'device_type')
  2641. device_type_qs = DeviceTypeModel.objects.filter(type=uid_set_qs[0]['device_type']).values(
  2642. 'model')
  2643. model = device_type_qs[0]['model'] if device_type_qs.exists() else ''
  2644. # 判断设备是否为ipc设备和是否支持云存
  2645. if model == 2:
  2646. if len(uid_set_qs[0]['ucode']) > 4:
  2647. number = uid_set_qs[0]['ucode'][-4]
  2648. else:
  2649. continue
  2650. if number in ['4', '5']:
  2651. device_number += 1
  2652. else:
  2653. continue
  2654. item['device_number'] = device_number
  2655. item['other_device'] = 0
  2656. not_upload_list.append(item)
  2657. # 创建Excel,导出所有流失预警数据
  2658. file_name = "流失预警.xls"
  2659. if not_upload_list:
  2660. ws = xlwt.Workbook(encoding="UTF-8")
  2661. w = ws.add_sheet('流失预警', cell_overwrite_ok=True)
  2662. w.write(0, 0, u'用户名')
  2663. w.write(0, 1, u'用户ID')
  2664. w.write(0, 2, u'设备UID')
  2665. w.write(0, 3, u'设备自云存开通起多少天没有上传数据')
  2666. w.write(0, 4, u'设备数量')
  2667. w.write(0, 5, u'用户有无上传过数据')
  2668. w.write(0, 6, u'是否有有效期内的付费套餐')
  2669. w.write(0, 7, u'预警级别')
  2670. excel_row = 1
  2671. for obj in not_upload_list:
  2672. data_username = obj['username']
  2673. data_userID_id = obj['userID_id']
  2674. data_uid = obj['uid']
  2675. data_day = obj['day']
  2676. data_device_number = obj['device_number']
  2677. if data_device_number == 1:
  2678. data_device_number = 'N/A'
  2679. data_use_status = obj['use_status']
  2680. if data_use_status == 1:
  2681. data_use_status = '有'
  2682. else:
  2683. data_use_status = '无'
  2684. data_other_device = '无'
  2685. data_grade = obj['grade']
  2686. w.write(excel_row, 0, data_username)
  2687. w.write(excel_row, 1, data_userID_id)
  2688. w.write(excel_row, 2, data_uid)
  2689. w.write(excel_row, 3, data_day)
  2690. w.write(excel_row, 4, data_device_number)
  2691. w.write(excel_row, 5, data_other_device)
  2692. w.write(excel_row, 6, data_use_status)
  2693. w.write(excel_row, 7, data_grade)
  2694. excel_row += 1
  2695. # 生成相应格式给前端
  2696. res = HttpResponse(content_type='application/vnd.ms-excel')
  2697. res['Content-Disposition'] = 'attachment; filename={}'.format(escape_uri_path(file_name))
  2698. ws.save(res)
  2699. return res
  2700. except Exception as e:
  2701. meg = '异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e))
  2702. return response.json(500, meg)
  2703. @staticmethod
  2704. def purchase_refund_list(request_dict, response):
  2705. """
  2706. 苹果内购退款列表
  2707. :param request_dict:
  2708. :param response:
  2709. :return:
  2710. """
  2711. order_id = request_dict.get("orderID", None)
  2712. uid = request_dict.get("uid", None)
  2713. apple_order = request_dict.get("appleOrder", None)
  2714. app_type = request_dict.get("appType", None)
  2715. page = int(request_dict.get('page', 1)) # 默认值设为 1
  2716. page_size = int(request_dict.get('pageSize', 10)) # 默认值设为 10
  2717. in_app_refund_qs = InAppRefund.objects.all()
  2718. if order_id:
  2719. in_app_refund_qs = in_app_refund_qs.filter(orderID=order_id)
  2720. if uid:
  2721. in_app_refund_qs = in_app_refund_qs.filter(uid=uid)
  2722. if apple_order and app_type:
  2723. app_type = int(app_type)
  2724. if app_type == 1:
  2725. bundle_id = "com.ansjer.zccloud"
  2726. elif app_type == 2:
  2727. bundle_id = "com.cloudlife.commissionf"
  2728. else:
  2729. return response.json(0)
  2730. in_app_purchase_obj = InAppPurchase(bundle_id=bundle_id)
  2731. client = in_app_purchase_obj.client
  2732. signed_data_verifier = in_app_purchase_obj.verifier
  2733. order_lookup_response = client.look_up_order_id(apple_order)
  2734. signed_transactions = order_lookup_response.signedTransactions
  2735. if signed_transactions:
  2736. transaction_payload = signed_data_verifier.verify_and_decode_signed_transaction(signed_transactions[0])
  2737. transaction_id = transaction_payload.transactionId
  2738. in_app_refund_qs = in_app_refund_qs.filter(transaction_id=transaction_id)
  2739. else:
  2740. return response.json(800)
  2741. # 分页
  2742. paginator = Paginator(in_app_refund_qs.order_by("-created_time"), page_size) # 每页显示 page_size 条
  2743. in_app_refund_page = paginator.get_page(page)
  2744. in_app_refund_list = []
  2745. for in_app_refund in in_app_refund_page:
  2746. in_app_refund_list.append(
  2747. {
  2748. "refundId": in_app_refund.id,
  2749. "orderID": in_app_refund.orderID,
  2750. "uid": in_app_refund.uid,
  2751. "refundPreference": in_app_refund.refund_preference,
  2752. "refundProgress": in_app_refund.refund_progress,
  2753. "appType": in_app_refund.app_type,
  2754. "createTime": in_app_refund.created_time,
  2755. "updateTime": in_app_refund.updated_time,
  2756. "putTime": in_app_refund.put_time,
  2757. }
  2758. )
  2759. return response.json(0, {
  2760. "inAppRefundList": in_app_refund_list,
  2761. "total": paginator.count,
  2762. })
  2763. @staticmethod
  2764. def edit_refund_preference(request_dict, response):
  2765. refund_id = request_dict.get("refundId", None)
  2766. refund_preference = request_dict.get("refundPreference", None)
  2767. if not all([refund_id, refund_preference]):
  2768. return response.json(444)
  2769. InAppRefund.objects.filter(id=refund_id).update(refund_preference=refund_preference)
  2770. return response.json(0)
  2771. @staticmethod
  2772. def add_refund_order(request_dict, response):
  2773. """
  2774. 添加预备退款订单
  2775. :param request_dict:
  2776. :param response:
  2777. :return:
  2778. """
  2779. order_id = request_dict.get("orderID", None)
  2780. apple_order = request_dict.get("appleOrder", None)
  2781. app_type = request_dict.get("appType", None)
  2782. if not order_id and (not apple_order or not app_type):
  2783. return response.json(444)
  2784. orders_qs = Order_Model.objects.all()
  2785. if order_id:
  2786. orders_qs = orders_qs.filter(orderID=order_id)
  2787. if InAppRefund.objects.filter(orderID=order_id).exists():
  2788. return response.json(174)
  2789. if apple_order and app_type:
  2790. app_type = int(app_type)
  2791. if app_type == 1:
  2792. bundle_id = "com.ansjer.zccloud"
  2793. elif app_type == 2:
  2794. bundle_id = "com.cloudlife.commissionf"
  2795. else:
  2796. return response.json(0)
  2797. in_app_purchase_obj = InAppPurchase(bundle_id=bundle_id)
  2798. client = in_app_purchase_obj.client
  2799. signed_data_verifier = in_app_purchase_obj.verifier
  2800. order_lookup_response = client.look_up_order_id(apple_order)
  2801. signed_transactions = order_lookup_response.signedTransactions
  2802. if signed_transactions:
  2803. transaction_ids = []
  2804. for signed_transaction in signed_transactions:
  2805. transaction_payload = signed_data_verifier.verify_and_decode_signed_transaction(signed_transaction)
  2806. transaction_id = transaction_payload.transactionId
  2807. transaction_ids.append(transaction_id)
  2808. orders_qs = orders_qs.filter(transaction_id__in=transaction_ids)
  2809. else:
  2810. return response.json(800)
  2811. if not orders_qs.exists():
  2812. return response.json(173, "订单不存在")
  2813. for order in orders_qs:
  2814. uid = order.UID
  2815. order_id = order.orderID
  2816. transaction_id = order.transaction_id
  2817. now_time = int(time.time())
  2818. if not InAppRefund.objects.filter(transaction_id=transaction_id).exists():
  2819. if app_type:
  2820. InAppRefund.objects.create(
  2821. uid=uid, transaction_id=transaction_id,
  2822. orderID=order_id, refund_progress=4, app_type=app_type,
  2823. created_time=now_time, updated_time=now_time)
  2824. else:
  2825. InAppRefund.objects.create(
  2826. uid=uid, transaction_id=transaction_id,
  2827. orderID=order_id, refund_progress=4,
  2828. created_time=now_time, updated_time=now_time)
  2829. return response.json(0)
  2830. @staticmethod
  2831. def today_cloud_package_query_num(response):
  2832. """查询每日云存列表界面访问次数"""
  2833. try:
  2834. redis_obj = RedisObject()
  2835. # 获取所有字段
  2836. all_data = redis_obj.get_all_hash_data(RedisKeyConstant.TODAY_CLOUD_QUERY_NUMBER.value)
  2837. return response.json(0, all_data)
  2838. except Exception as e:
  2839. return response.json(500, str(e))
  2840. @staticmethod
  2841. def call_today_cloud_package_query_num(response):
  2842. """查询全球每日云存列表界面访问次数"""
  2843. try:
  2844. all_data = []
  2845. servers = {
  2846. "test": "https://test.zositechc.cn/serveManagement/todayCloudPackageQueryNum",
  2847. "eu": "https://api.zositeche.com/serveManagement/todayCloudPackageQueryNum",
  2848. "cn": "https://www.zositechc.cn/serveManagement/todayCloudPackageQueryNum",
  2849. "us": "https://www.dvema.com/serveManagement/todayCloudPackageQueryNum"
  2850. }
  2851. # 用于存储日期数据
  2852. region_dates = defaultdict(dict)
  2853. all_dates = set() # 用于收集所有的日期
  2854. for region in servers:
  2855. res = requests.get(servers[region], timeout=10)
  2856. result = json.loads(res.text)
  2857. region_data = result['data']
  2858. for date, value in region_data.items():
  2859. region_dates[region][date] = int(value)
  2860. all_dates.add(date)
  2861. # 从返回的数据中获取最小和最大日期
  2862. min_date = min(all_dates, key=lambda x: datetime.datetime.strptime(x, "%Y-%m-%d"))
  2863. max_date = max(all_dates, key=lambda x: datetime.datetime.strptime(x, "%Y-%m-%d"))
  2864. # 生成日期范围列表
  2865. date_list = []
  2866. current_date = datetime.datetime.strptime(min_date, "%Y-%m-%d")
  2867. while current_date <= datetime.datetime.strptime(max_date, "%Y-%m-%d"):
  2868. date_list.append(current_date.strftime("%Y-%m-%d"))
  2869. current_date += datetime.timedelta(days=1)
  2870. # 格式化所有数据
  2871. for date in date_list:
  2872. for region in servers:
  2873. value = region_dates[region].get(date, 0)
  2874. all_data.append({
  2875. "date": date,
  2876. "region": region,
  2877. "value": value
  2878. })
  2879. # 计算总和 "all" 部分
  2880. merged = defaultdict(int)
  2881. for record in all_data:
  2882. date = record["date"]
  2883. merged[date] += record["value"]
  2884. # 将"all"总和添加到all_data
  2885. for date, value in merged.items():
  2886. all_data.append({
  2887. "date": date,
  2888. "region": "all",
  2889. "value": value
  2890. })
  2891. return response.json(0, {"list": all_data})
  2892. except Exception as e:
  2893. return response.json(500, str(e))