views.py 23 KB

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