UnicomManageController.py 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. # Copyright (C) 2022 #
  2. # @Time : 2022/7/18 16:16
  3. # @Author : ghl
  4. # @Email : Guanhailogn@asj6.wecom.work
  5. # @File : UnicomManageController.py
  6. # @Software: PyCharm
  7. import hashlib
  8. import json
  9. import time
  10. import uuid
  11. import openpyxl
  12. import requests
  13. from django.db import transaction, connection
  14. from django.http import HttpResponse
  15. from django.views.generic.base import View
  16. from Ansjer.config import CONFIG_INFO
  17. from Ansjer.config import LOGGER
  18. from Controller.UnicomCombo.UnicomComboController import UnicomComboView
  19. from Model.models import UnicomDeviceInfo, UnicomCombo, Pay_Type, UnicomComboOrderInfo, Device_User, Order_Model, \
  20. ExchangeCode, UnicomFlowPush, SysMsgModel, UnicomComboExperienceHistory, LogModel
  21. from Object.Enums.WXOperatorEnum import WXOperatorEnum
  22. from Object.ResponseObject import ResponseObject
  23. from Object.TokenObject import TokenObject
  24. from Object.UnicomObject import UnicomObjeect
  25. from Object.WXTechObject import WXTechObject
  26. from Service.CommonService import CommonService
  27. class UnicomManageControllerView(View):
  28. def get(self, request, *args, **kwargs):
  29. request.encoding = 'utf-8'
  30. operation = kwargs.get('operation')
  31. return self.validation(request.GET, request, operation)
  32. def post(self, request, *args, **kwargs):
  33. request.encoding = 'utf-8'
  34. operation = kwargs.get('operation')
  35. return self.validation(request.POST, request, operation)
  36. def validation(self, request_dict, request, operation):
  37. response = ResponseObject()
  38. # 获取支付类型
  39. if operation == 'get/pay':
  40. return self.get_pay_type(response)
  41. # 获取套餐类型
  42. elif operation == 'combo/type':
  43. return self.get_unicom_combo_type(response)
  44. elif operation == 'downloadCDK': # 下载兑换码
  45. return self.package_cdk_export_excel(response)
  46. else:
  47. tko = TokenObject(
  48. request.META.get('HTTP_AUTHORIZATION'),
  49. returntpye='pc')
  50. if tko.code != 0:
  51. return response.json(tko.code)
  52. response.lang = tko.lang
  53. userID = tko.userID
  54. # 获取套餐详细表
  55. if operation == 'get/deta/info':
  56. return self.get_unicom_info(request_dict, response)
  57. # 添加和编辑卡套餐
  58. elif operation == 'edit/combo':
  59. return self.edit_combo(request_dict, response)
  60. # 统计4G套餐
  61. elif operation == 'getComboDataList':
  62. return self.static_info(request_dict, response)
  63. # 删除卡套餐
  64. elif operation == 'dele/combo/info':
  65. return self.combo_order_info(request_dict, response)
  66. # 获取/筛选用户信息
  67. elif operation == 'filter/user':
  68. return self.get_user_info(request_dict, response)
  69. # 充值流量
  70. elif operation == 'getFlowPackages':
  71. return self.get_flow_packages(request_dict, response)
  72. # 获取/筛选4G流量卡订单信息
  73. elif operation == 'query-order':
  74. return self.query_4G_user_order(request_dict, response)
  75. elif operation == 'sim-info':
  76. return self.get_iccid_info(request_dict, response)
  77. elif operation == 'batchGenerateCDK': # 批量生成兑换码
  78. return self.create_package_cdk(request_dict, response)
  79. elif operation == 'resetCardPackage':
  80. return self.reset_card_package(request, request_dict, response)
  81. else:
  82. return response.json(404)
  83. @classmethod
  84. def reset_card_package(cls, request, request_dict, response):
  85. try:
  86. serial_number = request_dict.get('serialNumber', None)
  87. if not serial_number:
  88. return response.json(444)
  89. device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number)
  90. now_time = int(time.time())
  91. if device_info_qs.exists(): # 首先查询SIM卡绑定信息是否存在
  92. iccid = device_info_qs.first().iccid
  93. if device_info_qs.first().card_type == 1: # 五兴电信
  94. data = {'iccids': iccid, 'operator': WXOperatorEnum.TELECOM.value}
  95. wx_tech = WXTechObject()
  96. res = wx_tech.delete_card_package(**data)
  97. if res['code'] == '0':
  98. UnicomComboExperienceHistory.objects.filter(iccid=iccid).delete()
  99. return response.json(0)
  100. return response.json(176)
  101. flow_push_qs = UnicomFlowPush.objects.filter(serial_no=serial_number)
  102. if flow_push_qs.exists(): # 删除流量预警推送
  103. flow_push_qs.delete()
  104. sys_msg_qs = SysMsgModel.objects.filter(uid=serial_number)
  105. if sys_msg_qs.exists(): # 删除有关系统消息数据
  106. sys_msg_qs.delete()
  107. # 将4G用户信息状态改为已完成测试状态
  108. device_info_qs.update(status=1, updated_time=now_time, user_id='')
  109. combo_order_qs = UnicomComboOrderInfo.objects.filter(iccid=iccid)
  110. if combo_order_qs.exists():
  111. combo_order_qs.delete()
  112. combo_experience_history_qs = UnicomComboExperienceHistory.objects.filter(iccid=iccid)
  113. if combo_experience_history_qs.exists():
  114. combo_experience_history_qs.delete()
  115. UnicomObjeect().change_device_to_disable(iccid) # 重置流量停用设备
  116. ip = CommonService.get_ip_address(request)
  117. describe = '重置4G流量序列号{},iccid:{}'.format(serial_number, iccid)
  118. cls.generate_card_package_order(iccid, serial_number)
  119. cls.create_operation_log('unicom/manage/resetCardPackage', ip, request_dict, describe)
  120. return response.json(0)
  121. return response.json(173)
  122. except Exception as e:
  123. LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  124. return response.json(500)
  125. @classmethod
  126. def generate_card_package_order(cls, iccid, serial_number):
  127. """
  128. 模拟设备上电赠送1G
  129. @param iccid:
  130. @param serial_number:
  131. @return:
  132. """
  133. url = 'https://www.zositechc.cn/' if CONFIG_INFO == 'cn' else 'https://test.zositechc.cn/'
  134. url = url + 'unicom/api/device-bind'
  135. now_time = int(time.time())
  136. sign = CommonService.encode_data(str(now_time))
  137. data = {
  138. 'iccid': iccid,
  139. 'serialNo': serial_number,
  140. 'timeStamp': now_time,
  141. 'sign': sign,
  142. 'sim': 1
  143. }
  144. response = requests.post(url=url, data=data, timeout=5)
  145. LOGGER.info(f"生成体验套餐结果:{json.loads(response.text)}")
  146. @classmethod
  147. def create_operation_log(cls, url, ip, request_dict, describe):
  148. """
  149. 存入操作日志
  150. @param url: 请求路径
  151. @param describe: 描述
  152. @param ip: 当前IP
  153. @param request_dict: 请求参数
  154. @return: True | False
  155. """
  156. try:
  157. # 记录操作日志
  158. content = json.loads(json.dumps(request_dict))
  159. log = {
  160. 'ip': ip,
  161. 'user_id': 1,
  162. 'status': 200,
  163. 'time': int(time.time()),
  164. 'content': json.dumps(content),
  165. 'url': url,
  166. 'operation': describe,
  167. }
  168. LogModel.objects.create(**log)
  169. return True
  170. except Exception as e:
  171. print('日志异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  172. return False
  173. def get_user_info(self, request_dict, response):
  174. """
  175. 获取/筛选卡用户信息
  176. @param request_dict:
  177. @param response:
  178. @return:
  179. NickName:用户昵称 phone: 电话
  180. serial_no: 设备序列号
  181. """
  182. NickName = request_dict.get('NickName', None)
  183. phone = request_dict.get('phone', None)
  184. iccid = request_dict.get('iccid', None)
  185. serial_no = request_dict.get('serialNo', None)
  186. status = request_dict.get('status')
  187. pageSize = request_dict.get('pageSize', None)
  188. pageNo = request_dict.get('pageNo', None)
  189. if not all({pageNo, pageSize}):
  190. return response.json(444)
  191. page = int(pageNo)
  192. line = int(pageSize)
  193. try:
  194. unicom_device_qs = UnicomDeviceInfo.objects.all().order_by('-updated_time')
  195. device_user_qs = Device_User.objects.filter().values(
  196. 'userID', 'NickName', 'phone')
  197. if status:
  198. unicom_device_qs = unicom_device_qs.filter(status=status)
  199. if iccid:
  200. unicom_device_qs = unicom_device_qs.filter(iccid__icontains=iccid)
  201. if serial_no:
  202. unicom_device_qs = unicom_device_qs.filter(serial_no__icontains=serial_no)
  203. if NickName:
  204. device_user_qs = device_user_qs.filter(NickName__icontains=NickName)
  205. if not device_user_qs.exists():
  206. return response.json(0, [])
  207. userID = device_user_qs.first()['userID']
  208. unicom_device_qs = unicom_device_qs.filter(user_id=userID)
  209. if phone:
  210. device_user_qs = device_user_qs.filter(phone=phone)
  211. if not device_user_qs.exists():
  212. return response.json(0, [])
  213. userID = device_user_qs.first()['userID']
  214. unicom_device_qs = unicom_device_qs.filter(user_id=userID)
  215. total = unicom_device_qs.count()
  216. unicom_device_qs = unicom_device_qs[(page - 1) * line:page * line]
  217. list_data = []
  218. for unicom_device in unicom_device_qs:
  219. data = {
  220. 'iccid': unicom_device.iccid,
  221. 'serialNo': unicom_device.serial_no,
  222. 'userID': unicom_device.user_id,
  223. 'cardType': unicom_device.card_type,
  224. 'status': unicom_device.status,
  225. 'mainCard': unicom_device.main_card,
  226. 'createdTime': unicom_device.created_time,
  227. 'updatedTime': unicom_device.updated_time
  228. }
  229. device_user_qs = Device_User.objects.filter(userID=unicom_device.user_id).values('username', 'NickName',
  230. 'phone')
  231. data['userName'] = device_user_qs[0]['username'] if device_user_qs.exists() else ''
  232. data['NickName'] = device_user_qs[0]['NickName'] if device_user_qs.exists() else ''
  233. data['phone'] = device_user_qs[0]['phone'] if device_user_qs.exists() else ''
  234. list_data.append(data)
  235. return response.json(0, {'list': list_data, 'total': total})
  236. except Exception as e:
  237. print(e)
  238. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  239. @staticmethod
  240. def query_sql_4g():
  241. """
  242. 4G关联查询SQL
  243. @return: str
  244. """
  245. sql = 'SELECT '
  246. sql += 'du.username,du.phone,o.UID as uid,o.`status`,udi.serial_no as serialNo,o.orderID,o.`desc`, '
  247. sql += 'o.price,uo.next_month_activate as nextActivate,uo.iccid,uo.`status` as useStatus,uo.`flow_total_usage`,'
  248. sql += 'uo.updated_time as upTime, uo.activation_time as acTime,uo.expire_time as epTime '
  249. sql += 'FROM orders o '
  250. sql += 'LEFT JOIN unicom_combo_order_info uo ON o.orderID = uo.order_id '
  251. sql += 'INNER JOIN device_user du ON du.userID = o.userID_id '
  252. sql += 'INNER JOIN unicom_device_info udi ON udi.iccid = uo.iccid '
  253. return sql
  254. @staticmethod
  255. def query_4G_user_order(request_dict, response):
  256. """
  257. 查询4G用户订单
  258. """
  259. try:
  260. page = int(request_dict.get('pageNo', 1))
  261. size = int(request_dict.get('pageSize', 10))
  262. user_name = request_dict.get('userName', None)
  263. uid = request_dict.get('uid', None)
  264. serial_no = request_dict.get('serialNo', None)
  265. combo_use_type = request_dict.get('comboUseType', None)
  266. cursor = connection.cursor()
  267. sql = UnicomManageControllerView.query_sql_4g()
  268. sql += 'WHERE o.order_type = %s '
  269. param_list = [2]
  270. if user_name:
  271. sql += "and du.username LIKE %s "
  272. param_list.append(user_name)
  273. if uid:
  274. sql += "and o.UID LIKE %s "
  275. param_list.append(uid)
  276. if serial_no:
  277. sql += "and udi.serial_no LIKE %s "
  278. param_list.append(serial_no)
  279. if combo_use_type:
  280. sql += 'and uo.status = %s '
  281. param_list.append(int(combo_use_type))
  282. cursor.execute(sql, param_list)
  283. total = len(cursor.fetchall())
  284. param_list.append((page - 1) * size)
  285. param_list.append(size, )
  286. sql += 'order by o.addTime DESC LIMIT %s,%s '
  287. cursor.execute(sql, param_list)
  288. data_obj = cursor.fetchall()
  289. cursor.close() # 执行完,关闭
  290. connection.close()
  291. result_list = []
  292. col_names = [desc[0] for desc in cursor.description]
  293. for item in data_obj:
  294. order_dict = dict(zip(col_names, item))
  295. if order_dict['status'] == 1:
  296. total_flow = UnicomObjeect.current_sim_traffic_usage_details(order_dict['iccid']) # 4G总值
  297. total_flow = int(total_flow)
  298. flow_total_usage = order_dict['flow_total_usage'] # 激活时当月已用流量
  299. if flow_total_usage == '': # 判断数值是否为空
  300. flow_total_usage = 0
  301. flow_total_usage = float(flow_total_usage)
  302. order_dict['using_total'] = total_flow - flow_total_usage
  303. else:
  304. order_dict['using_total'] = 0
  305. result_list.append(order_dict)
  306. return response.json(0, {'orderList': result_list, 'total': total})
  307. except Exception as e:
  308. meg = '异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e))
  309. return response.json(500, meg)
  310. @staticmethod
  311. def check_sim_user(iccid):
  312. """
  313. 检查SIM卡用户
  314. @param iccid:物联卡
  315. @return:
  316. """
  317. u_device_qs = UnicomDeviceInfo.objects.filter(iccid=iccid).values('user_id')
  318. if not u_device_qs.exists() or not u_device_qs[0]['user_id']:
  319. return False
  320. return True
  321. @classmethod
  322. def edit_combo(cls, request_dict, response):
  323. """
  324. 添加和编辑卡套餐
  325. @param request_dict:
  326. @param response:
  327. @return:
  328. """
  329. combo_id = request_dict.get('id', None)
  330. combo_name = request_dict.get('comboName', None)
  331. status = request_dict.get('status', None)
  332. combo_type = request_dict.get('comboType', None)
  333. flow_total = request_dict.get('flowTotal', None)
  334. expiration_days = request_dict.get('expirationDays', None)
  335. expiration_type = request_dict.get('expirationType', None)
  336. pay_type = request_dict.get(
  337. 'payTypes', '')[
  338. 1:-1].split(',') # '[1,2]' -> ['1','2']
  339. sort = request_dict.get('sort', None)
  340. price = request_dict.get('price', None)
  341. remark = request_dict.get('remark', None)
  342. is_show = request_dict.get('isShow', None)
  343. virtualPrice = request_dict.get('virtualPrice', None)
  344. if not all([pay_type, price, is_show, status, combo_type, flow_total, expiration_days, expiration_type]):
  345. return response.json(444)
  346. flow_total = int(flow_total)
  347. expiration_days = int(expiration_days)
  348. expiration_type = int(expiration_type)
  349. status = int(status)
  350. combo_type = int(combo_type)
  351. is_show = int(is_show)
  352. sort = int(sort)
  353. nowTime = int(time.time())
  354. # 判断是编辑还是添加
  355. with transaction.atomic():
  356. try:
  357. re_data = {
  358. 'combo_name': combo_name,
  359. 'status': status,
  360. 'combo_type': combo_type,
  361. 'flow_total': flow_total,
  362. 'expiration_days': expiration_days,
  363. 'expiration_type': expiration_type,
  364. 'price': price,
  365. 'sort': sort,
  366. 'remark': remark if remark else '',
  367. 'is_show': is_show,
  368. 'virtual_price': virtualPrice,
  369. }
  370. if combo_id:
  371. combo_type_qs = UnicomCombo.objects.filter(id=combo_id)
  372. if not combo_type_qs.exists():
  373. return response.json(173)
  374. re_data['updated_time'] = nowTime
  375. combo_type_qs.filter(id=combo_id).update(**re_data)
  376. combo_type_qs.get(id=combo_id).pay_type.set(pay_type)
  377. else:
  378. re_data['updated_time'] = int(time.time())
  379. re_data['created_time'] = int(time.time())
  380. UnicomCombo.objects.create(**re_data).pay_type.set(pay_type)
  381. return response.json(0)
  382. except Exception as e:
  383. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  384. @staticmethod
  385. def get_unicom_info(request_dict, response):
  386. """
  387. 获取套餐详细表
  388. @param request_dict:
  389. @param response:
  390. @return:
  391. """
  392. pageNo = request_dict.get('pageNo', None)
  393. pageSize = request_dict.get('pageSize', None)
  394. if not all([pageNo, pageSize]):
  395. return response.json(444)
  396. elif pageNo and pageSize:
  397. pass
  398. page = int(pageNo)
  399. line = int(pageSize)
  400. try:
  401. combo_qs = UnicomCombo.objects.filter(is_del=False) \
  402. .values('id', 'status', 'combo_name',
  403. 'flow_total', 'combo_type',
  404. 'expiration_days',
  405. 'expiration_type', 'price', 'is_unlimited',
  406. 'updated_time', 'created_time',
  407. 'remark', 'is_show', 'sort', 'virtual_price').order_by('sort')
  408. if not combo_qs.exists():
  409. return response.json(0, [])
  410. total = combo_qs.count()
  411. combo_qs = combo_qs[(page - 1) * line:page * line]
  412. combo_list = []
  413. for item in combo_qs:
  414. # 获取支付方式列表
  415. pay_type_list = [pay_type['id'] for pay_type in
  416. UnicomCombo.objects.get(id=item['id']).pay_type.values('id')]
  417. combo_list.append({
  418. 'id': item['id'],
  419. 'status': item['status'],
  420. 'comboType': item['combo_type'],
  421. 'comboName': item['combo_name'],
  422. 'flowTotal': item['flow_total'],
  423. 'expirationDays': item['expiration_days'],
  424. 'expirationType': item['expiration_type'],
  425. 'price': item['price'],
  426. 'sort': item['sort'],
  427. 'isUnlimited': item['is_unlimited'],
  428. 'updatedTime': item['updated_time'],
  429. 'createdTime': item['created_time'],
  430. 'remark': item['remark'],
  431. 'isShow': item['is_show'],
  432. 'payTypes': pay_type_list,
  433. 'virtualPrice': item['virtual_price']
  434. })
  435. return response.json(0, {'list': combo_list, 'total': total})
  436. except Exception as e:
  437. print(e)
  438. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  439. @classmethod
  440. def get_pay_type(cls, response):
  441. """
  442. 获取支付类型
  443. @param response:
  444. @return:
  445. """
  446. pay_type_qs = Pay_Type.objects.all().values('id', 'payment')
  447. if not pay_type_qs.exists():
  448. return response.json(0, [])
  449. pay_type_list = []
  450. for pay_type in pay_type_qs:
  451. pay_type_list.append(pay_type)
  452. return response.json(0, pay_type_list)
  453. @classmethod
  454. def get_unicom_combo_type(cls, response):
  455. """
  456. 获取赠送套餐
  457. @param response:
  458. @return:
  459. """
  460. unicom_combo_qs = UnicomCombo.objects.filter(combo_type=2, status=0).values('id', 'combo_name')
  461. if not unicom_combo_qs.exists():
  462. return response.json(0, [])
  463. combo_list = []
  464. for combo in unicom_combo_qs:
  465. combo_list.append(combo)
  466. return response.json(0, combo_list)
  467. @classmethod
  468. def combo_order_info(cls, request_dict, response):
  469. """
  470. 删除卡套餐信息(修改状态)
  471. @param request_dict
  472. @param response
  473. @return:
  474. """
  475. combo_id = request_dict.get('id', None)
  476. if not combo_id:
  477. return response.json(444)
  478. combo_qs = UnicomCombo.objects.filter(id=combo_id)
  479. # 只修改默认状态
  480. if combo_qs.exists():
  481. combo_qs.update(is_del=True)
  482. return response.json(0)
  483. def static_info(self, request_dict, response):
  484. """
  485. 统计联通套餐
  486. @param request_dict:请求参数
  487. @param response: 响应对象
  488. @param return:
  489. """
  490. year = request_dict.get('year', None)
  491. Jan = int(time.mktime(time.strptime(year + '-1-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  492. Feb = int(time.mktime(time.strptime(year + '-2-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  493. Mar = int(time.mktime(time.strptime(year + '-3-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  494. Apr = int(time.mktime(time.strptime(year + '-4-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  495. May = int(time.mktime(time.strptime(year + '-5-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  496. Jun = int(time.mktime(time.strptime(year + '-6-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  497. Jul = int(time.mktime(time.strptime(year + '-7-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  498. Aug = int(time.mktime(time.strptime(year + '-8-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  499. Sep = int(time.mktime(time.strptime(year + '-9-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  500. Oct = int(time.mktime(time.strptime(year + '-10-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  501. Nov = int(time.mktime(time.strptime(year + '-11-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  502. Dec = int(time.mktime(time.strptime(year + '-12-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  503. Jan_next = int(time.mktime(time.strptime(str(int(year) + 1) + '-1-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
  504. list_data = []
  505. unicom_combo_qs = UnicomCombo.objects.filter().values('id', 'combo_type', 'combo_name')
  506. if not unicom_combo_qs.exists():
  507. return response.json(173)
  508. try:
  509. for unicom_combo in unicom_combo_qs:
  510. name = unicom_combo['combo_name']
  511. combo_order = UnicomComboOrderInfo.objects.filter(combo_id=unicom_combo['id'])
  512. if not combo_order.exists():
  513. continue
  514. Jan_count = combo_order.filter(created_time__range=[Jan, Feb]).count()
  515. Feb_count = combo_order.filter(created_time__range=[Feb, Mar]).count()
  516. Mar_count = combo_order.filter(created_time__range=[Mar, Apr]).count()
  517. Apr_count = combo_order.filter(created_time__range=[Apr, May]).count()
  518. May_count = combo_order.filter(created_time__range=[May, Jun]).count()
  519. Jun_count = combo_order.filter(created_time__range=[Jun, Jul]).count()
  520. Jul_count = combo_order.filter(created_time__range=[Jul, Aug]).count()
  521. Aug_count = combo_order.filter(created_time__range=[Aug, Sep]).count()
  522. Sep_count = combo_order.filter(created_time__range=[Sep, Oct]).count()
  523. Oct_count = combo_order.filter(created_time__range=[Oct, Nov]).count()
  524. Nov_count = combo_order.filter(created_time__range=[Nov, Dec]).count()
  525. Dec_count = combo_order.filter(created_time__range=[Dec, Jan_next]).count()
  526. data = [Jan_count, Feb_count, Mar_count, Apr_count, May_count, Jun_count, Jul_count, Aug_count,
  527. Sep_count,
  528. Oct_count, Nov_count, Dec_count]
  529. cloud_data = {
  530. 'name': name,
  531. 'type': 'line',
  532. 'data': data,
  533. }
  534. list_data.append(cloud_data)
  535. return response.json(0, {'list': list_data})
  536. except Exception as e:
  537. print(e)
  538. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  539. @classmethod
  540. def get_flow_packages(cls, request_dict, response):
  541. """
  542. 赠送套餐流量
  543. @param request_dict:请求参数
  544. @username request_dict:用户名
  545. @comboType request_dict:套餐类型
  546. @serialNo request_dict:序列号
  547. @param response: 响应对象
  548. @return:
  549. """
  550. userId = request_dict.get('userId', None)
  551. serialNo = request_dict.get('serialNo', None)
  552. comboId = request_dict.get('comboId', None)
  553. if not all([userId, serialNo, comboId]):
  554. return response.json(444)
  555. try:
  556. while transaction.atomic():
  557. combo_info_qs = UnicomCombo.objects.filter(id=comboId, combo_type=2, status=0) \
  558. .values('id', 'combo_name', 'price', 'virtual_price', 'remark', 'combo_type')
  559. unicom_device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serialNo,
  560. user_id=userId).values \
  561. ('iccid')
  562. if not unicom_device_info_qs.exists() or not combo_info_qs.exists():
  563. return response.json(173)
  564. combo_info_qs = combo_info_qs.first()
  565. unicom_device_info_qs = unicom_device_info_qs.first()
  566. n_time = int(time.time())
  567. order_id = CommonService.createOrderID() # 生成订单号
  568. # 赠送套餐下个月生效
  569. unicom_combo = UnicomComboView.create_combo_order_info(order_id=order_id, activate_type=1,
  570. iccid=unicom_device_info_qs['iccid'],
  571. combo_id=comboId)
  572. if unicom_combo is False:
  573. return response.json(178)
  574. rank_id, ai_rank_id = UnicomComboView.get_cloud_or_ai_combo() # 生成订单必须添加该字段
  575. uid = CommonService.query_uid_with_serial(serialNo) # 获取序列号或UID
  576. # 获取套餐信息
  577. order_dict = {
  578. 'orderID': order_id,
  579. 'UID': uid,
  580. 'rank_id': rank_id,
  581. 'ai_rank_id': ai_rank_id,
  582. 'userID_id': userId,
  583. 'desc': combo_info_qs['combo_name'],
  584. 'payType': 10,
  585. 'payTime': n_time,
  586. 'price': combo_info_qs['price'],
  587. 'addTime': n_time,
  588. 'updTime': n_time,
  589. 'status': 1,
  590. 'unify_combo_id': str(combo_info_qs['id']),
  591. 'order_type': 2,
  592. 'store_meal_name': combo_info_qs['combo_name']
  593. }
  594. Order_Model.objects.create(**order_dict)
  595. return response.json(0)
  596. except Exception as e:
  597. print(e)
  598. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  599. @classmethod
  600. def get_iccid_info(cls, request_dict, response):
  601. """
  602. 获取联通iccid最新状态
  603. """
  604. try:
  605. iccid = request_dict.get('iccid', None)
  606. if not iccid:
  607. return response.json(444)
  608. re_data = {'iccid': iccid}
  609. result = UnicomObjeect().query_device_status(**re_data)
  610. res_dict = UnicomObjeect().get_text_dict(result)
  611. # 状态不等于1(激活)时进行激活 1:激活;2:停用
  612. return response.json(0, res_dict['data']['status'])
  613. except Exception as e:
  614. print(e)
  615. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  616. @classmethod
  617. def package_cdk_export_excel(cls, response):
  618. """
  619. 流量包兑换码导出excel
  620. """
  621. try:
  622. # 创建一个新的excel文档
  623. wb = openpyxl.Workbook()
  624. # 获取默认的工作表
  625. sheet = wb.active
  626. sheet.title = '周视国内流量年卡兑换码'
  627. sheet.column_dimensions['A'].width = 15
  628. sheet.column_dimensions['B'].width = 20
  629. exchange_code = ExchangeCode.objects.filter(status=False, is_down=False)
  630. if not exchange_code.exists():
  631. return response.json(173)
  632. # 将兑换码写入到excel表
  633. for i, vo in enumerate(list(exchange_code)):
  634. code_no = cls.fix_string_length(str(vo.id))
  635. sheet.cell(row=i + 1, column=1, value=code_no)
  636. sheet.cell(row=i + 1, column=2, value=vo.code)
  637. filename = '国内流量年卡兑换码-{}.xlsx'.format(exchange_code.count())
  638. # 创建一个http响应
  639. res = HttpResponse(content_type='application/vnd.ms-excel')
  640. # 设置响应头,告诉浏览器文件要下载而不是直接打开
  641. res['Content-Disposition'] = 'attachment; filename={}'.format(filename)
  642. # 将excel文档保存到http响应中
  643. wb.save(res)
  644. exchange_code.update(is_down=True, updated_time=int(time.time()))
  645. return res
  646. except Exception as e:
  647. LOGGER.info('*****UnicomManageController.package_cdk_export_excel:errLine:{}, errMsg:{}'
  648. .format(e.__traceback__.tb_lineno, repr(e)))
  649. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  650. @staticmethod
  651. def fix_string_length(code_no):
  652. """
  653. 将兑换码编号生成固定6位长度
  654. """
  655. if len(code_no) < 6:
  656. return 'NO.' + code_no.rjust(6, '0')
  657. else:
  658. return 'NO.' + code_no
  659. @classmethod
  660. def create_package_cdk(cls, request_dict, response):
  661. """
  662. 批量生成兑换码
  663. """
  664. try:
  665. LOGGER.info('*****UnicomManageController.create_package_cdk,params:{}'.format(request_dict))
  666. quantity = request_dict.get('quantity', None)
  667. package_id = request_dict.get('packageId', None)
  668. if not all([quantity, package_id]):
  669. return response.json(444)
  670. combo_qs = UnicomCombo.objects.filter(id=int(package_id))
  671. if not combo_qs.exists():
  672. return response.json(173)
  673. combo = combo_qs.first()
  674. exchange_code_list = []
  675. now_time = int(time.time())
  676. if combo.combo_type == 3: # 五兴电信
  677. for i in range(int(quantity)):
  678. # 10位兑换码 后面两位为标识代表五兴电信
  679. code = cls.generate_code() + 'WD'
  680. exchange_code_list.append(ExchangeCode(code=code, status=False, is_down=0,
  681. package_type=1, package_id=combo.id,
  682. expire_time=0,
  683. created_time=now_time,
  684. updated_time=now_time))
  685. elif combo.combo_type == 0: # 珠海联通
  686. for i in range(int(quantity)):
  687. # 10位兑换码 后面两位为标识代表五兴电信
  688. code = cls.generate_code() + 'ZL'
  689. exchange_code_list.append(ExchangeCode(code=code, status=False, is_down=0,
  690. package_type=0, package_id=combo.id,
  691. expire_time=0,
  692. created_time=now_time,
  693. updated_time=now_time))
  694. if exchange_code_list:
  695. ExchangeCode.objects.bulk_create(exchange_code_list)
  696. return response.json(0)
  697. return response.json(178)
  698. except Exception as e:
  699. LOGGER.info('*****UnicomManageController.create_package_cdk:errLine:{}, errMsg:{}'
  700. .format(e.__traceback__.tb_lineno, repr(e)))
  701. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  702. @classmethod
  703. def generate_code(cls):
  704. # 生成uuid并移除-
  705. uuid_str = str(uuid.uuid4()).replace('-', '')
  706. now_time = int(time.time())
  707. uuid_str += str(now_time)
  708. # 使用SHA1算法生成哈希值
  709. sha1 = hashlib.sha1(uuid_str.encode('utf-8'))
  710. # 取哈希值的前8位,并将其转换为大写字母
  711. code = sha1.hexdigest()[:8].upper()
  712. return code