TG-PlatformPlus/instructionModel/instructionManager.py

222 lines
7.3 KiB
Python

#!/opt/homebrew/bin/python3
# -*- coding:utf-8 -*-
import json
import uuid
from PyQt6 import *
from PyQt6.QtCore import *
from logs import log
from typing import Union
from models import Instruction, Session
class InstructionManager(QObject):
typeChange = pyqtSignal(QVariant)
attrChange = pyqtSignal(str)
updateData = pyqtSignal(str, str)
createData = pyqtSignal(str, str)
__supportedType = {
"general" : {
"name" : "通用指令",
"qmlPath" : "./General.qml",
"digestAttr" : "data"
},
"cosl" : {
"name" : "COSL_16位通用指令",
"qmlPath" : "./Cosl.qml",
"digestAttr" : "cmd"
},
"scpi" : {
"name" : "SCPI指令",
"qmlPath" : "./Scpi.qml",
"digestAttr" : "data"
},
"http" : {
"name" : "HTTP指令",
"qmlPath" : "./Http.qml",
"digestAttr" : "url"
}
# "scpi" : "SCPI指令",
# "modbus_rtu" : "MODBUS RTU",
# "modbus_ascii" : "MODBUS ASCII",
# "modbus_tcp" : "MODBUS TCP",
# "at" : "AT指令",
}
def __init__(self, parent=None):
super().__init__()
@pyqtSlot(str,str,str, QVariant, result=str)
def create(self, dev_model_id, name, type, attr):
if not isinstance(attr, dict):
attr = attr.toVariant()
if not attr.__contains__("remark"):
attr["remark"] = ""
digetsAttr = InstructionManager.__supportedType[type]["digestAttr"]
if not attr.__contains__(digetsAttr):
attr[digetsAttr] = ""
data = {
"id": str(uuid.uuid4()),
"dev_model_id": dev_model_id,
"name": name,
"type": type,
"attr": json.dumps(attr)
}
ok, res = Session.addByClass(Instruction, data)
if ok:
return str(res["id"])
return ""
@pyqtSlot(QVariant, result=str)
def create_from_json(self, params):
if not isinstance(params, dict):
params = params.toVariant()
data = {
"id": params["id"],
"dev_model_id": params["dev_model_id"],
"name": params["name"],
"type": params["type"],
"attr": json.dumps(params["attr"])
}
ok, res = Session.addByClass(Instruction, data)
if ok:
return str(res["id"])
return ""
@pyqtSlot(QVariant, result=str)
def create_from_git_json(self, params):
if not isinstance(params, dict):
params = params.toVariant()
data = {
"id": params["id"],
"dev_model_id": params["dev_model_id"],
"name": params["name"],
"type": params["type"],
"attr": json.dumps(params["attr"])
}
ok, res = Session.addByClassFromGit(Instruction, data)
if ok:
return str(res["id"])
return ""
@pyqtSlot(str, result=str)
def createCopy(self, id):
ok,res = Session.queryById(Instruction, id)
if ok:
res["name"] = res["name"] + "_副本"
res["attr"] = json.loads(res["attr"])
dev_model_id = res["dev_model_id"]
return self.create(dev_model_id, res["name"], res["type"], res["attr"])
@pyqtSlot(str,str, result=str)
def createCrossCopy(self, id, dev_model_id = ''):
ok,res = Session.queryById(Instruction, id)
if ok:
res["name"] = res["name"] + "_副本"
res["attr"] = json.loads(res["attr"])
if dev_model_id == '':
dev_model_id = res["dev_model_id"]
return self.create(dev_model_id, res["name"], res["type"], res["attr"])
@pyqtSlot(str, result=str)
def copy(self, id, copy_dev_model_id):
ok,res = Session.queryById(Instruction, id)
if ok:
res["dev_model_id"] = copy_dev_model_id
res["attr"] = json.loads(res["attr"])
return self.create(res["dev_model_id"], res["name"], res["type"], res["attr"])
@pyqtSlot(str, result=bool)
def copyDevModel(self, dev_model_id, new_dev_model_id):
instructionLst = self.getDevmodelInstructions(dev_model_id)
for instruction in instructionLst:
self.copy(instruction["id"], new_dev_model_id)
return True
@pyqtSlot(str, QVariant, result=bool)
def update(self, id, param = None):
if not isinstance(param, dict):
param = param.toVariant()
data = {}
if "name" in param:
data["name"] = param["name"]
if "attr" in param:
data["attr"] = json.dumps(param["attr"])
ok,res = Session.updateById(Instruction, id, data)
return ok
@pyqtSlot(str, result=bool)
@pyqtSlot(list, result=bool)
def delete(self, id):
if isinstance(id, str):
ok,res = Session.deleteById(Instruction, id)
return ok
else:
ok,res = Session.deleteByIds(Instruction, id)
return ok
@pyqtSlot(str, result=QVariant)
@pyqtSlot(list, result=list)
def getInfo(self, id: Union[str, list]):
if isinstance(id, list) :
ok,res = Session.queryByIds(Instruction, id)
if ok:
for data in res:
if "attr" in data:
data["attr_str"] = data["attr"] or ""
data["attr"] = data["attr"] and json.loads(data["attr"]) or {}
return res
else:
return []
else:
if id == "all":
ok,res = Session.queryByAll(Instruction)
if ok:
for data in res:
if "attr" in data:
data["attr"] = data["attr"] and json.loads(data["attr"]) or {}
return res
else:
ok,res = Session.queryById(Instruction, id)
if ok:
if "attr" in res:
res["attr_str"] = res["attr"] or ""
res["attr"] = res["attr"] and json.loads(res["attr"]) or {}
return res
else:
return None
# 获取所有属于设备模型的指令
@pyqtSlot(str, result=QVariant)
def getDevmodelInstructions(self, dev_model_id):
ok, res = Session.queryByDevModelId(Instruction, dev_model_id)
if ok:
for data in res:
if "attr" in data:
data["attr_str"] = data["attr"] or ""
data["attr"] = data["attr"] and json.loads(data["attr"]) or {}
return res
else:
return []
# 获取所有属于设备模型的指令
@pyqtSlot(str, result=QVariant)
def getOriginalDevmodelInstructions(self, dev_model_id):
ok, res = Session.queryByDevModelId(Instruction, dev_model_id)
if ok:
for data in res:
if "attr" in data:
data["attr"] = data["attr"] and json.loads(data["attr"]) or {}
return res
else:
return []
@pyqtSlot(result=QVariant)
def getSupportedType(self):
return InstructionManager.__supportedType
instructionManager = InstructionManager()