views.py 24 KB

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