main_test.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # encoding=utf-8
  2. from PyQt5 import QtCore, QtGui, QtWidgets
  3. import os
  4. import sys
  5. import datetime
  6. from xlrd import open_workbook
  7. from xlsxwriter.workbook import Workbook
  8. import openpyxl
  9. from mongoclient import (
  10. get_qxz_conf,
  11. device_detail_deivce_id,
  12. get_sa_qxz_info_record,
  13. get_sa_qxz_data,
  14. get_conf_data,
  15. get_sim_info
  16. )
  17. from utils import (
  18. merge_title_format,
  19. toji_format,
  20. formal_format,
  21. error_format,
  22. common_format,
  23. default_formal,
  24. get_excel_content,
  25. head_dict,
  26. sim_info
  27. )
  28. save_filename = ""
  29. class SCDThread(object):
  30. """涉及进度条需主界面动态执行GUI,线程执行业务逻辑,避免主页面卡死"""
  31. def __init__(self,device_list,save_path,start_time,end_time,set_plat,set_stm8vs,set_order):
  32. self.save_path = save_path
  33. self.device_list = device_list
  34. self.start_time = start_time
  35. self.end_time = end_time
  36. self.set_plat = set_plat
  37. self.set_stm8vs = set_stm8vs
  38. self.set_order = set_order
  39. def run(self):
  40. start = self.start_time.strftime("%Y-%m-%d %H:%M:%S")
  41. end = self.end_time.strftime("%Y-%m-%d %H:%M:%S")
  42. dever_num = self.set_stm8vs
  43. save_filename = self.set_order + "_" + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + ".xlsx"
  44. save_path = os.path.join(self.save_path,save_filename)
  45. workbook = Workbook(save_path)
  46. device_list = self.device_list
  47. worksheet = workbook.add_worksheet()
  48. merge_title_style = workbook.add_format(merge_title_format)
  49. toji_style = workbook.add_format(toji_format)
  50. default_style = workbook.add_format(default_formal)
  51. red_style = workbook.add_format(error_format)
  52. green_style = workbook.add_format(formal_format)
  53. yellow_style = workbook.add_format(common_format)
  54. style_dict = {
  55. 2: red_style,
  56. 1: green_style,
  57. 3: yellow_style,
  58. 4: default_style
  59. }
  60. title_name_list = [
  61. "ID",
  62. "检验项目",
  63. "电压",
  64. "信号强度",
  65. "经度",
  66. "纬度",
  67. "固件版本号",
  68. "sim卡信息",
  69. "位置信息"
  70. ]
  71. # 查找第一台设备的配置文件,获取配置项
  72. device_id, _, _, _, _ = device_detail_deivce_id(device_list[0])
  73. conf = get_qxz_conf(device_id)
  74. title_name_list += [v.split("#")[0] for k, v in conf.items()]
  75. title_name_list.append("单台合格数")
  76. head_list = [i.split("#")[0] for i in title_name_list]
  77. worksheet.merge_range(0, 0, 0, len(head_list) - 1, "物联网气象站设备质检表格", merge_title_style)
  78. toji_data = [
  79. "任务单号",
  80. self.set_order,
  81. "检验时间",
  82. start,
  83. end,
  84. "报告日期",
  85. (datetime.datetime.now()).strftime("%y-%m-%d %H:%M:%S"),
  86. "合格数"
  87. ]
  88. # 生成Excel表格第2行, 本次数据概要
  89. for index, k in enumerate(toji_data):
  90. value = str(k)
  91. worksheet.write(1, index, value, toji_style)
  92. # 生成Excel表格第3行, 检测标题
  93. for index, k in enumerate(title_name_list):
  94. worksheet.write(2, index, k, default_style)
  95. # 生成Excel表格第4行, 检测标准
  96. for index, k in enumerate(title_name_list):
  97. value = (head_dict.get(k, ["无判定条件", ""]))[0]
  98. worksheet.write(3, index, value, default_style)
  99. plus = 12 if index in [0, 1] else 8
  100. c_n = len(value) / 2 + plus
  101. worksheet.set_column(index, index, c_n)
  102. # 输入数据
  103. is_pass_count = 0
  104. for index, id in enumerate(device_list):
  105. device_id, dver_num, lng, lat, position = device_detail_deivce_id(id)
  106. # 获取电压,信号强度历史数据
  107. valt_rssi = get_sa_qxz_info_record(device_id, start, end)
  108. # 获取sim卡信息
  109. sim = get_sim_info(device_id, start, end)
  110. sim_in = sim_info(sim)
  111. # 第一部分拼接 表头及数据
  112. org_data = {
  113. "id_1": {"data": id, "explan": "ID"},
  114. "id_2": {"data": device_id, "explan": "检验项目"},
  115. "id_3": valt_rssi.get("volt"), # 电压
  116. "id_4": valt_rssi.get("rssi"), # 信号强度
  117. "id_5": {"data": lng, "explan": "经度"},
  118. "id_6": {"data": lat, "explan": "纬度"},
  119. "id_7": {"data": [dver_num.replace("/", "-"), dever_num], "explan": "固件版本号"},
  120. "id_8": {"data": sim_in, "explan": "sim卡信息"},
  121. "id_9": {"data": position, "explan": "位置信息"},
  122. }
  123. conf = get_qxz_conf(device_id)
  124. # 获取数据
  125. qx_data = get_sa_qxz_data(device_id, start, end, conf)
  126. # 第二部分拼接 表头及数据 获取气象与数据结合
  127. conf_data = get_conf_data(conf, qx_data)
  128. org_data.update(conf_data)
  129. i = 0
  130. is_right = 0
  131. for t, v in org_data.items():
  132. # 执行方法
  133. name = v.get("explan")
  134. data = v.get("data")
  135. func = head_dict.get(name)[1]
  136. if data:
  137. temp = func(data)
  138. if temp[0] == 1:
  139. is_right += 1
  140. else:
  141. temp = [2, "没有数据"]
  142. worksheet.write(index + 4, i, temp[1], style_dict[temp[0]])
  143. i += 1
  144. last = []
  145. if is_right == len(title_name_list) - 1:
  146. last = [1, "合格"]
  147. is_pass_count += 1
  148. else:
  149. last = [2, "不合格"]
  150. worksheet.write(index + 4, i, last[1], style_dict[last[0]])
  151. worksheet.write(1, 8, is_pass_count, toji_style)
  152. worksheet.protect("yfkj")
  153. workbook.close()
  154. if __name__== "__main__":
  155. start_time = datetime.datetime.strptime("2023-11-20 18:00:00", "%Y-%m-%d %H:%M:%S")
  156. end_time = datetime.datetime.strptime("2023-11-21 20:00:00", "%Y-%m-%d %H:%M:%S")
  157. device_list,save_path,set_plat,set_stm8vs,set_order = ["864865060469831"], "f:/scripting_tools/bigdata_django/zhijian/qxz/", "1", "1", "1"
  158. qxz = SCDThread(device_list,save_path,start_time,end_time,set_plat,set_stm8vs,set_order)
  159. qxz.run()