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.

173 lines
6.8 KiB

10 months ago
import os
import shutil
10 months ago
from quart import jsonify, request,session,flash,redirect
from . import api
from web.common.utils import login_required
from core.DBManager import mDBM
from core.ModelManager import mMM
from core.Upload_file import allowed_file,check_file
10 months ago
from myutils.ConfigManager import myCongif
from werkzeug.utils import secure_filename
10 months ago
@api.route('/model/list',methods=['GET'])
@login_required
async def model_list(): #获取算法列表
strsql = "select ID,model_name,version,duration_time,proportion from model;"
datas = mDBM.do_select(strsql)
reMsg = [{"ID":data[0],"name":data[1],"version":data[2],"duration_time":data[3],
"proportion":data[4]} for data in datas]
return jsonify(reMsg)
def restart_work(mid):
strsql = f"select channel_id from channel2model where model_id = {mid};"
datas = mDBM.do_select(strsql)
if datas: # 有关联
print("有关联")
# 重启通道业务
for data in datas:
mMM.restartC2M(data[0]) # 根该模型关联的所有通道都需要重启工作线程
@api.route('/model/add',methods=['POST'])
10 months ago
@login_required
async def model_add(): #新增算法
reStatus = 0
reMsg = "有错误!"
form = await request.form
model_name = form['mName']
files = await request.files
if 'file' not in files:
reMsg = '参数错误'
return jsonify({'status': reStatus, 'msg': reMsg})
file = files['file']
if file.filename == '':
reMsg = '没有选择文件'
return jsonify({'status': reStatus, 'msg': reMsg})
#判断算法名称是否重复
strsql = f"select ID from model where model_name='{model_name}';"
data = mDBM.do_select(strsql, 1)
if data:
reMsg = "算法名称重复,请修改!"
else:
if file and allowed_file(file.filename):
filename = secure_filename(file.filename) #安全过滤
file_path = os.path.join(myCongif.get_data('UPLOAD_FOLDER'), filename)
await file.save(file_path)
#检查上传文件的合法性,若符合要求移动到正式路径
filename_pre = filename.rsplit('.',1)[0] #除去到.zip
model_version, model_name_file, model_path = check_file(file_path,filename_pre,2) #itype--2 是算法模型升级 1-系统升级
#删除压缩包
os.remove(file_path)
if model_version and model_path:
#model表插入数据
strsql = (f"insert into model (model_name,version,model_path) values "
f"('{model_name}','{model_version}','{model_path}');")
ret = mDBM.do_sql(strsql)
if ret:
reStatus = 1
reMsg = '算法添加成功'
else:
reMsg = '插入数据库出错,请联系技术支持!!'
else:
reMsg = '升级包不合法,请重新上传!'
else:
reMsg = '只允许上传zip文件'
#新增算法,不需要处理通道关联的相关业务
return jsonify({'status': reStatus, 'msg': reMsg})
@api.route('/model/upgrade',methods=['POST'])
@login_required
async def model_upgrade(): #升级算法
reStatus = 0
reMsg = "有错误!"
10 months ago
form = await request.form
mid = form['mid']
10 months ago
files = await request.files
if 'file' not in files:
reMsg = '参数错误'
return jsonify({'status': reStatus, 'msg': reMsg})
10 months ago
file = files['file']
if file.filename == '':
reMsg = '没有选择文件'
return jsonify({'status': reStatus, 'msg': reMsg})
10 months ago
if file and allowed_file(file.filename):
filename = secure_filename(file.filename) # 安全过滤
10 months ago
file_path = os.path.join(myCongif.get_data('UPLOAD_FOLDER'), filename)
await file.save(file_path)
# 检查上传文件的合法性,若符合要求移动到正式路径
filename_pre = filename.rsplit('.', 1)[0] # 除去到.zip
model_version, model_name_file, model_path = check_file(file_path, filename_pre, 2) # itype--2 是算法模型升级 1-系统升级
# 删除压缩包
os.remove(file_path)
if model_version and model_path:
strsql = (f"update model set version='{model_version}',model_path='{model_path}' "
f"where ID={mid};")
10 months ago
ret = mDBM.do_sql(strsql)
if ret:
reStatus = 1
reMsg = '升級算法成功'
#重启业务数据
restart_work(mid)
10 months ago
else:
reMsg = '修改数据库出错,请联系技术支持!!'
10 months ago
else:
reMsg = '升级包不合法,请重新上传!'
10 months ago
else:
reMsg = '只允许上传zip文件'
10 months ago
return jsonify({'status': reStatus, 'msg': reMsg})
@api.route('/model/del',methods=['POST'])
10 months ago
@login_required
async def model_del():
json_data = await request.get_json()
mid = json_data.get('mid')
#删除与该算法关联的通道相关数据
strsql = f"select channel_id from channel2model where model_id = {mid};"
datas = mDBM.do_select(strsql)
if datas: #有关联
#删与通道的关联信息 --c2m,schedule
mDBM.delC2M(mid,2)
#重启通道业务
for data in datas:
mMM.restartC2M(data[0]) #根该模型关联的所有通道都需要重启工作线程
10 months ago
#删除算法文件
strsql = f"select model_path from model where ID = {mid};"
10 months ago
data = mDBM.do_select(strsql,1)
if data:
py_path = data[0]
dir_path = py_path.rsplit('/',1)[0] #正常最后一层应该都是/--手动加的
print(dir_path)
shutil.rmtree(dir_path)
# 删该算法记录
strsql = f"delete from model where ID = {mid};"
mDBM.do_sql(strsql)
#正常来说删除一般不会失败
return jsonify({'status': 1, 'msg': "删除成功"})
10 months ago
@api.route('/model/changecnf',methods=['POST'])
@login_required
async def model_config_change(): #修改算法的配置信息
json_data = await request.get_json()
mid = json_data.get('mid')
reStatus = 0
try:
duration_time = int(json_data.get('duration_time'))
proportion = float(json_data.get('proportion'))
if proportion > 0 and proportion < 1:
strsql = f"update model set duration_time='{duration_time}',proportion='{proportion}' where ID={mid};"
ret = mDBM.do_sql(strsql)
if ret:
reStatus = 1
reMsg = "修改算法配置成功"
#重启-工作线程
restart_work(mid)
else:
reMsg = "修改算法配置失败"
10 months ago
else:
reMsg = "占比阈值需要为大于0,小于1的值"
except ValueError:
reMsg = "数据类型不对!"
10 months ago
return jsonify({'status': reStatus, 'msg': reMsg})