commit
177288317c
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,26 @@
|
||||
from fastapi import FastAPI
|
||||
from app.api import Server, ShortCircuit
|
||||
from app.api.ShortCircuit import app_start
|
||||
|
||||
|
||||
def register_blueprints(app):
|
||||
'''
|
||||
registration route (module)
|
||||
'''
|
||||
# app.include_router(Server.router, tags=["API接口"])
|
||||
app.include_router(ShortCircuit.router, tags=["电池短路API接口"])
|
||||
|
||||
async def lifespan(app):
|
||||
# 应用启动时执行
|
||||
await app_start()
|
||||
|
||||
# 在应用关闭时执行的代码
|
||||
yield # 等待应用关闭
|
||||
|
||||
def create_app():
|
||||
app = FastAPI(lifespan=lifespan)
|
||||
|
||||
#注册路由
|
||||
register_blueprints(app)
|
||||
|
||||
return app
|
@ -0,0 +1,82 @@
|
||||
import os
|
||||
import cv2
|
||||
import threading
|
||||
|
||||
outputFrame = None
|
||||
lock = threading.Lock()
|
||||
|
||||
class CvCamera():
|
||||
def __init__(self):
|
||||
# 获取当前相机
|
||||
self.cap = None
|
||||
self.workFlag =False
|
||||
self.record_id =None
|
||||
self.video_path = 'D:/Project/UI/videoFold'
|
||||
self.fourcc = cv2.VideoWriter_fourcc(*'XVID')
|
||||
if not os.path.exists(self.video_path) or not os.path.isdir(self.video_path):
|
||||
os.makedirs(self.video_path)
|
||||
|
||||
|
||||
#打开相机
|
||||
def start(self,record_id=None):
|
||||
try:
|
||||
if self.workFlag == False:
|
||||
self.record_id =record_id
|
||||
self.cap = cv2.VideoCapture(0)
|
||||
self.workFlag = True
|
||||
# 单独线程供相机使用
|
||||
t = threading.Thread(target=self.videoWork)
|
||||
t.start()
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
|
||||
# 释放资源
|
||||
def release(self):
|
||||
global outputFrame
|
||||
try:
|
||||
self.workFlag = False
|
||||
self.record_id = None
|
||||
if (self.cap):
|
||||
outputFrame=None
|
||||
self.cap.release()
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
# 相机图像分析
|
||||
def videoWork(self):
|
||||
global outputFrame, lock
|
||||
self.cap.set(cv2.CAP_PROP_FPS, 30)
|
||||
out = cv2.VideoWriter(self.video_path + '/' + self.record_id + '.mp4', self.fourcc, 20.0, (640, 480))
|
||||
while (self.workFlag):
|
||||
try:
|
||||
ret, frame = self.cap.read()
|
||||
# cv2.imshow('image',frame)
|
||||
# cv2.waitKey(0)
|
||||
with lock:
|
||||
outputFrame = frame.copy()
|
||||
out.write(frame)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
|
||||
# 输出图像
|
||||
def generate(self):
|
||||
# 抓取对输出帧和锁定变量的全局引用
|
||||
global outputFrame, lock
|
||||
# 循环访问输出流中的帧
|
||||
while True:
|
||||
# 等到锁被获取
|
||||
with lock:
|
||||
# 检查输出帧是否可用,否则跳过
|
||||
# 循环的迭代
|
||||
if outputFrame is None:
|
||||
continue
|
||||
# 以 JPEG 格式对帧进行编码
|
||||
(flag, encodedImage) = cv2.imencode(".jpg", outputFrame)
|
||||
# 确保帧已成功编码
|
||||
if not flag:
|
||||
continue
|
||||
# 以字节格式生成输出帧
|
||||
yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + bytearray(encodedImage) + b'\r\n')
|
@ -0,0 +1,113 @@
|
||||
import csv
|
||||
import json
|
||||
import os
|
||||
import pathlib
|
||||
import shutil
|
||||
|
||||
from app.conf.Setting import settings
|
||||
# from app.lib.StaticData import ServerStatus
|
||||
|
||||
|
||||
class RecordStatus:
|
||||
"""记录当然实验工作状态"""
|
||||
|
||||
def __init__(self):
|
||||
self.file = pathlib.Path(settings.BASE_PATH, settings.TEMP_PATH, "last_experiment.json")
|
||||
|
||||
def load(self):
|
||||
if not self.file.exists():
|
||||
return {}
|
||||
return json.loads(self.file.read_text())
|
||||
|
||||
def update(self, work_time, status):
|
||||
data = {
|
||||
"work_time": work_time,
|
||||
"status": status
|
||||
}
|
||||
self.file.write_text(json.dumps(data))
|
||||
|
||||
def clear(self):
|
||||
if self.file.exists():
|
||||
self.file.unlink()
|
||||
|
||||
|
||||
class ExperimentData:
|
||||
"""实验数据"""
|
||||
|
||||
current_obj = None
|
||||
id = None
|
||||
|
||||
def __init__(self, _id):
|
||||
self._id = _id
|
||||
self.dir_path = pathlib.Path(os.path.join(settings.BASE_PATH, settings.TEMP_PATH, self._id))
|
||||
self.file_path = self.dir_path.joinpath("experiment_data.csv")
|
||||
self.status_file = self.dir_path.joinpath("last_status.json")
|
||||
|
||||
def init(self):
|
||||
if not self.dir_path.exists():
|
||||
print(f"create dir {self.dir_path}")
|
||||
self.dir_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
self.file_path.touch(exist_ok=True)
|
||||
self.status_file.touch(exist_ok=True)
|
||||
ExperimentData.current_obj = self
|
||||
ExperimentData.id = self._id
|
||||
|
||||
def update_status(self, status_data):
|
||||
|
||||
format_value = (f'{status_data["status"]},{status_data["status_text"]},'
|
||||
f'{status_data["s_pressure"]},{status_data["temperature"]},'
|
||||
f'{status_data["test_time"]}\n')
|
||||
|
||||
with open(self.file_path, "a+") as f:
|
||||
f.write(format_value)
|
||||
|
||||
data = {
|
||||
"status": status_data["status"],
|
||||
"status_text": status_data["status_text"],
|
||||
"s_pressure": status_data["s_pressure"],
|
||||
"temperature": status_data["temperature"],
|
||||
"test_time": status_data["test_time"]
|
||||
}
|
||||
|
||||
self.status_file.write_text(json.dumps(data))
|
||||
|
||||
def get_last_status(self):
|
||||
if not self.status_file.exists():
|
||||
return {'status': 0} # 设置的初始值
|
||||
|
||||
raw = self.status_file.read_text()
|
||||
if not raw:
|
||||
return {'status': 0} # 设置的初始值
|
||||
return json.loads(self.status_file.read_text())
|
||||
|
||||
def finish(self):
|
||||
ExperimentData.current_obj = None
|
||||
|
||||
def remove(self):
|
||||
if self.dir_path.exists():
|
||||
print(f"remove dir {self.dir_path}")
|
||||
shutil.rmtree(self.dir_path)
|
||||
|
||||
def judging_status(self, status_obj, work_time):
|
||||
"""根据时间判断状态"""
|
||||
cur_status = status_obj[0][0]
|
||||
for status, time in status_obj:
|
||||
if int(work_time) <= int(time):
|
||||
return cur_status
|
||||
else:
|
||||
cur_status = status
|
||||
|
||||
return cur_status
|
||||
|
||||
def get_raw_data(self):
|
||||
result = []
|
||||
|
||||
if not self.file_path.exists():
|
||||
return result
|
||||
|
||||
with open(self.file_path, "r") as f:
|
||||
reader = csv.reader(f)
|
||||
for row in reader:
|
||||
result.append(row)
|
||||
return result
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,46 @@
|
||||
import getpass
|
||||
import glob
|
||||
import platform
|
||||
from io import BytesIO
|
||||
from os import path
|
||||
|
||||
import psutil
|
||||
|
||||
system_name = platform.system()
|
||||
|
||||
|
||||
class DeviceNotFound(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def fetch():
|
||||
"""获取U盘中的Excel文件"""
|
||||
if system_name == 'Windows':
|
||||
usbs = [disk.device for disk in psutil.disk_partitions() if disk.opts == 'rw,removable']
|
||||
if not usbs:
|
||||
raise DeviceNotFound()
|
||||
usb = usbs[0]
|
||||
files = glob.glob(f'{usb}/*.xlsx') + glob.glob(f'{usb}/*.xls')
|
||||
return [{"name": path.basename(f), "file": f} for f in files]
|
||||
|
||||
usbs = [item for item in psutil.disk_partitions() if item.mountpoint.startswith(f'/media/{getpass.getuser()}')]
|
||||
if not usbs:
|
||||
raise DeviceNotFound()
|
||||
usb = usbs[0]
|
||||
files = glob.glob(f'{usb.mountpoint}/*.xlsx') + glob.glob(f'{usb.mountpoint}/*.xls')
|
||||
return [{"name": path.basename(f), "file": f} for f in files]
|
||||
|
||||
|
||||
def put_in(filename: str, bin: BytesIO):
|
||||
if system_name == 'Windows':
|
||||
usbs = [disk.device for disk in psutil.disk_partitions() if disk.opts == 'rw,removable']
|
||||
if not usbs:
|
||||
raise DeviceNotFound()
|
||||
path_file = path.join(usbs[0], filename)
|
||||
else:
|
||||
usbs = [item for item in psutil.disk_partitions() if item.mountpoint.startswith(f'/media/{getpass.getuser()}')]
|
||||
if not usbs:
|
||||
raise DeviceNotFound()
|
||||
path_file = path.join(usbs[0].mountpoint, filename)
|
||||
with open(path_file, 'wb') as f:
|
||||
f.write(bin.getbuffer())
|
@ -0,0 +1,20 @@
|
||||
from fastapi import WebSocket
|
||||
|
||||
|
||||
class ConnectionManager:
|
||||
def __init__(self):
|
||||
self.active_connections: list[WebSocket] = []
|
||||
|
||||
async def connect(self, websocket: WebSocket):
|
||||
await websocket.accept()
|
||||
self.active_connections.append(websocket)
|
||||
|
||||
def disconnect(self, websocket: WebSocket):
|
||||
self.active_connections.remove(websocket)
|
||||
|
||||
async def send_data(self, message: dict, websocket: WebSocket):
|
||||
await websocket.send_json(message)
|
||||
|
||||
async def broadcast(self, message: str):
|
||||
for connection in self.active_connections:
|
||||
await connection.send_text(message)
|
@ -0,0 +1,5 @@
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
__all__ = ["Base"]
|
@ -0,0 +1,382 @@
|
||||
from app.models.Repository import OrmBase
|
||||
from app.models.DateEntity import EntityUser, EntityRole, DeviceConfig, ExperimentSpecimen, ExperimentInfo, \
|
||||
ExperimentReport, Channel
|
||||
from app.lib.Utils import *
|
||||
from sqlalchemy import and_, or_, desc, text
|
||||
|
||||
|
||||
# 分页参数模型
|
||||
class PageParam(object):
|
||||
def __init__(self, curPage, pageRows, totalRecords=None, orderType=None, orderField=None):
|
||||
self.orderType = orderType # 排序类型 asc=正序 desc=倒序
|
||||
self.orderField = orderField # 排序字段
|
||||
self.pageRows = pageRows # 单页行数
|
||||
self.curPage = curPage # 当前页码
|
||||
self.totalRecords = totalRecords # 总页数
|
||||
|
||||
|
||||
# 用户逻辑类
|
||||
class BllUser(OrmBase):
|
||||
|
||||
def __init__(self, entityType=EntityUser):
|
||||
super().__init__(entityType)
|
||||
|
||||
# 用户登录
|
||||
def login(self, username, password):
|
||||
return self.findEntity(and_(EntityUser.user_name == username, EntityUser.user_pwd == Utils.MD5(password), EntityUser.is_enabled == 0))
|
||||
|
||||
def facelogin(self, id):
|
||||
return self.findEntity(EntityUser.user_id == id)
|
||||
|
||||
# 获取用户列表
|
||||
def getUserList(self):
|
||||
return self.findList(EntityUser.is_enabled == 0)
|
||||
|
||||
# 获取用户详情信息
|
||||
def getUserInfo(self, userId):
|
||||
return self.findEntity(userId)
|
||||
|
||||
# 设备配置类
|
||||
class BllDeviceConfig(OrmBase):
|
||||
|
||||
def __init__(self, entityType=DeviceConfig):
|
||||
super().__init__(entityType)
|
||||
|
||||
# 获取设置详情信息
|
||||
def getInfo(self):
|
||||
return self.findEntity()
|
||||
|
||||
|
||||
# 实验信息类
|
||||
class BllExperimentInfo(OrmBase):
|
||||
|
||||
def __init__(self, entityType=ExperimentInfo):
|
||||
super().__init__(entityType)
|
||||
|
||||
# 获取试验列表
|
||||
def getExperimentList(self, search_word):
|
||||
orm_query = self.findList(ExperimentInfo.is_enabled == 0)
|
||||
if search_word.name:
|
||||
orm_query = orm_query.filter(ExperimentInfo.specimen_name.like(f"%{search_word.name}%"))
|
||||
if search_word.date:
|
||||
orm_query = orm_query.filter(ExperimentInfo.created_time.contains(search_word.date))
|
||||
if search_word.experiment_id:
|
||||
orm_query = orm_query.filter(ExperimentInfo.id == search_word.experiment_id)
|
||||
# if search_word.state:
|
||||
# orm_query = orm_query.filter(ExperimentInfo.state == search_word.state)
|
||||
return orm_query.order_by(desc(ExperimentInfo.created_time))
|
||||
|
||||
# 实验报表类
|
||||
class BllExperimentReport(OrmBase):
|
||||
|
||||
def __init__(self, entityType=ExperimentReport):
|
||||
super().__init__(entityType)
|
||||
|
||||
|
||||
# 通道类
|
||||
class BllChannel(OrmBase):
|
||||
|
||||
def __init__(self, entityType=Channel):
|
||||
super().__init__(entityType)
|
||||
|
||||
|
||||
# 材料类
|
||||
class BllExperimentSpecimen(OrmBase):
|
||||
|
||||
def __init__(self, entityType=ExperimentSpecimen):
|
||||
super().__init__(entityType)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# 角色逻辑类
|
||||
class BllRole(OrmBase):
|
||||
|
||||
def __init__(self, entityType=EntityRole):
|
||||
super().__init__(entityType)
|
||||
|
||||
# 获取角色列表
|
||||
|
||||
def getRoleList(self):
|
||||
return self.findList(EntityRole.is_enabled == 0).all()
|
||||
#
|
||||
#
|
||||
# class BllSpecimen(OrmBase):
|
||||
# def __init__(self, entityType=EntitySpecimen):
|
||||
# super().__init__(entityType)
|
||||
#
|
||||
# def insertSpecimen(self, **kwargs):
|
||||
# entity = EntitySpecimen()
|
||||
# entity.specimen_id = kwargs["specimen_id"]
|
||||
# entity.user_id = kwargs["user_id"]
|
||||
# entity.user_name = kwargs["user_name"]
|
||||
#
|
||||
# entity.specimen_name = kwargs["specimen_name"]
|
||||
# entity.specimen_code = kwargs["specimen_code"]
|
||||
# entity.specimen_type = kwargs["specimen_type"]
|
||||
# entity.specimen_origin = kwargs["specimen_origin"]
|
||||
# entity.specimen_desc = kwargs["specimen_desc"]
|
||||
# entity.storage_location = kwargs["storage_location"]
|
||||
#
|
||||
# entity.remark = kwargs["remark"]
|
||||
# entity.rfid = kwargs["rfid"]
|
||||
# entity.created_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
# entity.update_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
#
|
||||
# entity.is_enabled = 0
|
||||
# self.insert(entity)
|
||||
#
|
||||
# def updateSpecimen(self, **kwargs):
|
||||
# entity = self.findEntity(EntitySpecimen.specimen_id == kwargs["specimen_id"])
|
||||
# if "rfid" in kwargs:
|
||||
# entity.rfid = kwargs.get("rfid")
|
||||
# entity.rfid_state = 1 if kwargs.get("rfid") else 2
|
||||
# if "inventory_status" in kwargs:
|
||||
# entity.inventory_status = kwargs.get("inventory_status")
|
||||
# if "disinfection_state" in kwargs:
|
||||
# entity.disinfection_state = kwargs.get("disinfection_state")
|
||||
#
|
||||
# entity.update_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
# self.update(entity)
|
||||
# return entity
|
||||
#
|
||||
# def get_specimen_list(self, search_word):
|
||||
# orm_query = self.findList(EntitySpecimen.is_enabled == 0)
|
||||
# if search_word.specimen_name:
|
||||
# orm_query = orm_query.filter(EntitySpecimen.specimen_name.like(f"%{search_word.specimen_name}%"))
|
||||
# if hasattr(search_word, 'specimen_id') and search_word.specimen_id:
|
||||
# orm_query = orm_query.filter(EntitySpecimen.specimen_id == search_word.specimen_id)
|
||||
# if hasattr(search_word, 'record_id') and search_word.record_id:
|
||||
# orm_query = orm_query.filter(EntitySpecimen.specimen_id == search_word.record_id)
|
||||
# if hasattr(search_word, 'date') and search_word.date:
|
||||
# orm_query = orm_query.filter(EntitySpecimen.created_time.contains(search_word.date))
|
||||
# return orm_query.order_by(desc(EntitySpecimen.update_time))
|
||||
#
|
||||
# def delSpecimen(self, specimen_id):
|
||||
# entity = self.findEntity(EntitySpecimen.specimen_id == specimen_id)
|
||||
# entity.is_enabled = 1
|
||||
# self.update(entity)
|
||||
#
|
||||
#
|
||||
# class BllWaitDisinfSpecimen(OrmBase):
|
||||
# def __init__(self, entityType=EntityWaitDisinfSpecimen):
|
||||
# super().__init__(entityType)
|
||||
#
|
||||
# def insert_wait_disinf_specimen(self, **kwargs):
|
||||
# entity = EntityWaitDisinfSpecimen()
|
||||
# entity.user_id = kwargs["user_id"]
|
||||
# entity.user_name = kwargs["user_name"]
|
||||
# entity.record_id = kwargs["record_id"]
|
||||
# entity.specimen_id = kwargs["specimen_id"]
|
||||
# entity.specimen_name = kwargs["specimen_name"]
|
||||
# entity.specimen_code = kwargs["specimen_code"]
|
||||
# entity.specimen_desc = kwargs["specimen_desc"]
|
||||
# entity.specimen_origin = kwargs["specimen_origin"]
|
||||
# entity.specimen_type = kwargs["specimen_type"]
|
||||
# entity.storage_location = kwargs["storage_location"]
|
||||
# entity.remark = kwargs["remark"]
|
||||
# entity.rfid = kwargs["rfid"]
|
||||
# entity.disinf_type = kwargs["disinf_type"]
|
||||
# entity.created_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
# entity.update_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
# entity.is_enabled = 0
|
||||
# self.insert(entity)
|
||||
#
|
||||
# def get_wait_disinf_specimen_list(self, search_word):
|
||||
# orm_query = self.findList(and_(EntityWaitDisinfSpecimen.is_enabled == 0,
|
||||
# EntityWaitDisinfSpecimen.done == 0))
|
||||
# if hasattr(search_word, 'user_id') and search_word.user_id:
|
||||
# orm_query = orm_query.filter(EntityWaitDisinfSpecimen.user_id == search_word.user_id)
|
||||
# return orm_query.order_by(desc(EntityWaitDisinfSpecimen.update_time))
|
||||
#
|
||||
#
|
||||
#
|
||||
# class BllExperimentConfig(OrmBase):
|
||||
#
|
||||
# def __init__(self, entityType=EntityExperimentConfig):
|
||||
# super().__init__(entityType)
|
||||
#
|
||||
# def insertConfig(self, **kwargs):
|
||||
# entity = EntityExperimentConfig()
|
||||
# entity.config_id = kwargs["config_id"]
|
||||
# entity.user_id = kwargs["user_id"]
|
||||
# entity.user_name = kwargs["user_name"]
|
||||
#
|
||||
# entity.ozone_disinf = kwargs["ozone_disinf"]
|
||||
# entity.uv_disinf = kwargs["uv_disinf"]
|
||||
# entity.ozone_conc = kwargs["ozone_conc"]
|
||||
# entity.disinf_time = kwargs["disinf_time"]
|
||||
# entity.temperature = kwargs["temperature"]
|
||||
# entity.humidity = kwargs["humidity"]
|
||||
#
|
||||
# entity.config_name = kwargs["config_name"]
|
||||
# entity.config_desc = kwargs["config_desc"]
|
||||
#
|
||||
# entity.created_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
# entity.update_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
# self.insert(entity)
|
||||
#
|
||||
# def get_config_list(self, search_word):
|
||||
# orm_query = self.findList(EntityExperimentConfig.is_enabled == 0)
|
||||
# if hasattr(search_word, 'user_id') and search_word.user_id:
|
||||
# orm_query = orm_query.filter(EntityExperimentConfig.user_id == search_word.user_id)
|
||||
# return orm_query.order_by(desc(EntityExperimentConfig.update_time))
|
||||
#
|
||||
#
|
||||
# class BllExperiment(OrmBase):
|
||||
# def __init__(self, entityType=EntityExperiment):
|
||||
# super().__init__(entityType)
|
||||
#
|
||||
# def insertExperiment(self, **kwargs):
|
||||
# specimen_ids = kwargs["specimens"]
|
||||
# specimens = BllSpecimen().findList(and_(EntitySpecimen.specimen_id.in_(specimen_ids), EntitySpecimen.is_enabled == 0)).all()
|
||||
#
|
||||
# entity = EntityExperiment()
|
||||
# entity.experiment_id = kwargs["experiment_id"]
|
||||
# entity.name = kwargs["name"]
|
||||
# entity.user_id = kwargs["user_id"]
|
||||
# entity.user_name = kwargs["user_name"]
|
||||
#
|
||||
# entity.ozone_disinf = kwargs["ozone_disinf"]
|
||||
# entity.uv_disinf = kwargs["uv_disinf"]
|
||||
# entity.ozone_conc = kwargs["ozone_conc"]
|
||||
# entity.disinf_time = kwargs["disinf_time"]
|
||||
# entity.temperature = kwargs["temperature"]
|
||||
# entity.humidity = kwargs["humidity"]
|
||||
#
|
||||
# entity.created_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
# entity.update_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
# entity.is_enabled = 0
|
||||
#
|
||||
# for specimen in specimens:
|
||||
# from sqlalchemy.orm import object_session
|
||||
# current_session = object_session(specimen)
|
||||
# if current_session is not None:
|
||||
# current_session.expunge(specimen)
|
||||
# entity.specimens.append(specimen)
|
||||
#
|
||||
# self.insert(entity)
|
||||
#
|
||||
# def updateExperiment(self, **kwargs):
|
||||
# entity = self.findEntity(kwargs["experiment_id"])
|
||||
# entity.update_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
#
|
||||
# self.update(entity)
|
||||
# return entity
|
||||
#
|
||||
# # 获取试验列表
|
||||
# def getExperimentList(self, search_word):
|
||||
# orm_query = self.findList(EntityExperiment.is_enabled == 0)
|
||||
# if search_word.name:
|
||||
# orm_query = orm_query.filter(EntityExperiment.name.like(f"%{search_word.name}%"))
|
||||
# if search_word.date:
|
||||
# orm_query = orm_query.filter(EntityExperiment.created_time.contains(search_word.date))
|
||||
# if search_word.experiment_id:
|
||||
# orm_query = orm_query.filter(EntityExperiment.experiment_id == search_word.experiment_id)
|
||||
# return orm_query.order_by(desc(EntityExperiment.update_time))
|
||||
#
|
||||
# # 删除单次试验
|
||||
# def delExperiment(self, experiment_id):
|
||||
# entity = self.findEntity(EntityExperiment.experiment_id == experiment_id)
|
||||
# entity.is_enabled = 1
|
||||
# self.update(entity)
|
||||
#
|
||||
# # 查询最后一次试验
|
||||
# def getLastExperiment(self):
|
||||
# orm_query = self.findList(EntityExperiment.is_enabled == 0)
|
||||
# return orm_query.order_by(desc(EntityExperiment.created_time)).first()
|
||||
#
|
||||
# # 试验记录逻辑类
|
||||
#
|
||||
#
|
||||
# class BllExperimentRecord(OrmBase):
|
||||
#
|
||||
# def __init__(self, entityType=EntityExperimentRecord):
|
||||
# super().__init__(entityType)
|
||||
#
|
||||
# # 新增试验记录信息
|
||||
#
|
||||
# def insertExperimentRecord(self, **kwargs):
|
||||
# entity = EntityExperimentRecord()
|
||||
# entity.record_id = kwargs["record_id"]
|
||||
# entity.experiment_id = kwargs["experiment_id"]
|
||||
# entity.user_id = kwargs["user_id"]
|
||||
# entity.user_name = kwargs["user_name"]
|
||||
#
|
||||
# entity.initial_press = kwargs["initial_press"]
|
||||
# entity.final_press = kwargs["final_press"]
|
||||
# entity.leakage_rate = kwargs["leakage_rate"]
|
||||
# entity.dijici = kwargs["dijici"]
|
||||
#
|
||||
# entity.is_enabled = 0
|
||||
# entity.created_time = kwargs['created_time'] if "created_time" in kwargs else datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
# entity.update_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
# self.insert(entity)
|
||||
#
|
||||
# # 更新试验记录信息
|
||||
# def updateExperimentRecord(self, **kwargs):
|
||||
# entity = self.findEntity(EntityExperimentRecord.record_id == kwargs["record_id"])
|
||||
# if entity:
|
||||
# entity.update_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
# self.update(entity)
|
||||
#
|
||||
# # 获取单条试验记录信息
|
||||
# def getExperimentRecord_by_record_id(self, record_id):
|
||||
# data = self.findEntity(EntityExperimentRecord.record_id == record_id)
|
||||
# return data
|
||||
#
|
||||
# # 获取单条试验记录信息
|
||||
# def getExperimentRecord_by_experiment_id(self, experiment_id):
|
||||
# data = self.findEntity(EntityExperimentRecord.experiment_id == experiment_id)
|
||||
# return data
|
||||
#
|
||||
# # 删除单条记录
|
||||
# def delExperimentRecord(self, record_id):
|
||||
# entity = self.findEntity(EntityExperimentRecord.record_id == record_id)
|
||||
# entity.is_enabled = 1
|
||||
# self.update(entity)
|
||||
#
|
||||
#
|
||||
# class BllUselog(OrmBase):
|
||||
# def __init__(self, entityType=EntityUseLog):
|
||||
# super().__init__(entityType)
|
||||
#
|
||||
# def insert_log(self, **kwargs):
|
||||
# entity = EntityUseLog()
|
||||
# entity.user_id = kwargs["user_id"]
|
||||
# entity.user_name = kwargs["user_name"]
|
||||
# entity.specimen_id = kwargs["specimen_id"]
|
||||
# entity.specimen_code = kwargs["specimen_code"]
|
||||
# entity.specimen_name = kwargs["specimen_name"]
|
||||
# entity.operation_type = kwargs["operation_type"]
|
||||
# entity.record_id = Utils.get_uuid()
|
||||
# entity.created_time = Utils.get_time()
|
||||
# entity.update_time = Utils.get_time()
|
||||
# self.insert(entity)
|
||||
#
|
||||
#
|
||||
# class BllTerminal(OrmBase):
|
||||
# def __init__(self, entityType=EntityTerminal):
|
||||
# super().__init__(entityType)
|
||||
#
|
||||
# def insert_terminal(self, **kwargs):
|
||||
# entity = EntityTerminal()
|
||||
# entity.name = kwargs["name"]
|
||||
# entity.title = kwargs["title"]
|
||||
# entity.login_count = kwargs["login_count"]
|
||||
# entity.index_of_user = kwargs["index_of_user"]
|
||||
# entity.id = Utils.get_uuid()
|
||||
# entity.created_time = Utils.get_time()
|
||||
# entity.update_time = Utils.get_time()
|
||||
# self.insert(entity)
|
||||
#
|
||||
# def update_terminal(self, **kwargs):
|
||||
# entity = self.findEntity(EntityTerminal.id == kwargs["id"])
|
||||
# entity.name = kwargs["name"]
|
||||
# entity.title = kwargs["title"]
|
||||
# entity.login_count = kwargs["login_count"]
|
||||
# entity.index_of_user = kwargs["index_of_user"]
|
||||
# entity.update_time = Utils.get_time()
|
||||
# self.update(entity)
|
||||
#
|
@ -0,0 +1,216 @@
|
||||
import traceback
|
||||
import paginate_sqlalchemy
|
||||
from sqlalchemy import create_engine, desc
|
||||
from app.conf.Setting import settings
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.sql import func
|
||||
from sqlalchemy.sql.elements import BinaryExpression, BooleanClauseList
|
||||
from app.lib.Log import logger
|
||||
|
||||
class OrmBase(object):
|
||||
# 初始化数据库连接
|
||||
engine = create_engine(settings.SQLALCHEMY_DATABASE_URI,connect_args={'check_same_thread': False}, pool_size=100)
|
||||
# 创建session工厂
|
||||
DBSession = sessionmaker(bind=engine, autoflush=False, autocommit=False, expire_on_commit=True)
|
||||
# 创建session对象
|
||||
session = DBSession()
|
||||
# 事务标识
|
||||
transFlag = False
|
||||
|
||||
def __init__(self, entityType):
|
||||
super().__init__()
|
||||
# 对象类型
|
||||
self.entityType = entityType
|
||||
|
||||
# 开始事务
|
||||
def beginTrans(self):
|
||||
self.session = self.DBSession()
|
||||
self.transFlag = True
|
||||
|
||||
# 提交事务
|
||||
def commitTrans(self):
|
||||
try:
|
||||
self.transFlag = False
|
||||
self.session.commit()
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
# 新增数据
|
||||
def insert(self, entity):
|
||||
try:
|
||||
if (not self.transFlag):
|
||||
self.session = self.DBSession()
|
||||
self.session.add(entity)
|
||||
if (not self.transFlag):
|
||||
self.session.commit()
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
# 新增多行数据
|
||||
def insert_many(self, entity_list):
|
||||
try:
|
||||
if (not self.transFlag):
|
||||
self.session = self.DBSession()
|
||||
self.session.bulk_save_objects(entity_list)
|
||||
if (not self.transFlag):
|
||||
self.session.commit()
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
# 更新数据
|
||||
def update(self, entity):
|
||||
try:
|
||||
if (not self.transFlag):
|
||||
self.session = self.DBSession()
|
||||
self.session.merge(entity)
|
||||
if (not self.transFlag):
|
||||
self.session.commit()
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
# 删除操作
|
||||
def delete(self, where):
|
||||
try:
|
||||
if (not self.transFlag):
|
||||
self.session = self.DBSession()
|
||||
self.session.query(self.entityType).filter(where).delete()
|
||||
if (not self.transFlag):
|
||||
self.session.commit()
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
# 查询单个实体
|
||||
def findEntity(self, *where):
|
||||
try:
|
||||
self.session = self.DBSession()
|
||||
if (type(*where) is BinaryExpression or type(*where) is BooleanClauseList):
|
||||
return self.session.query(self.entityType).filter(*where).first()
|
||||
else:
|
||||
return self.session.query(self.entityType).get(where)
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
def findLastEntity(self, order_by_field, *where):
|
||||
try:
|
||||
self.session = self.DBSession()
|
||||
if (type(*where) is BinaryExpression or type(*where) is BooleanClauseList):
|
||||
return self.session.query(self.entityType).filter(*where).order_by(desc(order_by_field)).first()
|
||||
else:
|
||||
return self.session.query(self.entityType).order_by(desc(order_by_field)).get(where)
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
# 查询实体列表
|
||||
def findList(self, *where):
|
||||
try:
|
||||
self.session = self.DBSession()
|
||||
return self.session.query(self.entityType).filter(*where)
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
# 查询所有实体列表
|
||||
def findAllList(self):
|
||||
try:
|
||||
self.session = self.DBSession()
|
||||
return self.session.query(self.entityType).all()
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
# 查询分页
|
||||
def queryPage(self, orm_query, pageParam):
|
||||
try:
|
||||
page = paginate_sqlalchemy.SqlalchemyOrmPage(
|
||||
orm_query, page=pageParam.curPage, items_per_page=pageParam.pageRows, db_session=self.DBSession)
|
||||
pageParam.totalRecords = page.item_count
|
||||
return page.items
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
raise e
|
||||
|
||||
# 查询数量
|
||||
def findCount(self, *where):
|
||||
try:
|
||||
self.session = self.DBSession()
|
||||
return self.session.query(func.count('*')).select_from(self.entityType).filter(*where).scalar()
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
# 查询最大数
|
||||
def findMax(self, prop, *where):
|
||||
try:
|
||||
self.session = self.DBSession()
|
||||
return self.session.query(func.max(prop)).select_from(self.entityType).filter(*where).scalar()
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
# 执行Sql语句
|
||||
def execute(self, sql, *agrs):
|
||||
try:
|
||||
self.session = self.DBSession()
|
||||
return self.session.execute(sql, *agrs)
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
||||
|
||||
# 执行Sql语句
|
||||
def executeNoParam(self, sql):
|
||||
try:
|
||||
self.session = self.DBSession()
|
||||
self.session.execute(sql)
|
||||
if (not self.transFlag):
|
||||
self.session.commit()
|
||||
except Exception as e:
|
||||
logger.error(traceback.format_exc())
|
||||
self.session.rollback()
|
||||
raise e
|
||||
finally:
|
||||
self.session.close()
|
@ -0,0 +1 @@
|
||||
from .DateEntity import EntityUser,EntityRole
|
@ -0,0 +1,123 @@
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
#用户注册,编辑
|
||||
class SignUpdateModel(BaseModel):
|
||||
username: str
|
||||
name: str
|
||||
role_id: str
|
||||
password: str
|
||||
sex: int
|
||||
|
||||
#用户登录
|
||||
class SignInModel(BaseModel):
|
||||
username: str
|
||||
password: str
|
||||
|
||||
#用户分页列表
|
||||
class UserModel(BaseModel):
|
||||
page_no: int = 1
|
||||
page_size: int = 5
|
||||
|
||||
#下位机发送指令
|
||||
class SendMesModel(BaseModel):
|
||||
name: str
|
||||
status:int = 0
|
||||
|
||||
#新增试验
|
||||
class InsertModel(BaseModel):
|
||||
items: dict
|
||||
|
||||
|
||||
class ContinueModel(BaseModel):
|
||||
id: str
|
||||
step: str
|
||||
|
||||
class UpdateModel(BaseModel):
|
||||
id: str
|
||||
items: dict
|
||||
|
||||
#停止试验
|
||||
class StopModel(BaseModel):
|
||||
id: str
|
||||
test_result: int = 0
|
||||
|
||||
|
||||
class SpecimenSearchModel(BaseModel):
|
||||
page_no: int = 1
|
||||
page_size: int = 5
|
||||
specimen_name: str = None
|
||||
specimen_code: str = None
|
||||
specimen_id: str = None
|
||||
rfid: str = None
|
||||
|
||||
|
||||
class WaitSpecimenSearchModel(BaseModel):
|
||||
page_no: int = 1
|
||||
page_size: int = 5
|
||||
record_id: str = None
|
||||
specimen_name: str = None
|
||||
specimen_code: str = None
|
||||
specimen_id: str = None
|
||||
rfid: str = None
|
||||
|
||||
|
||||
#报表查询
|
||||
class SearchWordModel(BaseModel):
|
||||
page_no: int = 1
|
||||
page_size: int = 5
|
||||
name: str = None
|
||||
experiment_id: str = None
|
||||
record_id: str = None
|
||||
date: str = None
|
||||
|
||||
class CombustionLimitModel(BaseModel):
|
||||
specimen_id: str
|
||||
ct_value: str
|
||||
combustion_type: str
|
||||
|
||||
|
||||
#报表导出
|
||||
class ExportTableModel(BaseModel):
|
||||
specimen_id: str
|
||||
download_type: str
|
||||
|
||||
|
||||
# 获取实验数据
|
||||
class DataModel(BaseModel):
|
||||
id: str
|
||||
|
||||
|
||||
class SpecimenModel(BaseModel):
|
||||
items: dict
|
||||
|
||||
|
||||
class SpecimenConfigModel(BaseModel):
|
||||
items: dict
|
||||
|
||||
|
||||
class InStorageModel(BaseModel):
|
||||
specimen_ids: list
|
||||
storage_type: int
|
||||
|
||||
|
||||
class DeviceConfigModel(BaseModel):
|
||||
light_status: int # 0-关闭 1-开启
|
||||
fan_status: int # 0-关闭 1-开启
|
||||
warning_light_status: int = 0# 0-关闭 1-开启
|
||||
lock_status: int # 0-关闭 1-开启
|
||||
|
||||
|
||||
class ExperimentParamModel(BaseModel):
|
||||
temperature: float # 设置温度
|
||||
expose_time: float # 暴露时间
|
||||
put_time: float # 放置时间
|
||||
short_circuit_param: float = 0.0 # 短路参数
|
||||
specimen_name: str # 样品名称
|
||||
battery_type: str # 电池型号
|
||||
specimen_num: str # 样品编号
|
||||
battery_specification: str # 电池规格
|
||||
battery_manufacturers: str # 电池厂家
|
||||
channel_ids: str # 通道ids 逗号分隔
|
||||
experiment_specimen_id: str = '' # 材料id
|
||||
channel_experiment_dict : dict = {} # 通道实验参数
|
@ -0,0 +1,50 @@
|
||||
import os
|
||||
|
||||
from app.api.ShortCircuit import app_start
|
||||
from app.conf.Setting import settings
|
||||
import uvicorn
|
||||
from fastapi import Request
|
||||
from app.api import create_app
|
||||
from app.lib.Utils import Utils
|
||||
from fastapi.encoders import jsonable_encoder
|
||||
from fastapi.exceptions import RequestValidationError
|
||||
from fastapi.responses import JSONResponse
|
||||
from app.models import DateEntity
|
||||
from app.models.Repository import OrmBase
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
app = create_app()
|
||||
DateEntity.Base.metadata.create_all(bind=OrmBase.engine)#创建表结构
|
||||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
# allow_origins=["*"], # 允许所有源,也可以指定具体源
|
||||
allow_origins=["http://127.0.0.1:8000"], # 前端的源地址
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"], # 允许所有方法
|
||||
allow_headers=["*"], # 允许所有头
|
||||
)
|
||||
|
||||
@app.exception_handler(RequestValidationError)
|
||||
async def validation_exception_handler(request: Request, exc: RequestValidationError):
|
||||
return JSONResponse(
|
||||
status_code=200,
|
||||
content=jsonable_encoder(Utils.false_return(desc='参数错误')),
|
||||
)
|
||||
|
||||
|
||||
@app.middleware("http")
|
||||
async def before_request(request, call_next):
|
||||
response = await call_next(request)
|
||||
return response
|
||||
|
||||
|
||||
# @app.on_event("startup")
|
||||
# async def startup():
|
||||
# # pass
|
||||
# await app_start()
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
uvicorn.run(app="main:app",host=settings.SERVER_HOST,port=settings.SERVER_POST,reload=settings.RELOAD)
|
@ -0,0 +1,32 @@
|
||||
aiomysql==0.2.0
|
||||
annotated-types==0.6.0
|
||||
anyio==4.3.0
|
||||
click==8.1.7
|
||||
colorama==0.4.6
|
||||
exceptiongroup==1.2.0
|
||||
fastapi==0.110.1
|
||||
greenlet==3.0.3
|
||||
h11==0.14.0
|
||||
idna==3.6
|
||||
logzero==1.7.0
|
||||
modbus-tk==1.1.3
|
||||
paginate==0.5.6
|
||||
paginate-sqlalchemy==0.3.1
|
||||
psutil==5.9.8
|
||||
pydantic==1.9.1
|
||||
pydantic_core==2.16.3
|
||||
PyMySQL==1.1.0
|
||||
pyserial==3.5
|
||||
sniffio==1.3.1
|
||||
SQLAlchemy==2.0.29
|
||||
starlette==0.37.2
|
||||
typing_extensions==4.11.0
|
||||
uvicorn==0.29.0
|
||||
websockets==12.0
|
||||
openpyxl==3.1.2
|
||||
matplotlib==3.7.5
|
||||
scipy==1.10.1
|
||||
opencv-python~=4.10.0.84
|
||||
numpy~=1.24.4
|
||||
pillow~=10.4.0
|
||||
APScheduler~=3.10.4
|
@ -0,0 +1,7 @@
|
||||
@echo off
|
||||
start /min cmd /k "conda activate py10 && D:&&cd DG16-D\&& python main.py"
|
||||
start "" "C:\Program Files\Google\Chrome\Application\chrome" --start-fullscreen http://127.0.0.1:8088"
|
||||
D:&&cd dist\ && python -m http.server 8088"
|
||||
|
||||
|
||||
exit
|
@ -0,0 +1,4 @@
|
||||
@echo off
|
||||
::start python D:\DG21-E\main.py
|
||||
start C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome --start-fullscreen http://127.0.0.1
|
||||
exit
|
Binary file not shown.
Loading…
Reference in new issue