views.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659
  1. import io
  2. import json
  3. import os
  4. from django.http import HttpResponse
  5. from django.shortcuts import render
  6. from rest_framework.response import Response
  7. from rest_framework import status
  8. from rest_framework.generics import GenericAPIView
  9. from rest_framework.views import APIView
  10. from django.db.models import ObjectDoesNotExist, Q
  11. from utils.JWTAuthentication_diy import MyJWTAuthentication
  12. from utils.permissions import QxzLoginPermission
  13. from utils.paginations import CustomPagination
  14. from .serializers import QxzTypeConfigAddSerializer, QxzTypeConfigModifySerializer, QxzTypeConfigDeleteSerializer, \
  15. QxzTypeConfigListSerializer, QxzElementAddSerializer, QxzElementModifySerializer, QxzElementDeleteSerializer, \
  16. QxzElementListSerializer, QxzDeviceAddSerializer, QxzDeviceListSerializer
  17. from .models import QxzTypeConfigModel, QxzElementConfigModel, QxzDeviceConfigModel
  18. import jwt
  19. class UserLoginView(APIView):
  20. def post(self, request, *args, **kwargs):
  21. """用户登录接口"""
  22. username = request.data.get('username')
  23. password = request.data.get('password')
  24. print(username, password)
  25. if username == "admin" and password == "hnyfqxz":
  26. token = jwt.encode({"username": username, "password": password}, "secret", algorithm="HS256").decode('utf-8')
  27. request.session["hnyfqxz"] = token
  28. request.session.save()
  29. return Response({'msg': "登录成功", "token": token}, status=200)
  30. return Response({'msg': "登录失败,用户名或密码不正确"}, status=400)
  31. class UserLogoutView(APIView):
  32. permission_classes = [QxzLoginPermission]
  33. def post(self, request, *args, **kwargs):
  34. """用户退出接口"""
  35. try:
  36. del request.session['hnyfqxz']
  37. request.session.save()
  38. except Exception as e:
  39. pass
  40. return Response({'msg': "退出成功"}, status=200)
  41. class QxzTypeConfigAddView(GenericAPIView):
  42. # authentication_classes = [MyJWTAuthentication]
  43. permission_classes = [QxzLoginPermission]
  44. serializer_class = QxzTypeConfigAddSerializer
  45. queryset = QxzTypeConfigModel.objects.all()
  46. def post(self, request, *args, **kwargs):
  47. """新增要素类型配置信息接口"""
  48. serializer = self.get_serializer(data=request.data)
  49. serializer.is_valid(raise_exception=True)
  50. data = serializer.validated_data
  51. eNum = data['eNum']
  52. cName = data['cName']
  53. units = data['units']
  54. queryset = self.get_queryset()
  55. if queryset.filter(eNum=eNum):
  56. return Response(data={"msg": "eNum已存在", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  57. if queryset.filter(cName=cName):
  58. return Response(data={"msg": "要素类型名称已存在", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  59. qsc = QxzTypeConfigModel()
  60. qsc.eNum = eNum
  61. qsc.cName = cName
  62. qsc.units = units
  63. qsc.save()
  64. return Response(data={"msg": "要素类型配置创建成功", "data": ""}, status=status.HTTP_200_OK)
  65. class QxzTypeConfigModifyView(GenericAPIView):
  66. # authentication_classes = [MyJWTAuthentication]
  67. permission_classes = [QxzLoginPermission]
  68. serializer_class = QxzTypeConfigModifySerializer
  69. queryset = QxzTypeConfigModel.objects.all()
  70. def post(self, request, *args, **kwargs):
  71. """修改要素类型配置信息接口"""
  72. serializer = self.get_serializer(data=request.data)
  73. serializer.is_valid(raise_exception=True)
  74. data = serializer.validated_data
  75. qsc_id = data['qsc_id']
  76. cName = data['cName']
  77. units = data['units']
  78. queryset = self.get_queryset().exclude(id=qsc_id)
  79. # if queryset.filter(eNum=eNum):
  80. # return Response(data={"msg": "eNum已存在", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  81. if queryset.filter(cName=cName):
  82. return Response(data={"msg": "要素类型名称已存在", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  83. try:
  84. qsc = QxzTypeConfigModel.objects.get(id=qsc_id)
  85. except ObjectDoesNotExist as e:
  86. return Response(data={"msg": "要素类型配置不存在", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  87. if qsc.is_default:
  88. return Response(data={"msg": "默认要素类型不允许修改", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  89. qsc.cName = cName
  90. qsc.units = units
  91. qsc.save()
  92. return Response(data={"msg": "要素类型配置修改成功", "data": ""}, status=status.HTTP_200_OK)
  93. class QxzTypeConfigDeleteView(GenericAPIView):
  94. # authentication_classes = [MyJWTAuthentication]
  95. permission_classes = [QxzLoginPermission]
  96. serializer_class = QxzTypeConfigDeleteSerializer
  97. queryset = QxzTypeConfigModel.objects.all()
  98. def post(self, request, *args, **kwargs):
  99. """删除要素类型配置信息接口"""
  100. serializer = self.get_serializer(data=request.data)
  101. serializer.is_valid(raise_exception=True)
  102. data = serializer.validated_data
  103. qsc_id = data['qsc_id']
  104. try:
  105. qsc = QxzTypeConfigModel.objects.get(id=qsc_id)
  106. except ObjectDoesNotExist as e:
  107. return Response(data={"msg": "要素类型配置不存在", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  108. if qsc.is_default:
  109. return Response(data={"msg": "默认要素类型不允许删除", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  110. QxzElementConfigModel.objects.filter(eNum=qsc.eNum).delete()
  111. qsc.delete()
  112. return Response(data={"msg": "要素类型配置删除成功", "data": ""}, status=status.HTTP_200_OK)
  113. class QxzTypeConfigListView(GenericAPIView):
  114. # authentication_classes = [MyJWTAuthentication]
  115. permission_classes = [QxzLoginPermission]
  116. pagination_class = CustomPagination
  117. serializer_class = QxzTypeConfigListSerializer
  118. queryset = QxzTypeConfigModel.objects.all().order_by('-id')
  119. def post(self, request, *args, **kwargs):
  120. """获取要素类型配置列表接口"""
  121. serializer = self.get_serializer(data=request.data)
  122. serializer.is_valid(raise_exception=True)
  123. data = serializer.validated_data
  124. cName = data.get('cName', '').strip()
  125. is_default = data.get('is_default')
  126. queryset = self.get_queryset()
  127. if cName:
  128. queryset = queryset.filter(cName__contains=cName)
  129. if is_default in [True, False]:
  130. queryset = queryset.filter(is_default=is_default)
  131. page = self.paginate_queryset(queryset)
  132. serializer = self.get_serializer(page, many=True)
  133. return self.get_paginated_response(serializer.data)
  134. class QxzElementAddView(GenericAPIView):
  135. # authentication_classes = [MyJWTAuthentication]
  136. permission_classes = [QxzLoginPermission]
  137. serializer_class = QxzElementAddSerializer
  138. queryset = QxzElementConfigModel.objects.all().order_by('-id')
  139. def post(self, request, *args, **kwargs):
  140. """新增要素信息接口"""
  141. serializer = self.get_serializer(data=request.data)
  142. serializer.is_valid(raise_exception=True)
  143. data = serializer.validated_data
  144. eName = data['eName']
  145. cName = data['cName']
  146. eNum = data['eNum']
  147. units = data['units']
  148. is_standard = data['is_standard']
  149. sensor_addr = data['sensor_addr']
  150. start_reg = data['start_reg']
  151. count = data['count']
  152. d_pos = data['d_pos']
  153. d_length = data['d_length']
  154. factor = data['factor']
  155. dotled_s = data['dotled_s']
  156. queryset = self.get_queryset()
  157. if queryset.filter(eName=eName):
  158. return Response(data={"msg": "英文名称不能重复", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  159. try:
  160. t = QxzTypeConfigModel.objects.get(eNum=eNum)
  161. if t.units != units:
  162. raise Exception()
  163. except Exception as e:
  164. return Response(data={"msg": "要素类型异常", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  165. qec = QxzElementConfigModel()
  166. qec.eName = eName
  167. qec.cName = cName
  168. qec.units = units
  169. qec.eNum = eNum
  170. qec.is_standard = is_standard
  171. qec.sensor_addr = sensor_addr
  172. qec.start_reg = start_reg
  173. qec.count = count
  174. qec.d_pos = d_pos
  175. qec.d_length = d_length
  176. qec.factor = factor
  177. qec.dotled_s = dotled_s
  178. qec.save()
  179. return Response(data={"msg": "创建要素成功", "data": ""}, status=status.HTTP_200_OK)
  180. class QxzElementModifyView(GenericAPIView):
  181. # authentication_classes = [MyJWTAuthentication]
  182. permission_classes = [QxzLoginPermission]
  183. serializer_class = QxzElementModifySerializer
  184. queryset = QxzElementConfigModel.objects.all().order_by('-id')
  185. def post(self, request, *args, **kwargs):
  186. """修改要素信息接口"""
  187. serializer = self.get_serializer(data=request.data)
  188. serializer.is_valid(raise_exception=True)
  189. data = serializer.validated_data
  190. qec_id = data['qec_id']
  191. eName = data['eName']
  192. cName = data['cName']
  193. is_standard = data['is_standard']
  194. sensor_addr = data['sensor_addr']
  195. start_reg = data['start_reg']
  196. count = data['count']
  197. d_pos = data['d_pos']
  198. d_length = data['d_length']
  199. factor = data['factor']
  200. dotled_s = data['dotled_s']
  201. try:
  202. qec = self.get_queryset().get(id=qec_id)
  203. except ObjectDoesNotExist as e:
  204. return Response(data={"msg": "要素不存在", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  205. queryset = self.get_queryset().exclude(id=qec_id)
  206. if queryset.filter(eName=eName):
  207. return Response(data={"msg": "英文名称不能重复", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  208. qec.eName = eName
  209. qec.cName = cName
  210. qec.is_standard = is_standard
  211. qec.sensor_addr = sensor_addr
  212. qec.start_reg = start_reg
  213. qec.count = count
  214. qec.d_pos = d_pos
  215. qec.d_length = d_length
  216. qec.factor = factor
  217. qec.dotled_s = dotled_s
  218. qec.save()
  219. return Response(data={"msg": "修改要素成功", "data": ""}, status=status.HTTP_200_OK)
  220. class QxzElementDeleteView(GenericAPIView):
  221. # authentication_classes = [MyJWTAuthentication]
  222. permission_classes = [QxzLoginPermission]
  223. serializer_class = QxzElementDeleteSerializer
  224. queryset = QxzElementConfigModel.objects.all().order_by('-id')
  225. def post(self, request, *args, **kwargs):
  226. """删除要素信息接口"""
  227. serializer = self.get_serializer(data=request.data)
  228. serializer.is_valid(raise_exception=True)
  229. data = serializer.validated_data
  230. qec_id = data['qec_id']
  231. try:
  232. qec = self.get_queryset().get(id=qec_id)
  233. except ObjectDoesNotExist as e:
  234. return Response(data={"msg": "要素不存在", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  235. qec.delete()
  236. return Response(data={"msg": "删除要素成功", "data": ""}, status=status.HTTP_200_OK)
  237. class QxzElementListView(GenericAPIView):
  238. # authentication_classes = [MyJWTAuthentication]
  239. permission_classes = [QxzLoginPermission]
  240. pagination_class = CustomPagination
  241. serializer_class = QxzElementListSerializer
  242. queryset = QxzElementConfigModel.objects.all().order_by('-id')
  243. def post(self, request, *args, **kwargs):
  244. """获取要素列表接口"""
  245. serializer = self.get_serializer(data=request.data)
  246. serializer.is_valid(raise_exception=True)
  247. data = serializer.validated_data
  248. ele_name = data.get('ele_name', '')
  249. is_standard = data.get('is_standard')
  250. queryset = self.get_queryset()
  251. if ele_name:
  252. queryset = queryset.filter(Q(cName__contains=ele_name) | Q(eName__contains=ele_name))
  253. if is_standard is not None:
  254. queryset = queryset.filter(is_standard=is_standard)
  255. page = self.paginate_queryset(queryset)
  256. serializer = self.get_serializer(page, many=True)
  257. return self.get_paginated_response(serializer.data)
  258. class QxzDeviceAddView(GenericAPIView):
  259. # authentication_classes = [MyJWTAuthentication]
  260. permission_classes = [QxzLoginPermission]
  261. serializer_class = QxzDeviceAddSerializer
  262. queryset = QxzDeviceConfigModel.objects.all().order_by('-id')
  263. def post(self, request, *args, **kwargs):
  264. """创建气象配置信息接口"""
  265. serializer = self.get_serializer(data=request.data)
  266. serializer.is_valid(raise_exception=True)
  267. data = serializer.validated_data
  268. device_id = data['device_id']
  269. order_num = data['order_num']
  270. device_type = data['device_type']
  271. is_standard = data['is_standard']
  272. ele_cnf = data['ele_cnf']
  273. led_cnf = data['led_cnf']
  274. file = request.FILES.get('file')
  275. queryset = self.get_queryset().filter(device_id=device_id)
  276. if queryset:
  277. return Response(data={"msg": "设备配置已存在,请勿重复创建", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  278. base_dir = f"/data/qxz/element/config/{device_id}"
  279. if not os.path.isdir(base_dir):
  280. os.makedirs(base_dir)
  281. if file:
  282. file_name = f"{device_id}.rbl"
  283. file_path = os.path.join(base_dir, file_name)
  284. with open(file_path, 'wb') as wb:
  285. for chunk in file.chunks():
  286. wb.write(chunk)
  287. config_sh_dict = {
  288. "config": "ch_conf",
  289. "ext": {
  290. "App_mod": device_type,
  291. }
  292. }
  293. e_name_list = list(ele_cnf.values())
  294. e_value_dict = {}
  295. for k, v in ele_cnf.items():
  296. config_sh_dict["ext"][k] = v
  297. e_value_dict[v] = k
  298. sh_file_path = os.path.join(base_dir, 'configch.c')
  299. with open(sh_file_path, 'w') as fw:
  300. json.dump(config_sh_dict, fw, ensure_ascii=False)
  301. if led_cnf:
  302. led_dict = {
  303. "cmd": "dotled_para",
  304. "ext": led_cnf
  305. }
  306. sh_file_path = os.path.join(base_dir, 'configled.c')
  307. with open(sh_file_path, 'w') as fw:
  308. json.dump(led_dict, fw, ensure_ascii=False)
  309. c_name_list = []
  310. config_list = []
  311. queryset = QxzElementConfigModel.objects.filter(eName__in=e_name_list)
  312. num = 0
  313. for item in queryset:
  314. eName = item.eName
  315. cName = f"{item.cName}:"
  316. ekey = e_value_dict[eName]
  317. c_name_list.append(item.cName)
  318. config_list.append({
  319. 'num': num, 'sensor_addr': item.sensor_addr, 'start_reg': item.start_reg, 'count': item.count,
  320. 'd_pos': item.d_pos, 'factor': item.factor, 'd_length': item.d_length, 'err_cnt': 0, 'online_flag': 0,
  321. 'value': 0, 'cName': cName, 'units': item.units, 'eName': item.eName, 'eValue': '0',
  322. 'eKey': ekey, 'eNum': item.eNum, 'dotled_s': item.dotled_s
  323. })
  324. num += 1
  325. c_num = 1
  326. for i in range(0, len(config_list), 15):
  327. c_list = config_list[i: i+15]
  328. c_path = os.path.join(base_dir, f'config0{c_num}.c')
  329. with open(c_path, 'w') as fw:
  330. c_data = {
  331. "element": c_list
  332. }
  333. json.dump(c_data, fw, ensure_ascii=False)
  334. c_num += 1
  335. qdc = QxzDeviceConfigModel()
  336. qdc.device_id = device_id
  337. qdc.order_num = order_num
  338. qdc.device_type = device_type
  339. qdc.is_standard = is_standard
  340. qdc.ele_cnf = json.dumps(ele_cnf, ensure_ascii=False)
  341. qdc.led_cnf = json.dumps(led_cnf, ensure_ascii=False)
  342. qdc.ele_name = json.dumps(c_name_list, ensure_ascii=False)
  343. qdc.save()
  344. return Response(data={"msg": "创建设备配置成功", "data": ""}, status=status.HTTP_200_OK)
  345. class QxzDeviceModifyView(GenericAPIView):
  346. # authentication_classes = [MyJWTAuthentication]
  347. permission_classes = [QxzLoginPermission]
  348. serializer_class = QxzDeviceAddSerializer
  349. queryset = QxzDeviceConfigModel.objects.all().order_by('-id')
  350. def post(self, request, *args, **kwargs):
  351. """修改气象配置信息接口"""
  352. serializer = self.get_serializer(data=request.data)
  353. serializer.is_valid(raise_exception=True)
  354. data = serializer.validated_data
  355. device_id = data['device_id']
  356. order_num = data['order_num']
  357. device_type = data['device_type']
  358. is_standard = data['is_standard']
  359. ele_cnf = data['ele_cnf']
  360. led_cnf = data['led_cnf']
  361. file = request.FILES.get('file')
  362. try:
  363. qdc = self.get_queryset().get(device_id=device_id)
  364. except ObjectDoesNotExist as e:
  365. return Response(data={"msg": "设备配置不存在", "data": ""}, status=status.HTTP_400_BAD_REQUEST)
  366. base_dir = f"/data/qxz/element/config/{device_id}"
  367. if not os.path.isdir(base_dir):
  368. os.makedirs(base_dir)
  369. if file:
  370. file_name = f"{device_id}.rbl"
  371. file_path = os.path.join(base_dir, file_name)
  372. with open(file_path, 'wb') as wb:
  373. for chunk in file.chunks():
  374. wb.write(chunk)
  375. config_sh_dict = {
  376. "config": "ch_conf",
  377. "ext": {
  378. "App_mod": device_type,
  379. }
  380. }
  381. e_name_list = list(ele_cnf.values())
  382. e_value_dict = {}
  383. for k, v in ele_cnf.items():
  384. config_sh_dict["ext"][k] = v
  385. e_value_dict[v] = k
  386. sh_file_path = os.path.join(base_dir, 'configch.c')
  387. with open(sh_file_path, 'w') as fw:
  388. json.dump(config_sh_dict, fw, ensure_ascii=False)
  389. if led_cnf:
  390. led_dict = {
  391. "cmd": "dotled_para",
  392. "ext": led_cnf
  393. }
  394. sh_file_path = os.path.join(base_dir, 'configled.c')
  395. with open(sh_file_path, 'w') as fw:
  396. json.dump(led_dict, fw, ensure_ascii=False)
  397. c_name_list = []
  398. config_list = []
  399. queryset = QxzElementConfigModel.objects.filter(eName__in=e_name_list)
  400. num = 0
  401. for item in queryset:
  402. eName = item.eName
  403. cName = f"{item.cName}:"
  404. ekey = e_value_dict[eName]
  405. c_name_list.append(item.cName)
  406. config_list.append({
  407. 'num': num, 'sensor_addr': item.sensor_addr, 'start_reg': item.start_reg, 'count': item.count,
  408. 'd_pos': item.d_pos, 'factor': item.factor, 'd_length': item.d_length, 'err_cnt': 0, 'online_flag': 0,
  409. 'value': 0, 'cName': cName, 'units': item.units, 'eName': item.eName, 'eValue': '0',
  410. 'eKey': ekey, 'eNum': item.eNum, 'dotled_s': item.dotled_s
  411. })
  412. num += 1
  413. c_num = 1
  414. for i in range(0, len(config_list), 15):
  415. c_list = config_list[i: i+15]
  416. c_path = os.path.join(base_dir, f'config0{c_num}.c')
  417. with open(c_path, 'w') as fw:
  418. c_data = {
  419. "element": c_list
  420. }
  421. json.dump(c_data, fw, ensure_ascii=False)
  422. c_num += 1
  423. qdc.order_num = order_num
  424. qdc.device_type = device_type
  425. qdc.is_standard = is_standard
  426. qdc.ele_cnf = json.dumps(ele_cnf, ensure_ascii=False)
  427. qdc.led_cnf = json.dumps(led_cnf, ensure_ascii=False)
  428. qdc.ele_name = json.dumps(c_name_list, ensure_ascii=False)
  429. qdc.save()
  430. return Response(data={"msg": "修改设备配置成功", "data": ""}, status=status.HTTP_200_OK)
  431. class QxzDeviceListView(GenericAPIView):
  432. # authentication_classes = [MyJWTAuthentication]
  433. permission_classes = [QxzLoginPermission]
  434. pagination_class = CustomPagination
  435. serializer_class = QxzDeviceListSerializer
  436. queryset = QxzDeviceConfigModel.objects.all().order_by('-id')
  437. def post(self, request, *args, **kwargs):
  438. """获取气象配置列表接口"""
  439. serializer = self.get_serializer(data=request.data)
  440. serializer.is_valid(raise_exception=True)
  441. data = serializer.validated_data
  442. device_id = data.get('device_id')
  443. queryset = self.get_queryset()
  444. if device_id:
  445. queryset = queryset.filter(Q(device_id__contains=device_id) | Q(order_num__contains=device_id))
  446. page = self.paginate_queryset(queryset)
  447. serializer = self.get_serializer(page, many=True)
  448. return self.get_paginated_response(serializer.data)
  449. class QxzConfigDownView(APIView):
  450. def get(self, request, device_id, file_name, *args, **kwargs):
  451. file_path = f"/data/qxz/element/config/{device_id}/{file_name}"
  452. if os.path.exists(file_path):
  453. with open(file_path, 'rb') as fr:
  454. content = fr.read()
  455. else:
  456. file_name = "null.c"
  457. content = b''
  458. response = HttpResponse(content, content_type="application/octet-stream")
  459. response['Content-Disposition'] = f'attachment; filename={file_name}'
  460. response['Access-Control-Allow-Origin'] = "*"
  461. return response
  462. def init_data():
  463. data = {
  464. '101': ['101', '大气温度', '℃'],
  465. '102': ['102', '大气湿度', '%RH'],
  466. '103': ['103', '模拟气压', 'hpa'],
  467. '104': ['104', '雨量', 'mm'],
  468. '105': ['105', '简易总辐射', 'w/㎡'],
  469. '106': ['106', '土壤温度', '℃'],
  470. '107': ['107', '土壤湿度', '%RH'],
  471. '108': ['108', '风速', 'm/s'],
  472. '109': ['109', '风向', '°'],
  473. '110': ['110', '蒸发', 'mm'],
  474. '111': ['111', '雪量', 'mm'],
  475. '112': ['112', '照度', 'LUX'],
  476. '113': ['113', '日照时数', 'h'],
  477. '114': ['114', '光合', 'w/㎡'],
  478. '115': ['115', '雨量累计', 'mm'],
  479. '116': ['116', '辐射累计', 'MJ/㎡'],
  480. '117': ['117', '有无雨雪', ''],
  481. '118': ['118', '噪声', '分贝'],
  482. '119': ['119', '水位', 'cm'],
  483. '120': ['120', '二氧化碳', 'PPM'],
  484. '121': ['121', '曝辐量', 'cal/cm2'],
  485. '122': ['122', '液位', 'mm'],
  486. '123': ['123', '光合有效辐射', 'W/m2'],
  487. '124': ['124', '电压', 'V'],
  488. '125': ['125', '紫外线', 'w/㎡'],
  489. '126': ['126', '粉尘', 'ug/m3'],
  490. '127': ['127', '数字气压', 'hpa'],
  491. '128': ['128', 'PH值', ''],
  492. '129': ['129', '最大风速', 'm/s'],
  493. '130': ['130', '平均风速', 'm/s'],
  494. '131': ['131', '经度', '°'],
  495. '132': ['132', '纬度', '°'],
  496. '133': ['133', '海拔高度', 'm'],
  497. '134': ['134', 'TBQ总辐射', 'W/m2'],
  498. '135': ['135', '直接辐射', 'W/m2'],
  499. '136': ['136', '散射辐射', 'W/m2'],
  500. '138': ['138', '紫外辐射', 'W/m2'],
  501. '139': ['139', '贴片温度', '℃'],
  502. '140': ['140', '露点温度', '℃'],
  503. '141': ['141', '一氧化碳', 'PPM'],
  504. '142': ['142', '电流', 'mA'],
  505. '143': ['143', '超声波风速', 'm/s'],
  506. '144': ['144', '水温', '℃'],
  507. '145': ['145', 'PM2.5', 'ug/m3'],
  508. '146': ['146', 'PM10', 'ug/m3'],
  509. '147': ['147', 'PH', ''],
  510. '148': ['148', '溶解氧', 'mg/l'],
  511. '149': ['149', '氨氮', 'mg/l'],
  512. '150': ['150', '电导率', 'mS/cm'],
  513. '151': ['151', '浊度', 'NTU'],
  514. '152': ['152', '能见度', 'm'],
  515. '153': ['153', '氨气', 'ppm'],
  516. '154': ['154', '盐分', 'mg/L'],
  517. '155': ['155', '氮', 'mg/kg'],
  518. '156': ['156', '磷', 'mg/kg'],
  519. '157': ['157', '钾', 'mg/kg'],
  520. '158': ['158', '热通量', 'W/m2'],
  521. '159': ['159', '叶面温度', '℃'],
  522. '160': ['160', '叶面湿度', '%RH'],
  523. '161': ['161', '茎秆', 'mm'],
  524. '162': ['162', '负氧离子', '个/cm3'],
  525. '201': ['201', '土壤水势', 'KPA'],
  526. '202': ['202', '露点温度', '℃'],
  527. '203': ['203', 'PM100', 'ug/m3'],
  528. '208': ['208', '照度', 'Lux'],
  529. '211': ['211', '电导率', 'uS/cm'],
  530. '212': ['212', '净辐射', 'W/m2'],
  531. '213': ['213', '流速', 'm/s'],
  532. '214': ['214', '空高', 'm'],
  533. '215': ['215', '瞬时流量', 'm3/s'],
  534. '216': ['216', '累积流量', 'm3'],
  535. '217': ['217', '热通量累计', 'MJ/m2'],
  536. '218': ['218', '果实直径', 'mm'],
  537. '219': ['219', '硫化氢', 'ppm'],
  538. '220': ['220', '氧气', 'ppm'],
  539. '221': ['221', '臭氧', 'ppm'],
  540. '222': ['222', '茎流', 'ml/h'],
  541. '223': ['223', 'COD', 'mg/L'],
  542. '224': ['224', '信号强度', 'dBm'],
  543. '225': ['225', '盐度', 'PSU'],
  544. '226': ['226', 'ORP', 'mV'],
  545. '227': ['227', '光量子', 'W/m2'],
  546. '228': ['228', '水质pH', ' '],
  547. '229': ['229', '氨氮', 'ppm'],
  548. '230': ['230', '水位', 'm'],
  549. '251': ['251', '湿球温度', '℃'],
  550. '252': ['252', '最大阵风', 'm/s'],
  551. '255': ['255', '土壤张力', 'kpa']
  552. }
  553. for item in data.values():
  554. c = QxzTypeConfigModel()
  555. c.eNum = item[0]
  556. c.cName = item[1]
  557. c.units = item[2]
  558. c.is_default = True
  559. c.save()