222 lines
7.3 KiB
Python
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()
|
|
|
|
|