views.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. from rest_framework import status
  2. from rest_framework import viewsets
  3. from rest_framework.response import Response
  4. from django.http import HttpResponse
  5. from rest_framework.decorators import action
  6. from rest_framework.serializers import ValidationError
  7. import requests
  8. import uuid
  9. import os
  10. import datetime
  11. from io import BytesIO
  12. import pandas as pd
  13. from django.utils.encoding import escape_uri_path
  14. from .serializers import PlatSimInfoSerializer
  15. from .models import PlatSimInfo
  16. from utils.paginations import CustomPagination
  17. from utils.utils import DeviceInfoUtils, GetSIMInfo
  18. # Create your views here.
  19. def time_dif(checkdatetime):
  20. # 获取传入时间和当前时间差
  21. nowdatetime = datetime.datetime.now()
  22. checkdatetime = datetime.datetime.strptime(checkdatetime, "%Y-%m-%d %H:%M:%S")
  23. timedif = nowdatetime - checkdatetime
  24. return timedif.days
  25. class PlatformIOTCardViewSet(viewsets.ModelViewSet):
  26. serializer_class = PlatSimInfoSerializer
  27. pagination_class = CustomPagination
  28. queryset = PlatSimInfo.objects.all().order_by("-id")
  29. def list(self, request, *args, **kwargs):
  30. device_type = request.query_params.get("device_type")
  31. deviceId = request.query_params.get("deviceId")
  32. simId = request.query_params.get("simId")
  33. expire_start_time = request.query_params.get("expire_start_time")
  34. expire_end_time = request.query_params.get("expire_end_time")
  35. queryset = self.get_queryset()
  36. if device_type:
  37. queryset = queryset.filter(device_type=device_type)
  38. if deviceId:
  39. if len(deviceId.strip()) < 4:
  40. raise ValidationError("设备号长度不能小于4位")
  41. queryset = queryset.filter(deviceId__icontains=deviceId.strip())
  42. if simId:
  43. if len(simId.strip()) < 4:
  44. raise ValidationError("物联网卡号长度不能小于4位")
  45. queryset = queryset.filter(simId__icontains=simId.strip())
  46. if expire_start_time:
  47. queryset = queryset.filter(expiry_date__range=(expire_start_time, expire_end_time))
  48. page = self.paginate_queryset(queryset)
  49. serializer = self.get_serializer(page, many=True)
  50. return self.get_paginated_response(serializer.data)
  51. def create(self, request, *args, **kwargs):
  52. device_id = request.data.get("device_id").strip()
  53. simId = request.data.get("simId").strip()
  54. if len(simId) > 20 or len(simId) < 19:
  55. raise ValidationError("物联网卡长度介于19-20位")
  56. if self.get_queryset().filter(simId=simId).exists():
  57. raise ValidationError("该物联网卡号已存在,请核查!")
  58. if self.get_queryset().filter(deviceId=device_id, input_type=2).exists():
  59. raise ValidationError("该设备已存在手动录入类型,请核查!")
  60. device_info_list = DeviceInfoUtils().get_equip_list(
  61. d_id=device_id,
  62. isfullId=1
  63. )
  64. if device_info_list:
  65. device_info = device_info_list[0]
  66. device_type = device_info["device_type"]
  67. platform = device_info["plat"]
  68. else:
  69. device_type = ""
  70. platform = ""
  71. if device_type not in ["测报灯", "孢子仪"]:
  72. raise ValidationError("不支持该类型设备手动录入物联网卡!")
  73. if platform == "四情平台":
  74. platformid = 1
  75. elif platform == "大数据平台":
  76. platformid = 2
  77. else:
  78. raise ValidationError("平台不存在该设备ID,请核查!")
  79. requests.post(url="http://www.yfzhwlw.com/equip_simiccid", data={"e_id": device_id, "iccid": simId}, timeout=10)
  80. requests.post(url="http://127.0.0.1:8002/api/api_gateway?method=forecast.send_control.device_sim",
  81. data={"device_id": device_id, "iccid": simId, "type": "change"}, timeout=10)
  82. sim_operators, account_status, active_date, data_plan, data_usage, data_balance, expiry_date = GetSIMInfo(
  83. simId).get_sim_info()
  84. request_data = {
  85. "simId": simId,
  86. "sim_operators": sim_operators,
  87. "input_type": 2,
  88. "deviceId": device_id,
  89. "device_type": device_type,
  90. "platform": platformid,
  91. "account_status": account_status,
  92. "active_date": active_date,
  93. "data_plan": data_plan,
  94. "data_usage": data_usage,
  95. "data_balance": data_balance,
  96. "expiry_date": expiry_date
  97. }
  98. serializer = self.get_serializer(data=request_data)
  99. serializer.is_valid(raise_exception=True)
  100. self.perform_create(serializer)
  101. headers = self.get_success_headers(serializer.data)
  102. return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  103. def update(self, request, pk, *args, **kwargs):
  104. req = request.data.get("req")
  105. instance = self.get_object()
  106. if req == "upgrade":
  107. iccid = instance.simId
  108. sim_operators, account_status, active_date, data_plan, data_usage, data_balance, expiry_date = GetSIMInfo(
  109. iccid).get_sim_info()
  110. update_data = {
  111. "sim_operators": sim_operators,
  112. "account_status": account_status,
  113. "active_date": active_date,
  114. "data_plan": data_plan,
  115. "data_usage": data_usage,
  116. "data_balance": data_balance,
  117. "expiry_date": expiry_date
  118. }
  119. elif req == "change":
  120. deviceId = instance.deviceId
  121. if instance.input_type == 1:
  122. raise ValidationError("设备读取物联网卡禁止更改")
  123. simId = request.POST.get("simId").strip()
  124. if len(simId) > 20 or len(simId) < 19:
  125. raise ValidationError("物联网卡长度介于19-20位")
  126. if self.get_queryset().filter(simId=simId).exists():
  127. raise ValidationError("预更改卡号已存在,请核对!")
  128. try:
  129. requests.post(url="http://www.yfzhwlw.com/equip_simiccid", data={"e_id": deviceId, "iccid": simId},
  130. timeout=10)
  131. requests.post(url="http://127.0.0.1:8002/api/api_gateway?method=forecast.send_control.device_sim",
  132. data={"device_id": deviceId, "iccid": simId, "type": "change"}, timeout=10)
  133. except:
  134. pass
  135. sim_operators, account_status, active_date, data_plan, data_usage, data_balance, expiry_date = GetSIMInfo(
  136. simId).get_sim_info()
  137. update_data = {
  138. "simId": simId,
  139. "sim_operators": sim_operators,
  140. "account_status": account_status,
  141. "active_date": active_date,
  142. "data_plan": data_plan,
  143. "data_usage": data_usage,
  144. "data_balance": data_balance,
  145. "expiry_date": expiry_date
  146. }
  147. else:
  148. raise ValidationError("未识别req参数")
  149. serializer = self.get_serializer(instance, data=update_data, partial=True)
  150. serializer.is_valid(raise_exception=True)
  151. self.perform_update(serializer)
  152. return Response(serializer.data)
  153. @action(methods=['get'], detail=False, url_path='get_device_type', url_name='get_device_type')
  154. def get_device_type(self, request, *args, **kwargs):
  155. queryset = PlatSimInfo.objects.raw("SELECT id,device_type FROM plat_sim_info GROUP BY device_type;")
  156. data = []
  157. for i in queryset:
  158. data.append(i.device_type)
  159. return Response(data)
  160. @action(methods=['get'], detail=False, url_path='down_excel', url_name='down_excel')
  161. def down_excel(self, request, *args, **kwargs):
  162. filename = request.query_params.get("filename")
  163. if filename == "发货表示例模板.xlsx":
  164. save_data = dict(设备ID=[])
  165. elif filename == "合宙续存流量卡筛选模板.xlsx":
  166. save_data = dict(ICCID=[], 续费价格=[], 当月消耗流量=[])
  167. elif filename == "SIMBoss续存流量卡筛选模板.xlsx":
  168. save_data = dict(ICCID=[], 筛查月份1=[], 筛查月份2=[], 筛查月份3=[], 筛查月份4=[], 筛查月份5=[],
  169. 筛查月份6=[], 筛查月份7=[], 筛查月份8=[], 筛查月份9=[])
  170. else:
  171. now_dir = os.path.dirname(__file__)
  172. file_path = os.path.join(now_dir, "excel_folder", filename)
  173. if os.path.exists(file_path) == False:
  174. raise ValidationError("文件不存在,请确认文件名")
  175. else:
  176. with open(file_path, 'rb') as f:
  177. data = f.read()
  178. response = HttpResponse(data, content_type="application/vnd.ms-excel")
  179. response['Content-Disposition'] = 'attachment;filename={}'.format(escape_uri_path(filename))
  180. os.remove(file_path)
  181. return response
  182. df = pd.DataFrame(data=save_data)
  183. output = BytesIO()
  184. df.to_excel(output, index=False)
  185. output.seek(0)
  186. response = HttpResponse(content_type='application/vnd.ms-excel')
  187. response['Content-Disposition'] = 'attachment;filename={}'.format(escape_uri_path(filename))
  188. response.write(output.getvalue())
  189. return response
  190. @action(methods=['post'], detail=False, url_path='delivery_card_filter', url_name='delivery_card_filter')
  191. def card_delivery_filter(self, request, *args, **kwargs):
  192. file = request.FILES.get('file')
  193. file_dataframe = pd.read_excel(file)
  194. save_data = dict(deviceid=[], fulldeviceid=[], device_type=[], is_recharge=[], backword=[])
  195. for deviceId in file_dataframe["设备ID"]:
  196. if isinstance(deviceId, int):
  197. deviceId = str(int(deviceId))
  198. else:
  199. deviceId = deviceId.strip()
  200. sim_queryset = self.get_queryset().filter(deviceId__endswith=deviceId, input_type=1)
  201. if sim_queryset.count() == 0:
  202. fulldeviceid = "未知"
  203. device_type = "未知"
  204. is_recharge = "未知"
  205. backword = "根据表内设备号未找到记录"
  206. elif sim_queryset.count() == 1:
  207. sim_obj = sim_queryset.first()
  208. fulldeviceid = sim_obj.deviceId
  209. device_type = sim_obj.device_type
  210. if sim_obj.expiry_date == "未知":
  211. is_recharge = "未知"
  212. else:
  213. time_difference = time_dif(sim_obj.expiry_date)
  214. if time_difference >= -180:
  215. is_recharge = "是"
  216. else:
  217. is_recharge = "否"
  218. backword = "{}".format(sim_obj.simId)
  219. if sim_obj.device_type == "孢子仪" or sim_obj.device_type == "测报灯":
  220. sim2_queryset = self.get_queryset().filter(deviceId=fulldeviceid, input_type=2).order_by("-id")
  221. if sim2_queryset:
  222. sim2_obj = sim2_queryset[0]
  223. if sim2_obj.expiry_date == "未知":
  224. is_recharge = "卡1" + is_recharge + ",卡2未知"
  225. else:
  226. time_difference = time_dif(sim2_obj.expiry_date)
  227. if time_difference >= -180:
  228. is_recharge = "卡1" + is_recharge + ",卡2是"
  229. else:
  230. is_recharge = "卡1" + is_recharge + ",卡2否"
  231. backword = "卡1:{};卡2:{}".format(sim_obj.simId, sim2_obj.simId)
  232. else:
  233. print("卡二不存在")
  234. else:
  235. fulldeviceid = "未知"
  236. device_type = "未知"
  237. is_recharge = "未知"
  238. backword = "根据表内设备号存在多条记录"
  239. save_data["deviceid"].append(deviceId)
  240. save_data["fulldeviceid"].append(fulldeviceid)
  241. save_data["is_recharge"].append(is_recharge)
  242. save_data["device_type"].append(device_type)
  243. save_data["backword"].append(backword)
  244. df = pd.DataFrame(data=save_data)
  245. save_filename = str(uuid.uuid4()) + ".xlsx"
  246. now_dir = os.path.dirname(__file__)
  247. save_path = os.path.join(now_dir, "excel_folder", save_filename)
  248. df.to_excel(save_path, index=False, header=["设备ID", "完整设备号(自行判断)", "设备类型", "是否需要充值", "说明备注"])
  249. return Response(save_filename)
  250. @action(methods=['post'], detail=False, url_path='xucun_card_filter', url_name='xucun_card_filter')
  251. def xucun_card_filter(self, request, *args, **kwargs):
  252. simtype = request.data.get("simtype")
  253. renew_file = request.FILES.get("file")
  254. file_dataframe = pd.read_excel(renew_file)
  255. if simtype == "1": # 合宙卡
  256. save_data = dict(ICCID=[], 续费价格=[], 是否需要充值=[], 备注=[])
  257. sim_list = list(file_dataframe["ICCID"])
  258. price_list = list(file_dataframe["续费价格"])
  259. usage_list = list(file_dataframe["当月消耗流量"])
  260. for index, usage in enumerate(usage_list):
  261. save_data["ICCID"].append(str(sim_list[index]))
  262. save_data["续费价格"].append(str(price_list[index]))
  263. try:
  264. usage_value = float(usage)
  265. except:
  266. usage_value = ""
  267. if usage_value == 0 or usage_value == "":
  268. card_queryset = self.get_queryset().filter(simId=str(sim_list[index]))
  269. if card_queryset.exists():
  270. card_obj = card_queryset.first()
  271. deviceId = card_obj.deviceId
  272. device_info_list = DeviceInfoUtils().get_equip_list(d_id=deviceId, isfullId=1)
  273. if device_info_list:
  274. device_info = device_info_list[0]
  275. uptime = device_info["uptime"]
  276. else:
  277. uptime = "1970-01-01 00:00:00"
  278. time_diff_days = time_dif(uptime)
  279. if time_diff_days > 270:
  280. save_data["是否需要充值"].append("否")
  281. save_data["备注"].append("对应设备号:{}".format(deviceId))
  282. else:
  283. save_data["是否需要充值"].append("是")
  284. save_data["备注"].append("对应设备号:{}".format(deviceId))
  285. else:
  286. save_data["是否需要充值"].append("未知")
  287. save_data["备注"].append("未找到该卡记录,请确认是否未录入平台")
  288. else:
  289. save_data["是否需要充值"].append("是")
  290. save_data["备注"].append("当月存在流量使用")
  291. else: # SIMboss
  292. save_data = dict(ICCID=[], 是否需要充值=[])
  293. for index, sim in enumerate(file_dataframe["ICCID"]):
  294. save_data["ICCID"].append(str(sim))
  295. status = 0
  296. for i in range(9):
  297. if float(file_dataframe["筛查月份{}".format(str(i + 1))][index]) > 1:
  298. status = 1
  299. break
  300. if status == 1:
  301. save_data["是否需要充值"].append("是")
  302. else:
  303. save_data["是否需要充值"].append("否")
  304. df = pd.DataFrame(data=save_data)
  305. save_filename = str(uuid.uuid4()) + ".xlsx"
  306. now_dir = os.path.dirname(__file__)
  307. save_path = os.path.join(now_dir, "excel_folder", save_filename)
  308. df.to_excel(save_path, index=False)
  309. return Response(save_filename)
  310. @action(methods=['post'], detail=False, url_path='inquiries', url_name='inquiries')
  311. def inquiries(self, request):
  312. iccid = request.data.get("iccid")
  313. if iccid:
  314. sim_operators, account_status, active_date, data_plan, data_usage, data_balance, expiry_date = GetSIMInfo(
  315. iccid).get_sim_info()
  316. data = {
  317. "simId": iccid,
  318. "sim_operators": "合宙" if sim_operators == 1 else "SIMBoss" if sim_operators == 2 else "未知",
  319. "account_status": account_status,
  320. "active_date": active_date,
  321. "data_plan": data_plan,
  322. "data_usage": data_usage,
  323. "data_balance": data_balance,
  324. "expiry_date": expiry_date
  325. }
  326. return Response(data)
  327. else:
  328. raise ValidationError("iccid参数缺失")