SerialNumberController.py 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import logging
  4. import random
  5. import time
  6. from bulk_update.helper import bulk_update
  7. from django.db import transaction
  8. from django.db.models import Count
  9. from django.views import View
  10. from Model.models import SerialNumberModel, UserModel, UserSerialNumberModel, UserUIDModel, CompanySerialModel
  11. from Object.RedisObject import RedisObject
  12. from Object.ResponseObject import ResponseObject
  13. from Object.TokenObject import TokenObject
  14. from Service.AlgorithmService import AlgorithmBaseOn35
  15. from Service.CommonService import CommonService
  16. from Service.ModelService import ModelService
  17. class SerialNumberView(View):
  18. def get(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. request_dict = request.GET
  21. operation = kwargs.get('operation')
  22. return self.validate(request_dict, operation)
  23. def post(self, request, *args, **kwargs):
  24. request.encoding = 'utf-8'
  25. request_dict = request.POST
  26. operation = kwargs.get('operation')
  27. return self.validate(request_dict, operation)
  28. def validate(self, request_dict, operation):
  29. response = ResponseObject()
  30. if operation == 'create':
  31. return self.do_create(request_dict, response)
  32. elif operation == 'getSerial':
  33. return self.do_get_serial_number(request_dict, response)
  34. token = request_dict.get('token', None)
  35. token = TokenObject(token)
  36. if token.code != 0:
  37. return response.json(token.code)
  38. if operation == 'quantity':
  39. return self.do_quantity(request_dict,token.userID, response)
  40. elif operation == 'allot':
  41. return self.do_allot(request_dict, response)
  42. else:
  43. return response.json(309)
  44. # 查询当前可用的UID的数量
  45. def do_quantity(self, request_dict, userID, response):
  46. user_qs = UserModel.objects.filter(id=userID)
  47. if not user_qs.exists():
  48. return response.json(9)
  49. user = user_qs[0]
  50. chenyunsuper = SerialNumberModel.objects.filter().count()
  51. result = UserSerialNumberModel.objects.filter(user__id=user.id, serial_number__use_status=1).aggregate(num=Count('serial_number__use_status'))
  52. chenyundev = result['num']
  53. chenyun = SerialNumberModel.objects.filter(use_status=1).count()
  54. res_data = {'code': 0, 'chenyun': chenyun, 'chenyunsuper': chenyunsuper, 'chenyundev': chenyundev}
  55. return response.json(0, {'data': res_data})
  56. def do_create(self, request_dict, response):
  57. quantity = int(request_dict.get('quantity', 0))
  58. if not quantity:
  59. return response.json(444)
  60. try:
  61. try:
  62. sum = SerialNumberModel.objects.last().id
  63. except:
  64. sum = 0
  65. serial_number_bulk = []
  66. now_time = int(time.time())
  67. algorithm = AlgorithmBaseOn35()
  68. for i in range(quantity):
  69. serial_number = algorithm.getLetter(sum)
  70. sum += 1 # sum每次递增1
  71. # 前面补0至六位
  72. serial_number = (6-len(serial_number))*'0' + serial_number
  73. serial_number_bulk.append(SerialNumberModel(serial_number=serial_number, add_time=now_time))
  74. # 开启事务写入
  75. with transaction.atomic():
  76. SerialNumberModel.objects.bulk_create(serial_number_bulk)
  77. return response.json(0)
  78. except Exception as e:
  79. print(e)
  80. return response.json(500, repr(e))
  81. # 分配序列号
  82. @transaction.atomic
  83. def do_allot(self, request_dict, response):
  84. username = request_dict.get('username', None)
  85. quantity = int(request_dict.get('quantity', None))
  86. token = request_dict.get('token', None)
  87. token = TokenObject(token)
  88. if token.code != 0:
  89. return response.json(token.code)
  90. user = UserModel.objects.get(id=token.userID)
  91. if not user or '0' not in user.permission:
  92. return response.json(404)
  93. # 要分配的对象
  94. allot_user_qs = UserModel.objects.filter(username=username)
  95. if not allot_user_qs.exists():
  96. return response.json(444, 'username')
  97. # 取出对应区域可用的UID分配给allot_user
  98. sn_qs = SerialNumberModel.objects.filter(use_status=0)[0:quantity]
  99. sns = []
  100. for sn in sn_qs:
  101. sns.append(sn.serial_number)
  102. cs_qs = CompanySerialModel.objects.filter(serial_number__in=sns, status=1)
  103. sns = []
  104. for cs in cs_qs:
  105. sns.append(cs.serial_number)
  106. sn_qs = SerialNumberModel.objects.filter(serial_number__in=sns)
  107. count = sn_qs.count()
  108. if count < quantity:
  109. return response.json(444, '序列号不足')
  110. updates = []
  111. datas = []
  112. count = 0
  113. if sn_qs.exists():
  114. sn_qs = sn_qs[0:quantity]
  115. now_time = int(time.time())
  116. for i in range(len(sn_qs)):
  117. item = sn_qs[i]
  118. serialNumberModel = SerialNumberModel(
  119. id=item.id,
  120. serial_number=item.serial_number,
  121. status=item.status,
  122. use_status=1,
  123. add_time=item.add_time
  124. )
  125. user_serial_number = UserSerialNumberModel()
  126. user_serial_number.serial_number = serialNumberModel
  127. user_serial_number.user = allot_user_qs[0]
  128. user_serial_number.add_time = now_time
  129. user_serial_number.update_time = now_time
  130. datas.append(user_serial_number)
  131. updates.append(serialNumberModel)
  132. if len(updates) % 5000 == 0:
  133. bulk_update(updates)
  134. UserSerialNumberModel.objects.bulk_create(datas)
  135. if len(updates) > 0:
  136. bulk_update(updates)
  137. UserSerialNumberModel.objects.bulk_create(datas)
  138. del datas
  139. del updates
  140. return response.json(0)
  141. else:
  142. return response.json(444)
  143. # 提供给pc端获取序列号
  144. def do_get_serial_number(self, request_dict, response):
  145. quantity = 1 #只能取一个
  146. company_id = request_dict.get('company_id', None)
  147. token = request_dict.get('token', None)
  148. time_stamp = request_dict.get('time_stamp', None)
  149. mac = request_dict.get('mac', None)
  150. if token and time_stamp and quantity and company_id:
  151. token = int(CommonService.decode_data(token))
  152. time_stamp = int(time_stamp)
  153. now_time = int(time.time())
  154. distance = now_time - time_stamp
  155. if token != time_stamp or distance > 60000 or distance < -60000: # 为了全球化时间控制在一天内
  156. return response.json(404)
  157. redisObject = RedisObject()
  158. key = 'serial_lock'
  159. value = redisObject.lpop(key)
  160. count = 0
  161. while value is False and count < 5:
  162. time.sleep(1)
  163. value = redisObject.lpop(key)
  164. count += 1
  165. if count == 5 and value is False: # 暂时注释
  166. return response.json(5)
  167. userid = '3'
  168. user_qs = UserModel.objects.filter(id=userid)
  169. if not user_qs.exists():
  170. return response.json(9)
  171. user = user_qs[0]
  172. result = UserSerialNumberModel.objects.filter(user__id=user.id,
  173. serial_number__use_status=1).aggregate(
  174. num=Count('serial_number__use_status'))
  175. us_qs = UserSerialNumberModel.objects.filter(user__id=user.id,
  176. serial_number__use_status=1).values(
  177. 'serial_number__serial_number')
  178. sns = []
  179. for us in us_qs:
  180. sns.append(us['serial_number__serial_number'])
  181. cs_qs = CompanySerialModel.objects.filter(serial_number__in=sns, status=1, company__secret=company_id).values('serial_number', 'company__mark')
  182. sns = []
  183. mark = ""
  184. if cs_qs.exists():
  185. for cs in cs_qs:
  186. sns.append(cs['serial_number'])
  187. mark = cs_qs[0]['company__mark']
  188. sn_qs = SerialNumberModel.objects.filter(serial_number__in=sns)
  189. count = result['num']
  190. if count < quantity:
  191. return response.json(444, '序列号不足')
  192. # company_serial_qs = company_serial_qs.values('id', 'serial_number__serial_number', 'company__mark')
  193. save_point = transaction.savepoint() # 设置事务保存点
  194. try:
  195. if sn_qs.exists():
  196. sn_qs = sn_qs[0: quantity]
  197. serial_number = sn_qs[0].serial_number
  198. serialNumberModel = SerialNumberModel(
  199. id=sn_qs[0].id,
  200. serial_number=serial_number,
  201. status=sn_qs[0].status,
  202. use_status=2,
  203. add_time=sn_qs[0].add_time
  204. )
  205. updates = []
  206. updates.append(serialNumberModel)
  207. bulk_update(updates)
  208. except Exception as e:
  209. if save_point:
  210. transaction.savepoint_rollback(save_point) # 事务回滚
  211. redisObject.rpush(key, value)
  212. return response.json(0, {'serial_number': serial_number + mark, 'mac': mac})
  213. else:
  214. return response.json(444)