| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- # encoding=utf-8
- from PyQt5 import QtCore, QtGui, QtWidgets
- import os
- import sys
- import datetime
- from xlrd import open_workbook
- from xlsxwriter.workbook import Workbook
- import openpyxl
- from mongoclient import (
- get_qxz_conf,
- device_detail_deivce_id,
- get_sa_qxz_info_record,
- get_sa_qxz_data,
- get_conf_data,
- get_sim_info
- )
- from utils import (
- merge_title_format,
- toji_format,
- formal_format,
- error_format,
- common_format,
- default_formal,
- get_excel_content,
- head_dict,
- sim_info
- )
- save_filename = ""
- class SCDThread(object):
- """涉及进度条需主界面动态执行GUI,线程执行业务逻辑,避免主页面卡死"""
- def __init__(self,device_list,save_path,start_time,end_time,set_plat,set_stm8vs,set_order):
- self.save_path = save_path
- self.device_list = device_list
- self.start_time = start_time
- self.end_time = end_time
- self.set_plat = set_plat
- self.set_stm8vs = set_stm8vs
- self.set_order = set_order
- def run(self):
- start = self.start_time.strftime("%Y-%m-%d %H:%M:%S")
- end = self.end_time.strftime("%Y-%m-%d %H:%M:%S")
- dever_num = self.set_stm8vs
- save_filename = self.set_order + "_" + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + ".xlsx"
- save_path = os.path.join(self.save_path,save_filename)
- workbook = Workbook(save_path)
- device_list = self.device_list
- worksheet = workbook.add_worksheet()
- merge_title_style = workbook.add_format(merge_title_format)
- toji_style = workbook.add_format(toji_format)
- default_style = workbook.add_format(default_formal)
- red_style = workbook.add_format(error_format)
- green_style = workbook.add_format(formal_format)
- yellow_style = workbook.add_format(common_format)
- style_dict = {
- 2: red_style,
- 1: green_style,
- 3: yellow_style,
- 4: default_style
- }
- title_name_list = [
- "ID",
- "检验项目",
- "电压",
- "信号强度",
- "经度",
- "纬度",
- "固件版本号",
- "sim卡信息",
- "位置信息"
- ]
- # 查找第一台设备的配置文件,获取配置项
- device_id, _, _, _, _ = device_detail_deivce_id(device_list[0])
- conf = get_qxz_conf(device_id)
- title_name_list += [v.split("#")[0] for k, v in conf.items()]
- title_name_list.append("单台合格数")
- head_list = [i.split("#")[0] for i in title_name_list]
- worksheet.merge_range(0, 0, 0, len(head_list) - 1, "物联网气象站设备质检表格", merge_title_style)
- toji_data = [
- "任务单号",
- self.set_order,
- "检验时间",
- start,
- end,
- "报告日期",
- (datetime.datetime.now()).strftime("%y-%m-%d %H:%M:%S"),
- "合格数"
- ]
- # 生成Excel表格第2行, 本次数据概要
- for index, k in enumerate(toji_data):
- value = str(k)
- worksheet.write(1, index, value, toji_style)
- # 生成Excel表格第3行, 检测标题
- for index, k in enumerate(title_name_list):
- worksheet.write(2, index, k, default_style)
- # 生成Excel表格第4行, 检测标准
- for index, k in enumerate(title_name_list):
- value = (head_dict.get(k, ["无判定条件", ""]))[0]
- worksheet.write(3, index, value, default_style)
- plus = 12 if index in [0, 1] else 8
- c_n = len(value) / 2 + plus
- worksheet.set_column(index, index, c_n)
- # 输入数据
- is_pass_count = 0
- for index, id in enumerate(device_list):
- device_id, dver_num, lng, lat, position = device_detail_deivce_id(id)
- # 获取电压,信号强度历史数据
- valt_rssi = get_sa_qxz_info_record(device_id, start, end)
- # 获取sim卡信息
- sim = get_sim_info(device_id, start, end)
- sim_in = sim_info(sim)
- # 第一部分拼接 表头及数据
- org_data = {
- "id_1": {"data": id, "explan": "ID"},
- "id_2": {"data": device_id, "explan": "检验项目"},
- "id_3": valt_rssi.get("volt"), # 电压
- "id_4": valt_rssi.get("rssi"), # 信号强度
- "id_5": {"data": lng, "explan": "经度"},
- "id_6": {"data": lat, "explan": "纬度"},
- "id_7": {"data": [dver_num.replace("/", "-"), dever_num], "explan": "固件版本号"},
- "id_8": {"data": sim_in, "explan": "sim卡信息"},
- "id_9": {"data": position, "explan": "位置信息"},
- }
- conf = get_qxz_conf(device_id)
- # 获取数据
- qx_data = get_sa_qxz_data(device_id, start, end, conf)
- # 第二部分拼接 表头及数据 获取气象与数据结合
- conf_data = get_conf_data(conf, qx_data)
- org_data.update(conf_data)
- i = 0
- is_right = 0
- for t, v in org_data.items():
- # 执行方法
- name = v.get("explan")
- data = v.get("data")
- func = head_dict.get(name)[1]
- if data:
- temp = func(data)
- if temp[0] == 1:
- is_right += 1
- else:
- temp = [2, "没有数据"]
- worksheet.write(index + 4, i, temp[1], style_dict[temp[0]])
- i += 1
- last = []
- if is_right == len(title_name_list) - 1:
- last = [1, "合格"]
- is_pass_count += 1
- else:
- last = [2, "不合格"]
- worksheet.write(index + 4, i, last[1], style_dict[last[0]])
- worksheet.write(1, 8, is_pass_count, toji_style)
- worksheet.protect("yfkj")
- workbook.close()
- if __name__== "__main__":
- start_time = datetime.datetime.strptime("2023-11-20 18:00:00", "%Y-%m-%d %H:%M:%S")
- end_time = datetime.datetime.strptime("2023-11-21 20:00:00", "%Y-%m-%d %H:%M:%S")
- device_list,save_path,set_plat,set_stm8vs,set_order = ["864865060469831"], "f:/scripting_tools/bigdata_django/zhijian/qxz/", "1", "1", "1"
- qxz = SCDThread(device_list,save_path,start_time,end_time,set_plat,set_stm8vs,set_order)
- qxz.run()
|