yf_yzl hace 2 años
padre
commit
2a9e2e34a6

BIN
1_0925.xlsx


BIN
2_0925.xlsx


BIN
bigdata_django/zhijian/__pycache__/cbd_zhijian.cpython-36.pyc


BIN
bigdata_django/zhijian/__pycache__/qxz_zhijian_simple.cpython-36.pyc


+ 17 - 9
bigdata_django/zhijian/cbd_zhijian.py

@@ -217,7 +217,7 @@ class Ui_MainWindow(object):
         self.productLabel.setObjectName("productLabel")
         self.productBox = QtWidgets.QComboBox(self.centralwidget)
         self.productBox.setGeometry(QtCore.QRect(310, 440, 151, 21))
-        self.productBox.addItems(['1.0测报灯','4.0测报灯'])
+        self.productBox.addItems(['1.0测报灯','4.0测报灯', "水稻测报灯"])
 
         # 供电选择
         self.powerSupplyLabel = QtWidgets.QLabel(self.centralwidget)
@@ -585,7 +585,7 @@ class CBDThread(QtCore.QThread):
     def __bigdata_iamge_verify(self, device_id):
         # 对图片质量进行打分并求平均值
         scores_time = {}
-        photo_obj = self.cbd_photo.find({"device_id":str(device_id), 'addtime': {"$gte": int(self.start_time) - 3600 * 24,"$lte":self.start_time}})
+        photo_obj = self.cbd_photo.find({"device_id":str(device_id), 'addtime': {"$gte": int(self.start_time) - 3600 * 48,"$lte":self.start_time}})
         # photo_obj = self.cbd_photo.find({"device_id":str(device_id), 'addtime': {"$lte":self.start_time}})
         for p in photo_obj:
             photo_addr = p.get("addr")
@@ -611,6 +611,7 @@ class CBDThread(QtCore.QThread):
             shutil.rmtree(local_dir)
         except:
             pass
+        print(scores_time, "----------------------")
         return scores_time
 
     def __siqing_image_verify(self, device_id):
@@ -895,22 +896,26 @@ class CBDThread(QtCore.QThread):
             temp = [float(k.get("ah", 0)) for k in temp_hum]
             en_hum = [1,f"{str(min(temp))}~{str(max(temp))}"]
         # 图片质量
-        if self.set_product == "4.0测报灯":
+        if self.set_product == "4.0测报灯" or self.set_product == "水稻测报灯":
             sorted_dict = sorted(image_score.items(), key=lambda x: x[1], reverse=True)
             sorted_dict = sorted_dict[:3]
             lte = []
             score = []
+            print(sorted_dict, "----------------")
             for v in sorted_dict:
-                if v[1] < 68:
+                rank = 50 if self.set_product == "水稻测报灯" else 68
+                if v[1] < rank:
                     lte.append(str(v[1]))
-                score.append(str(round(v[1], 3)))
+                    score.append(str(round(v[1], 3)))
+                else:
+                    score.append(str(round(v[1], 3)))
             if sorted_dict:
                 if lte:                
                     img_jg = [0, ",".join(score)]
                 else:
                     img_jg = [1, ",".join(score)]
             else:
-                img_jg = [0, "输入开始时间前24h内无图片"]
+                img_jg = [0, "输入开始时间前48h内无图片"]
         else:
             img_jg = [1, ""]
         # 上报信息条数
@@ -1119,10 +1124,13 @@ class CBDThread(QtCore.QThread):
         else:
             tr_k_jg = [0, f"无数据上报"]
         # 雨控
-        if "1" in rain_k_jg_lst:
-            rain_k_jg = [1, f"被雨控有{str(rain_k_jg_lst.count('1'))}条数据"]
+        if self.set_product == "水稻测报灯":
+            rain_k_jg = [1, "合格"]
         else:
-            rain_k_jg = [0, "无被雨控数据上报"]
+            if "1" in rain_k_jg_lst:
+                rain_k_jg = [1, f"被雨控有{str(rain_k_jg_lst.count('1'))}条数据"]
+            else:
+                rain_k_jg = [0, "无被雨控数据上报"]
         # 加热仓温度
         heat_temp = []
         for h in heat_temp_lst:

BIN
bigdata_django/zhijian/qxz/__pycache__/main.cpython-36.pyc


BIN
bigdata_django/zhijian/qxz/__pycache__/mongoclient.cpython-36.pyc


BIN
bigdata_django/zhijian/qxz/__pycache__/special.cpython-36.pyc


BIN
bigdata_django/zhijian/qxz/__pycache__/utils.cpython-36.pyc


+ 0 - 0
bigdata_django/zhijian/qxz/gui.py


+ 388 - 133
bigdata_django/zhijian/qxz/main.py

@@ -1,26 +1,13 @@
 # encoding=utf-8
-
-from cgi import print_arguments
-from multiprocessing.managers import DictProxy
-from operator import delitem
-from unittest import result
 from PyQt5 import QtCore, QtGui, QtWidgets
-
 import os
 import sys
-import re
-import ast
-from urllib import parse
-import json
-import time
 import datetime
-import requests
-import uuid
-import pymongo
-import pymysql
-from collections import defaultdict, Counter
-
+from xlrd import open_workbook
 from xlsxwriter.workbook import Workbook
+import openpyxl
+
+
 from mongoclient import (
     get_qxz_conf, 
     device_detail_deivce_id, 
@@ -41,125 +28,393 @@ from utils import (
     sim_info
 )
 
+save_filename = ""
+
+
+class Ui_MainWindow(object):
+    """GUI界面"""
+    def setupUi(self, MainWindow):
+        MainWindow.setObjectName("MainWindow")
+        MainWindow.resize(701, 644)
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(12)
+        MainWindow.setFont(font)
+        icon = QtGui.QIcon("logo.ico")
+        MainWindow.setWindowIcon(icon)
+        self.centralwidget = QtWidgets.QWidget(MainWindow)
+        self.centralwidget.setObjectName("centralwidget")
+        self.pageTitleLabel = QtWidgets.QLabel(self.centralwidget)
+        self.pageTitleLabel.setGeometry(QtCore.QRect(139, 50, 429, 42))
+        font = QtGui.QFont()
+        font.setFamily("楷体")
+        font.setPointSize(28)
+        self.pageTitleLabel.setFont(font)
+        self.pageTitleLabel.setTextFormat(QtCore.Qt.AutoText)
+        self.pageTitleLabel.setObjectName("pageTitleLabel")
+        self.inputFileLabel = QtWidgets.QLabel(self.centralwidget)
+        self.inputFileLabel.setGeometry(QtCore.QRect(180, 130, 121, 21))
+        self.inputFileLabel.setObjectName("inputFileLabel")
+        self.inputFileEdit = QtWidgets.QLineEdit(self.centralwidget)
+        self.inputFileEdit.setGeometry(QtCore.QRect(310, 130, 151, 21))
+        self.inputFileEdit.setFocusPolicy(QtCore.Qt.NoFocus)
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(8)
+        self.inputFileEdit.setFont(font)
+        self.inputFileEdit.setObjectName("inputFileEdit")
+        self.inputFileTool = QtWidgets.QToolButton(self.centralwidget)
+        self.inputFileTool.setGeometry(QtCore.QRect(470, 130, 71, 21))
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(10)
+        self.inputFileTool.setFont(font)
+        self.inputFileTool.setObjectName("inputFileTool")
+        self.savePathLabel = QtWidgets.QLabel(self.centralwidget)
+        self.savePathLabel.setGeometry(QtCore.QRect(180, 170, 121, 21))
+        self.savePathLabel.setObjectName("savePathLabel")
+        self.savePathEdit = QtWidgets.QLineEdit(self.centralwidget)
+        self.savePathEdit.setGeometry(QtCore.QRect(310, 170, 151, 21))
+        self.savePathEdit.setFocusPolicy(QtCore.Qt.NoFocus)
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(8)
+        self.savePathEdit.setFont(font)
+        self.savePathEdit.setObjectName("savePathEdit")
+        self.savePathTool = QtWidgets.QToolButton(self.centralwidget)
+        self.savePathTool.setGeometry(QtCore.QRect(470, 170, 71, 21))
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(10)
+        self.savePathTool.setFont(font)
+        self.savePathTool.setObjectName("savePathTool")
+        self.startTimeLabel = QtWidgets.QLabel(self.centralwidget)
+        self.startTimeLabel.setGeometry(QtCore.QRect(180, 210, 121, 21))
+        self.startTimeLabel.setObjectName("startTimeLabel")
+        self.startTimeEdit = QtWidgets.QDateTimeEdit(self.centralwidget)
+        self.startTimeEdit.setGeometry(QtCore.QRect(310, 210, 151, 21))
+        self.startTimeEdit.setMaximumDateTime(QtCore.QDateTime(QtCore.QDate(2025, 12, 31), QtCore.QTime(23, 59, 59)))
+        self.startTimeEdit.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(2023, 6, 1), QtCore.QTime(8, 0, 0)))
+        self.startTimeEdit.setObjectName("startTimeEdit")
+        self.endTimeLabel = QtWidgets.QLabel(self.centralwidget)
+        self.endTimeLabel.setGeometry(QtCore.QRect(180, 250, 121, 21))
+        self.endTimeLabel.setObjectName("endTimeLabel")
+        self.endTimeEdit = QtWidgets.QDateTimeEdit(self.centralwidget)
+        self.endTimeEdit.setGeometry(QtCore.QRect(310, 250, 151, 21))
+        self.endTimeEdit.setMaximumDateTime(QtCore.QDateTime(QtCore.QDate(2025, 12, 31), QtCore.QTime(23, 59, 59)))
+        self.endTimeEdit.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(2023, 6, 1), QtCore.QTime(18, 0, 0)))
+        self.endTimeEdit.setObjectName("endTimeEdit")
+        self.platLabel = QtWidgets.QLabel(self.centralwidget)
+        self.platLabel.setGeometry(QtCore.QRect(180, 290, 121, 21))
+        self.platLabel.setObjectName("dianjiLabel")
+        self.platBox = QtWidgets.QComboBox(self.centralwidget)
+        self.platBox.setGeometry(QtCore.QRect(310, 290, 151, 21))
+        self.platBox.addItems(['大数据平台','四情平台'])
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(11)
+        self.platBox.setFont(font)
+        self.platBox.setObjectName("platBox")
+        self.stm8vsLabel = QtWidgets.QLabel(self.centralwidget)
+        self.stm8vsLabel.setGeometry(QtCore.QRect(180, 330, 121, 21))
+        self.stm8vsLabel.setObjectName("stm8vsLabel")
+        self.stm8vsEdit = QtWidgets.QLineEdit(self.centralwidget)
+        self.stm8vsEdit.setGeometry(QtCore.QRect(310, 330, 151, 21))
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(11)
+        self.stm8vsEdit.setFont(font)
+        self.stm8vsEdit.setObjectName("stm8vsEdit")
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(11)
+        self.orderLabel = QtWidgets.QLabel(self.centralwidget)
+        self.orderLabel.setGeometry(QtCore.QRect(180, 370, 121, 21))
+        self.orderLabel.setObjectName("dverLabel")
+        self.orderEdit = QtWidgets.QLineEdit(self.centralwidget)
+        self.orderEdit.setGeometry(QtCore.QRect(310, 370, 151, 21))
+        font = QtGui.QFont()
+        font.setFamily("Arial")
+        font.setPointSize(11)
+        self.orderEdit.setFont(font)
+        self.orderEdit.setObjectName("dverEdit")
+        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
+        self.pushButton.setGeometry(QtCore.QRect(300, 410, 111, 41))
+        self.pushButton.setObjectName("pushButton")
+        self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
+        self.progressBar.setGeometry(QtCore.QRect(130, 470, 491, 31))
+        self.progressBar.setProperty("value", 0)
+        self.progressBar.setVisible(False)
+        self.progressBar.setObjectName("progressBar")
+        MainWindow.setCentralWidget(self.centralwidget)
+        self.retranslateUi(MainWindow)
+        self.inputFileTool.clicked.connect(self.input_file_path)
+        self.savePathTool.clicked.connect(self.out_save_location)
+        self.pushButton.clicked.connect(self.on_click)
+        QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+    def retranslateUi(self, MainWindow):
+        _translate = QtCore.QCoreApplication.translate
+        MainWindow.setWindowTitle(_translate("MainWindow", "气象站质检工具"))
+        self.savePathTool.setText(_translate("MainWindow", "选择文件夹"))
+        self.inputFileTool.setText(_translate("MainWindow", "选择文件"))
+        self.pageTitleLabel.setText(_translate("MainWindow", "<html><head/><body><p><span style=\" font-weight:600; color:#3a45aa;\">云飞气象站设备质检工具</span></p></body></html>"))
+        self.savePathLabel.setText(_translate("MainWindow", "|输出文件位置:"))
+        self.inputFileLabel.setText(_translate("MainWindow", "|输入文件位置:"))
+        self.startTimeLabel.setText(_translate("MainWindow", "|开始时间:"))
+        self.endTimeLabel.setText(_translate("MainWindow", "|结束时间:"))
+        self.platLabel.setText(_translate("MainWindow", "|检验平台:"))
+        self.stm8vsLabel.setText(_translate("MainWindow", "|主板版本号:"))
+        self.orderLabel.setText(_translate("MainWindow", "|任务单号:"))
+        self.pushButton.setText(_translate("MainWindow", "开始导出"))
+
+    def input_file_path(self):
+        file_path = QtWidgets.QFileDialog.getOpenFileName(None,"选取文件","./","All Files (*.xlsx;*.xls);;Text Files (*.txt);;ALL(*)")
+        self.inputFileEdit.setText(file_path[0])
+        self.inputFileEdit.setStyleSheet("color:black;")
+
+    def out_save_location(self):
+        fname = QtWidgets.QFileDialog.getExistingDirectory(None, '选取文件夹', './')
+        self.savePathEdit.setText(fname)
+        self.savePathEdit.setStyleSheet("color:black;")
+
+    def on_click(self):
+        file_path = self.inputFileEdit.text()
+        save_path = self.savePathEdit.text()
+        start_time = self.startTimeEdit.dateTime().toPyDateTime()
+        end_time = self.endTimeEdit.dateTime().toPyDateTime()
+        set_plat = self.platBox.currentText()
+        set_stm8vs = self.stm8vsEdit.text()
+        set_order = self.orderEdit.text()
+        
+        if not all ([file_path,save_path,start_time,end_time,set_stm8vs,set_order]):
+            QtWidgets.QMessageBox.information(None, "提示", "选项未填写完整")
+        elif end_time < start_time:
+            QtWidgets.QMessageBox.information(None, "提示", "结束日期应在开始日期之后")
+        else:
+            read_dict = {}
+            if file_path.split(".")[-1] == "xlsx":
+                wb = openpyxl.load_workbook(file_path)
+                sheet = wb[wb.sheetnames[0]]
+                row_num = sheet.max_row
+                d_list = []
+                for row in range(2, row_num + 1):
+                    cell = sheet.cell(row, 1)
+                    try: 
+                        cell_value = str(cell.value).strip()
+                        if cell_value:
+                            d_list.append(cell.value)
+                    except Exception as e:
+                        continue
+
+                read_dict["设备ID"] = d_list
+            else:
+                xls = open_workbook(file_path)
+                sheet_object = xls.sheets()[0]
+                ncols = sheet_object.ncols
+                d_list = []
+                col_value = sheet_object.col_values(0)
+                for d_i in col_value[1:]:
+                    try:
+                        d_i_v = str(d_i).strip()
+                        d_list.append(d_i_v)
+                    except Exception as e:
+                        continue
+                read_dict["设备ID"] = d_list
+            device_list = read_dict.get("设备ID")
+
+            if device_list:
+                self.inputFileTool.setEnabled(False)
+                self.savePathTool.setEnabled(False)
+                self.startTimeEdit.setEnabled(False)
+                self.endTimeEdit.setEnabled(False)
+                self.platBox.setEnabled(False)
+                self.stm8vsEdit.setEnabled(False)
+                self.orderEdit.setEnabled(False)
+                self.pushButton.setEnabled(False)
+                self.pushButton.setText("执行中...")
+                self.runThread = SCDThread(device_list,save_path,start_time,end_time,set_plat,set_stm8vs,set_order)
+                self.runThread.proess_signal.connect(self.set_progressbar_value)
+                self.runThread.start()
+                self.progressBar.setVisible(True)
+            else:
+                QtWidgets.QMessageBox.information(None, "提示", "输入文件无'设备ID'列或该列无数据")
+
+    def set_progressbar_value(self, value):
+        self.progressBar.setValue(value)
+        if value == 100:
+            QtWidgets.QMessageBox.information(None, "提示", "文件导出完毕!导出文件名:\n{}".format(save_filename))
+            self.inputFileTool.setEnabled(True)
+            # self.inputFileEdit.setText("")
+            self.savePathTool.setEnabled(True)
+            # self.savePathEdit.setText("")
+            self.startTimeEdit.setEnabled(True)
+            self.endTimeEdit.setEnabled(True)
+            self.platBox.setEnabled(True)
+            self.stm8vsEdit.setEnabled(True)
+            # self.stm8vsEdit.setText("")
+            self.orderEdit.setEnabled(True)
+            # self.orderEdit.setText("")
+            self.pushButton.setEnabled(True)
+            self.pushButton.setText("开始导出")
+            self.progressBar.setVisible(False)
+            self.progressBar.setValue(0)
+            return
+
 
-def run():
-    start = "2023-08-28 10:00:00"
-    end = "2023-08-31 20:00:00"
-    dever_num = "111"
-    # 获取所有的device_id
-    device_list = get_excel_content("F:\\scripting_tools\\热通量增加测试.xlsx")
-    workbook = Workbook("F:\\test.xlsx")
-    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 = [
-        "任务单号", 
-        "set_order", 
-        "检验时间", 
-        "start_time_str", 
-        "end_time_str",
-        "报告日期", 
-        (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": "位置信息"},
+
+class SCDThread(QtCore.QThread):
+    """涉及进度条需主界面动态执行GUI,线程执行业务逻辑,避免主页面卡死"""
+    proess_signal = QtCore.pyqtSignal(int)
+    def __init__(self,device_list,save_path,start_time,end_time,set_plat,set_stm8vs,set_order):
+        super(SCDThread, self).__init__()
+
+        self.save_path = save_path
+        # self.start_time = time.mktime(start_time.timetuple())
+        # self.end_time = time.mktime(end_time.timetuple())
+        # self.start_time_str = start_time.strftime("%y-%m-%d %H:%M:%S")
+        # self.end_time_str = end_time.strftime("%y-%m-%d %H:%M:%S")
+        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 = "2023-08-28 10:00:00"
+        # end = "2023-08-31 20:00:00"
+        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
+        # 获取所有的device_id
+        # device_list = get_excel_content("F:\\scripting_tools\\热通量增加测试.xlsx")
+        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)
-        # 获取数据
-        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:
-                print(name)
-                print(data)
-                print("-"*100)
-                temp = func(data)
-                if temp[0] == 1:
-                    is_right += 1
+        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:
+                    # print(name)
+                    # print(data)
+                    # print("-"*100)
+                    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:
-                temp = [2, "没有数据"]
-            worksheet.write(index + 4, i, temp[1], style_dict[temp[0]])
-            i += 1
-        last = []
-        if is_right == len(title_name_list) - 3:
-            last = [1, "合格"]
-            is_pass_count += 1
-        else:
-            last = [2, f"不合格: {len(title_name_list) - is_right - 3}"]
-        worksheet.write(index + 4, i, last[1], style_dict[last[0]])
-    worksheet.write(1, 8, is_pass_count, toji_style)
-    workbook.close()
+                last = [2, "不合格"]
+            worksheet.write(index + 4, i, last[1], style_dict[last[0]])
+            self.proess_signal.emit(int((index + 1)/len(device_list) * 100))
+        worksheet.write(1, 8, is_pass_count, toji_style)
+        worksheet.protect("yfkj")
+        workbook.close()
+        # self.proess_signal.emit(100)
 
 
-if __name__ == "__main__":
-    run()
+if __name__== "__main__":
+    QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
+    QtGui.QGuiApplication.setAttribute(QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
+    app = QtWidgets.QApplication(sys.argv)
+    MainWindow = QtWidgets.QMainWindow()
+    ui = Ui_MainWindow()
+    ui.setupUi(MainWindow)
+    MainWindow.show()
+    sys.exit(app.exec_()) 

+ 5 - 5
bigdata_django/zhijian/qxz/mongoclient.py

@@ -1,4 +1,3 @@
-from distutils.command.config import config
 import pymongo
 from urllib import parse
 import datetime
@@ -28,7 +27,7 @@ def get_sim_info(device_id, start, end):
     # sim卡信息
     db = get_table()
     qxz_base_info = db.sa_qxz_base_info
-    query = {'device_id': device_id, 'uptime': {"$lte": end, "$gte": start}}
+    query = {'device_id': device_id}
     base_info = qxz_base_info.find_one(query, {"_id": 0, "iccid": 1})
     return base_info.get("iccid")
 
@@ -128,7 +127,8 @@ if __name__ == "__main__":
     base_info = get_sim_info(device_id, start, end)
     conf = get_qxz_conf(device_id)
     data = get_sa_qxz_data(device_id, start, end, conf)
-    result = get_conf_data(conf, data)
-    for k, v in result.items():
-        print(k, v)
+    print(data)
+    # result = get_conf_data(conf, data)
+    # for k, v in result.items():
+    #     print(k, v)
 

+ 84 - 75
bigdata_django/zhijian/qxz/special.py

@@ -101,9 +101,9 @@ def shu_ju_tiao_shu(data):
 
 # "风速": "合格条件(绿色):\n1、0<示值<10\n2、有1条合格 即可",
 def feng_su(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num and max_num < 10:
@@ -116,9 +116,9 @@ def feng_su(data):
 
 # "风向": "合格条件(绿色):\n1、0<示值<360\n2、有1条合格即可"
 def feng_xiang(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num and max_num < 360:
@@ -130,9 +130,9 @@ def feng_xiang(data):
     
 # "降雨量累计": "合格条件(绿色):\n1、0<示值\n2、00:00示值归零\n3、有1条合格即可"
 def jiang_yu(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0.1 < min_num :
@@ -146,9 +146,9 @@ def jiang_yu(data):
 
 # "土壤含水率": "合格条件(绿色):\n1、0<示值<=100\n2、有1条合格即可
 def tu_rang_han_shui(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num and max_num <= 100:
@@ -161,9 +161,9 @@ def tu_rang_han_shui(data):
 
 # "土壤温度": "合格条件(绿色):\n1.≠0且在-5~35°C之间\n2、有1条合格即可"
 def tu_rang_wen_du(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if -5 < min_num and max_num < 35:
@@ -175,9 +175,9 @@ def tu_rang_wen_du(data):
 
 # "盐分": "合格条件(绿色):\n1、0<示值<1000#2、有1条合格即可",
 def yan_fen(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num and max_num < 1000:
@@ -189,9 +189,9 @@ def yan_fen(data):
 
 # "电导率": "合格条件(绿色):\n1、0<示值\n2、有1条合格即"
 def dian_dao_lv(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -203,9 +203,9 @@ def dian_dao_lv(data):
 
 # "氮": "合格条件(绿色):\n1、0<示值\n2、有1条合格即可",
 def dan(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num :
@@ -217,9 +217,9 @@ def dan(data):
 
 # "磷": "合格条件(绿色):\n1、0<示值且不能为负值\n2、有1条合格即可",
 def lin(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -232,9 +232,9 @@ def lin(data):
 
 # "光合有效辐射": "合格条件(绿色):\n1、0<示值且不能为负值\n2、有1条合格即可",
 def guang_he_fu_she(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -247,9 +247,9 @@ def guang_he_fu_she(data):
 
 # "日照时数": "合格条件(绿色):\n1、0.1≤示值\n2、有1条合格即可",
 def ri_zhao(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0.1 < min_num:
@@ -262,9 +262,9 @@ def ri_zhao(data):
 
 # "PM2.5": "合格条件(绿色):\n1、0<示值且不能为负值\n2、有1条合格即可",
 def pm25(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -277,9 +277,9 @@ def pm25(data):
 
 # "PM10": "合格条件(绿色):\n1、0<示值\n2、有1条合格即可",
 def pm10(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -292,9 +292,9 @@ def pm10(data):
 
 # "负氧离子": "合格条件(绿色):\n1、0<示值<1000\n2、有1条合格即可",
 def fu_li_zi(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num and max_num < 1000:
@@ -308,9 +308,9 @@ def fu_li_zi(data):
 
 # "总辐射": "合格条件(绿色):\n1、0<示值\n2、有1条合格即可",
 def zong_fu_she(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -323,9 +323,9 @@ def zong_fu_she(data):
 
 # "二氧化碳": "合格条件(绿色):\n1、400<示值<1500\n2、有1条合格即可",
 def er_yang_hua_tan(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 400 < min_num and max_num < 1500:
@@ -338,9 +338,9 @@ def er_yang_hua_tan(data):
 
 # "蒸发量": "合格条件(绿色):\n1、0<示值\n2、有1条合格即可",
 def zheng_fa(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -353,12 +353,12 @@ def zheng_fa(data):
 
 # "土壤PH": "合格条件(绿色):\n1、6~8\n2、有1条合格即可",
 def tu_rang_ph(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
-        if 6 < min_num and max_num < 8:
+        if 5 < min_num and max_num < 10:
             return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
@@ -369,9 +369,9 @@ def tu_rang_ph(data):
 
 # "钾": "合格条件(绿色):\n1、0<示值\n2、有1条合格即可",
 def jia(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -384,9 +384,9 @@ def jia(data):
 
 # "紫外辐射": "合格条件(绿色):\n1、0<示 值\n2、有1条合格即可",
 def zi_wai_fu_she(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -399,9 +399,9 @@ def zi_wai_fu_she(data):
 
 # "空气温度": "合格条件(绿色):\n1.-10~35°C,但不允许为0°C\n2、有1条合格即可",
 def keong_qi_wen_du(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if -10 < min_num and max_num < 35 and 0.0 not in data:
@@ -414,9 +414,9 @@ def keong_qi_wen_du(data):
 
 # "空气湿度": "合格条件(绿色):\n1、0<示值<100\n2、有1条合格即可",
 def keong_qi_shi_du(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num and max_num < 100:
@@ -429,9 +429,9 @@ def keong_qi_shi_du(data):
 
 # "水质pH": "合格条件(绿色):\n1、6≤示值≤8\n2、有1条合格即可",
 def shui_zhi_ph(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 6 < min_num and max_num < 8:
@@ -444,9 +444,9 @@ def shui_zhi_ph(data):
 
 # "水位": "合格条件(绿色):\n1、0<示值\n2、有1条合格即可",
 def shui_wei(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -459,9 +459,9 @@ def shui_wei(data):
 
 # "水质电导率": "合格条件(绿色):\n1、0<示值\n2、有1条合格即可",
 def shui_zhi_dao_dian(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -473,9 +473,9 @@ def shui_zhi_dao_dian(data):
 
 # "气压": "合格条件(绿色):\n1、900<示值<1150\n2、有1条合格即可",
 def qi_ya(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 900 < min_num and max_num < 1150:
@@ -488,9 +488,9 @@ def qi_ya(data):
 
 # "光照度": "合格条件(绿色):\n1、0<示值<200000\n2、有1条合格即可",
 def guang_zhao_du(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num and max_num < 200000:
@@ -503,9 +503,10 @@ def guang_zhao_du(data):
 
 # "硫化氢": "合格条件(绿色):\n1、示值=0\n2、有1条合格即可",
 def liu_hua_qing(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
+        
         data = list(set(data))
         if len(data) == 1 and data[0] == 0:
             return 1, 0
@@ -517,9 +518,10 @@ def liu_hua_qing(data):
 
 # "水温": "合格条件(绿色):\n1.0~30°C,但不允许为0°C\n2、 有1条合格即可",
 def shui_wen(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
+
         min_num = min(data)
         max_num = max(data)
         if 1.0 < min_num and max_num < 30:
@@ -532,9 +534,10 @@ def shui_wen(data):
 
 # "溶解氧": "合格条件(绿色):\n1、0<示值\n2、有1条合格即可",
 def rong_jie_yang(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
+
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -546,9 +549,10 @@ def rong_jie_yang(data):
 
 # "浊度": "合格条件(绿色):\n1、0<示值\n2、有1条合格即可",
 def zhuo_du(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
+        
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -560,9 +564,10 @@ def zhuo_du(data):
 
 # "氨气": "合格条件(绿色):\n1、示值=0\n2、有1条合格即可",
 def an_qi(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
+        
         data = list(set(data))
         if len(data) == 1 and data[0] == 0:
             return 1, 0
@@ -574,9 +579,10 @@ def an_qi(data):
 
 # "氧气": "合格条件(绿色):\n1、0<示值\n2、有1条合格即可",
 def yang_qi(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
+
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -589,9 +595,10 @@ def yang_qi(data):
 
 # "PM100": "合格条件(绿色):\n1、0<示值\n2 、有1条合格即可",
 def pm100(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
+
         min_num = min(data)
         max_num = max(data)
         if 0 < min_num:
@@ -604,29 +611,31 @@ def pm100(data):
 
 # "露点温度": "合格条件(绿色):\n1.-10~35°C,但不允许为0°C\n2、有1条合格即可",
 def lou_dian_wen_du(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
+
         min_num = min(data)
         max_num = max(data)
         if -10 < min_num and max_num < 35 and 0.0 not in data:
             return 1, f"最小值{min_num},最大值{max_num}"
         else:
-            return 2, f"最小值{min_num},最大值{max_num}"
+            return 2, f"最小值{min_num},最大值{max_num},存在0的数据有{data.count(0.0)}条"
     else:
         return 2, "没有数据"
 
 # 热通量  上传条数的数据在均在±500内(但不能为0),即判定合格,否则不合格
 def re_tong_liang(data):
+    # 去除字段中 -99.99 数据
+    data = [i for i in data if i != -99.99]
     if data:
-        # 去除字段中 -99.99 数据
-        data = [i for i in data if i != -99.99]
+
         min_num = min(data)
         max_num = max(data)
         if -500 < min_num and max_num < 500 and 0.0 not in data:
             return 1, f"最小值{min_num},最大值{max_num}"
         else:
-            return 2, f"最小值{min_num},最大值{max_num}"
+            return 2, f"最小值{min_num},最大值{max_num},存在0的数据有{data.count(0.0)}条"
     else:
         return 2, "没有数据"
 

+ 0 - 3
bigdata_django/zhijian/qxz/utils.py

@@ -1,9 +1,6 @@
 import json
-from operator import delitem
 import requests
 import datetime
-import re
-import pymongo
 from xlrd import open_workbook
 import openpyxl
 from special import (

+ 0 - 865
bigdata_django/zhijian/qxz_zhijian_debug.py

@@ -1,865 +0,0 @@
-from cgi import print_arguments
-from unittest import result
-from PyQt5 import QtCore, QtGui, QtWidgets
-
-import os
-import sys
-import re
-import ast
-from urllib import parse
-import json
-import time
-import datetime
-import requests
-import uuid
-import pymongo
-import pymysql
-from collections import defaultdict, Counter
-from xlrd import open_workbook
-from xlsxwriter.workbook import Workbook
-import openpyxl
-
-
-save_filename = ""
-pwd_str = "yf6021"
-toji_format = {
-    'font_name' : '宋体',
-    'font_size': 14,
-    'font_color': 'black',
-    'text_wrap': True,
-    'bold': False,
-    'fg_color': '92D050',
-    'align': 'center',
-    'valign': 'vcenter',
-    'border': 1,
-    'top': 1,
-    'left': 1,
-    'right': 1,
-    'bottom': 1
-}
-title_format = {
-    'font_name' : '宋体',
-    'font_size': 12,
-    'bold': True,
-    'align': 'center',
-    'valign': 'vcenter',
-    'border': 1,
-    'top': 1,
-    'left': 1,
-    'right': 1,
-    'bottom': 1
-}
-merge_title_format = {
-    'font_name' : '宋体',
-    'font_size': 26,
-    'bold': True,
-    'align': 'center',
-    'valign': 'vcenter',
-    "fg_color": "8DB4E2",
-    'border': 1,
-    'top': 1,
-    'left': 1,
-    'right': 1,
-    'bottom': 1
-}
-explain_formal = {
-    'font_name' : '宋体',
-    'font_size': 11,
-    'font_color': 'black',
-    'text_wrap': True,
-    'align': 'justify',
-    'valign': 'vcenter',
-    'border': 1,
-    'top': 1,
-    'left': 1,
-    'right': 1,
-    'bottom': 1
-}
-formal_format = {
-    'font_name' : '宋体',
-    'font_size': 11,
-    'font_color': 'black',
-    'fg_color': '77E88C',
-    'text_wrap': True,
-    'align': 'center',
-    'valign': 'vcenter',
-    'border': 1,
-    'top': 1,
-    'left': 1,
-    'right': 1,
-    'bottom': 1
-}
-common_format = {
-    'font_name' : '宋体',
-    'font_size': 11,
-    'font_color': 'black',
-    "fg_color": 'E7EC73',
-    'text_wrap': True,
-    'align': 'center',
-    'valign': 'vcenter',
-    'border': 1,
-    'top': 1,
-    'left': 1,
-    'right': 1,
-    'bottom': 1
-}
-error_format = {
-    'font_name' : '宋体',
-    'font_size': 11,
-    'font_color': 'black',
-    "fg_color": 'F4746A',
-    'text_wrap': True,
-    'align': 'center',
-    'valign': 'vcenter',
-    'border': 1,
-    'top': 1,
-    'left': 1,
-    'right': 1,
-    'bottom': 1
-}
-
-default_formal = {
-    'font_name': '宋体',
-    'font_size': 11,
-    'font_color': 'black',
-    'text_wrap': True,
-    'align': 'center',
-    'valign': 'vcenter',
-    'border': 1,
-    'top': 1,
-    'left': 1,
-    'right': 1,
-    'bottom': 1
-}
-
-
-class SCDThread(object):
-    """涉及进度条需主界面动态执行GUI,线程执行业务逻辑,避免主页面卡死"""
-    def __init__(self,device_list,save_path,start_time,end_time,set_plat,set_stm8vs,set_order):
-        self.device_list = device_list
-        self.save_path = save_path
-        self.start_time = start_time
-        self.end_time = end_time
-        self.start_time_str = start_time.strftime("%y-%m-%d %H:%M:%S")
-        self.end_time_str = end_time.strftime("%y-%m-%d %H:%M:%S")
-        self.set_plat = set_plat
-        self.set_stm8vs = set_stm8vs
-        self.set_order = set_order
-
-        self.user = parse.quote_plus("root")
-        self.passwd = parse.quote_plus("yfkj@6020")
-        self.myclient = pymongo.MongoClient("mongodb://{0}:{1}@8.136.98.49:57017/".format(self.user,self.passwd))
-        self.db = self.myclient.smartfarming
-        self.device_collection = self.db.sa_device
-        self.qxz_collection = self.db.sa_device_qxz_data
-
-        self.config = {
-            'host': '120.27.222.26',
-            'port': 3306,
-            'user': 'yfwlw',
-            'password': 'sql_yfkj_6019',
-            'db': 'yfwlw',
-            'charset': 'utf8mb4',
-            'cursorclass': pymysql.cursors.DictCursor,
-        }
-        self.connection = pymysql.connect(**self.config)
-        self.cursor = self.connection.cursor()
-
-        self.mongo_ping()
-    
-    def mongo_ping(self):
-        """mongo-ping预防连接失效"""
-        # try:
-        #     self.myclient.admin.command('ping')
-        # except:  # "ConnectionFailure"
-        self.myclient = pymongo.MongoClient("mongodb://{0}:{1}@8.136.98.49:57017/".format(self.user,self.passwd))
-        self.db = self.myclient.smartfarming
-        self.device_collection = self.db.sa_device
-        self.qxz_collection = self.db.sa_qxz_data
-        self.qxz_info_record_collection = self.db.sa_qxz_info_record
-        self.qxz_base_info_collection = self.db.sa_qxz_base_info
-        # self.sa_qxz_conf = self.db.
-    
-    def sql_ping(self):
-        """mysql-ping 预防连接失效"""
-        try:
-            self.connection.ping()
-        except:
-            self.connection = pymysql.connect(**self.config)
-            self.cursor = self.connection.cursor()
-
-    def __time_dif(self,checkdatetime):
-        """计算时间差"""
-        nowdatetime = datetime.datetime.now()
-        checkdatetime = datetime.datetime.strptime(checkdatetime, "%Y-%m-%d %H:%M:%S")
-        timedif = checkdatetime - nowdatetime
-        return timedif.days
-    
-    def device_their_platform(self,shortId):
-        """确定设备所在平台以及完整设备号"""
-        self.mongo_ping()
-        self.sql_ping()
-        regex = re.compile('.*{}$'.format(shortId))
-        bd_device_dict = self.device_collection.find_one(
-            filter = {"device_id":regex,"device_type_id":5},
-            projection = {'_id': 0},
-            sort = [('uptime', pymongo.DESCENDING)]
-        )
-        device_sql = "SELECT * FROM AppInfoManage_qxzstatus_new WHERE equip_id_id LIKE '%{}' ORDER BY upl_time DESC LIMIT 1;".format(shortId)
-        self.cursor.execute(device_sql)
-        sq_device_dict = self.cursor.fetchone()
-        if bd_device_dict and sq_device_dict:
-            bd_upltime = bd_device_dict["uptime"]
-            sq_upltime = time.mktime(sq_device_dict["upl_time"].timetuple())
-            if bd_upltime >= sq_upltime:
-                d_id = bd_device_dict["id"]
-                deviceId = bd_device_dict["device_id"]
-                platform = "大数据平台"
-            else:
-                d_id = ""
-                deviceId = sq_device_dict["equip_id_id"]
-                platform = "四情平台"
-        elif bd_device_dict and not sq_device_dict:
-            d_id = bd_device_dict["id"]
-            deviceId = bd_device_dict["device_id"]
-            platform = "大数据平台"
-            return d_id,deviceId,platform
-        elif not bd_device_dict and sq_device_dict:
-            d_id = ""
-            deviceId = sq_device_dict["equip_id_id"]
-            platform = "四情平台"
-        else:
-            d_id = ""
-            deviceId = "平台无此设备"
-            platform = "未知"
-        print("deviceId:",deviceId)
-        return d_id,deviceId,platform
-    
-    def sim_info(self, iccid):
-        """查询卡信息"""
-        url = "http://8.136.98.49:10001/iotcard/platsimview/inquiries/"
-        try:
-            response = requests.request("POST", url, data={"iccid": iccid})
-        except:
-            return [0, "查询卡信息异常稍后重试"]
-        else:
-            res_data = json.loads(response.text)
-            if res_data["msg"] == "success" and res_data["data"]:
-                expiry_date = res_data["data"]["expiry_date"]
-                if expiry_date == "未知":
-                    return [0, "未查询到卡信息"]
-                else:
-                    time_difference = self.__time_dif(expiry_date)
-                    if time_difference >= 180:
-                        return [1, "有效期剩余{}天".format(time_difference)]
-                    elif 30 <= time_difference < 180:
-                        return [2, "有效期剩余{}天".format(time_difference)]
-                    else:
-                        return [0, "有效期剩余{}天".format(time_difference)]
-            else:
-                return [0, "查询无结果"]
-
-    def _get_data_new(self):
-        """获取最新设备数据信息"""
-        pipeline = [
-            {
-                "$match": {
-                    "device_id": {"$in": self.device_list}
-                }
-            },
-            {
-                "$group": {
-                    "_id": {"device_id": "$device_id"},
-                    "last_msg": {"$last": "$$ROOT"}
-                }
-            },
-            {
-                "$replaceRoot": {"newRoot": "$last_msg"}
-            }
-        ]
-        cursor = self.db.sa_qxz_data.aggregate(pipeline, allowDiskUse=True)
-        data_dict = {item['device_id']: item for item in cursor}
-        return data_dict
-
-    def _get_bigdata_qxz_conf(self):
-        data_dict = self._get_data_new()
-        cursor = self.db.sa_qxz_conf.find({"device_id": {"$in": self.device_list}})
-        title_name_set = set()
-        qxz_conf_dict = {}
-        for item in cursor:
-            device_id = item['device_id']
-            qxz_data = data_dict[device_id]
-            config_dict = {}
-            counter = Counter()
-            for k, v in item.items():
-                if k.startswith('e') and v and qxz_data.get(k, None):
-                    t_name = v.split('#')[0]
-                    t_index = counter.get(t_name, "")
-                    config_dict[k] = f"{t_name}#{t_index}"
-                    counter[t_name] += 1
-            n_list = list(config_dict.values())
-            title_name_set.update(n_list)
-            qxz_conf_dict[device_id] = config_dict
-        title_name_list = sorted(list(title_name_set))
-        for i in title_name_list:
-            print(i)
-        for k, v in qxz_conf_dict.items():
-            print(k, v)
-        return title_name_list, qxz_conf_dict
-
-    def get_qxz_element_data(self, device_id, conf_dict):
-        group_dict = {
-            "_id": "$device_id",
-            "total_count": {"$count": {}},
-            "uptime_list": {"$push": "$uptime"}
-        }
-
-        project_dict = {
-            "_id": 0,
-            "device_id": "$_id",
-            "total_count": "$total_count",
-            "uptime_info": {
-                "$function": {
-                    "args": ["$uptime_list"],
-                    "lang": "js",
-                    "body": """
-function(uptime_list){
-    let old_uptime = uptime_list[0];
-    let uptime_20 = 0;
-    let uptime_40 = 0;
-    for (let i = 1; i < uptime_list.length; i++) {
-        let uptime = uptime_list[i];
-        let diff_time = uptime - old_uptime;
-
-        if (diff_time < 1200){
-            uptime_20 += 1;
-        } else if (diff_time > 2400){
-            uptime_40 += 1;
-        }
-        old_uptime = uptime;
-    }
-    return {"uptime_20": uptime_20, "uptime_40": uptime_40}
-}
-"""
-                }
-            }
-        }
-        for ek in conf_dict.keys():
-            group_dict[ek] = {"$push": f"${ek}"}
-            try:
-                k = conf_dict[ek]
-                func_name = self.get_conf_key(k)
-                project_dict[ek] = self.cond.func_dict[func_name](ek)
-            except KeyError as e:
-                continue
-
-        pipeline = [
-            {
-                "$match": {
-                    "device_id": device_id,
-                    "uptime": {
-                        "$gte": self.start_time,
-                        "$lt": self.end_time
-                    }
-                }
-            },
-            {
-                "$sort": {"uptime": 1}
-            },
-            {
-                "$project": {
-                    "device_id": "$device_id",
-                    "uptime": "$uptime",
-                    "tmp_list": {
-                        "$filter": {
-                            "input": {"$objectToArray": "$$ROOT"},
-                            "as": "item",
-                            "cond": {
-                                "$and": [
-                                    {
-                                        "$regexMatch": {
-                                            "input": "$$item.k",
-                                            "regex": "^e\d+",
-                                            "options": "i"
-                                        }
-                                    },
-                                    {
-                                        "$regexMatch": {
-                                            "input": "$$item.v",
-                                            "regex": ".*#.*",
-                                            "options": "i"
-                                        }
-                                    }
-                                ]
-                            }
-                        }
-                    }
-                }
-            },
-            {
-                "$addFields": {
-                    "tmp_obj": {
-                        "$arrayToObject": {
-                            "$map": {
-                                "input": "$tmp_list",
-                                "as": "item",
-                                "in": {
-                                    "k": "$$item.k",
-                                    "v": {
-                                        "$toInt": {
-                                            "$toDouble": {"$arrayElemAt": [{"$split": ["$$item.v", "#"]}, 0]}
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            },
-            {
-                "$replaceRoot": {
-                    "newRoot": {
-                        "$mergeObjects": ["$tmp_obj", {"device_id": "$device_id", "uptime": "$uptime"}]
-                    }
-                }
-            },
-            {
-                "$group": group_dict
-            },
-            {
-                "$project": project_dict
-            }
-        ]
-
-        cursor = self.db.sa_qxz_data.aggregate(pipeline, allowDiskUse=True)
-        result = {k: v for item in cursor for k, v in item.items()}
-        return result
-
-    def get_qxz_volt_or_rssi_data(self):
-        pipeline = [
-            {
-                "$match": {
-                    "device_id": {
-                        "$in": self.device_list
-                    }
-                },
-            },
-            {
-                "$project": {
-                    "device_id": "$device_id",
-                    "volt": {
-                        "$toDouble": "$volt"
-                    },
-                    "rssi": {
-                        "$toDouble": "$rssi"
-                    }
-                }
-            },
-            {
-                "$group": {
-                    "_id": "$device_id",
-                    "max_volt": {
-                        "$max": "$volt"
-                    },
-                    "min_volt": {
-                        "$min": "$volt"
-                    },
-                    "max_rssi": {
-                        "$max": "$rssi"
-                    },
-                    "min_rssi": {
-                        "$min": "$rssi"
-                    }
-                }
-            },
-            {
-                "$project": {
-                    "_id": 0,
-                    "device_id": "$_id",
-                    "volt_info": {
-                        'max_value': "$max_volt", 'min_value': "$min_volt",
-                        'status': {
-                            "$cond": {
-                                "if": {
-                                    "$and": [
-                                        {"$lte": ["$max_volt", 15]},
-                                        {"$gte": ["$min_volt", 11]}
-                                    ]
-                                },
-                                "then": 1,
-                                "else": 0
-                            }
-                        }
-                    },
-                    "rssi_info": {
-                        'max_value': "$max_rssi", 'min_value': "$min_rssi",
-                        'status': {
-                            "$cond": {
-                                "if": {
-                                    "$gte": ["$min_rssi", 14]
-                                },
-                                "then": 1,
-                                "else": 0
-                            }
-                        }
-                    }
-                }
-            }
-        ]
-        cursor = self.qxz_info_record_collection.aggregate(pipeline, allowDiskUse=True)
-        result = {item['device_id']: item for item in cursor}
-        return result
-
-    def get_qxz_device_data(self):
-        pipeline = [
-            {
-                "$match": {
-                    "device_id": {
-                        "$in": self.device_list
-                    }
-                },
-            },
-            {
-                "$project": {
-                    "device_id": "$device_id",
-                    "dver_num": "$dver_num",
-                    "lng": {
-                        "$convert": {
-                            "input": "$lng",
-                            "to": "double",
-                            "onError": 0,
-                            "onNull": 0
-                        }
-                    },
-                    "lat": {
-                        "$convert": {
-                            "input": "$lat",
-                            "to": "double",
-                            "onError": 0,
-                            "onNull": 0
-                        }
-                    }
-                }
-            },
-            {
-                "$project": {
-                    "_id": 0,
-                    "device_id": "$device_id",
-                    "dver_info": {
-                        "status": {
-                            "$cond": {
-                                "if": {
-                                    "$eq": ["$dver_num", self.set_stm8vs]
-                                },
-                                "then": 1,
-                                "else": 0
-                            }
-                        },
-                        "dver_num": "$dver_num",
-                        "old_value": self.set_stm8vs
-                    },
-                    "lng_info": {
-                        "status": {
-                            "$cond": {
-                                "if": {
-                                    "$and": [
-                                        {"$lte": ["$lng", 113.7869444]},
-                                        {"$gte": ["$lng", 113.7536111]}
-                                    ]
-                                },
-                                "then": 1,
-                                "else": 0
-                            }
-                        },
-                        "lng": "$lng"
-                    },
-                    "lat_info": {
-                        "status": {
-                            "$cond": {
-                                "if": {
-                                    "$and": [
-                                        {"$lte": ["$lat", 35.0458333]},
-                                        {"$gte": ["$lat", 35.0125]}
-                                    ]
-                                },
-                                "then": 1,
-                                "else": 0
-                            }
-                        },
-                        "lat": "$lat"
-                    }
-                }
-            }
-        ]
-        cursor = self.device_collection.aggregate(pipeline, allowDiskUse=True)
-        result = {item['device_id']: item for item in cursor}
-        return result
-
-    def get_sim_data(self):
-        pipeline = [
-            {
-                "$match": {
-                    "device_id": {
-                        "$in": self.device_list
-                    }
-                }
-            },
-            {
-                "$project": {
-                    "_id": 0,
-                    "device_id": "$device_id",
-                    "iccid": "$iccid"
-                }
-            }
-        ]
-        cursor = self.qxz_base_info_collection.aggregate(pipeline, allowDiskUse=True)
-        result = {item['device_id']: item["iccid"] for item in cursor}
-        return result
-
-    def parse_data(self, device_id, qxz_conf_dict, vr_dict, device_data_dict, sim_data):
-        """解析获取元素数据"""
-        element_dict = {}
-        element_dict["ID#"] = device_id
-        element_dict["检验项目#"] = device_id
-        try:
-            conf_dict = qxz_conf_dict[device_id]
-            device_data = self.get_qxz_element_data(device_id, conf_dict)
-            element_dict.update({conf_dict[k]: v for k, v in device_data.items() if k in conf_dict})
-
-            vr_info = vr_dict[device_id]
-            dd_info = device_data_dict[device_id]
-
-            element_dict["经度#"] = dd_info["lng_info"]
-            element_dict["纬度#"] = dd_info["lat_info"]
-            element_dict["固件版本号#"] = dd_info["dver_info"]
-
-            element_dict["电压#"] = vr_info["volt_info"]
-            element_dict["信号强度#"] = vr_info["rssi_info"]
-            sim_info = self.sim_info(sim_data[device_id])
-            element_dict["sim卡信息#"] = {
-                "status": sim_info[0],
-                "msg": sim_info[1]
-            }
-            element_dict["上传数据条数#"] = {
-                "total_count": device_data['total_count'],
-                "uptime_20": device_data["uptime_info"]["uptime_20"],
-                "uptime_40": device_data["uptime_info"]["uptime_40"]
-            }
-        except KeyError as e:
-            pass
-        return element_dict
-
-    def get_conf_key(self, k):
-        key = k.split('#')[0]
-        if "土壤含水率" in key:
-            key = "土壤含水率"
-        if "土壤温度" in key:
-            key = "土壤温度"
-        return key
-
-    def get_position(self, lng, lat):
-        if lng and lat:
-            try:
-                ret = requests.post("http://api.map.baidu.com/geocoder?location=%s,%s&coord_type=gcj02&output=json"%(lat,lng))
-                ret_json = json.loads(ret.text)
-                province, city, district = ret_json["result"]["addressComponent"]["province"], \
-                                        ret_json["result"]["addressComponent"]["city"], \
-                                        ret_json["result"]["addressComponent"]["district"]
-                
-                return province + city + district
-            except Exception as e:
-                return False
-        else:
-            return False
-
-    def get_conf_data(self, device_config, device_data, keys):
-        device_config = dict(device_config)
-        for iname, ivalue in device_config.items():
-            if ivalue and isinstance(ivalue, str):
-                if keys in ivalue:
-                    idevice_key_sun = iname
-        idevice_data = []
-        for d in device_data:
-            print(d, "++")
-            idevice_data.append(float((d.get(idevice_key_sun)).split("#")[0]))
-        return idevice_data
-
-      
-    def run(self):
-        """主业务逻辑,涉及进度条不能模块化,慢慢捋"""
-        title_name_list = ["ID#", "检验项目#", "电压#", "信号强度#", "经度#", "纬度#", "固件版本号#", "sim卡信息#",
-                           "上传数据条数#"]
-
-        default_func_dict = {
-            "电压": self.cond.get_cond_volt_msg,
-            "信号强度": self.cond.get_cond_rssi_msg,
-            "经度": self.cond.get_cond_lng_msg,
-            "纬度": self.cond.get_cond_lat_msg,
-            "固件版本号": self.cond.get_cond_version_msg,
-            "上传数据条数": self.cond.get_time_uptime_msg,
-            "sim卡信息": self.cond.get_cond_sim_msg
-        }
-        head_name_list, qxz_conf_dict = self._get_bigdata_qxz_conf()
-        for n in head_name_list:
-            if n not in title_name_list:
-                title_name_list.append(n)
-
-        title_name_list.append("位置信息#")
-        title_name_list.append("单台合格数#")
-
-        device_data_dict = self.get_qxz_device_data()
-        vr_dict = self.get_qxz_volt_or_rssi_data()
-        sim_data = self.get_sim_data()
-
-        proess = 0
-        now_time = datetime.datetime.now()
-        global save_filename
-        save_filename = self.set_order + "_" + now_time.strftime("%m%d") + ".xlsx"
-        save_path = os.path.join(self.save_path,save_filename)
-
-        workbook = Workbook(save_path)
-        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 = {
-            0: red_style,
-            1: green_style,
-            2: yellow_style,
-            3: default_style
-        }
-
-        head_list = [i.split("#")[0] for i in title_name_list]
-        worksheet.merge_range(0, 0, 0, len(head_list) - 1, "物联网气象站设备质检表格", merge_title_style)
-
-        for index, k in enumerate(title_name_list):
-            value = k.split('#')[0]
-            worksheet.write(2, index, value, default_style)
-
-        for index, k in enumerate(title_name_list):
-            key = self.get_conf_key(k)
-            try:
-                value = self.cond.head_dict[key]
-            except KeyError as e:
-                value = "无判定条件"
-            worksheet.write(3, index, value, default_style)
-
-        row_index = 4
-        qualified = 0
-        for device_id in self.device_list:
-            self.mongo_ping()
-            element_dict = self.parse_data(device_id, qxz_conf_dict, vr_dict, device_data_dict, sim_data)
-            device_config = self.db.sa_qxz_conf.find_one({"device_id": device_id}, {'_id':0,'id':0})
-            device_data = self.db.sa_qxz_data.find({"device_id": device_id, "uptime": {"$gte": self.start_time, "$lte": self.end_time}})
-            # device_machine = self.db.sa_device.find_one({"device_id": device_id})
-            not_qualified = 0
-            lng = 0
-            lat = 0
-            for index, k in enumerate(title_name_list):
-                status, msg = 3, "无数据"
-                try:
-                    value = element_dict[k]
-                    key = self.get_conf_key(k)
-                    if key in ["ID", "检验项目"]:
-                        rt = {"status": 1, "msg": value}
-                    elif key in default_func_dict:
-                        print(key, "-----------------")
-                        if key == "电压":
-                            print("----", device_data.count())
-                            result = self.get_conf_data(device_config, device_data, "电压")
-                            print(result, "************")
-                        rt = default_func_dict[key](value)
-                        if key == "经度":
-                            lng = value.get("lng")
-                        if key == "纬度":
-                            lat = value.get("lat")
-                    else:
-                        if key == "日照时数":
-                            idevice_key_sun = ""
-                            device_config = dict(device_config)
-                            for iname, ivalue in device_config.items():
-                                if ivalue and isinstance(ivalue, str):
-                                    if "日照时数" in ivalue:
-                                        idevice_key_sun = iname
-                            idevice_data = []
-                            for d in device_data:
-                                idevice_data.append(float((d.get(idevice_key_sun)).split("#")[0]))
-                            if max(idevice_data) > 0.1:
-                                rt = {'status': 1, 'msg': f'最大值:{str(max(idevice_data))},最小值:{str(min(idevice_data))}'}
-                            else:
-                                rt = {'status': 0, 'msg': f'最大值:{str(max(idevice_data))},最小值:{str(min(idevice_data))}'}
-                        elif key == "降雨量累计":
-                            idevice_key_rain = ""
-                            device_config = dict(device_config)
-                            for iname, ivalue in device_config.items():
-                                if ivalue and isinstance(ivalue, str):
-                                    if "降雨量累计" in ivalue:
-                                        idevice_key_rain = iname
-                            idevice_data = []
-                            for d in device_data:
-                                idevice_data.append(float((d.get(idevice_key_rain)).split("#")[0]))
-                            if max(idevice_data) > 0.1:
-                                rt = {'status': 1, 'msg': f'最大值:{str(max(idevice_data))},最小值:{str(min(idevice_data))}'}
-                            else:
-                                rt = {'status': 0, 'msg': f'最大值:{str(max(idevice_data))},最小值:{str(min(idevice_data))}'}
-                        else:
-                            rt = self.cond.cond_msg_dict[key](value)
-                    status, msg = rt['status'], rt['msg']
-                except Exception as e:
-                    pass
-
-                if status == 0:
-                    not_qualified += 1
-                if k == "位置信息#":
-                    # 使用经纬度获取地理
-                    result = self.get_position(lng, lat)
-                    if result and result == "河南省新乡市原阳县":
-                        status = 1
-                        msg = result
-                    else:
-                        status = 0
-                        msg = result
-                if k == "单台合格数#":
-                    status, msg = 0, f"不合格: {not_qualified}"
-                    if not_qualified == 0:
-                        status, msg = 1, "合格"
-                column_style = style_dict[status]
-                worksheet.write(row_index, index, str(msg), column_style)
-
-                proess = (index + 1) / len(self.device_list) * 100
-                if int(proess) == 100:
-                    self.proess_signal.emit(99)
-                else:
-                    self.proess_signal.emit(int(proess))
-
-            if not_qualified == 0:
-                qualified += 1
-            row_index += 1
-
-
-
-        toji_data = [
-            "任务单号", self.set_order, "检验时间", self.start_time_str, self.end_time_str,
-            "报告日期", now_time.strftime("%y-%m-%d %H:%M:%S"), "合格数", qualified
-        ]
-        for i in range(len(head_list) - len(toji_data)):
-            toji_data.append("          ")
-
-        for index, k in enumerate(toji_data):
-            value = str(k)
-            worksheet.write(1, index, value, toji_style)
-            c_n = len(value) + 15
-            worksheet.set_column(index, index, c_n)
-
-        worksheet.protect(pwd_str)
-        workbook.close()
-        self.cursor.close()
-        self.connection.close()
-        self.myclient.close()
-
-if __name__ == "__main__":
-    device_list,save_path,start_time,end_time,set_plat,set_stm8vs,set_order = [""]
-    SCDThread().run()

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1070 - 0
bigdata_django/zhijian/qxz_zhijian_simple.py