|
@@ -19,7 +19,7 @@ from io import BytesIO
|
|
|
from sqlalchemy import and_, asc, desc
|
|
from sqlalchemy import and_, asc, desc
|
|
|
from functools import partial
|
|
from functools import partial
|
|
|
from service.deal_image import DealImage
|
|
from service.deal_image import DealImage
|
|
|
-from databases import DeviceConfig, SysConfigs, SqlQuery, CRUD, select, DeviceConfigTabs, CategoryLinks
|
|
|
|
|
|
|
+from databases import DeviceConfig, SysConfigs, SqlQuery, CRUD, select, DeviceConfigTabs
|
|
|
from service.run_main import RunMain
|
|
from service.run_main import RunMain
|
|
|
import importlib
|
|
import importlib
|
|
|
from service.auto_deal_pics.upload_pic import UploadPic
|
|
from service.auto_deal_pics.upload_pic import UploadPic
|
|
@@ -1058,19 +1058,49 @@ def update_tab_name(params: DeviceConfigTabsReq):
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+CATEGORY_LINKS_KEY = "category_links"
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _get_category_links_list(session):
|
|
|
|
|
+ """从sys_configs读取category_links配置,返回数组;配置不存在或解析失败返回空数组"""
|
|
|
|
|
+ sysConfig = CRUD(SysConfigs)
|
|
|
|
|
+ item = sysConfig.read(session, conditions={"key": CATEGORY_LINKS_KEY})
|
|
|
|
|
+ if item == None:
|
|
|
|
|
+ return []
|
|
|
|
|
+ try:
|
|
|
|
|
+ links = json.loads(item.value)
|
|
|
|
|
+ return links if isinstance(links, list) else []
|
|
|
|
|
+ except (json.JSONDecodeError, TypeError):
|
|
|
|
|
+ return []
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _save_category_links_list(session, links):
|
|
|
|
|
+ """将category_links数组写回sys_configs,value为json字符串,格式:[{"category_name":"","tab_name":"","tab_id":123}]"""
|
|
|
|
|
+ value = json.dumps(links, ensure_ascii=False)
|
|
|
|
|
+ sysConfig = CRUD(SysConfigs)
|
|
|
|
|
+ item = sysConfig.read(session, conditions={"key": CATEGORY_LINKS_KEY})
|
|
|
|
|
+ if item == None:
|
|
|
|
|
+ # 配置项不存在则新增一条
|
|
|
|
|
+ config = SysConfigs(key=CATEGORY_LINKS_KEY, value=value)
|
|
|
|
|
+ session.add(config)
|
|
|
|
|
+ session.commit()
|
|
|
|
|
+ else:
|
|
|
|
|
+ sysConfig.updateConditions(session, conditions={"key": CATEGORY_LINKS_KEY}, value=value)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
@app.get("/get_category_links", description="获取分类关联列表")
|
|
@app.get("/get_category_links", description="获取分类关联列表")
|
|
|
def get_category_links():
|
|
def get_category_links():
|
|
|
- """查询所有分类与Tab配置的关联记录(category_links表)"""
|
|
|
|
|
|
|
+ """查询所有分类与Tab配置的关联(存储于sys_configs,key=category_links)"""
|
|
|
session = SqlQuery()
|
|
session = SqlQuery()
|
|
|
- linkModel = CRUD(CategoryLinks)
|
|
|
|
|
- links = linkModel.read_all(session, order_by="id", ascending=True)
|
|
|
|
|
|
|
+ links = _get_category_links_list(session)
|
|
|
session.close()
|
|
session.close()
|
|
|
return {"code": 0, "msg": "", "data": {"list": links}}
|
|
return {"code": 0, "msg": "", "data": {"list": links}}
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.post("/save_category_link", description="新增或修改分类关联")
|
|
@app.post("/save_category_link", description="新增或修改分类关联")
|
|
|
def save_category_link(params: CategoryLinksReq):
|
|
def save_category_link(params: CategoryLinksReq):
|
|
|
- """新增或修改分类与Tab配置的关联,校验tab_id在device_config_tabs表中是否存在"""
|
|
|
|
|
|
|
+ """新增或修改分类与Tab配置的关联;tab_id已被其他分类关联时报错;保存后同步线上配置"""
|
|
|
|
|
+ settings.USER_TOKEN = params.token
|
|
|
category_name = (params.category_name or "").strip()
|
|
category_name = (params.category_name or "").strip()
|
|
|
if category_name == "":
|
|
if category_name == "":
|
|
|
return {"code": 1, "msg": "分类名称不能为空", "data": None}
|
|
return {"code": 1, "msg": "分类名称不能为空", "data": None}
|
|
@@ -1081,39 +1111,52 @@ def save_category_link(params: CategoryLinksReq):
|
|
|
if tab == None:
|
|
if tab == None:
|
|
|
session.close()
|
|
session.close()
|
|
|
return {"code": 1, "msg": "关联的Tab配置不存在,请检查tab_id", "data": None}
|
|
return {"code": 1, "msg": "关联的Tab配置不存在,请检查tab_id", "data": None}
|
|
|
- linkModel = CRUD(CategoryLinks)
|
|
|
|
|
- # 同步Tab最新名称,保证tab_name与device_config_tabs表中的mode_name一致
|
|
|
|
|
- kwargs = {"category_name": category_name, "tab_id": tab.id, "tab_name": tab.mode_name}
|
|
|
|
|
- if params.id == None or params.id == 0:
|
|
|
|
|
- # 走新增逻辑,分类名称不允许重复
|
|
|
|
|
- exist = linkModel.read(session, conditions={"category_name": category_name})
|
|
|
|
|
- if exist != None:
|
|
|
|
|
|
|
+ links = _get_category_links_list(session)
|
|
|
|
|
+ # 定位当前编辑项:按分类名称匹配(分类名称唯一),匹配到走修改,否则走新增
|
|
|
|
|
+ edit_index = -1
|
|
|
|
|
+ for idx, link in enumerate(links):
|
|
|
|
|
+ if link.get("category_name") == category_name:
|
|
|
|
|
+ edit_index = idx
|
|
|
|
|
+ break
|
|
|
|
|
+ # 校验tab_id是否已被其他分类关联,已关联则报错提示
|
|
|
|
|
+ for idx, link in enumerate(links):
|
|
|
|
|
+ if link.get("tab_id") == params.tab_id and idx != edit_index:
|
|
|
session.close()
|
|
session.close()
|
|
|
- return {"code": 1, "msg": "该分类名称已存在,请勿重复添加", "data": None}
|
|
|
|
|
- save_link = linkModel.create(session, obj_in=kwargs)
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ "code": 1,
|
|
|
|
|
+ "msg": f"该Tab已被分类【{link.get('category_name')}】关联,请勿重复关联",
|
|
|
|
|
+ "data": None,
|
|
|
|
|
+ }
|
|
|
|
|
+ # 同步Tab最新名称,保证tab_name与device_config_tabs表中的mode_name一致
|
|
|
|
|
+ new_link = {"category_name": category_name, "tab_name": tab.mode_name, "tab_id": tab.id}
|
|
|
|
|
+ if edit_index >= 0:
|
|
|
|
|
+ # 走修改逻辑,覆盖同名分类的关联配置
|
|
|
|
|
+ links[edit_index] = new_link
|
|
|
else:
|
|
else:
|
|
|
- # 走编辑逻辑,先校验记录是否存在
|
|
|
|
|
- model = linkModel.read(session, conditions={"id": params.id})
|
|
|
|
|
- if model == None:
|
|
|
|
|
- session.close()
|
|
|
|
|
- return {"code": 1, "msg": "数据不存在", "data": None}
|
|
|
|
|
- save_link = linkModel.update(session, obj_id=params.id, **kwargs)
|
|
|
|
|
|
|
+ # 走新增逻辑,追加到数组末尾
|
|
|
|
|
+ links.append(new_link)
|
|
|
|
|
+ _save_category_links_list(session, links)
|
|
|
session.close()
|
|
session.close()
|
|
|
- return {"code": 0, "msg": "操作成功", "data": save_link}
|
|
|
|
|
|
|
+ # 与其他sys_configs一致,修改后需要同步到线上
|
|
|
|
|
+ settings.sync_sys_configs2Online()
|
|
|
|
|
+ return {"code": 0, "msg": "操作成功", "data": {"list": links}}
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.post("/delete_category_link", description="删除分类关联")
|
|
@app.post("/delete_category_link", description="删除分类关联")
|
|
|
-def delete_category_link(params: ModelGetDeviceConfigDetail):
|
|
|
|
|
- """根据id删除一条分类与Tab配置的关联记录"""
|
|
|
|
|
|
|
+def delete_category_link(params: CategoryLinksDelete):
|
|
|
|
|
+ """根据数组下标删除一条分类关联,删除后同步线上配置"""
|
|
|
|
|
+ settings.USER_TOKEN = params.token
|
|
|
session = SqlQuery()
|
|
session = SqlQuery()
|
|
|
- linkModel = CRUD(CategoryLinks)
|
|
|
|
|
- model = linkModel.read(session, conditions={"id": params.id})
|
|
|
|
|
- if model == None:
|
|
|
|
|
|
|
+ links = _get_category_links_list(session)
|
|
|
|
|
+ if params.index < 0 or params.index >= len(links):
|
|
|
session.close()
|
|
session.close()
|
|
|
return {"code": 1, "msg": "数据不存在", "data": None}
|
|
return {"code": 1, "msg": "数据不存在", "data": None}
|
|
|
- linkModel.delete(session, obj_id=params.id)
|
|
|
|
|
|
|
+ links.pop(params.index)
|
|
|
|
|
+ _save_category_links_list(session, links)
|
|
|
session.close()
|
|
session.close()
|
|
|
- return {"code": 0, "msg": "删除成功", "data": None}
|
|
|
|
|
|
|
+ # 与其他sys_configs一致,删除后需要同步到线上
|
|
|
|
|
+ settings.sync_sys_configs2Online()
|
|
|
|
|
+ return {"code": 0, "msg": "删除成功", "data": {"list": links}}
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.post("/get_device_configs", description="获取可执行程序命令列表")
|
|
@app.post("/get_device_configs", description="获取可执行程序命令列表")
|