views.py 16 KB

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