views.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  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, GetDashujuSiqingDeviceInfo
  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. def time_dif_new(stamp):
  26. nowdatetime = datetime.datetime.now()
  27. check = datetime.datetime.fromtimestamp(stamp)
  28. timedif = nowdatetime - check
  29. return timedif.days
  30. class PlatformIOTCardViewSet(viewsets.ModelViewSet):
  31. serializer_class = PlatSimInfoSerializer
  32. pagination_class = CustomPagination
  33. queryset = PlatSimInfo.objects.all().order_by("-id")
  34. def list(self, request, *args, **kwargs):
  35. device_type = request.query_params.get("device_type")
  36. deviceId = request.query_params.get("deviceId")
  37. simId = request.query_params.get("simId")
  38. expire_start_time = request.query_params.get("expire_start_time")
  39. expire_end_time = request.query_params.get("expire_end_time")
  40. queryset = self.get_queryset()
  41. if device_type:
  42. queryset = queryset.filter(device_type=device_type)
  43. if deviceId:
  44. if len(deviceId.strip()) < 4:
  45. raise ValidationError("设备号长度不能小于4位")
  46. queryset = queryset.filter(deviceId__icontains=deviceId.strip())
  47. if simId:
  48. if len(simId.strip()) < 4:
  49. raise ValidationError("物联网卡号长度不能小于4位")
  50. queryset = queryset.filter(simId__icontains=simId.strip())
  51. if expire_start_time:
  52. queryset = queryset.filter(expiry_date__range=(expire_start_time, expire_end_time))
  53. page = self.paginate_queryset(queryset)
  54. serializer = self.get_serializer(page, many=True)
  55. return self.get_paginated_response(serializer.data)
  56. def create(self, request, *args, **kwargs):
  57. device_id = request.data.get("device_id").strip()
  58. simId = request.data.get("simId").strip()
  59. if len(simId) > 20 or len(simId) < 19:
  60. raise ValidationError("物联网卡长度介于19-20位")
  61. if self.get_queryset().filter(simId=simId).exists():
  62. raise ValidationError("该物联网卡号已存在,请核查!")
  63. if self.get_queryset().filter(deviceId=device_id, input_type=2).exists():
  64. raise ValidationError("该设备已存在手动录入类型,请核查!")
  65. device_info_list = DeviceInfoUtils().get_equip_list(
  66. d_id=device_id,
  67. isfullId=1
  68. )
  69. if device_info_list:
  70. device_info = device_info_list[0]
  71. device_type = device_info["device_type"]
  72. platform = device_info["plat"]
  73. else:
  74. device_type = ""
  75. platform = ""
  76. if device_type not in ["测报灯", "孢子仪"]:
  77. raise ValidationError("不支持该类型设备手动录入物联网卡!")
  78. if platform == "四情平台":
  79. platformid = 1
  80. elif platform == "大数据平台":
  81. platformid = 2
  82. else:
  83. raise ValidationError("平台不存在该设备ID,请核查!")
  84. requests.post(url="http://172.16.220.3/equip_simiccid", data={"e_id": device_id, "iccid": simId}, timeout=10)
  85. requests.post(url="http://127.0.0.1:8002/api/api_gateway?method=forecast.send_control.device_sim",
  86. data={"device_id": device_id, "iccid": simId, "type": "change"}, timeout=10)
  87. sim_operators, account_status, active_date, data_plan, data_usage, data_balance, expiry_date = GetSIMInfo(
  88. simId).get_sim_info()
  89. request_data = {
  90. "simId": simId,
  91. "sim_operators": sim_operators,
  92. "input_type": 2,
  93. "deviceId": device_id,
  94. "device_type": device_type,
  95. "platform": platformid,
  96. "account_status": account_status,
  97. "active_date": active_date,
  98. "data_plan": data_plan,
  99. "data_usage": data_usage,
  100. "data_balance": data_balance,
  101. "expiry_date": expiry_date
  102. }
  103. serializer = self.get_serializer(data=request_data)
  104. serializer.is_valid(raise_exception=True)
  105. self.perform_create(serializer)
  106. headers = self.get_success_headers(serializer.data)
  107. return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  108. def update(self, request, pk, *args, **kwargs):
  109. req = request.data.get("req")
  110. instance = self.get_object()
  111. if req == "upgrade":
  112. iccid = instance.simId
  113. sim_operators, account_status, active_date, data_plan, data_usage, data_balance, expiry_date = GetSIMInfo(
  114. iccid).get_sim_info()
  115. update_data = {
  116. "sim_operators": sim_operators,
  117. "account_status": account_status,
  118. "active_date": active_date,
  119. "data_plan": data_plan,
  120. "data_usage": data_usage,
  121. "data_balance": data_balance,
  122. "expiry_date": expiry_date
  123. }
  124. elif req == "change":
  125. deviceId = instance.deviceId
  126. if instance.input_type == 1:
  127. raise ValidationError("设备读取物联网卡禁止更改")
  128. simId = request.data.get("simId").strip()
  129. if len(simId) > 20 or len(simId) < 19:
  130. raise ValidationError("物联网卡长度介于19-20位")
  131. if self.get_queryset().filter(simId=simId).exists():
  132. raise ValidationError("预更改卡号已存在,请核对!")
  133. try:
  134. requests.post(url="http://172.16.220.3/equip_simiccid", data={"e_id": deviceId, "iccid": simId},
  135. timeout=10)
  136. requests.post(url="http://127.0.0.1:8002/api/api_gateway?method=forecast.send_control.device_sim",
  137. data={"device_id": deviceId, "iccid": simId, "type": "change"}, timeout=10)
  138. except:
  139. pass
  140. sim_operators, account_status, active_date, data_plan, data_usage, data_balance, expiry_date = GetSIMInfo(
  141. simId).get_sim_info()
  142. update_data = {
  143. "simId": simId,
  144. "sim_operators": sim_operators,
  145. "account_status": account_status,
  146. "active_date": active_date,
  147. "data_plan": data_plan,
  148. "data_usage": data_usage,
  149. "data_balance": data_balance,
  150. "expiry_date": expiry_date
  151. }
  152. else:
  153. raise ValidationError("未识别req参数")
  154. serializer = self.get_serializer(instance, data=update_data, partial=True)
  155. serializer.is_valid(raise_exception=True)
  156. self.perform_update(serializer)
  157. return Response(serializer.data)
  158. @action(methods=['get'], detail=False, url_path='get_device_type', url_name='get_device_type')
  159. def get_device_type(self, request, *args, **kwargs):
  160. queryset = PlatSimInfo.objects.raw("SELECT id,device_type FROM plat_sim_info GROUP BY device_type;")
  161. data = []
  162. for i in queryset:
  163. data.append(i.device_type)
  164. return Response(data)
  165. @action(methods=['get'], detail=False, url_path='down_excel', url_name='down_excel')
  166. def down_excel(self, request, *args, **kwargs):
  167. filename = request.query_params.get("filename")
  168. if filename == "发货表示例模板.xlsx":
  169. save_data = dict(设备ID=[])
  170. elif filename == "合宙续存流量卡筛选模板.xlsx":
  171. save_data = dict(ICCID=[], 续费价格=[], 当月消耗流量=[])
  172. elif filename == "SIMBoss续存流量卡筛选模板.xlsx":
  173. save_data = dict(ICCID=[], 筛查月份1=[], 筛查月份2=[], 筛查月份3=[], 筛查月份4=[], 筛查月份5=[],
  174. 筛查月份6=[], 筛查月份7=[], 筛查月份8=[], 筛查月份9=[])
  175. else:
  176. now_dir = os.path.dirname(__file__)
  177. file_path = os.path.join(now_dir, "excel_folder", filename)
  178. if os.path.exists(file_path) == False:
  179. raise ValidationError("文件不存在,请确认文件名")
  180. else:
  181. with open(file_path, 'rb') as f:
  182. data = f.read()
  183. response = HttpResponse(data, content_type="application/vnd.ms-excel")
  184. response['Content-Disposition'] = 'attachment;filename={}'.format(escape_uri_path(filename))
  185. os.remove(file_path)
  186. return response
  187. df = pd.DataFrame(data=save_data)
  188. output = BytesIO()
  189. df.to_excel(output, index=False)
  190. output.seek(0)
  191. response = HttpResponse(content_type='application/vnd.ms-excel')
  192. response['Content-Disposition'] = 'attachment;filename={}'.format(escape_uri_path(filename))
  193. response.write(output.getvalue())
  194. return response
  195. @action(methods=['post'], detail=False, url_path='delivery_card_filter', url_name='delivery_card_filter')
  196. def card_delivery_filter(self, request, *args, **kwargs):
  197. file = request.FILES.get('file')
  198. file_dataframe = pd.read_excel(file)
  199. save_data = dict(deviceid=[], platform=[], device_type=[], order_id=[], owen_user=[], status=[], location=[], sim_1=[],is_recharge_1=[], sim_2=[], is_recharge_2=[])
  200. for deviceId in file_dataframe.get("设备ID",[]):
  201. if isinstance(deviceId, int):
  202. deviceId = str(int(deviceId))
  203. else:
  204. deviceId = deviceId.strip()
  205. save_data["deviceid"].append(deviceId)
  206. device_info_list = DeviceInfoUtils().get_equip_list(d_id=deviceId, isfullId=1)
  207. save_data["platform"].append(device_info_list[0]["plat"] if device_info_list else "未知")
  208. save_data["device_type"].append(device_info_list[0]["device_type"] if device_info_list else "")
  209. save_data["order_id"].append(device_info_list[0]["order_id"] if device_info_list else "")
  210. save_data["owen_user"].append(device_info_list[0]["owen_user"] if device_info_list else "")
  211. save_data["status"].append(device_info_list[0]["status"] if device_info_list else "")
  212. save_data["location"].append(device_info_list[0]["location"] if device_info_list else "")
  213. sim_1_queryset = self.get_queryset().filter(deviceId=deviceId, input_type=1)
  214. if sim_1_queryset.count() == 0:
  215. save_data["sim_1"].append("暂无")
  216. save_data["is_recharge_1"].append("")
  217. else:
  218. sim_1_obj = sim_1_queryset[0]
  219. save_data["sim_1"].append(sim_1_obj.simId)
  220. if sim_1_obj.expiry_date == "未知":
  221. save_data["is_recharge_1"].append("未知")
  222. else:
  223. time_difference = time_dif(sim_1_obj.expiry_date)
  224. if time_difference >= -180:
  225. save_data["is_recharge_1"].append("是")
  226. else:
  227. save_data["is_recharge_1"].append("否")
  228. sim_2_queryset = self.get_queryset().filter(deviceId=deviceId, input_type=2)
  229. if sim_2_queryset.count() == 0:
  230. save_data["sim_2"].append("暂无")
  231. save_data["is_recharge_2"].append("")
  232. else:
  233. sim_2_obj = sim_2_queryset[0]
  234. save_data["sim_2"].append(sim_2_obj.simId)
  235. if sim_2_obj.expiry_date == "未知":
  236. save_data["is_recharge_2"].append("未知")
  237. else:
  238. time_difference = time_dif(sim_2_obj.expiry_date)
  239. if time_difference >= -180:
  240. save_data["is_recharge_2"].append("是")
  241. else:
  242. save_data["is_recharge_2"].append("否")
  243. df = pd.DataFrame(data=save_data)
  244. save_filename = str(uuid.uuid4()) + ".xlsx"
  245. now_dir = os.path.dirname(__file__)
  246. save_path = os.path.join(now_dir, "excel_folder", save_filename)
  247. df.to_excel(save_path, index=False, header=["设备ID", "所属平台", "设备类型", "任务单号", "所属用户", "设备状态", "设备位置", "设备自读SIM卡", "是否需要充值", "人工录入SIM卡", "是否需要充值"])
  248. return Response(save_filename)
  249. @action(methods=['post'], detail=False, url_path='xucun_card_filter', url_name='xucun_card_filter')
  250. def xucun_card_filter(self, request, *args, **kwargs):
  251. simtype = request.data.get("simtype")
  252. renew_file = request.FILES.get("file")
  253. file_dataframe = pd.read_excel(renew_file)
  254. dashuju_siqing = GetDashujuSiqingDeviceInfo()
  255. if simtype == "1": # 合宙卡
  256. save_data = dict(ICCID=[],续费价格=[],是否需要充值=[],设备ID=[],所属平台=[],设备类型=[],任务单号=[],所属用户=[],设备状态=[],设备位置=[])
  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. card_queryset = self.get_queryset().filter(simId=str(sim_list[index]).strip())
  264. if card_queryset.exists():
  265. card_obj = card_queryset.last()
  266. deviceId = card_obj.deviceId
  267. save_data["设备ID"].append(deviceId)
  268. # device_info_list = DeviceInfoUtils().get_equip_list(d_id=deviceId, isfullId=1)
  269. device_info_list = dashuju_siqing.get_together(device_id=deviceId)
  270. if device_info_list:
  271. device_info = device_info_list
  272. uptime = device_info["uptime"]
  273. save_data["所属平台"].append(device_info["plat"])
  274. save_data["设备类型"].append(device_info["device_type"])
  275. save_data["任务单号"].append(device_info["order_id"])
  276. save_data["所属用户"].append(device_info["owner_user"])
  277. save_data["设备状态"].append(device_info["status"])
  278. save_data["设备位置"].append(device_info["location"])
  279. else:
  280. uptime = ""
  281. save_data["所属平台"].append("")
  282. save_data["设备类型"].append("")
  283. save_data["任务单号"].append("")
  284. save_data["所属用户"].append("")
  285. save_data["设备状态"].append("")
  286. save_data["设备位置"].append("")
  287. else:
  288. uptime = ""
  289. save_data["设备ID"].append("")
  290. save_data["所属平台"].append("")
  291. save_data["设备类型"].append("")
  292. save_data["任务单号"].append("")
  293. save_data["所属用户"].append("")
  294. save_data["设备状态"].append("")
  295. save_data["设备位置"].append("")
  296. try:
  297. usage_value = float(usage)
  298. except:
  299. usage_value = ""
  300. if usage_value == 0 or usage_value == "":
  301. if uptime:
  302. time_diff_days = time_dif_new(uptime)
  303. if time_diff_days > 270:
  304. save_data["是否需要充值"].append("否")
  305. else:
  306. save_data["是否需要充值"].append("是")
  307. else:
  308. save_data["是否需要充值"].append("未知")
  309. else:
  310. save_data["是否需要充值"].append("是")
  311. else: # SIMboss
  312. save_data = dict(ICCID=[], 是否需要充值=[],设备ID=[],所属平台=[],设备类型=[],任务单号=[],所属用户=[],设备状态=[],设备位置=[])
  313. for index, sim in enumerate(file_dataframe["ICCID"]):
  314. save_data["ICCID"].append(str(sim))
  315. card_queryset = self.get_queryset().filter(simId=str(sim).strip())
  316. if card_queryset.exists():
  317. try:
  318. card_obj = card_queryset.last()
  319. deviceId = card_obj.deviceId
  320. save_data["设备ID"].append(deviceId)
  321. # device_info_list = DeviceInfoUtils().get_equip_list(d_id=deviceId, isfullId=1)
  322. device_info_list = dashuju_siqing.get_together(device_id=deviceId)
  323. if device_info_list:
  324. device_info = device_info_list
  325. save_data["所属平台"].append(device_info["plat"])
  326. save_data["设备类型"].append(device_info["device_type"])
  327. save_data["任务单号"].append(device_info["order_id"])
  328. save_data["所属用户"].append(device_info["owner_user"])
  329. save_data["设备状态"].append(device_info["status"])
  330. save_data["设备位置"].append(device_info["location"])
  331. else:
  332. save_data["所属平台"].append("")
  333. save_data["设备类型"].append("")
  334. save_data["任务单号"].append("")
  335. save_data["所属用户"].append("")
  336. save_data["设备状态"].append("")
  337. save_data["设备位置"].append("")
  338. except Exception as e:
  339. save_data["设备ID"].append("")
  340. save_data["所属平台"].append("")
  341. save_data["设备类型"].append("")
  342. save_data["任务单号"].append("")
  343. save_data["所属用户"].append("")
  344. save_data["设备状态"].append("")
  345. save_data["设备位置"].append("")
  346. else:
  347. save_data["设备ID"].append("")
  348. save_data["所属平台"].append("")
  349. save_data["设备类型"].append("")
  350. save_data["任务单号"].append("")
  351. save_data["所属用户"].append("")
  352. save_data["设备状态"].append("")
  353. save_data["设备位置"].append("")
  354. status = 0
  355. for i in range(9):
  356. if float(file_dataframe["筛查月份{}".format(str(i + 1))][index]) > 1:
  357. status = 1
  358. break
  359. if status == 1:
  360. save_data["是否需要充值"].append("是")
  361. else:
  362. save_data["是否需要充值"].append("否")
  363. dashuju_siqing.conn.close()
  364. df = pd.DataFrame(data=save_data)
  365. save_filename = str(uuid.uuid4()) + ".xlsx"
  366. now_dir = os.path.dirname(__file__)
  367. save_path = os.path.join(now_dir, "excel_folder", save_filename)
  368. print(save_path)
  369. df.to_excel(save_path, index=False)
  370. return Response(save_filename)
  371. @action(methods=['post'], detail=False, url_path='inquiries', url_name='inquiries')
  372. def inquiries(self, request):
  373. iccid = request.data.get("iccid")
  374. if iccid:
  375. sim_operators, account_status, active_date, data_plan, data_usage, data_balance, expiry_date = GetSIMInfo(
  376. iccid).get_sim_info()
  377. data = {
  378. "simId": iccid,
  379. "sim_operators": "合宙" if sim_operators == 1 else "SIMBoss" if sim_operators == 2 else "未知",
  380. "account_status": account_status,
  381. "active_date": active_date,
  382. "data_plan": data_plan,
  383. "data_usage": data_usage,
  384. "data_balance": data_balance,
  385. "expiry_date": expiry_date
  386. }
  387. return Response(data)
  388. else:
  389. raise ValidationError("iccid参数缺失")