You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1305 lines
54 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# import os
# import sys
# import ctypes
# import asyncio
# import datetime
# import psutil
# import requests
# import pathlib
# from apscheduler.schedulers.asyncio import AsyncIOScheduler
# from app.lib.VK70xUMCDAQ import VK70xUMCDAQ
#
# from app.conf.Setting import settings
#
# from app.lib.RecordData import ExperimentData
# from app.models import *
# from app.lib.Utils import Utils
# from app.lib.Utils import format_status_data
# from fastapi import APIRouter, Request, WebSocket, WebSocketDisconnect, Response
# from app.lib.ModBus import ModbusConnection, IDLE, ZHIFENG
# from sqlalchemy import and_, desc
# from app.models.Business import PageParam, BllUser, BllRole, BllExperiment, BllExperimentRecord, BllSpecimen, \
# BllExperimentConfig, BllWaitDisinfSpecimen, BllTerminal, BllUselog
# from app.models.DateEntity import EntitySpecimen, EntityExperiment, EntityWaitDisinfSpecimen, EntityExperimentConfig, \
# EntityTerminal
# from app.validators.api import *
# from app.lib.StaticData import *
# from app.lib.websocket_manageer import ConnectionManager
# from app.lib.Log import logger
# from app.utils.excel_util import ExcelExport
# import io
# from app.lib import usb
# import httpx
#
# shiyan_time = 0
# END_TIME = None
# START_EXPERIMENT_ID = None
#
# router = APIRouter(prefix='/api')
#
#
# @router.get('/get_terminal_info', summary='获取系统信息')
# async def get_terminal_info(request: Request):
# terminal_info = BllTerminal().findEntity(EntityTerminal.is_enabled == 0)
# return Utils.true_return(terminal_info, desc="获取成功!")
#
#
# @router.post('/add_user', summary='创建用户')
# async def add_user(request: Request, body: SignUpdateModel):
# """
# 创建用户
# :body SignUpdateModel
# :return:
# """
# user = BllUser().findEntity(and_(EntityUser.user_name == body.username, EntityUser.is_enabled == 0))
# if user:
# return Utils.false_return('', desc="账号已注册!")
# entity = EntityUser()
# entity.user_id = str(Utils.get_uuid())
# entity.user_pwd = Utils.MD5(body.password)
# entity.user_name = body.username
# entity.real_name = body.name
# entity.role_id = body.role_id
# entity.user_sex = body.sex
# entity.update_time = Utils.get_time()
# BllUser().insert(entity)
# return Utils.true_return('', desc="创建成功!")
#
#
# @router.post('/login', summary='用户登录')
# async def login(request: Request, body: SignInModel):
# """
# 用户登录
# :body SignInModel
# :return:
# """
# user = BllUser().login(body.username, body.password)
# if user:
# CurrentUser["username"] = user.user_name
# CurrentUser["user_id"] = user.user_id
# return Utils.true_return(user, desc="登录成功!")
# return Utils.false_return('', desc="登录失败,账号与密码不匹配!")
#
#
# @router.post('/user_list', summary='用户列表')
# async def user_list(request: Request, body: UserModel):
# """
# 用户列表
# :return:
# """
# queryOrm = BllUser().getUserList()
# pageparam = PageParam(body.page_no, body.page_size)
# user_list = BllUser().queryPage(queryOrm, pageparam)
# pagination = {
# "total_count": pageparam.totalRecords,
# "page_no": body.page_no,
# "page_size": body.page_size
# }
# return Utils.true_return_pagination(pagination, user_list, desc="获取成功!")
#
#
# @router.put('/{user_id}', summary='编辑用户')
# async def update_user(user_id: str, body: SignUpdateModel):
# """
# 编辑用户
# :param user_id: str
# :body SignUpdateModel
# :return:
# """
# user = BllUser().findEntity(and_(EntityUser.user_id == user_id, EntityUser.is_enabled == 0))
# if user:
# user.user_pwd = Utils.MD5(body.password)
# user.user_name = body.username
# user.real_name = body.name
# user.role_id = body.role_id
# user.user_sex = body.sex
# user.update_time = Utils.get_time()
# BllUser().update(user)
# return Utils.true_return(user, desc="编辑成功!")
# return Utils.false_return('', desc="查不到该账号!")
#
#
# @router.delete('/delete_user/{user_id}', summary='删除用户')
# async def del_user(user_id: str):
# """
# 删除用户
# :param user_id: str
# :return:
# """
# user = BllUser().findEntity(and_(EntityUser.user_id == user_id, EntityUser.is_enabled == 0))
# if user:
# user.is_enabled = 1
# user.update_time = Utils.get_time()
# BllUser().update(user)
# return Utils.true_return('', desc="删除成功!")
# return Utils.false_return('', desc="查不到该账号!")
#
#
# @router.get('/get_role_list', summary='获取角色列表')
# async def get_role_list(request: Request):
# """
# 获取角色列表
# :return:
# """
# role_list = BllRole().findList(EntityRole.is_enabled == 0).all()
# data_list = [{"role_name": i.role_name, "role_id": i.role_id} for i in role_list]
# return Utils.true_return(data_list, desc="查询成功!")
#
#
# @router.post('/get_specimen_list', summary='获取证物数据')
# async def get_specimen_data(request: Request, body: SpecimenSearchModel):
# queryOrm = BllSpecimen().get_specimen_list(body)
# pageparam = PageParam(body.page_no, body.page_size)
# specimen_list = BllSpecimen().queryPage(queryOrm, pageparam)
# for specimen in specimen_list:
# specimen.experiment_list = [i.to_dict() for i in specimen.experiments]
#
# pagination = {
# "total_count": pageparam.totalRecords,
# "page_no": body.page_no,
# "page_size": body.page_size
# }
# return Utils.true_return_pagination(pagination, specimen_list, desc="获取成功!")
#
#
# @router.get('/test_data', summary='测试接口')
# async def get_specimen_data(type: int = None, open: int = 1):
# if type:
# if type == 1:
# print('open door-------------')
# await open_door(open)
# elif type == 2:
# print('config_v1-------------')
# await config_v1()
# elif type == 3:
# print('get_sensor_data-------------')
# await get_sensor_data()
# elif type == 4:
# print('get_device_state-------------')
# await get_device_state()
#
# return Utils.true_return('', desc="获取成功!")
#
#
# @router.get('/test_request', summary='测试接口')
# async def test_request():
# global END_TIME
# END_TIME = datetime.datetime.now()
# # wait_obj = BllWaitDisinfSpecimen().findEntity(
# # EntityWaitDisinfSpecimen.specimen_id == "2bd90215-b91e-11ef-ad8c-2c6dc175c6a5")
# # wait_obj.done = 1
# # BllWaitDisinfSpecimen().update(wait_obj)
#
# return Utils.true_return('', desc="获取成功!")
#
#
# async def get_device_state():
# url = "http://100.64.0.1/api/cabinet/v1/state"
#
# try:
# # 发送GET请求
# async with httpx.AsyncClient() as client:
# response = await client.get(url, timeout=4)
#
# # 检查响应状态码
# if response.status_code == 200:
# # 解析响应JSON数据
# data = response.json()
#
# # 获取各个设备的状态
# led = data.get("led")
# door = data.get("door")
# fans = data.get("fans")
# compressor = data.get("compressor")
# heating = data.get("heating")
# ozonizer = data.get("ozonizer")
# disinfectant = data.get("disinfectant")
# pump = data.get("pump")
# work_time = data.get("work_time")
# sensor = data.get("sensor")
#
# # 打印设备状态
# print(f"原始值: {data}")
# print(f"LED 状态: {'亮' if led == 1 else '灭'}")
# print(f"门状态: {'开' if door == 1 else '关'}")
# print(f"风机状态: {'开' if fans == 1 else '关'}")
# print(f"压缩机状态: {'开' if compressor == 1 else '关'}")
# print(f"加热管状态: {'开' if heating == 1 else '关'}")
# print(f"臭氧发生器状态: {'开' if ozonizer == 1 else '关'}")
# print(f"紫外线消毒灯状态: {'开' if disinfectant == 1 else '关'}")
# print(f"水泵状态: {'开' if pump == 1 else '关'}")
# print(f"工作时间: {work_time}")
#
# # 检查传感器状态,注意 bit0, bit1, bit2
# sensor_status = f"温湿度传感器: {'异常' if (sensor & 0b001) else '正常'}, "
# sensor_status += f"VOC传感器: {'异常' if (sensor & 0b010) else '正常'}, "
# sensor_status += f"臭氧检测仪: {'异常' if (sensor & 0b100) else '正常'}"
# print(sensor_status)
#
# else:
# print(f"请求失败,状态码:{response.status_code}")
#
# except httpx.RequestError as e:
# print(f"请求失败:{e}")
#
#
# async def get_sensor_data():
# url = "http://100.64.0.1/api/cabinet/v1/sensor"
#
# try:
# # 发送GET请求
# async with httpx.AsyncClient() as client:
# response = await client.get(url, timeout=4)
#
# # 检查响应状态码
# if response.status_code == 200:
# # 解析响应JSON数据
# data = response.json()
# temperature = data.get("temperature")
# humidity = data.get("humidity")
# voc = data.get("voc")
# ozone = data.get("ozone")
#
# # 打印返回的传感器数据
# print(f"温度: {temperature} °C")
# print(f"湿度: {humidity} %")
# print(f"VOC: {voc} ppm")
# print(f"臭氧: {ozone} ppb")
# else:
# print(f"请求失败,状态码:{response.status_code}")
#
# except httpx.RequestError as e:
# print(f"请求失败:{e}")
#
#
# async def config_v1():
# # 定义接口URL
# url = "http://100.64.0.1:80/api/cabinet/v1/setting" # 替换为实际服务器地址
#
# # 定义请求数据
# payload = {
# "temperature": 20, # 温度设置18~30℃
# "humidity": 50, # 湿度设置40~70%RH
# "ozone": 1, # 臭氧值1为开启0为关闭
# "time": 30, # 消毒时长(单位:分钟)
# "mode": 2, # 消毒模式0:关闭, 1:臭氧, 2:紫外线消毒)
# # "light_config": 2 # LED模式0:常关, 1:常开, 2:自动模式)
# }
#
# # 定义请求头
# headers = {
# "Content-Type": "application/json" # 确保以 JSON 格式发送数据
# }
#
# # 发送POST请求
# try:
# async with httpx.AsyncClient() as client:
# response = await client.post(url, json=payload)
#
# # 如果请求成功,打印响应数据
# if response:
# print("响应状态码:", response.status_code)
# print("响应数据:", response.json()) # 打印返回的 JSON 数据
#
# except httpx.RequestError as e:
# print(f"下位机通讯失败: {e}")
#
#
# @router.post('/insertSpecimen', summary='新增证物')
# async def insertSpecimen(request: Request, body: SpecimenModel):
# '''
#
# specimen_id = Column(String(50), comment="物品id", primary_key=True)
# specimen_name = Column(String(50), comment="物品名称")
# specimen_code = Column(String(50), comment="物品编号")
# specimen_type = Column(String(50), comment="物品类型")
# specimen_origin = Column(String(255), comment="物品来源")
# specimen_desc = Column(String(500), comment="物品描述")
# storage_location = Column(String(255), comment="存放位置")
# remark = Column(String(500), comment="备注")
# rfid = Column(String(50), comment="条码")
#
# '''
# SpecimenInsertDict.update(body.items)
# spkwargs_ = SpecimenInsertDict
# specimen_id = str(Utils.get_uuid())
#
# specimen = BllSpecimen().findEntity(and_(EntitySpecimen.specimen_code == spkwargs_["specimen_code"],
# EntitySpecimen.specimen_name == spkwargs_["specimen_name"],
# EntitySpecimen.is_enabled == 0))
# if specimen:
# return Utils.false_return('', desc="相同名称及编号的物证已存在!")
#
# if spkwargs_.get("rfid"):
# specimen = BllSpecimen().findEntity(and_(EntitySpecimen.rfid == spkwargs_.get("rfid"),
# EntitySpecimen.specimen_id != specimen_id,
# EntitySpecimen.is_enabled == 0))
# if specimen:
# specimen.rfid_state = 2
# specimen.update_time = Utils.get_time()
# specimen.rfid = ''
# BllSpecimen().update(specimen)
#
# spkwargs_["specimen_id"] = specimen_id
# if spkwargs_.get("rfid"):
# spkwargs_['rfid_state'] = 1
# else:
# spkwargs_['rfid_state'] = 2
#
# spkwargs_["user_id"] = CurrentUser["user_id"]
# spkwargs_["user_name"] = CurrentUser["username"]
# BllSpecimen().insertSpecimen(**spkwargs_)
# data = {
# 'specimen_id': specimen_id,
# }
#
# return Utils.true_return(data, desc="新增成功!")
#
#
# @router.post('/check_rfid', summary='RFID绑定')
# async def check_rfid(request: Request, rfid: str, specimen_id: str):
# if specimen_id:
# specimen = BllSpecimen().findEntity(and_(EntitySpecimen.specimen_id == specimen_id,
# EntitySpecimen.is_enabled == 0))
# if not specimen:
# return Utils.false_return(data='', desc="查不到该物证!")
# if specimen.rfid:
# if specimen.rfid == rfid:
# return Utils.false_return(data='', desc="该物证已绑定该条码,是否需要解绑?")
# return Utils.false_return(data='', desc="该物证已绑定其他条码,确定需要更换新的条码吗?")
#
# specimen = BllSpecimen().findEntity(and_(EntitySpecimen.rfid == rfid,
# EntitySpecimen.specimen_id != specimen_id,
# EntitySpecimen.is_enabled == 0))
# if specimen:
# return Utils.true_return(data='', desc="该条码已经被其他物证绑定,确定要绑定到该物证上吗?")
#
# else:
# specimen = BllSpecimen().findEntity(and_(EntitySpecimen.rfid == rfid,
# EntitySpecimen.is_enabled == 0))
# if specimen:
# return Utils.false_return(data='', desc="该条码已经被其他物证绑定,确定要绑定到该物证上吗?")
#
# return Utils.true_return(data='', desc="可正常绑定!")
#
#
# @router.post('/updateSpecimen', summary='编辑证物')
# async def updateSpecimen(request: Request, body: SpecimenModel):
# SpecimenInsertDict.update(body.items)
# spkwargs_ = SpecimenInsertDict
# specimen_id = spkwargs_["specimen_id"]
# if spkwargs_.get("rfid"):
# specimen = BllSpecimen().findEntity(and_(EntitySpecimen.rfid == spkwargs_.get("rfid"),
# EntitySpecimen.specimen_id != specimen_id,
# EntitySpecimen.is_enabled == 0))
# if specimen:
# specimen.rfid_state = 2
# specimen.update_time = Utils.get_time()
# specimen.rfid = ''
# BllSpecimen().update(specimen)
#
# specimen = BllSpecimen().findEntity(EntitySpecimen.specimen_id == specimen_id)
# if specimen:
# specimen.specimen_name = spkwargs_["specimen_name"]
# specimen.specimen_type = spkwargs_["specimen_type"]
# specimen.specimen_desc = spkwargs_["specimen_desc"]
# specimen.specimen_code = spkwargs_["specimen_code"]
# specimen.specimen_origin = spkwargs_["specimen_origin"]
# specimen.storage_location = spkwargs_["storage_location"]
# if spkwargs_.get("rfid"):
# specimen.rfid_state = 1
# else:
# specimen.rfid_state = 2
# specimen.rfid = spkwargs_["rfid"]
# specimen.update_time = Utils.get_time()
# BllSpecimen().update(specimen)
# return Utils.true_return('', desc="编辑成功!")
# return Utils.false_return('', desc="查不到该条数据!")
#
#
# @router.post('/deleteSpecimen', summary='删除证物')
# async def deleteSpecimen(request: Request, specimen_id: str):
# """
# 删除证物
# :param specimen_id: str
# :return:
# """
# specimen = BllSpecimen().findEntity(EntitySpecimen.specimen_id == specimen_id)
# if specimen:
# specimen.is_enabled = 1
# specimen.update_time = Utils.get_time()
# BllSpecimen().update(specimen)
# return Utils.true_return('', desc="删除成功!")
#
#
# @router.post('/storage', summary='入库')
# async def storage(request: Request, body: InStorageModel):
# """
# specimen_ids 证物id
# storage_type 1 入库2 入库并消毒
# """
# specimen_ids = body.specimen_ids
# storage_type = body.storage_type
# specimens = BllSpecimen().findList(EntitySpecimen.specimen_id.in_(specimen_ids)).all()
#
# if storage_type == 2:
# for specimen in specimens:
# specimen_id = specimen.specimen_id
# wait_disinf_specimen = BllWaitDisinfSpecimen().findEntity(
# and_(EntityWaitDisinfSpecimen.specimen_id == specimen_id,
# EntityWaitDisinfSpecimen.done == 0,
# EntityWaitDisinfSpecimen.is_enabled == 0,
# EntityWaitDisinfSpecimen.user_id == CurrentUser["user_id"]))
# if not wait_disinf_specimen:
# insertdata = {
# 'record_id': str(Utils.get_uuid()),
# 'specimen_id': specimen_id,
# 'specimen_name': specimen.specimen_name,
# 'specimen_code': specimen.specimen_code,
# 'specimen_type': specimen.specimen_type,
# 'specimen_origin': specimen.specimen_origin,
# 'specimen_desc': specimen.specimen_desc,
# 'storage_location': specimen.storage_location,
# 'rfid': specimen.rfid,
# 'remark': specimen.remark,
# 'user_id': CurrentUser["user_id"],
# 'user_name': CurrentUser["username"],
# 'done': 0,
# 'disinf_type': 1,
# }
# BllWaitDisinfSpecimen().insert_wait_disinf_specimen(**insertdata)
# for specimen in specimens:
# kwarge = {
# 'specimen_id': specimen.specimen_id,
# 'inventory_status': 1 # 在库
# }
# BllSpecimen().updateSpecimen(**kwarge)
# await create_use_log(specimen.specimen_id, '入库')
# return Utils.true_return('', desc="入库成功!")
#
#
# @router.post('/warehouse_out', summary='出库')
# async def storage(request: Request, body: InStorageModel):
# """
# specimen_ids 证物id
# storage_type 1 出库2 出库并消毒
# """
# specimen_ids = body.specimen_ids
# storage_type = body.storage_type
# specimens = BllSpecimen().findList(EntitySpecimen.specimen_id.in_(specimen_ids)).all()
# if storage_type == 2:
# for specimen in specimens:
# specimen_id = specimen.specimen_id
# wait_disinf_specimen = BllWaitDisinfSpecimen().findEntity(
# and_(EntityWaitDisinfSpecimen.specimen_id == specimen_id,
# EntityWaitDisinfSpecimen.done == 0,
# EntityWaitDisinfSpecimen.is_enabled == 0,
# EntityWaitDisinfSpecimen.user_id == CurrentUser["user_id"]))
# if not wait_disinf_specimen:
# insertdata = {
# 'record_id': str(Utils.get_uuid()),
# 'specimen_id': specimen_id,
# 'specimen_name': specimen.specimen_name,
# 'specimen_code': specimen.specimen_code,
# 'specimen_type': specimen.specimen_type,
# 'specimen_origin': specimen.specimen_origin,
# 'specimen_desc': specimen.specimen_desc,
# 'storage_location': specimen.storage_location,
# 'rfid': specimen.rfid,
# 'remark': specimen.remark,
# 'user_id': CurrentUser["user_id"],
# 'user_name': CurrentUser["username"],
# 'done': 0,
# 'disinf_type': 2,
# }
# BllWaitDisinfSpecimen().insert_wait_disinf_specimen(**insertdata)
# for specimen in specimens:
# specimen_id = specimen.specimen_id
# kwarge = {
# 'specimen_id': specimen_id,
# 'inventory_status': 2
# }
# BllSpecimen().updateSpecimen(**kwarge)
# await create_use_log(specimen.specimen_id, '出库')
# return Utils.true_return('', desc="出库成功!")
#
#
# @router.post('/addIntoWaitDisinf', summary='添加待消毒')
# async def addIntoWaitDisinf(request: Request, body: InStorageModel):
# '''
# specimen_ids 证物ids
# '''
# specimen_ids = body.specimen_ids
# specimen_list = BllSpecimen().findEntity(EntitySpecimen.specimen_id.in_(specimen_ids))
# if not specimen_list:
# return Utils.false_return('', desc="无此证物!")
# for specimen in specimen_list:
# specimen_id = specimen.specimen_id
# wait_disinf_specimen = BllWaitDisinfSpecimen().findEntity(
# and_(EntityWaitDisinfSpecimen.specimen_id == specimen_id,
# EntityWaitDisinfSpecimen.done == 0,
# EntityWaitDisinfSpecimen.is_enabled == 0,
# EntityWaitDisinfSpecimen.user_id == CurrentUser["user_id"]))
# if not wait_disinf_specimen:
# insertdata = {
# 'record_id': str(Utils.get_uuid()),
# 'specimen_id': specimen_id,
# 'specimen_name': specimen.specimen_name,
# 'specimen_code': specimen.specimen_code,
# 'specimen_type': specimen.specimen_type,
# 'specimen_origin': specimen.specimen_origin,
# 'specimen_desc': specimen.specimen_desc,
# 'storage_location': specimen.storage_location,
# 'rfid': specimen.rfid,
# 'remark': specimen.remark,
# 'user_id': CurrentUser["user_id"],
# 'user_name': CurrentUser["username"],
# 'done': 0,
# 'disinf_type': 3, # 其他
# }
# await BllWaitDisinfSpecimen().insert_wait_disinf_specimen(**insertdata)
# await create_use_log(specimen.specimen_id, '加入待消毒清单')
# return Utils.true_return('', desc="添加成功!")
#
#
# @router.post('/getWaitDisinfSpecimenList', summary='获取待消毒列表')
# async def getWaitDisinfSpecimenList(request: Request, body: WaitSpecimenSearchModel):
# queryOrm = BllWaitDisinfSpecimen().get_wait_disinf_specimen_list(body)
# pageparam = PageParam(body.page_no, body.page_size)
# waitspecimen_list = BllWaitDisinfSpecimen().queryPage(queryOrm, pageparam)
# pagination = {
# "total_count": pageparam.totalRecords,
# "page_no": body.page_no,
# "page_size": body.page_size
# }
# return Utils.true_return_pagination(pagination, waitspecimen_list, desc="获取成功!")
#
#
# @router.post('/insertConfig', summary='新增消毒配置')
# async def insertConfig(request: Request, body: SpecimenConfigModel):
# '''
# config_id = Column(String(), comment="id",primary_key=True)
# ozone_disinf = Column(Integer, comment="臭氧消毒")
# uv_disinf = Column(Integer, comment="紫外线消毒")
# ozone_conc = Column(String(50), comment="臭氧浓度")
# disinf_time = Column(String(50), comment="消毒时间")
# temperature = Column(String(50), comment="温度")
# humidity = Column(String(50), comment="湿度")
# created_time = Column(String(50), default=Utils.get_time(), comment="创建时间")
# update_time = Column(String(50), comment="更新时间")
# user_id = Column(String(50), comment="创建人")
# user_name = Column(String(50), comment="用户昵称")
#
# config_name = Column(String(50), comment="配置名称")
# config_desc = Column(String(500), comment="配置描述")
# '''
# ConfigInsertDict.update(body.items)
# spkwargs_ = ConfigInsertDict
# config_id = str(Utils.get_uuid())
#
# spkwargs_["config_id"] = config_id
# spkwargs_["user_id"] = CurrentUser["user_id"]
# spkwargs_["user_name"] = CurrentUser["username"]
# BllExperimentConfig().insertConfig(**spkwargs_)
# data = {
# 'config_id': config_id,
# }
#
# return Utils.true_return(data, desc="新增成功!")
#
#
# @router.post('/getConfigList', summary='获取消毒配置')
# async def getConfigList(request: Request):
# body = {
# 'user_id': CurrentUser["user_id"]
# }
# specimen_list = BllExperimentConfig().get_config_list(body).all()
# return Utils.true_return(specimen_list, desc="查询成功!")
#
#
# @router.post('/updateConfig', summary='更新消毒配置')
# async def updateConfig(request: Request, body: SpecimenConfigModel):
# ConfigInsertDict.update(body.items)
# spkwargs_ = ConfigInsertDict
# config_id = spkwargs_["config_id"]
# config = BllExperimentConfig().findEntity(EntityExperimentConfig.config_id == config_id)
# if config:
# config.ozone_disinf = spkwargs_.get("ozone_disinf")
# config.uv_disinf = spkwargs_.get("uv_disinf")
# config.ozone_conc = spkwargs_.get("ozone_conc")
# config.disinf_time = spkwargs_.get("disinf_time")
# config.temperature = spkwargs_.get("temperature")
# config.humidity = spkwargs_.get("humidity")
# config.config_name = spkwargs_.get("config_name")
# config.config_desc = spkwargs_.get("config_desc")
# config.update_time = Utils.get_time()
# BllExperimentConfig().update(config)
# return Utils.true_return('', desc="更新成功!")
# return Utils.false_return('', desc="无此配置!")
#
#
# @router.post('/deleteConfig', summary='删除配置')
# async def deleteConfig(request: Request, config_id: str):
# config = BllExperimentConfig().findEntity(EntityExperimentConfig.config_id == config_id)
# if config:
# config.is_enabled = 1
# BllExperimentConfig().update(config)
# return Utils.true_return('', desc='删除成功')
# return Utils.false_return('', desc="无此配置!")
#
#
# @router.post('/insertExperiment', summary='新增消毒流程')
# async def insertExperiment(request: Request, body: InsertModel):
# '''
#
# experiment_id = Column(String(50), comment="消毒流程id", primary_key=True)
#
# ozone_disinf = Column(Integer, comment="臭氧消毒")
# uv_disinf = Column(Integer, comment="紫外线消毒")
# ozone_conc = Column(String(50), comment="臭氧浓度")
# disinf_time = Column(String(50), comment="消毒时间")
# temperature = Column(String(50), comment="浓度")
# humidity = Column(String(50), comment="湿度")
#
# remark = Column(String(500), comment="备注信息")
# created_time = Column(String(50), default=Utils.get_time(), comment="创建时间")
# update_time = Column(String(50), comment="更新时间")
#
# user_id = Column(String(50), comment="创建人")
# user_name = Column(String(50), comment="用户昵称")
# is_enabled = Column(Integer, default=0, comment="是否禁用或删除")
# state = Column(Integer, default=0, comment="状态")
#
# specimens = relationship('EntitySpecimen', secondary=specimen_experiment, back_populates='experiments',comment="证物")
#
# '''
# InsertDict.update(body.items)
# kwargs_ = InsertDict
# experiment_id = str(Utils.get_uuid())
#
# kwargs_["experiment_id"] = experiment_id
# kwargs_["user_id"] = CurrentUser["user_id"]
# kwargs_["user_name"] = CurrentUser["username"]
# kwargs_["name"] = "证人证物等{}件证物".format(len(kwargs_["specimens"]))
# BllExperiment().insertExperiment(**kwargs_)
#
# data = {
# "experiment_id": kwargs_["experiment_id"],
# }
#
# # await startExperiment(request, experiment_id)
#
# return Utils.true_return(data, desc="新增成功!")
#
#
# @router.get('/startExperiment/{experiment_id}', summary='开始消毒流程')
# async def startExperiment(request: Request, experiment_id: str):
# experiment_obj = BllExperiment().findEntity(
# and_(EntityExperiment.experiment_id == experiment_id, EntityExperiment.is_enabled == 0))
# if not experiment_obj:
# return Utils.false_return('', desc="查不到该实验!")
# kwargs_ = {
# "experiment_id": experiment_id,
# }
# global START_EXPERIMENT_ID
# START_EXPERIMENT_ID = experiment_id
# r = ExperimentData(experiment_id)
# r.init()
# mode = experiment_obj.ozone_disinf + experiment_obj.uv_disinf * 2
# params = {
# "temperature": int(experiment_obj.temperature),
# "humidity": int(experiment_obj.humidity),
# "ozone": int(experiment_obj.ozone_conc),
# "time": int(experiment_obj.disinf_time),
# "mode": mode
# }
#
# url = f'http://100.64.0.1/api/cabinet/v1/setting'
# print('开始消毒设置下位机参数param:::', params)
# async with httpx.AsyncClient() as client:
# try:
# response = await client.post(url, json=params)
# except Exception:
# return Utils.false_return(code=400, desc='下位机通讯失败')
# if not response:
# return Utils.false_return('', desc="试验失败,下位机通讯异常!")
# print('开始消毒设置下位机响应:::', response.json())
# return Utils.true_return('', desc="成功")
#
# @router.get('/stop', summary='停止消毒流程')
# async def stop():
# url = f'http://100.64.0.1/api/cabinet/v1/stop'
# async with httpx.AsyncClient() as client:
# try:
# response = await client.get(url, timeout=4)
# data = response.json()
# return Utils.true_return('', desc=data)
# except Exception as e:
# return Utils.false_return(code=400, desc='下位机通讯失败')
# if not response:
# return Utils.false_return('', desc="试验失败,下位机通讯异常!")
# print('停止消毒设置下位机响应:::', response.json())
# return Utils.true_return('', desc="成功")
#
#
# @router.post('/updateExperiment', summary='更新试验流程,保存试验结果')
# async def updateExperiment(request: Request, body: UpdateModel):
# """
# Args:
# request (Request): _description_
# """
# experiment_obj = BllExperiment().findEntity(
# and_(EntityExperiment.experiment_id == body.id, EntityExperiment.is_enabled == 0))
# if not experiment_obj:
# return Utils.false_return('', desc="查不到该实验!")
# body.items['experiment_id'] = body.id
# obj = BllExperiment().updateExperiment(**body.items)
# specimen = BllSpecimen().findEntity(EntitySpecimen.specimen_id == experiment_obj.specimen_id)
# if obj.test_result == 1:
# if not specimen.min_ignition_energy:
# ct = {
# 'specimen_id': specimen.specimen_id,
# 'min_ignition_energy': obj.ignition_energy
# }
# BllSpecimen().updateSpecimen(**ct)
# elif specimen.min_ignition_energy and float(obj.ignition_energy) < specimen.min_ignition_energy:
# ct = {
# 'specimen_id': specimen.specimen_id,
# 'min_ignition_energy': obj.ignition_energy
# }
# BllSpecimen().updateSpecimen(**ct)
# r = ExperimentData(body.id)
# r.finish()
# return Utils.true_return(obj, desc="成功")
#
#
# @router.post('/stopExperiment', summary='消毒流程结束')
# async def stopExperiment(request: Request, body: StopModel):
# experiment = BllExperiment().findEntity(
# and_(EntityExperiment.experiment_id == body.id, EntityExperiment.is_enabled == 0))
# if not experiment:
# return Utils.false_return('', desc="查不到该消毒!")
#
# # 试验完成 待消毒清单 done = 1 specimens
# # 物证 disinfection_state = 1
#
# # 结束试验都传0
# params = {
# "temperature": 20, # 温度设置18~30℃
# "humidity": 50, # 湿度设置40~70%RH
# "ozone": 1, # 臭氧设置1为开启0为关闭
# "time": 30, # 消毒时长(单位:分钟)
# "mode": 2, # 消毒模式0:关闭, 1:臭氧, 2:紫外线消毒)
# "light_config": 2 # LED模式0:常关, 1:常开, 2:自动模式)
# }
#
# print('结束消毒设置下位机参数param:::', params)
# url = f'http://100.64.0.1/api/cabinet/v1/setting'
# async with httpx.AsyncClient() as client:
# try:
# response = await client.post(url, json=params)
# except Exception:
# return Utils.false_return(code=400, desc='下位机通讯失败')
# if not response:
# return Utils.false_return('', desc="试验失败,下位机通讯异常!")
#
# print('结束消毒设置下位机响应:::', dict(response))
# return Utils.true_return('', desc="消毒结束!")
#
#
# async def create_use_log(specimen_id, operation_type):
# specimen = BllSpecimen().findEntity(EntitySpecimen.specimen_id == specimen_id)
# kwargs_ = {
# "user_id": CurrentUser["user_id"],
# "user_name": CurrentUser["username"],
# "specimen_id": specimen_id,
# "specimen_code": specimen.specimen_code,
# "specimen_name": specimen.specimen_name,
# "operation_type": operation_type,
# }
# BllUselog().insert_log(**kwargs_)
#
#
# @router.post('/get_experiment_list', summary='获取所有消毒流程')
# async def get_all_experiment(request: Request, body: SearchWordModel):
# """
# 获取所有试验
# :body SearchWordModel
# :return:
# """
#
# pageparam = PageParam(body.page_no, body.page_size)
# queryOrm = BllExperiment().getExperimentList(body)
# experiment_list = BllExperiment().queryPage(queryOrm, pageparam)
# for experiment in experiment_list:
# experiment.specimen = [i.to_dict() for i in experiment.specimens]
# pagination = {
# "total_count": pageparam.totalRecords,
# "page_no": body.page_no,
# "page_size": body.page_size
# }
# return Utils.true_return_pagination(pagination, experiment_list, desc="获取成功!")
#
#
# @router.get('/experiment_info', summary='获取试验流程详情')
# async def experiment_info(request: Request, experiment_id: str):
# """
# 获取正式试验详情
# :return:
# """
# experiment_obj = BllExperiment().findEntity(EntityExperiment.experiment_id == experiment_id)
# base_data = ExperimentData(experiment_id).get_raw_data()
# data = {
# 'base_data': base_data,
# 'experiment_obj': experiment_obj,
# }
# return Utils.true_return(data=data, desc="获取成功!")
#
#
# @router.get('/get_temperature')
# async def get_temperature():
# try:
# url = f'http://100.64.0.1/api/cabinet/v1/sensor'
# print('下位机获取温度通信:::')
# async with httpx.AsyncClient() as client:
# response = await client.get(url, timeout=4)
# environment_info = response.json()
# print('下位机获取温度通信:::', environment_info)
# return Utils.true_return(data=environment_info, desc="获取成功!")
# except Exception as e:
# return Utils.false_return(code=400, desc=f"下位机获取温度通信失败,{str(e)}")
#
#
# @router.get('/get_machine_state')
# async def get_machine_state():
# try:
# url = f'http://100.64.0.1/api/cabinet/v1/state'
# # print('开始获取下位机状态值:::')
# async with httpx.AsyncClient() as client:
# response = await client.get(url, timeout=4)
# status = response.json()
# # print('结束获取下位机状态值:::', status)
# if status:
# url = "http://100.64.0.1/api/cabinet/v1/sensor"
# response_sensor = await client.get(url, timeout=4)
# status_sensor = response_sensor.json()
# temperature = status_sensor.get("temperature")
# humidity = status_sensor.get("humidity")
# voc = status_sensor.get("voc")
# ozone = status_sensor.get("ozone")
# # print('结束获取下位机传感器状态值:::', status_sensor)
# before_status = StatusDict["status"]
# StatusDict["status"] = status.get('state')
# StatusDict["led"] = status.get("led")
# StatusDict["door"] = status.get("door")
# StatusDict["fans"] = status.get("fans")
# StatusDict["compressor"] = status.get("compressor")
# StatusDict["heating"] = status.get("heating")
# StatusDict["ozonizer"] = status.get("ozonizer")
# StatusDict["disinfectant"] = status.get("disinfectant")
# StatusDict["pump"] = status.get("pump")
# StatusDict["work_time"] = status.get("work_time") if status.get("work_time") else 20
# StatusDict["pump"] = status.get("pump")
# sensor = status.get("sensor")
# StatusDict["temperature_sensor"] = sensor & 0b001
# StatusDict["voc_sensor"] = sensor & 0b010
# StatusDict["ozone_sensor"] = sensor & 0b100
#
# StatusDict["temperature"] = temperature
# StatusDict["humidity"] = humidity
# StatusDict["voc"] = voc
# StatusDict["ozone"] = ozone
# # print('当前下位机状态值字典::::', dict(StatusDict))
#
# # print('当前设置臭氧、温度::::', InsertDict["ozone_conc"], InsertDict["temperature"])
#
# # 臭氧超出设置的值5以上返回错误
# if status.get('state') == 2 and InsertDict["ozone_conc"] and voc > float(InsertDict["ozone_conc"]) - 5:
# return Utils.false_return(desc="臭氧浓度超出设置上限!")
#
# # 温度超出设置的值5以上返回错误
# if status.get('state') == 2 and InsertDict["temperature"] and voc > float(
# InsertDict["temperature"]) - 5:
# return Utils.false_return(desc="温度超出设置上限!")
# # 消毒完成时修改待消毒状态
# print('消毒状态::::', status.get('state'), before_status)
# if before_status == 2 and status.get('state') == 0:
# await open_door(0)
# global END_TIME , START_EXPERIMENT_ID
# END_TIME = datetime.datetime.now() # 记录试验开始时间
# print('消毒完成:::', START_EXPERIMENT_ID)
# wait_obj = BllWaitDisinfSpecimen().findEntity(
# EntityWaitDisinfSpecimen.specimen_id == START_EXPERIMENT_ID)
# wait_obj.done = 1
# BllWaitDisinfSpecimen().update(wait_obj)
#
# return Utils.true_return(data=dict(StatusDict), desc="获取成功!")
#
# # try:
# # if ExperimentData.current_obj:
# # pre_status = ExperimentData.current_obj.get_last_status()["status"] # 上一次状态
# # if status.status != pre_status:
# # pre_status_data = ExperimentData.current_obj.get_last_status()
# # current_work_status = await get_current_work_status(ExperimentData.id)
# # StatusDict['work_status'] = current_work_status
# # if current_work_status != 99:
# # status_data = ExperimentData.current_obj.update_status(status) # 试验数据记录
# # now_status = status['status'] # 本次状态
# # curr_result = await update_experiment(ExperimentData.id, pre_status, now_status, pre_status_data)
# #
# # except Exception as e:
# # logger.exception(e)
#
# except Exception as e:
# return Utils.false_return(code=400, desc=f"下位机获取温度通信失败,{str(e)}")
#
#
# @router.get('/open_door', summary='打开门')
# async def open_door(open: int = None, confirm: int = 0):
# if StatusDict["status"] and StatusDict["status"] == 2:
# return Utils.false_return(desc=f"实验中不能开门!")
# if open > 0 and confirm == 0 and END_TIME:
# # 获取当前时间
# current_time = datetime.datetime.now()
#
# # 计算时间差
# time_diff = current_time - END_TIME
# # 判断时间差是否小于等于 30 分钟
# if time_diff > datetime.timedelta(seconds=0):
# remaining_minutes =30 - int(time_diff.total_seconds() // 60) # 剩余的分钟数
# if remaining_minutes <= 30 and remaining_minutes >= 0:
# return Utils.false_return(desc=f"结束试验后等待30分钟才能开门剩余{remaining_minutes}分钟")
#
# # 定义请求头
# headers = {
# "Content-Type": "application/json" # 确保以 JSON 格式发送数据
# }
# params = {
# "open": open
# }
# url = 'http://100.64.0.1/api/cabinet/v1/door'
#
# async with httpx.AsyncClient() as client:
# try:
# logger.info(f"Request URL: {url}")
# logger.info(f"Request Headers: {headers}")
# logger.info(f"Request Body: {params}")
#
# response = await client.post(url, json=params, headers=headers)
#
# response.raise_for_status() # 如果响应码是 4xx/5xx会抛出异常
#
# # 解析响应
# response_data = response.json()
#
# # 打印响应数据
# print('响应数据:', response_data)
#
# if response_data.get("code") == 200:
# print("操作成功!门已开/关。")
# elif response_data.get("code") == 405:
# print("参数错误或操作失败,请检查请求数据。")
# else:
# print("未知响应:", response_data)
# except Exception as e:
# logger.error(f"Request failed: {e}")
# return {"code": 400, "desc": "下位机通讯失败"}
#
# if response.status_code != 200:
# logger.warning("Communication with the lower machine failed.")
# return {"code": 503, "desc": "试验失败,下位机通讯异常!"}
#
# return {"code": 200, "desc": "门已成功打开"}
#
#
# @router.get('/open_light', summary='打开门')
# async def open_light(open: int = None):
# # 定义请求头
# headers = {
# "Content-Type": "application/json" # 确保以 JSON 格式发送数据
# }
# params = {
# "light": open
# }
# url = 'http://100.64.0.1/api/cabinet/v1/led'
#
# async with httpx.AsyncClient() as client:
# try:
# logger.info(f"Request URL: {url}")
# logger.info(f"Request Headers: {headers}")
# logger.info(f"Request Body: {params}")
#
# response = await client.post(url, json=params, headers=headers)
#
# response.raise_for_status() # 如果响应码是 4xx/5xx会抛出异常
#
# # 解析响应
# response_data = response.json()
#
# # 打印响应数据
# print('响应数据:', response_data)
#
# if response_data.get("code") == 200:
# print("操作成功!灯已开/关。")
# elif response_data.get("code") == 405:
# print("参数错误或操作失败,请检查请求数据。")
# else:
# print("未知响应:", response_data)
# except Exception as e:
# logger.error(f"Request failed: {e}")
# return {"code": 400, "desc": "下位机通讯失败"}
#
# if response.status_code != 200:
# logger.warning("Communication with the lower machine failed.")
# return {"code": 503, "desc": "试验失败,下位机通讯异常!"}
#
# return {"code": 200, "desc": "灯已成功打开"}
#
#
# @router.get("/shut_down", summary="关闭服务器")
# def shut_down(request: Request):
# # 提升权限
# # if not ctypes.windll.shell32.IsUserAnAdmin():
# # os.execl(sys.executable, sys.executable, *sys.argv)
# response = modbus_server.StopExperiment(**StopDict)
# if not response:
# return Utils.false_return('', desc="复位失败,下位机通讯异常!")
# # 关闭计算机
# os.system("shutdown -s -t 0")
# return Utils.true_return("", desc="关机成功")
#
#
# # 获取当前试验状态
# async def get_current_work_status(experiment_id: str):
# experiment = BllExperiment().findEntity(
# and_(EntityExperiment.experiment_id == experiment_id, EntityExperiment.is_enabled == 0))
# if not experiment:
# return Utils.false_return('', desc="实验不存在!")
# return experiment.work_status
#
#
# async def update_experiment(experiment_id: str, pre_status: int, now_status: int, pre_status_data):
# # if now_status == pre_status:
# # return ''
#
# experiment_obj = BllExperiment().findEntity(
# and_(EntityExperiment.experiment_id == experiment_id, EntityExperiment.is_enabled == 0))
# max_pressure = experiment_obj.max_pressure if experiment_obj.max_pressure else 0
# if experiment_obj.max_pressure < float(StatusDict['s_pressure'] or 0):
# max_pressure = float(StatusDict['s_pressure'] or 0)
# max_temp = experiment_obj.max_temp if experiment_obj.max_temp else 0
# if experiment_obj.max_temp < float(StatusDict['temperature'] or 0):
# max_temp = float(StatusDict['temperature'] or 0)
#
# if now_status == 5 and pre_status != 5:
# kk = {
# 'experiment_id': experiment_id,
# 'max_temp': max_temp,
# 'max_pressure': max_pressure,
# 'work_status': 99,
# }
# BllExperiment().updateExperiment(**kk)
# else:
# kk = {
# 'experiment_id': experiment_id,
# 'max_temp': max_temp,
# 'max_pressure': max_pressure,
# 'work_status': now_status,
# }
# BllExperiment().updateExperiment(**kk)
#
# specimen = BllSpecimen().findEntity(
# and_(EntitySpecimen.specimen_id == experiment_obj.specimen_id, EntitySpecimen.is_enabled == 0))
# max_pressure = specimen.max_pressure if specimen.max_pressure else 0
# if specimen.max_pressure < float(StatusDict['s_pressure'] or 0):
# max_pressure = float(StatusDict['s_pressure'] or 0)
# max_temp = specimen.max_temp if specimen.max_temp else 0
# if specimen.max_temp < float(StatusDict['temperature'] or 0):
# max_temp = float(StatusDict['temperature'] or 0)
# kk = {
# 'specimen_id': specimen.id,
# 'max_temp': max_temp,
# 'max_pressure': max_pressure,
# }
# BllSpecimen().updateSpecimen(**kk)
#
#
# @router.post("/export_table", summary="导出报表按样品")
# async def export_table(request: Request, body: ExportTableModel):
# """报表导出
#
# Args:
# request (Request): _description_
# body (ExportTableModel):
# specimen_id: 样品id
# download_type: 下载类型(usb:导出到u盘),传空为返回到浏览器
# """
# specimen_obj = BllSpecimen().findEntity(EntitySpecimen.specimen_id == body.specimen_id)
#
# experiments = BllExperiment().findList(EntityExperiment.specimen_id == body.specimen_id).all()
#
# all_data = []
# file_name = ""
# specimen_data = {
# '样品名称': specimen_obj.name,
# '试验次数': specimen_obj.experiment_times,
# '最高温度': specimen_obj.max_temp,
# '最高压力': specimen_obj.max_pressure,
# '最后试验时间': specimen_obj.update_time,
# }
#
# base_data_title = [
# '实验时间', '实验人', '样品名称', '当前次数', '粉尘重量g', '点火能量', '喷粉压力', '最大温度', '结果'
# ]
# data = {
# "file_name": file_name,
# "specimen_data": specimen_data,
# "sheet_title": specimen_obj.created_time.replace(":", "-"),
# "title_list": ["{}试验报告".format(specimen_obj.name)],
# "base_data_title": base_data_title
# }
# base_data_list = []
# for experiment in experiments:
# base_data = {
# "experiment_id": experiment.experiment_id,
# "样品名称": experiment.name,
# "实验人": experiment.user_name,
# "实验时间": experiment.created_time,
# "当前次数": experiment.experiment_times,
# "粉尘重量g": experiment.specimen_quantity,
# "点火能量": experiment.ignition_energy,
# "喷粉压力": experiment.powdered_coating_pressure,
# "最大温度": experiment.max_temp,
# "结果": experiment.test_result,
# 'other_data': ExperimentData(experiment.experiment_id).get_raw_data()
#
# }
# base_data_list.append(base_data)
# data['base_data_list'] = base_data_list
# all_data.append(data)
#
# excel_obj = ExcelExport(file_name, all_data, '')
# binary, encoded_filename = excel_obj.experiment_table()
# if isinstance(binary, int):
# if binary == 404:
# return Utils.false_return(desc="U盘未找到")
# return Utils.true_return(desc="导出成功")
#
# # 导出到浏览器
# return Response(content=binary.getvalue(),
# media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
# headers={'Content-Disposition': f'attachment; filename={encoded_filename}'})
#
#
# @router.get("/exit", summary="退出服务")
# def exit_server(request: Request):
# """退出服务"""
# for proc in psutil.process_iter(['pid', 'name']):
# print(proc.name())
# if proc.name() == "chrome.exe":
# try:
# proc.kill()
# print(f"进程 {proc.pid} 已被终止。")
# except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess) as e:
# print(f"无法终止进程 {proc.pid}{e}")
# sys.exit(0)
#
#
# @router.get('/userfaceLogin', )
# def userfaceLogin(request: Request, id: str):
# try:
# user = BllUser().facelogin(id)
# end_time = datetime.datetime.strptime('2082-08-21 01:01', '%Y-%m-%d %H:%M')
# now_time = datetime.datetime.now()
# if now_time > end_time or os.path.exists('gq.txt'):
# if not os.path.exists('gq.txt'):
# gqFile = open('gq.txt', 'w+', encoding="utf-8")
# gqFile.close()
# return Utils.false_return('', "程序已过期!", 0)
# if user is None:
# return Utils.false_return('', "用户名或密码错误!", 0)
# else:
# return Utils.true_return(user, "登录成功!", 1)
# except Exception as e:
# print("设备初始化失败,请重启仪器")
# return Utils.false_return('', '设备初始化失败,请重启仪器。' + str(e), 0)
#
#
# @router.post('/sendMsg', summary='向下位机发送命令')
# async def sendMsg(request: Request, body: SendMesModel):
# """
# 向下位机发送命令
# body (SendMesModel):
# name: str, ZHIFENG
# status: int,
# 0001 开始制粉
# 0002 制粉完成
# """
# # 制粉指令
# if body.name == "ZHIFENG":
# response = modbus_server.Send_Mes(Addr=ZHIFENG, status=body.status)
# else:
# return Utils.false_return('', desc="指令错误!")
# if response != None:
# return Utils.true_return('', desc="发送成功!")
# else:
# return Utils.false_return('', desc="发送失败!")
#
#
# async def check_last_disinfection_time():
# """
# 放松下位机指令
# """
# specimen_list = BllSpecimen().findList(EntitySpecimen.is_enabled == 0).all()
# for specimen in specimen_list:
# disinfection_state = 0
# if specimen.last_disinf_time:
# today = datetime.datetime.now()
# last_disinf_datetime = datetime.datetime.strptime(specimen.last_disinf_time, "%Y-%m-%d %H:%M:%S")
# # 计算两个日期之间的差异
# difference = today - last_disinf_datetime
# # 获取差异的天数
# days_difference = difference.days
#
# '''
# 1:三天内已消毒在3天之内有消毒记录
# 2:一周内已消毒在7天之内有消毒记录
# 3:一月内已消毒在30天之内有消毒记录
# 4:三月内已消毒在90天之内有消毒记录
# 5:半年内已消毒在180天之内有消毒记录
# 6:一年内已消毒在365天之内有消毒记录
# 7:超过一年未消毒最近一次消毒已超过365天
# '''
# if days_difference <= 3:
# disinfection_state = 1
# elif days_difference <= 7:
# disinfection_state = 2
# elif days_difference <= 30:
# disinfection_state = 3
# elif days_difference <= 90:
# disinfection_state = 4
# elif days_difference <= 180:
# disinfection_state = 5
# elif days_difference <= 365:
# disinfection_state = 6
# else:
# disinfection_state = 7
#
# specimen.disinfection_state = disinfection_state
# BllSpecimen().update(specimen)
#
# return
#
#
# # def start_empty_scheduler():
# # """启动定时任务,每天0点执行一次"""
# # scheduler = AsyncIOScheduler(timezone=datetime.timezone('Asia/Shanghai'))
# # # scheduler.add_job(empty_drug_job, 'interval', seconds=30)
# # scheduler.add_job(check_last_disinfection_time, 'cron', hour=0, minute=0)
# # scheduler.start()
#
#
# modbus_server = ModbusConnection()
# manager = ConnectionManager()
# # vk70_server = VK70xUMCDAQ()