yf_yzl 2 سال پیش
والد
کامیت
2a7b903224

+ 16 - 0
.vscode/launch.json

@@ -0,0 +1,16 @@
+{
+    // 使用 IntelliSense 了解相关属性。 
+    // 悬停以查看现有属性的描述。
+    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "Python: Current File",
+            "type": "python",
+            "request": "launch",
+            "program": "${file}",
+            "console": "integratedTerminal",
+            "justMyCode": true
+        }
+    ]
+}

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


+ 12 - 6
bigdata_django/zhijian/cbd_zhijian.py

@@ -586,7 +586,6 @@ class CBDThread(QtCore.QThread):
         # 对图片质量进行打分并求平均值
         scores_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")
             addtime = p.get("addtime")
@@ -595,8 +594,9 @@ class CBDThread(QtCore.QThread):
             file_name = photo_addr.split("/")[-1]
             file_name = file_name.replace("?", "")
             os.makedirs(local_dir) if not os.path.exists(local_dir) else None
+            print(photo_addr, "----------img----------")
             # response = requests.get(f"https://bigdata-image.oss-cn-hangzhou.aliyuncs.com/Basics/cbd/{photo_addr}")
-            response = requests.get(f"http://114.55.0.7:8089/Basics/cbd/{photo_addr}")
+            response = requests.get(f"http://8.136.98.49:8003/Basics/cbd/{photo_addr}")
             with open(os.path.join(local_dir, file_name), 'wb') as f:
                 f.write(response.content)
             result_score = self.predict(os.path.join(local_dir, file_name))
@@ -836,7 +836,10 @@ class CBDThread(QtCore.QThread):
                 dver_lst.append(dver)
             
         # 检查卡号及有效期
-        card_jg = self.sim_info(iccid)
+        if self.set_product != "水稻测报灯":
+            card_jg = self.sim_info(iccid)
+        else:
+            card_jg = [1, "合格"]
         # 经度
         lng_pass = [i for i in lng_lst if 113.76194444 >= i or i >= 113.77861111]
         if len(lng_pass):
@@ -871,10 +874,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 != "水稻测报灯":
+            if "1" in rain_k_jg_lst:
+                rain_k_jg = [1, f"被雨控有{str(rain_k_jg_lst.count('1'))}条数据"]
+            else:
+                rain_k_jg = [0, "无被雨控数据上报"]
         else:
-            rain_k_jg = [0, "无被雨控数据上报"]
+            rain_k_jg = [1, "合格"]
         # 加热仓温度
         heat_temp = []
         for h in heat_temp_lst:

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


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


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


+ 2 - 2
bigdata_django/zhijian/qxz/main.py

@@ -94,7 +94,7 @@ class Ui_MainWindow(object):
         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.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(2023, 1, 1), QtCore.QTime(18, 0, 0)))
         self.startTimeEdit.setObjectName("startTimeEdit")
         self.endTimeLabel = QtWidgets.QLabel(self.centralwidget)
         self.endTimeLabel.setGeometry(QtCore.QRect(180, 250, 121, 21))
@@ -102,7 +102,7 @@ class Ui_MainWindow(object):
         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.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(2023, 2, 1), QtCore.QTime(20, 0, 0)))
         self.endTimeEdit.setObjectName("endTimeEdit")
         self.platLabel = QtWidgets.QLabel(self.centralwidget)
         self.platLabel.setGeometry(QtCore.QRect(180, 290, 121, 21))

+ 170 - 0
bigdata_django/zhijian/qxz/main_test.py

@@ -0,0 +1,170 @@
+# 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()

+ 136 - 88
bigdata_django/zhijian/qxz/special.py

@@ -50,7 +50,11 @@ def xin_hao(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 14.0 < min_num:
+        is_right = False 
+        for k in data:
+            if k > 14.0:
+                is_right = True 
+        if is_right:
             return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
@@ -59,12 +63,15 @@ def xin_hao(data):
 
 # sim卡信息 大于等于180天单元格显示绿色\n2、小于180天大于等于30天单元格显示黄色、\n3、小于30天单元格显示为红色
 def sim(data):
-    if 180 <= data:
-        return 1, f"有效期剩余{data}天" 
-    elif 30 <= data < 180:
-        return 3, f"有效期剩余{data}天" 
-    elif  data < 30:
-        return 2, f"有效期剩余{data}天" 
+    if isinstance(data, int):
+        if 180 <= data:
+            return 1, f"有效期剩余{data}天" 
+        elif 30 <= data < 180:
+            return 3, f"有效期剩余{data}天" 
+        elif  data < 30:
+            return 2, f"有效期剩余{data}天" 
+    else:
+        return 2, data
 
 def wei_zhi(data):
     if data == "河南省新乡市原阳县":
@@ -80,13 +87,13 @@ def shu_ju_tiao_shu(data):
             # 计算数据间隔
             interval = []
             for k in range(len(data) - 1):
-                interval.append(data[k+1] - data[k])
+                interval.append(data[k] - data[k+1])
             lte_20 = []
             gte_40 = []
             for i in interval:
-                if i < 120:
+                if i < 1200:
                     lte_20.append(i)
-                if i > 240:
+                if i > 2400:
                     gte_40.append(i)
             if len(lte_20) < 2 and len(gte_40) < 2:
                 return 1,  f"数据量:{len(data)},间隔<20分钟:{len(lte_20)},间隔>40分钟:{len(gte_40)}"
@@ -106,8 +113,9 @@ def feng_su(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num and max_num < 10:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i < 10:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -121,8 +129,9 @@ def feng_xiang(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num and max_num < 360:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i < 360:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -135,15 +144,15 @@ def jiang_yu(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0.1 < min_num :
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0.1 < i :
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
         return 2, "没有数据"
 
 
-
 # "土壤含水率": "合格条件(绿色):\n1、0<示值<=100\n2、有1条合格即可
 def tu_rang_han_shui(data):
     # 去除字段中 -99.99 数据
@@ -151,8 +160,9 @@ def tu_rang_han_shui(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num and max_num <= 100:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for k in data:
+            if 0<k<=100:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -166,8 +176,9 @@ def tu_rang_wen_du(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if -5 < min_num and max_num < 35:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if -5 < i < 35:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -180,8 +191,9 @@ def yan_fen(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num and max_num < 1000:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i < 1000:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -194,8 +206,9 @@ def dian_dao_lv(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for k in data:
+            if k > 0.0:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -208,8 +221,9 @@ def dan(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num :
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i :
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -222,8 +236,9 @@ def lin(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -237,8 +252,9 @@ def guang_he_fu_she(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -252,8 +268,9 @@ def ri_zhao(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0.1 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0.1 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -267,8 +284,9 @@ def pm25(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -282,8 +300,9 @@ def pm10(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -297,15 +316,15 @@ def fu_li_zi(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num and max_num < 1000:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i < 1000:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
         return 2, "没有数据"
 
 
-
 # "总辐射": "合格条件(绿色):\n1、0<示值\n2、有1条合格即可",
 def zong_fu_she(data):
     # 去除字段中 -99.99 数据
@@ -313,8 +332,9 @@ def zong_fu_she(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -328,8 +348,9 @@ def er_yang_hua_tan(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 400 < min_num and max_num < 1500:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 400 < i < 1500:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -343,8 +364,9 @@ def zheng_fa(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -358,8 +380,9 @@ def tu_rang_ph(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 5 < min_num and max_num < 10:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 5 < i < 10:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -374,8 +397,9 @@ def jia(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -389,8 +413,9 @@ def zi_wai_fu_she(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -404,8 +429,9 @@ def keong_qi_wen_du(data):
     if data:
         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}"
+        for i in data:
+            if -10 < i < 35 and i != 0.0:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -419,8 +445,9 @@ def keong_qi_shi_du(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num and max_num < 100:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i < 100:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -434,8 +461,9 @@ def shui_zhi_ph(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 6 < min_num and max_num < 8:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 6 < i < 8:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -449,8 +477,9 @@ def shui_wei(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -464,8 +493,9 @@ def shui_zhi_dao_dian(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for k in data:
+            if k > 0.0:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -478,8 +508,9 @@ def qi_ya(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 900 < min_num and max_num < 1150:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 900 < i < 1150:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -493,8 +524,9 @@ def guang_zhao_du(data):
     if data:
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num and max_num < 200000:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i < 200000:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -506,10 +538,10 @@ def liu_hua_qing(data):
     # 去除字段中 -99.99 数据
     data = [i for i in data if i != -99.99]
     if data:
-        
         data = list(set(data))
-        if len(data) == 1 and data[0] == 0:
-            return 1, 0
+        for i in data:
+            if int(i) == 0:
+                return 1, 0
         else:
             return 2, 0
     else:
@@ -524,8 +556,9 @@ def shui_wen(data):
 
         min_num = min(data)
         max_num = max(data)
-        if 1.0 < min_num and max_num < 30:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 1.0 < i < 30:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -537,11 +570,11 @@ def rong_jie_yang(data):
     # 去除字段中 -99.99 数据
     data = [i for i in data if i != -99.99]
     if data:
-
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in min_num:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -552,11 +585,11 @@ def zhuo_du(data):
     # 去除字段中 -99.99 数据
     data = [i for i in data if i != -99.99]
     if data:
-        
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -569,8 +602,9 @@ def an_qi(data):
     if data:
         
         data = list(set(data))
-        if len(data) == 1 and data[0] == 0:
-            return 1, 0
+        for i in data:
+            if int(i) == 0:
+                return 1, 0
         else:
             return 2, 0
     else:
@@ -585,8 +619,9 @@ def yang_qi(data):
 
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -601,8 +636,9 @@ def pm100(data):
 
         min_num = min(data)
         max_num = max(data)
-        if 0 < min_num:
-            return 1, f"最小值{min_num},最大值{max_num}"
+        for i in data:
+            if 0 < i:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num}"
     else:
@@ -617,8 +653,9 @@ def lou_dian_wen_du(data):
 
         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}"
+        for i in data:
+            if -10 < i < 35 and int(i) != 0:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num},存在0的数据有{data.count(0.0)}条"
     else:
@@ -632,8 +669,9 @@ def re_tong_liang(data):
 
         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}"
+        for i in data:
+            if -500 < i < 500 and int(i) != 0:
+                return 1, f"最小值{min_num},最大值{max_num}"
         else:
             return 2, f"最小值{min_num},最大值{max_num},存在0的数据有{data.count(0.0)}条"
     else:
@@ -641,4 +679,14 @@ def re_tong_liang(data):
 
 # 合格数量
 def he_ge_shu(data):
-    return data[0], data[1]
+    return data[0], data[1]
+
+# 有无雨雪  如果存在 -99 则不合格,反之存在 0 或 1 都合格
+def is_snow_rain(data):
+    if data:
+        if -99 not in data and -99.99 not in data:
+            return 1, "合格"
+        else:
+            return 2, "存在-99或-99.99数据,不合格"
+    else:
+        return 2, "没有数据"

+ 18 - 11
bigdata_django/zhijian/qxz/utils.py

@@ -50,7 +50,8 @@ from special import (
     pm100,
     lou_dian_wen_du,
     re_tong_liang,
-    he_ge_shu
+    he_ge_shu,
+    is_snow_rain
 )
 
 
@@ -65,22 +66,27 @@ def time_dif(checkdatetime):
 
 def sim_info(iccid):
     """查询卡信息"""
+    print(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 -1
+        print(response.text)
+        try:
+            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 -1
+                else:
+                    time_difference = time_dif(expiry_date)
+                    return time_difference
             else:
-                time_difference = time_dif(expiry_date)
-                return time_difference
-        else:
-            return -1
+                return -1
+        except Exception as e:
+            return "查无信息"
 
 
 def get_position(lng, lat):
@@ -182,7 +188,8 @@ head_dict = {
     "PM100": ["合格条件(绿色):\n1、0<示值\n2 、有1条合格即可", pm100],
     "露点温度": ["合格条件(绿色):\n1.-10~35°C,但不允许为0°C\n2、有1条合格即可", lou_dian_wen_du],
     "热通量": ["合格条件(绿色):上传条数的数据在均在±500内(但不能为0),即判定合格,否则不合格", re_tong_liang],
-    "单台合格数": ["合格条件(绿色):\n所有显示数值全部在合格范围内,则判定为合格,", he_ge_shu]
+    "单台合格数": ["合格条件(绿色):\n所有显示数值全部在合格范围内,则判定为合格,", he_ge_shu],
+    "有无雨雪": ["合格条件(绿色):\n所有显示数值全部在合格范围内,则判定为合格,", is_snow_rain]
 }
 
 

+ 80 - 0
nginx.conf

@@ -0,0 +1,80 @@
+
+#------------------------大数据平台前端------------------
+server{
+    listen 80;
+    charset utf8;
+    server_name 114.55.0.7;
+    client_header_buffer_size 32k;
+    large_client_header_buffers 4 32k;
+    
+    location / {
+        root /data/bigdata_vue_frond/dist;
+        index index.html;
+        add_header Access-Control-Allow-Origin *;
+        etag on;
+    }
+    location /app {
+        alias /data/app_file;
+        index big_data.apk;
+        add_header Access-Control-Allow-Origin *;
+        # 开启索引功能
+        autoindex off;    
+        # 关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb、mb、gb)
+        autoindex_exact_size off;  
+        # 显示本机时间而非 GMT 时间)
+        autoindex_localtime on;   
+    }
+    location /download_files {
+        #文件所在的文件夹
+        alias /data/download_files; 
+        sendfile on;
+        autoindex on;
+        autoindex_exact_size on;
+        autoindex_localtime on;
+        charset utf-8;
+    }
+    location /qxz {
+        root  /data/bigdata_test/bigdata/templates/qxz;
+        index index.html;
+        add_header Access-Control-Allow-Origin *;
+    }
+
+    location /down/excel/ {
+        alias /data/www/down/export/excel/;
+    }
+    location ~ ^(images|javascript|js|css|flash|media|static)/ {
+        root  /data/bigdata_vue_frond/dist/static;
+        expires 10d;
+    }
+
+}
+
+
+#------------------------托莱斯气象站登录页------------------
+
+server{
+    listen 80;
+    charset utf8;
+    server_name www.zztlskj.com;
+    client_header_buffer_size 32k;
+    large_client_header_buffers 4 32k;
+
+    location /qx {
+        alias /data/bigdata_vue_frond/dist;
+        index index.html;
+        add_header Access-Control-Allow-Origin *;
+    }
+    location / {
+        root /data/bigdata_vue_frond/dist;
+        index other.html;
+        add_header Access-Control-Allow-Origin *;
+    }
+    location /down/excel/ {
+        alias /data/www/down/export/excel/;
+    }
+    location ~ ^(images|javascript|js|css|flash|media|static)/ {
+        root  /data/bigdata_vue_frond/dist/static;
+        expires 10d;
+    }
+
+}

+ 22 - 8
temp/send_data.py

@@ -1,11 +1,25 @@
-import requests
-import json
 
 
-with open("./tt.json", "r", encoding="utf-8") as f:
-    k = json.load(f)
 
-# cbd_photo  qxz_add
-# http://192.168.0.36:8000
-response = requests.post(url="http://60.14.40.10:8002/api/cbd_photo", data=json.dumps(k))
-print(response.text)
+# -*- coding: utf-8 -*-
+import oss2
+
+# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
+auth = oss2.Auth('LTAI4G7tFh5Nk4KXZoSPk1D8', 'RV4S2SfbLPoFNjlI4uIOoA0J1LQPQc')
+# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
+# 填写Bucket名称。
+# -internal
+oss_url, bt = "https://oss-cn-hangzhou.aliyuncs.com", "bigdata-image"
+bucket = oss2.Bucket(auth, oss_url, bt)
+
+# 填写Bucket名称,例如examplebucket。
+# 指定图片所在Bucket的名称。如果图片不在Bucket根目录,需携带文件完整路径,例如exampledir/example.jpg。
+key = '192.168.1.148_01_20230608140200248_ALARM_INPUT.jpg'
+
+# 如果图片不在指定Bucket内,需将该图片到目标Bucket。
+# bucket.put_object_from_file(key, 'D:\\localpath\\example.jpg')
+# 将图片缩放为固定宽高100 px后,再旋转90°。
+style = 'image/resize,m_fixed,w_100,h_100/rotate,90'
+# 生成带签名的URL,并指定过期时间为10分钟。过期时间单位为秒。
+url = bucket.sign_url('GET', key, 10 * 60, params={'x-oss-process': style})
+print(url)

+ 300 - 0
tools/mongo_find.py

@@ -0,0 +1,300 @@
+device_id = [
+"898604312221D0284000",
+"898604312221D0284002",
+"898604312221D0284006",
+"898604312221D0284007",
+"898604312221D0284008",
+"898604312221D0284009",
+"898604312221D0284010",
+"898604312221D0284011",
+"898604312221D0284012",
+"898604312221D0284013",
+"898604312221D0284014",
+"898604312221D0284015",
+"898604312221D0284016",
+"898604312221D0284017",
+"898604312221D0284019",
+"898604312221D0284021",
+"898604312221D0284024",
+"898604312221D0284025",
+"898604312221D0284026",
+"898604312221D0284030",
+"898604312221D0284032",
+"898604312221D0284034",
+"898604312221D0284036",
+"898604312221D0284038",
+"898604312221D0284039",
+"898604312221D0284040",
+"898604312221D0284041",
+"898604312221D0284042",
+"898604312221D0284043",
+"898604312221D0284044",
+"898604312221D0284045",
+"898604312221D0284046",
+"898604312221D0284047",
+"898604312221D0284049",
+"898604312221D0284050",
+"898604312221D0284052",
+"898604312221D0284054",
+"898604312221D0284055",
+"898604312221D0284056",
+"898604312221D0284059",
+"898604312221D0284061",
+"898604312221D0284062",
+"898604312221D0284064",
+"898604312221D0284065",
+"898604312221D0284066",
+"898604312221D0284067",
+"898604312221D0284068",
+"898604312221D0284070",
+"898604312221D0284071",
+"898604312221D0284072",
+"898604312221D0284075",
+"898604312221D0284076",
+"898604312221D0284077",
+"898604312221D0284078",
+"898604312221D0284079",
+"898604312221D0284080",
+"898604312221D0284081",
+"898604312221D0284082",
+"898604312221D0284084",
+"898604312221D0284085",
+"898604312221D0284086",
+"898604312221D0284087",
+"898604312221D0284088",
+"898604312221D0284089",
+"898604312221D0284090",
+"898604312221D0284091",
+"898604312221D0284094",
+"898604312221D0284097",
+"898604312221D0284101",
+"898604312221D0284103",
+"898604312221D0284104",
+"898604312221D0284105",
+"898604312221D0284106",
+"898604312221D0284107",
+"898604312221D0284110",
+"898604312221D0284111",
+"898604312221D0284113",
+"898604312221D0284115",
+"898604312221D0284116",
+"898604312221D0284119",
+"898604312221D0284120",
+"898604312221D0284121",
+"898604312221D0284122",
+"898604312221D0284127",
+"898604312221D0284128",
+"898604312221D0284132",
+"898604312221D0284134",
+"898604312221D0284135",
+"898604312221D0284136",
+"898604312221D0284137",
+"898604312221D0284138",
+"898604312221D0284139",
+"898604312221D0284140",
+"898604312221D0284141",
+"898604312221D0284142",
+"898604312221D0284143",
+"898604312221D0284144",
+"898604312221D0284146",
+"898604312221D0284147",
+"898604312221D0284150",
+"898604312221D0284151",
+"898604312221D0284153",
+"898604312221D0284154",
+"898604312221D0284155",
+"898604312221D0284156",
+"898604312221D0284157",
+"898604312221D0284158",
+"898604312221D0284160",
+"898604312221D0284162",
+"898604312221D0284164",
+"898604312221D0284165",
+"898604312221D0284168",
+"898604312221D0284169",
+"898604312221D0284170",
+"898604312221D0284172",
+"898604312221D0284173",
+"898604312221D0284174",
+"898604312221D0284175",
+"898604312221D0284176",
+"898604312221D0284178",
+"898604312221D0284179",
+"898604312221D0284183",
+"898604312221D0284185",
+"898604312221D0284186",
+"898604312221D0284187",
+"898604312221D0284188",
+"898604312221D0284189",
+"898604312221D0284194",
+"898604312221D0284195",
+"898604312221D0284196",
+"898604312221D0284197",
+"898604312221D0284198",
+"898604312221D0284199",
+"898604312221D0284202",
+"898604312221D0284207",
+"898604312221D0284208",
+"898604312221D0284209",
+"898604312221D0284210",
+"898604312221D0284212",
+"898604312221D0284215",
+"898604312221D0284216",
+"898604312221D0284217",
+"898604312221D0284218",
+"898604312221D0284219",
+"898604312221D0284221",
+"898604312221D0284223",
+"898604312221D0284224",
+"898604312221D0284232",
+"898604312221D0284233",
+"898604312221D0284234",
+"898604312221D0284235",
+"898604312221D0284236",
+"898604312221D0284238",
+"898604312221D0284241",
+"898604312221D0284242",
+"898604312221D0284243",
+"898604312221D0284246",
+"898604312221D0284247",
+"898604312221D0284248",
+"898604312221D0284252",
+"898604312221D0284254",
+"898604312221D0284257",
+"898604312221D0284260",
+"898604312221D0284261",
+"898604312221D0284262",
+"898604312221D0284265",
+"898604312221D0284266",
+"898604312221D0284268",
+"898604312221D0284269",
+"898604312221D0284272",
+"898604312221D0284273",
+"898604312221D0284274",
+"898604312221D0284275",
+"898604312221D0284276",
+"898604312221D0284277",
+"898604312221D0284278",
+"898604312221D0284279",
+"898604312221D0284280",
+"898604312221D0284281",
+"898604312221D0284282",
+"898604312221D0284283",
+"898604312221D0284284",
+"898604312221D0284285",
+"898604312221D0284288",
+"898604312221D0284289",
+"898604312221D0284291",
+"898604312221D0284293",
+"898604312221D0284294",
+"898604312221D0284296",
+"898604312221D0284297",
+"898604312221D0284298",
+"898604312221D0284299",
+"898604312221D0284302",
+"898604312221D0284303",
+"898604312221D0284305",
+"898604312221D0284307",
+"898604312221D0284308",
+"898604312221D0284309",
+"898604312221D0284310",
+"898604312221D0284311",
+"898604312221D0284312",
+"898604312221D0284316",
+"898604312221D0284317",
+"898604312221D0284318",
+"898604312221D0284319",
+"898604312221D0284322",
+"898604312221D0284323",
+"898604312221D0284324",
+"898604312221D0284325",
+"898604312221D0284326",
+"898604312221D0284327",
+"898604312221D0284328",
+"898604312221D0284329",
+"898604312221D0284331",
+"898604312221D0284332",
+"898604312221D0284333",
+"898604312221D0284335",
+"898604312221D0284336",
+"898604312221D0284338",
+"898604312221D0284339",
+"898604312221D0284340",
+"898604312221D0284344",
+"898604312221D0284345",
+"898604312221D0284346",
+"898604312221D0284347",
+"898604312221D0284348",
+"898604312221D0284350",
+"898604312221D0284353",
+"898604312221D0284354",
+"898604312221D0284355",
+"898604312221D0284356",
+"898604312221D0284357",
+"898604312221D0284358",
+"898604312221D0284359",
+"898604312221D0284360",
+"898604312221D0284362",
+"898604312221D0284363",
+"898604312221D0284364",
+"898604312221D0284365",
+"898604312221D0284367",
+"898604312221D0284368",
+"898604312221D0284369",
+"898604312221D0284372",
+"898604312221D0284373",
+"898604312221D0284374",
+"898604312221D0284375",
+"898604312221D0284376",
+"898604312221D0284377",
+"898604312221D0284378",
+"898604312221D0284380",
+"898604312221D0284381",
+"898604312221D0284383",
+"898604312221D0284384",
+"898604312221D0284388",
+"898604312221D0284390",
+"898604312221D0284391",
+"898604312221D0284393",
+"898604312221D0284395",
+"898604312221D0284398",
+"898604312221D0284399",
+"898604312221D0284400",
+"898604312221D0284401",
+"898604312221D0284402",
+"898604312221D0284403",
+"898604312221D0284404",
+"898604312221D0284405",
+"898604312221D0284409",
+"898604312221D0284412",
+"898604312221D0284415",
+"898604312221D0284416",
+"898604312221D0284417",
+"898604312221D0284418",
+"898604312221D0284419",
+"898604312221D0284420",
+"898604312221D0284421",
+"898604312221D0284422",
+"898604312221D0284428",
+"898604312221D0284429",
+"898604312221D0284434",
+"898604312221D0284435",
+"898604312221D0284438",
+"898604312221D0284439",
+"898604312221D0284440",
+"898604312221D0284441",
+"898604312221D0284444",
+"898604312221D0284445",
+"898604312221D0284449",
+"898604312221D0284450",
+"898604312221D0284453",
+"898604312221D0284454",
+"898604312221D0284456",
+"898604312221D0284457",
+"898604312221D0284458",
+"898604312221D0284459",
+"898604312221D0284461",
+"898604312221D0284465",
+"898604312221D0284466",
+"898604312221D0284469",
+"898604312221D0284470"]

+ 31 - 0
tools/test_http_mqtt.py

@@ -0,0 +1,31 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+import os
+import time
+ 
+threshold = 120
+# 获取前一分钟的结果
+date = time.strftime('%Y:%H:%M', time.localtime(time.time()-60))
+filename = '/usr/share/nginx/logs/geokon.access.log '
+ 
+def popen(command):
+    return os.popen(command).readlines()
+ 
+def main():
+    with open('/tmp/ipset.txt', 'a') as f:
+        f.write('%s: 日志搜索...........\n' % (date))
+        command = "grep %s %s | awk '{counts[$1]++}; END {for(url in counts) print counts[url], url}'" % (date, filename)
+        for ip in popen(command):
+            num, ipaddr = ip.split(' ')
+            num, ipaddr = int(num), ipaddr.strip()  # 第一个值是整型, 第二个值应当去掉空格
+            if num >= threshold:
+                if all(popen('ipset list | grep %s' % (ipaddr))):  # 如果不为true 那就添加
+                    f.write('每分钟大于%s次 地址: %s 将被禁止访问' % (threshold, ipaddr))
+                    popen('ipset add blacklist %s timeout 3600 &>/dev/null' % (ipaddr))
+            elif num >= 50:
+                f.write('访问次数 %s: %s\n' % (num, ipaddr))
+        f.write('日志搜索结束.................\n\n\n')
+ 
+if __name__ == '__main__':
+    main()