Browse Source

tmp commit

try_support_dt100n
zhaohe 4 weeks ago
parent
commit
0344d5b4e6
  1. 97
      appsrc/baseservice/front_msg_processer/front_msg_processer.cpp
  2. 26
      appsrc/baseservice/front_msg_processer/front_msg_processer.hpp
  3. 2
      appsrc/service/app/disinfection_ctrl_service_ext.cpp
  4. 4
      appsrc/service/app/pipeline_pressure_control.cpp
  5. 3
      appsrc/service/app/pipeline_pressure_control.hpp
  6. 10
      appsrc/service/app_core.cpp
  7. 1
      appsrc/service/audit_mgr_service.cpp
  8. 1
      appsrc/service/calibration/h2o2_liquid_weight_sensor_calibration_service.cpp
  9. 3
      appsrc/service/debug_page_test_service.cpp
  10. 1
      appsrc/service/device_info_mgr_service.cpp
  11. 3
      appsrc/service/disinfection_logs_service.cpp
  12. 1
      appsrc/service/equipment_usage_info_mgr_service.cpp
  13. 154
      appsrc/service/front_end_realtime_display_content_mgr.cpp
  14. 30
      appsrc/service/front_end_realtime_display_content_mgr.hpp
  15. 1
      appsrc/service/h2o2_sensor_mgr.cpp
  16. 3
      appsrc/service/hardware/device_io_ctrl_service.cpp
  17. 5
      appsrc/service/os_mgr_service.cpp
  18. 64
      appsrc/service/setting/ext_setting_mgr_service.cpp
  19. 4
      appsrc/service/setting/ext_setting_mgr_service.hpp
  20. 1
      appsrc/service/setting_mgr_service.cpp
  21. 40
      appsrc/service/test_page_ctrl_service.cpp
  22. 11
      appsrc/service/user_mgr_service.cpp
  23. 98
      html/debug/index.html

97
appsrc/baseservice/front_msg_processer/front_msg_processer.cpp

@ -40,15 +40,9 @@ json FrontMsgProcesser::geFnList() {
// fnlist
json fn;
for (auto& var : m_msgProcesserList) {
fn["className"] = var->className;
fn["fnName"] = var->fnName;
fn["params"] = var->params;
fn["retTypeInfo"] = var->retTypeInfo;
fn["paramsTypeInfo"] = var->paramsTypeInfo;
fnlist.push_back(fn);
fnlist.push_back(msgProcesserToJson(var));
}
rely["fnlist"] = fnlist;
// typeInfoList
json typeInfoList;
for (auto& var : typeInfoMap) {
@ -58,11 +52,72 @@ json FrontMsgProcesser::geFnList() {
typeInfo["enumValues"] = var.second.enumValues;
typeInfoList.push_back(typeInfo);
}
rely["typeInfoList"] = typeInfoList;
rely["fnlist"] = fnlist;
return rely;
}
json FrontMsgProcesser::geTypeInfoList() {
json rely;
json typeInfoList;
for (auto& var : typeInfoMap) {
json typeInfo;
typeInfo["typeName"] = var.second.typeName;
typeInfo["isEnum"] = !var.second.enumValues.empty();
typeInfo["enumValues"] = var.second.enumValues;
typeInfoList.push_back(typeInfo);
}
rely["typeInfoList"] = typeInfoList;
return rely;
}
json FrontMsgProcesser::geMenuList() {
json rely;
// for (auto& var : m_fnMenuMap) {
// json menu;
// menu["className"] = var.second.className;
// menu["classDispName"] = var.second.classDispName;
// rely.push_back(menu);
// }
for (auto& var : m_fnMenu) {
json menu;
menu["className"] = var.className;
menu["classDispName"] = var.classDispName;
rely.push_back(menu);
}
return rely;
}
json FrontMsgProcesser::msgProcesserToJson(shared_ptr<MsgProcesser> processer) {
json j;
j["className"] = processer->className;
j["fnName"] = processer->fnName;
j["params"] = processer->params;
j["retTypeInfo"] = processer->retTypeInfo;
j["paramsTypeInfo"] = processer->paramsTypeInfo;
if (processer->fnDispName.empty()) {
j["fnDispName"] = processer->fnName; // 如果没有显示名称,则使用函数名称
} else {
j["fnDispName"] = processer->fnDispName;
}
if (processer->paramDispNames.empty()) {
j["paramDispNames"] = processer->params; // 如果没有显示名称,则使用参数名称
} else {
j["paramDispNames"] = processer->paramDispNames;
}
return j;
}
json FrontMsgProcesser::geFnListByClass(string className) {
json fnlist;
for (auto& var : m_msgProcesserList) {
if (var->className == className) {
fnlist.push_back(msgProcesserToJson(var));
}
}
return fnlist;
}
void FrontMsgProcesser::processMsg(shared_ptr<MsgProcessContext> cxt) {
logger->debug("processMsg");
@ -82,6 +137,32 @@ void FrontMsgProcesser::processMsg(shared_ptr<MsgProcessContext> cxt) {
cxt->receipt["fromClass"] = "FNScheduler";
cxt->receipt["fromFn"] = "geFnList";
return;
} else if (fn == "FNScheduler.geMenuList") {
cxt->receipt["ackcode"] = 0;
cxt->receipt["rely"] = geMenuList();
cxt->receipt["fromClass"] = "FNScheduler";
cxt->receipt["fromFn"] = "geMenuList";
return;
} else if (fn == "FNScheduler.geTypeInfoList") {
cxt->receipt["ackcode"] = 0;
cxt->receipt["rely"] = geTypeInfoList();
cxt->receipt["fromClass"] = "FNScheduler";
cxt->receipt["fromFn"] = "geTypeInfoList";
return;
} else if (fn == "FNScheduler.geFnListByClass") {
if (cxt->params.find("className") == cxt->params.end()) {
cxt->receipt["fromClass"] = "FNScheduler";
cxt->receipt["fromFn"] = "geFnListByClass";
cxt->receipt["ackcode"] = 0;
cxt->receipt["rely"] = json::array();
return;
}
string className = cxt->params["className"];
cxt->receipt["ackcode"] = 0;
cxt->receipt["rely"] = geFnListByClass(className);
cxt->receipt["fromClass"] = "FNScheduler";
cxt->receipt["fromFn"] = "geFnListByClass";
return;
}
if (m_msgProcesserMap.find(key) != m_msgProcesserMap.end()) {

26
appsrc/baseservice/front_msg_processer/front_msg_processer.hpp

@ -62,13 +62,21 @@ class MsgProcesser {
string fnDispName;
};
class FnMenu {
public:
string className;
string classDispName;
};
class FrontMsgProcesser {
THISCLASS(FrontMsgProcesser);
public:
private:
map<string, shared_ptr<MsgProcesser>> m_msgProcesserMap;
list<shared_ptr<MsgProcesser>> m_msgProcesserList;
list<shared_ptr<MsgProcesser>> m_msgProcesserList;
list<FnMenu> m_fnMenu;
map<type_index, TypeInfo> typeInfoMap;
FrontMsgProcesser() {};
@ -88,6 +96,17 @@ class FrontMsgProcesser {
void processMsg(shared_ptr<MsgProcessContext> cxt);
json geFnList();
json geMenuList();
json geTypeInfoList();
json geFnListByClass(string className);
json msgProcesserToJson(shared_ptr<MsgProcesser> processer);
void addMenu(const string& className, const string& classDispName) {
FnMenu menu;
menu.className = className;
menu.classDispName = classDispName;
m_fnMenu.push_back(menu);
}
public:
template <typename T>
@ -214,3 +233,8 @@ static inline T jsonGet(json j) {
{ \
FrontMsgProcesser::ins().setProcesserName(thisClass.className, #fn, dispName, {}); \
}
#define REG_CLASS(classDispName) \
{ \
FrontMsgProcesser::ins().addMenu(thisClass.className, classDispName); \
}

2
appsrc/service/app/disinfection_ctrl_service_ext.cpp

@ -40,6 +40,8 @@ void DisinfectionCtrlServiceExt::initialize() {
GET_TO_SERVICE(ds);
GET_TO_SERVICE(dcs);
REG_CLASS("消毒控制")
REG_EXTFN(start, void(string), loglevel);
REG_EXTFN(startWithFormula, void(string), formulaid);
REG_EXTFN_VOID(stop, void());

4
appsrc/service/app/pipeline_pressure_control.cpp

@ -90,6 +90,10 @@ void PipelinePressureControl::setIntensity(shared_ptr<MsgProcessContext> cxt, in
m_intensity = intensity;
syncPressureValueState();
}
void PipelinePressureControl::pressurePropCtrl(shared_ptr<MsgProcessContext> cxt, PressureType type, int intensity){
}
void PipelinePressureControl::getState(shared_ptr<MsgProcessContext> cxt) { cxt->rely = getState(); }
json PipelinePressureControl::getState() {
json state;

3
appsrc/service/app/pipeline_pressure_control.hpp

@ -68,6 +68,9 @@ class PipelinePressureControl : public enable_shared_from_this<PipelinePressureC
private:
void setType(shared_ptr<MsgProcessContext> cxt, PressureType type);
void setIntensity(shared_ptr<MsgProcessContext> cxt, int intensity);
void pressurePropCtrl(shared_ptr<MsgProcessContext> cxt, PressureType type, int intensity);
void getState(shared_ptr<MsgProcessContext> cxt);
void getConfig(shared_ptr<MsgProcessContext> cxt);

10
appsrc/service/app_core.cpp

@ -110,6 +110,7 @@ static void installEcodeInfo() {
}
void AppCore::initialize() {
REG_CLASS("AppCore");
REG_ENUM_TYPE(SettingId, SettingId::getEnumStrList());
REG_ENUM_TYPE(AirLeakTestMode, AirLeakTestMode::getEnumStrList());
REG_ENUM_TYPE(UsrRoleType, UsrRoleType::getEnumStrList());
@ -157,7 +158,6 @@ void AppCore::initialize() {
//
BUILD_AND_REG_SERRVICE(AuditMgrService);
BUILD_AND_REG_SERRVICE(DisinfectionLogsService);
BUILD_AND_REG_SERRVICE(FrontEndRealtimeDisplayContentMgr); // 前端实时信息显示服务
// Device
BUILD_AND_REG_SERRVICE(UartPrinter);
@ -174,13 +174,13 @@ void AppCore::initialize() {
BUILD_AND_REG_SERRVICE(DisinfectionCtrlService);
BUILD_AND_REG_SERRVICE(DisinfectionCtrlServiceExt);
BUILD_AND_REG_SERRVICE(DrainLiquidService);
BUILD_AND_REG_SERRVICE(DebugPageTestService);
BUILD_AND_REG_SERRVICE(H2O2LiquidWeightSensorCalibrationService); // H2O2液体重量传感器校准
BUILD_AND_REG_SERRVICE(ExtSettingMgrService);
BUILD_AND_REG_SERRVICE(EquipmentUsageInfoMgrService);
BUILD_AND_REG_SERRVICE(DeviceMonitorService);
BUILD_AND_REG_SERRVICE(H2O2LiquidWeightSensorCalibrationService); // H2O2液体重量传感器校准
BUILD_AND_REG_SERRVICE(ExtSettingMgrService);
BUILD_AND_REG_SERRVICE(DebugPageTestService);
// int cnt = 0;
// while (true) {
// uint64_t tp = zsys_get_ticket();

1
appsrc/service/audit_mgr_service.cpp

@ -12,6 +12,7 @@ using namespace iflytop;
void AuditMgrService::initialize() {
GET_TO_SERVICE(m_udiskMgr);
REG_CLASS("审计");
REG_EXTFN_VOID(exportData, void());
REG_EXTFN(getRecords, void(int, int), page, pageSize);
REG_EXTFN_VOID(pushTestData, void());

1
appsrc/service/calibration/h2o2_liquid_weight_sensor_calibration_service.cpp

@ -5,6 +5,7 @@ using namespace std;
using namespace core;
void H2O2LiquidWeightSensorCalibrationService::initialize() {
REG_CLASS("存液桶校准");
GET_TO_SERVICE(m_disinfectantWeightUpdateService);
REG_EXTFN_VOID(getWeight, json(void)); //

3
appsrc/service/debug_page_test_service.cpp

@ -3,6 +3,8 @@
#include "hardware/device_io_ctrl_service.hpp"
using namespace iflytop;
void DebugPageTestService::initialize() {
REG_CLASS("代码调试");
REG_EXTFN_VOID(enterTestMode, void(void));
REG_EXTFN_VOID(exitTestMode, void(void));
REG_EXTFN(startGenFakeH2O2Data, void(json), data);
@ -136,5 +138,4 @@ void DebugPageTestService::triggerPromptEvent(shared_ptr<MsgProcessContext> cxt,
AppEventBus::ins()->pushPromoptEvent(message);
}
void DebugPageTestService::triggerAppCheckPointFailEvent(shared_ptr<MsgProcessContext> cxt) { //
}

1
appsrc/service/device_info_mgr_service.cpp

@ -10,6 +10,7 @@ DeviceInfoMgrService::DeviceInfoMgrService() {}
void DeviceInfoMgrService::initialize() {
GET_TO_SERVICE(m_ds);
REG_CLASS("设备信息");
REG_EXTFN_VOID(getDeviceInfo, void());
REG_EXTFN_VOID(getSubDeviceInfo, void());
}

3
appsrc/service/disinfection_logs_service.cpp

@ -108,6 +108,7 @@ void DisinfectionLogsService::initialize() {
GET_TO_SERVICE(m_ds);
GET_TO_SERVICE(m_udiskMgrService);
REG_CLASS("消毒日志管理");
REG_EXTFN_VOID(getRecordList, void());
REG_EXTFN_VOID(getRecordsStorageState, void());
REG_EXTFN(getRecord, void(string), logName);
@ -581,7 +582,7 @@ void DisinfectionLogsService::exportAllRecord(shared_ptr<MsgProcessContext> cxt)
for (auto& var : m_recordFiles) {
logNames.push_back(var);
}
exportDisinfectionData(logNames);
cxt->ackcode = exportDisinfectionData(logNames);
}
void DisinfectionLogsService::exportRecord(shared_ptr<MsgProcessContext> cxt, vector<string> logNames) {

1
appsrc/service/equipment_usage_info_mgr_service.cpp

@ -5,6 +5,7 @@ using namespace std;
using namespace core;
void EquipmentUsageInfoMgrService::initialize() {
REG_CLASS("设备使用情况统计");
REG_EXTFN_VOID(showHelp, json(void)); //
REG_EXTFN_VOID(getEquipmentUsageInfo, void(void)); //
REG_EXTFN_VOID(setCurTimeAsFactoryTime, void(void)); //

154
appsrc/service/front_end_realtime_display_content_mgr.cpp

@ -3,92 +3,92 @@
#include "service/hardware/device_io_ctrl_service.hpp"
using namespace iflytop;
void FrontEndRealtimeDisplayContentMgr::initialize() { //
REG_EXTFN_VOID(readH2O2SensorData, json());
REG_EXTFN_VOID(readH2O2SensorRawData, json());
REG_EXTFN_VOID(readH2O2SensorSnapshot, json());
//
stateUpdateThread.reset(new Thread("FERDC-stateUpdateThread", [this]() {
while (!ThisThread().getExitFlag()) {
try {
SEND_CLASS_REPORT(thisClass.className, "stateUpdate", readH2O2SensorData());
} catch (const std::exception& e) {
logger->error("stateUpdateThread error:{}", e.what());
}
ThisThread().sleepForMs(3000);
}
}));
}
// void FrontEndRealtimeDisplayContentMgr::initialize() { //
// REG_CLASS("首页信息显示(废弃中)")
// REG_EXTFN_VOID(readH2O2SensorData, json());
// REG_EXTFN_VOID(readH2O2SensorRawData, json());
// REG_EXTFN_VOID(readH2O2SensorSnapshot, json());
json FrontEndRealtimeDisplayContentMgr::readH2O2SensorData() {
auto h2o2SSSS = h2o2SensorStateSyncService;
// //
// stateUpdateThread.reset(new Thread("FERDC-stateUpdateThread", [this]() {
// while (!ThisThread().getExitFlag()) {
// try {
// SEND_CLASS_REPORT(thisClass.className, "stateUpdate", readH2O2SensorData());
// } catch (const std::exception& e) {
// logger->error("stateUpdateThread error:{}", e.what());
// }
// ThisThread().sleepForMs(3000);
// }
// }));
// }
// h2o2Mgr->getCacheData()
json sensordata = json::array();
int i = 0;
// json FrontEndRealtimeDisplayContentMgr::readH2O2SensorData() {
// auto h2o2SSSS = h2o2SensorStateSyncService;
sensordata[i]["type"] = H2O2SensorType::Internal;
sensordata[i]["sensorId"] = 1;
sensordata[i]["h2o2"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->h2o2;
sensordata[i]["temp"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->temp;
sensordata[i]["rh"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->rh;
sensordata[i]["rs"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->rs;
sensordata[i]["online"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->isOnline;
sensordata[i]["preheartWell"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->preHeatWell;
// // h2o2Mgr->getCacheData()
// json sensordata = json::array();
// int i = 0;
i++;
if (PORT.getExtH2O2SensorNum() >= 1) {
sensordata[i]["type"] = H2O2SensorType::WiredExtSensor;
sensordata[i]["sensorId"] = 1;
sensordata[i]["h2o2"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->h2o2;
sensordata[i]["temp"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->temp;
sensordata[i]["rh"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->rh;
sensordata[i]["rs"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->rs;
sensordata[i]["online"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->isOnline;
sensordata[i]["preheartWell"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->preHeatWell;
}
// sensordata[i]["type"] = H2O2SensorType::Internal;
// sensordata[i]["sensorId"] = 1;
// sensordata[i]["h2o2"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->h2o2;
// sensordata[i]["temp"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->temp;
// sensordata[i]["rh"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->rh;
// sensordata[i]["rs"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->rs;
// sensordata[i]["online"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->isOnline;
// sensordata[i]["preheartWell"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::Internal, 1)->preHeatWell;
i++;
if (PORT.getExtH2O2SensorNum() >= 2) {
sensordata[i]["type"] = H2O2SensorType::WiredExtSensor;
sensordata[i]["sensorId"] = 2;
sensordata[i]["h2o2"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->h2o2;
sensordata[i]["temp"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->temp;
sensordata[i]["rh"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->rh;
sensordata[i]["rs"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->rs;
sensordata[i]["online"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->isOnline;
sensordata[i]["preheartWell"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->preHeatWell;
}
// i++;
// if (PORT.getExtH2O2SensorNum() >= 1) {
// sensordata[i]["type"] = H2O2SensorType::WiredExtSensor;
// sensordata[i]["sensorId"] = 1;
// sensordata[i]["h2o2"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->h2o2;
// sensordata[i]["temp"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->temp;
// sensordata[i]["rh"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->rh;
// sensordata[i]["rs"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->rs;
// sensordata[i]["online"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->isOnline;
// sensordata[i]["preheartWell"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->preHeatWell;
// }
json rely;
rely["sensordata"] = sensordata;
rely["internalSensorNum"] = 1;
rely["wiredExSensorNum"] = PORT.getExtH2O2SensorNum();
// i++;
// if (PORT.getExtH2O2SensorNum() >= 2) {
// sensordata[i]["type"] = H2O2SensorType::WiredExtSensor;
// sensordata[i]["sensorId"] = 2;
// sensordata[i]["h2o2"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->h2o2;
// sensordata[i]["temp"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->temp;
// sensordata[i]["rh"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->rh;
// sensordata[i]["rs"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->rs;
// sensordata[i]["online"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->isOnline;
// sensordata[i]["preheartWell"] = h2o2SSSS->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->preHeatWell;
// }
return rely;
}
// json rely;
// rely["sensordata"] = sensordata;
// rely["internalSensorNum"] = 1;
// rely["wiredExSensorNum"] = PORT.getExtH2O2SensorNum();
void FrontEndRealtimeDisplayContentMgr::readH2O2SensorData(shared_ptr<MsgProcessContext> cxt) { cxt->rely["val"] = readH2O2SensorData(); }
void FrontEndRealtimeDisplayContentMgr::readH2O2SensorSnapshot(shared_ptr<MsgProcessContext> cxt) {
auto h2o2SSSS = h2o2SensorStateSyncService;
cxt->rely = *h2o2SSSS->takeSnapshot();
// return rely;
// }
}
// void FrontEndRealtimeDisplayContentMgr::readH2O2SensorData(shared_ptr<MsgProcessContext> cxt) { cxt->rely["val"] = readH2O2SensorData(); }
// void FrontEndRealtimeDisplayContentMgr::readH2O2SensorSnapshot(shared_ptr<MsgProcessContext> cxt) {
// auto h2o2SSSS = h2o2SensorStateSyncService;
// cxt->rely = *h2o2SSSS->takeSnapshot();
// }
void FrontEndRealtimeDisplayContentMgr::readH2O2SensorRawData(shared_ptr<MsgProcessContext> cxt) {
// h2o2Mgr->getCacheData()
json sensordata = json::array();
if (PORT.getExtH2O2SensorNum() >= 0) {
sensordata[0] = json(h2o2SensorStateSyncService->getCacheDataCpy(H2O2SensorType::Internal, 1)->reportData);
}
// void FrontEndRealtimeDisplayContentMgr::readH2O2SensorRawData(shared_ptr<MsgProcessContext> cxt) {
// // h2o2Mgr->getCacheData()
// json sensordata = json::array();
// if (PORT.getExtH2O2SensorNum() >= 0) {
// sensordata[0] = json(h2o2SensorStateSyncService->getCacheDataCpy(H2O2SensorType::Internal, 1)->reportData);
// }
if (PORT.getExtH2O2SensorNum() >= 1) {
sensordata[1] = json(h2o2SensorStateSyncService->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->reportData);
}
// if (PORT.getExtH2O2SensorNum() >= 1) {
// sensordata[1] = json(h2o2SensorStateSyncService->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 1)->reportData);
// }
if (PORT.getExtH2O2SensorNum() >= 2) {
sensordata[2] = json(h2o2SensorStateSyncService->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->reportData);
}
cxt->rely["val"] = sensordata;
}
// if (PORT.getExtH2O2SensorNum() >= 2) {
// sensordata[2] = json(h2o2SensorStateSyncService->getCacheDataCpy(H2O2SensorType::WiredExtSensor, 2)->reportData);
// }
// cxt->rely["val"] = sensordata;
// }

30
appsrc/service/front_end_realtime_display_content_mgr.hpp

@ -12,23 +12,23 @@
#include "baseservice/baseservice.hpp"
#include "service/hardware/h2o2_sensor_state_sync.hpp"
namespace iflytop {
class FrontEndRealtimeDisplayContentMgr : public enable_shared_from_this<FrontEndRealtimeDisplayContentMgr> {
THISCLASS(FrontEndRealtimeDisplayContentMgr);
// namespace iflytop {
// class FrontEndRealtimeDisplayContentMgr : public enable_shared_from_this<FrontEndRealtimeDisplayContentMgr> {
// THISCLASS(FrontEndRealtimeDisplayContentMgr);
SERVICE(H2O2SensorStateSyncService, h2o2SensorStateSyncService);
// SERVICE(H2O2SensorStateSyncService, h2o2SensorStateSyncService);
shared_ptr<DeviceStateService> m_ds;
unique_ptr<Thread> stateUpdateThread;
// shared_ptr<DeviceStateService> m_ds;
// unique_ptr<Thread> stateUpdateThread;
public:
void initialize();
// public:
// void initialize();
private:
json readH2O2SensorData();
void readH2O2SensorData(shared_ptr<MsgProcessContext> cxt);
void readH2O2SensorSnapshot(shared_ptr<MsgProcessContext> cxt);
void readH2O2SensorRawData(shared_ptr<MsgProcessContext> cxt);
};
// private:
// json readH2O2SensorData();
// void readH2O2SensorData(shared_ptr<MsgProcessContext> cxt);
// void readH2O2SensorSnapshot(shared_ptr<MsgProcessContext> cxt);
// void readH2O2SensorRawData(shared_ptr<MsgProcessContext> cxt);
// };
} // namespace iflytop
// } // namespace iflytop

1
appsrc/service/h2o2_sensor_mgr.cpp

@ -40,6 +40,7 @@ void H2O2SensorMgr::initialize() {
}
}));
REG_CLASS("H2O2探头管理");
REG_EXTFN(getH2O2DataRecordList, void(H2O2SensorType, int, int64_t, int64_t, int64_t), type, id, since, interval, before);
REG_EXTFN(getDisinfectionH2O2DataRecordList, void(H2O2SensorType, int, int64_t), type, id, interval);
REG_EXTFN_VOID(getH2O2SensorList, void());

3
appsrc/service/hardware/device_io_ctrl_service.cpp

@ -41,6 +41,8 @@ static bool isInTestMode() {
}
void DeviceIoControlService::initialize() {
REG_CLASS("底层设备控制(Debug)");
REG_FN_VOID(AddLiquidPump_addLiquid, void(void));
REG_FN(AddLiquidPump_run, void(int), rpm);
REG_FN_VOID(AddLiquidPump_drainLiquid, void(void));
@ -96,7 +98,6 @@ void DeviceIoControlService::initialize() {
* @brief
*/
heartThread.reset(new Thread("heartThread", [this]() {
while (true) {
if (VIRTUAL_DEVICE()) {

5
appsrc/service/os_mgr_service.cpp

@ -7,6 +7,7 @@ OsMgrService::OsMgrService() {}
void OsMgrService::initialize() {
GET_TO_SERVICE(m_ds);
REG_CLASS("OS管理");
REG_EXTFN_VOID(shutdown, void());
REG_EXTFN(updateDate, void(int, int, int), year, month, day);
REG_EXTFN(updateTime, void(int, int, int), hour, min, second);
@ -34,6 +35,4 @@ void OsMgrService::updateTime(shared_ptr<MsgProcessContext> cxt, int hour, int m
dosystem(fmt::format("hwclock -w").c_str());
}
void OsMgrService::getTime(shared_ptr<MsgProcessContext> cxt) {
cxt->rely["time"] = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
}
void OsMgrService::getTime(shared_ptr<MsgProcessContext> cxt) { cxt->rely["time"] = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count(); }

64
appsrc/service/setting/ext_setting_mgr_service.cpp

@ -4,8 +4,27 @@ using namespace iflytop;
using namespace std;
using namespace core;
void ExtSettingMgrService::initVal(shared_ptr<MsgProcessContext> cxt, ProjectTypeEnum projType, int year, int month, int day, int index) { DeviceExtSettingV2Dao::ins()->initVal(projType, year, month, day, index); }
void ExtSettingMgrService::initVal(shared_ptr<MsgProcessContext> cxt, ProjectTypeEnum projType, string deviceId) { DeviceExtSettingV2Dao::ins()->initVal(projType, deviceId); }
void ExtSettingMgrService::initVal1(shared_ptr<MsgProcessContext> cxt, ProjectTypeEnum projType, int year, int month, int day, int index) { DeviceExtSettingV2Dao::ins()->initVal(projType, year, month, day, index); }
void ExtSettingMgrService::initVal2(shared_ptr<MsgProcessContext> cxt, string deviceId) {
int deviceTypeLen = deviceId.length() - 9;
if (deviceTypeLen < 6) {
cxt->rely["error"] = fmt::format("设备ID格式错误,设备ID长度{}<15", deviceId.length());
return;
}
string deviceType = deviceId.substr(0, deviceTypeLen);
ProjectTypeEnum dtype = ProjectTypeEnum(deviceType);
if (dtype.getId() == ProjectTypeEnum::kunkown) {
cxt->rely["error"] = fmt::format("设备ID格式错误,不支持的设备类型:{}", deviceType);
return;
}
int year = stoi(deviceId.substr(deviceTypeLen, 2));
int month = stoi(deviceId.substr(deviceTypeLen + 2, 2));
int day = stoi(deviceId.substr(deviceTypeLen + 4, 2));
int index = stoi(deviceId.substr(deviceTypeLen + 6, 3));
DeviceExtSettingV2Dao::ins()->initVal(dtype, deviceId);
}
void ExtSettingMgrService::getSetting(shared_ptr<MsgProcessContext> cxt) { cxt->rely = DeviceExtSettingV2Dao::ins()->getSetting(); }
void ExtSettingMgrService::getSettingCH(shared_ptr<MsgProcessContext> cxt) { cxt->rely = DeviceExtSettingV2Dao::ins()->getSettingCH(); }
@ -32,8 +51,13 @@ void ExtSettingMgrService::rebootDevice(shared_ptr<MsgProcessContext> cxt) { sys
void ExtSettingMgrService::restartProgram(shared_ptr<MsgProcessContext> cxt) { system("systemctl restart zapp &"); }
void ExtSettingMgrService::initialize() {
REG_EXTFN(initVal, void(ProjectTypeEnum, int, int, int, int), projType, year, month, day, index);
REG_EXTFN(initVal, void(ProjectTypeEnum, string), projType, deviceId);
REG_CLASS("设备扩展配置");
REG_EXTFN(initVal1, void(ProjectTypeEnum, int, int, int, int), projType, year, month, day, index);
REG_EXTFN_VOID_DISPNAME(initVal1, "初始化设备");
REG_EXTFN(initVal2, void(string), deviceId);
REG_EXTFN_VOID_DISPNAME(initVal2, "初始化设备");
REG_EXTFN_VOID(getSetting, json());
REG_EXTFN_VOID_DISPNAME(getSetting, "获取设备扩展设置");
@ -42,52 +66,52 @@ void ExtSettingMgrService::initialize() {
REG_EXTFN_VOID_DISPNAME(getSettingCH, "获取设备扩展设置(中文)");
REG_EXTFN(setCanIF, void(string), val);
REG_EXTFN_DISPNAME(setCanIF, "CAN接口", "val");
REG_EXTFN_DISPNAME(setCanIF, "设置CAN接口", "val");
REG_EXTFN(setCanBitrate, void(int), val);
REG_EXTFN_DISPNAME(setCanBitrate, "CAN波特率", "val");
REG_EXTFN_DISPNAME(setCanBitrate, "设置CAN波特率", "val");
REG_EXTFN(setPrinterUartPath, void(string), val);
REG_EXTFN_DISPNAME(setPrinterUartPath, "打印机串口路径", "val");
REG_EXTFN_DISPNAME(setPrinterUartPath, "设置打印机串口路径", "val");
REG_EXTFN(setH2o2SensorExpireTimeMonth, void(int), val);
REG_EXTFN_DISPNAME(setH2o2SensorExpireTimeMonth, "H2O2传感器过期时间(月)", "val");
REG_EXTFN_DISPNAME(setH2o2SensorExpireTimeMonth, "设置H2O2传感器过期时间(月)", "val");
REG_EXTFN(setH2o2Sensorh2o2MinVal, void(int), val);
REG_EXTFN_DISPNAME(setH2o2Sensorh2o2MinVal, "H2O2传感器最小值", "val");
REG_EXTFN_DISPNAME(setH2o2Sensorh2o2MinVal, "设置H2O2传感器最小值", "val");
REG_EXTFN(setSensorPreheartTimeS, void(int), val);
REG_EXTFN_DISPNAME(setSensorPreheartTimeS, "传感器预热时间(秒)", "val");
REG_EXTFN_DISPNAME(setSensorPreheartTimeS, "设置传感器预热时间(秒)", "val");
REG_EXTFN(setExtWiredSensorNum, void(int), val);
REG_EXTFN_DISPNAME(setExtWiredSensorNum, "外部有线探头数量", "val");
REG_EXTFN_DISPNAME(setExtWiredSensorNum, "设置外部有线探头数量", "val");
REG_EXTFN(setEmptyThePipeLineTimeS, void(int), val);
REG_EXTFN_DISPNAME(setEmptyThePipeLineTimeS, "排空加液管道时间(秒)", "val");
REG_EXTFN_DISPNAME(setEmptyThePipeLineTimeS, "设置排空加液管道时间(秒)", "val");
REG_EXTFN(setEmptyingLiquidStorageTankCondtionG, void(int), val);
REG_EXTFN_DISPNAME(setEmptyingLiquidStorageTankCondtionG, "排空液体储存罐阈值(G)", "val");
REG_EXTFN_DISPNAME(setEmptyingLiquidStorageTankCondtionG, "设置排空液体阈值(g)", "val");
REG_EXTFN(setLeakTestInflationTimeMs, void(int), val);
REG_EXTFN_DISPNAME(setLeakTestInflationTimeMs, "泄漏测试充气时间(毫秒)", "val");
REG_EXTFN_DISPNAME(setLeakTestInflationTimeMs, "设置泄漏测试充气时间(毫秒)", "val");
REG_EXTFN(setLeakTestStabilizationTimeS, void(int), val);
REG_EXTFN_DISPNAME(setLeakTestStabilizationTimeS, "泄漏测试稳定时间(秒)", "val");
REG_EXTFN_DISPNAME(setLeakTestStabilizationTimeS, "设置泄漏测试稳定时间(秒)", "val");
REG_EXTFN(setDisinfectantBucketCapacity, void(int), val);
REG_EXTFN_DISPNAME(setDisinfectantBucketCapacity, "消毒液桶体积", "val");
REG_EXTFN_DISPNAME(setDisinfectantBucketCapacity, "设置消毒液桶体积", "val");
REG_EXTFN(setUserBehaviorRecordDbMaxRecords, void(int), val);
REG_EXTFN_DISPNAME(setUserBehaviorRecordDbMaxRecords, "用户行为记录数据库最大记录数", "val");
REG_EXTFN_DISPNAME(setUserBehaviorRecordDbMaxRecords, "设置用户行为最大记录数", "val");
REG_EXTFN(setGpmToSpeedRadio, void(float), val);
REG_EXTFN_DISPNAME(setGpmToSpeedRadio, "GPM转速比率", "val");
REG_EXTFN_DISPNAME(setGpmToSpeedRadio, "设置GPM转速比率", "val");
REG_EXTFN(setSprayLineEmptyTimeS, void(int), val);
REG_EXTFN_DISPNAME(setSprayLineEmptyTimeS, "喷液管道排空时间(秒)", "val");
REG_EXTFN_DISPNAME(setSprayLineEmptyTimeS, "设置喷液管道排空时间(秒)", "val");
REG_EXTFN(setSprayLineEmptyVelRPM, void(int), val);
REG_EXTFN_DISPNAME(setSprayLineEmptyVelRPM, "喷液管道排空速度(RPM)", "val");
REG_EXTFN_DISPNAME(setSprayLineEmptyVelRPM, "设置喷液管道排空速度(RPM)", "val");
REG_EXTFN_VOID(rebootDevice, void(void));
REG_EXTFN_VOID_DISPNAME(rebootDevice, "重启设备");

4
appsrc/service/setting/ext_setting_mgr_service.hpp

@ -19,8 +19,8 @@ class ExtSettingMgrService : public enable_shared_from_this<ExtSettingMgrService
void initialize();
private:
void initVal(shared_ptr<MsgProcessContext> cxt, ProjectTypeEnum projType, int year, int month, int day, int index);
void initVal(shared_ptr<MsgProcessContext> cxt, ProjectTypeEnum projType, string deviceId);
void initVal1(shared_ptr<MsgProcessContext> cxt, ProjectTypeEnum projType, int year, int month, int day, int index);
void initVal2(shared_ptr<MsgProcessContext> cxt, string deviceId);
void getSetting(shared_ptr<MsgProcessContext> cxt);
void getSettingCH(shared_ptr<MsgProcessContext> cxt);

1
appsrc/service/setting_mgr_service.cpp

@ -10,6 +10,7 @@ SettingMgrService::SettingMgrService() {}
void SettingMgrService::initialize() {
GET_TO_SERVICE(m_ds);
REG_CLASS("基础设置");
REG_EXTFN_VOID(getAllSetting, void());
REG_EXTFN(setSettingVal, void(string, string), settingName, settingVal);
REG_EXTFN_VOID(getAllFormula, json());

40
appsrc/service/test_page_ctrl_service.cpp

@ -8,27 +8,55 @@ using namespace testpage;
* @brief
*
*
* WARNING:
* Date: 2024-12-05
*
*/
void TestPageCtrlService::initialize() {
REG_CLASS("测试页面控制服务");
REG_EXTFN(sprayPumpDoForward, void(int32_t), gpm);
REG_EXTFN_DISPNAME(sprayPumpDoForward, "喷液泵正转");
REG_EXTFN(sprayPumpDoBackward, void(int32_t), gpm);
REG_EXTFN_DISPNAME(sprayPumpDoBackward, "喷液泵反转")
REG_EXTFN_VOID(sprayPumpDoStop, void());
REG_EXTFN_DISPNAME(sprayPumpDoStop, "喷液泵停止");
REG_EXTFN_VOID(liquidFillingPumpDoLiquidFilling, void());
REG_EXTFN_DISPNAME(liquidFillingPumpDoLiquidFilling, "加液");
REG_EXTFN_VOID(liquidFillingPumpDoLiquidDischarge, void());
REG_EXTFN_DISPNAME(liquidFillingPumpDoLiquidDischarge, "排液");
REG_EXTFN_VOID(liquidFillingPumpDoStop, void());
REG_EXTFN_DISPNAME(liquidFillingPumpDoStop, "停止加液");
REG_EXTFN_VOID(airCompressorDoOpen, void());
REG_EXTFN_DISPNAME(airCompressorDoOpen, "空压机打开");
REG_EXTFN_VOID(airCompressorDoClose, void());
REG_EXTFN_DISPNAME(airCompressorDoClose, "空压机关闭");
REG_EXTFN_VOID(blowerDoOpen, void());
REG_EXTFN_DISPNAME(blowerDoOpen, "鼓风机打开");
REG_EXTFN_VOID(blowerDoClose, void());
REG_EXTFN_DISPNAME(blowerDoClose, "鼓风机关闭");
REG_EXTFN_VOID(heatingDoOpen, void());
REG_EXTFN_DISPNAME(heatingDoOpen, "加热器打开");
REG_EXTFN_VOID(heatingDoClose, void());
REG_EXTFN_DISPNAME(heatingDoClose, "加热器关闭");
REG_EXTFN_VOID(printerDoTest, void());
REG_EXTFN_DISPNAME(printerDoTest, "打印机测试");
REG_EXTFN(airLeakDetectTestModeDoSetMode, void(string mode), mode);
REG_EXTFN_DISPNAME(airLeakDetectTestModeDoSetMode, "气路通道设置");
REG_FN_VOID(readState, void());
m_thread.reset(new Thread("TestPageCtrlServiceReportThread", [this]() {
while (!ThisThread().getExitFlag()) {
@ -106,9 +134,9 @@ void TestPageCtrlService::airLeakDetectTestModeDoSetMode(shared_ptr<MsgProcessCo
json TestPageCtrlService::readState() {
json state;
state["airCompressorCurrent"] = sensorStateSyncService->getAirCompressorCurrent();
state["blowerCurrent"] = sensorStateSyncService->getBlowerCurrent();
state["heaterCurrent"] = sensorStateSyncService->getHeaterCurrent();
state["heaterTemperature"] = sensorStateSyncService->getHeaterTemperature();
state["airCompressorCurrent"] = sensorStateSyncService->getAirCompressorCurrent();
state["blowerCurrent"] = sensorStateSyncService->getBlowerCurrent();
state["heaterCurrent"] = sensorStateSyncService->getHeaterCurrent();
state["heaterTemperature"] = sensorStateSyncService->getHeaterTemperature();
return state;
}

11
appsrc/service/user_mgr_service.cpp

@ -7,6 +7,7 @@ using namespace core;
void UserMgrService::initialize() {
GET_TO_SERVICE(m_deviceStateService);
REG_CLASS("用户管理");
REG_EXTFN(login, void(string, string), name, pwd);
REG_EXTFN_VOID(unlogin, void());
REG_EXTFN(addUser, void(string, string, UsrRoleType), name, passwd, roleType);
@ -77,8 +78,8 @@ void UserMgrService::updateUserName(shared_ptr<MsgProcessContext> cxt, int id, s
ADD_USER_BEHAVIOR(DS->getLoginName(), fmt::format("修改用户名{}->{}", oldname, name));
}
void UserMgrService::getAllUser(shared_ptr<MsgProcessContext> cxt) {
auto users = UserDao::ins()->getAllUserJson();
cxt->rely = users;
auto users = UserDao::ins()->getAllUserJson();
cxt->rely = users;
return;
}
@ -86,11 +87,11 @@ void UserMgrService::getLoginUser(shared_ptr<MsgProcessContext> cxt) {
string loginName = m_deviceStateService->getLoginName();
bool isLogin = m_deviceStateService->isLogin();
cxt->rely["isLogin"] = isLogin;
cxt->rely["isLogin"] = isLogin;
if (isLogin) {
cxt->rely["loginUser"] = UserDao::ins()->getUserJson(loginName);
cxt->rely["loginUser"] = UserDao::ins()->getUserJson(loginName);
} else {
cxt->rely["loginUser"] = {};
cxt->rely["loginUser"] = {};
}
return;
}

98
html/debug/index.html

@ -22,7 +22,9 @@
<body>
<div id="app" class="h-full">
<a-row class="h-full">
<a-col :span="6">
<a-col :span="3">
<div style="display:flex;padding:5px;">
<a-input v-model:value="wsUrl" style="margin-right:5px;"></a-input>
<a-button v-if="null === ws" @click="actionConnect">连接</a-button>
@ -30,39 +32,47 @@
</div>
<a-menu mode="inline" :items="actionMenuItems" @click="actionGroupMenuItemClick"></a-menu>
</a-col>
<!-- -->
<a-col :span="12" style="background-color: #f1f1f1;display:flex;flex-direction: column;">
<a-col :span="15" style="background-color: #f1f1f1;display:flex;flex-direction: column;">
<div v-if="null !== actionActiveGroup"
style="height:0;flex-grow: 1;overflow-y: auto;margin-bottom: 10px;padding: 10px;">
<div v-for="item in actionActiveGroup.items" class="action"
style="margin-bottom: 5px;background:white;padding:5px;border-radius: 5px;">
<div style="margin-right:5px;padding: 8px;">
{{item.fnName}}
</div>
<div v-for="param in item.params">
<a-select v-if="item.paramInfoMap[param].isEnum" v-model:value="item.values[param]" :placeholder="param"
:dropdownMatchSelectWidth="false">
style="margin-bottom: 5px;background:white;padding:5px;border-radius: 5px; ">
<!-- 按键 -->
<a-button ghost type="primary"
style="margin-right: 5px; min-width:230px ;font-weight: bold; text-align: left;"
@click="actionActionExecute(item)">
{{item.fnDispName}}</a-button>
<!-- 参数 -->
<div v-for="param in item.params" style="margin-right: 10px; width:150px ">
<a-select v-if="item.paramInfoMap[param].isEnum" style=" width:150px" v-model:value="item.values[param]"
:placeholder="param" :dropdownMatchSelectWidth="false">
<!-- -->
<a-select-option v-for="enumValue in item.paramInfoMap[param].enumValues" :key="enumValue"
:value="enumValue">{{enumValue}}</a-select-option>
<!-- -->
</a-select>
<!-- 点击输入框后弹出键盘 -->
<a-input v-else v-model:value="item.values[param]" :placeholder="param"
@click="showKeyboard(item.values, param)"></a-input>
</div>
<a-button style="margin-left:5px;" @click="actionActionExecute(item)">执行</a-button>
</div>
</div>
</div>
<!-- <div style="padding:10px;">
<a-textarea v-model:value="rawRequestContent" style="margin-bottom: 5px;height: 300px;"></a-textarea>
<div>
<a-button @click="actionSendRawRequest">发送</a-button>
</div>
</div> -->
@ -75,6 +85,7 @@
<div style="text-align: right; padding:10px;">
<a-button @click="actionClearLogs">清空日志</a-button>
</div>
<div style="height:0;flex-grow:1;overflow-y: auto;">
<a-collapse>
<a-collapse-panel v-for="(entry,index) in logs" :key="index" :header="entry.title">
@ -98,9 +109,6 @@
</div>
</a-col>
</a-row>
</div>
<script>
@ -109,6 +117,7 @@
data() {
return {
actions: [],
menuList: [],
actionActiveGroup: null,
rawRequestContent: '',
logs: [],
@ -124,7 +133,7 @@
},
computed: {
actionMenuItems() {
return this.actions.map(i => ({ key: i.key, label: i.key }));
return this.menuList.map(i => ({ key: i.className, label: i.classDispName }));
}
},
mounted() {
@ -153,6 +162,10 @@
if ('Ack' === data.messageType && 'FNScheduler' === data.fromClass && 'geFnList' === data.fromFn) {
this.actionListReload(data);
}
if ('Ack' === data.messageType && 'FNScheduler' === data.fromClass && 'geMenuList' === data.fromFn) {
this.menuListReload(data);
}
if ('Ack' === data.messageType) {
this.logs.push(responseEntry);
}
@ -165,15 +178,30 @@
};
this.ws.onopen = () => {
this.wsMessageIndex++;
let request = {};
request.messageId = this.wsMessageIndex;
request.timeStamp = Math.floor(Date.now() / 1000);
request.messageType = 'Command';
request.className = 'FNScheduler';
request.fnName = 'geFnList';
request.params = {};
this.wsCall(request);
{
this.wsMessageIndex++;
let request = {};
request.messageId = this.wsMessageIndex;
request.timeStamp = Math.floor(Date.now() / 1000);
request.messageType = 'Command';
request.className = 'FNScheduler';
request.fnName = 'geFnList';
request.params = {};
this.wsCall(request);
}
{
this.wsMessageIndex++;
let request = {};
request.messageId = this.wsMessageIndex;
request.timeStamp = Math.floor(Date.now() / 1000);
request.messageType = 'Command';
request.className = 'FNScheduler';
request.fnName = 'geMenuList';
request.params = {};
this.wsCall(request);
}
}
},
@ -204,6 +232,14 @@
}
},
menuListReload(response) {
let data = response.rely;
if (undefined === data) {
return;
}
this.menuList = data;
},
// action list reload
actionListReload(response) {
let data = response.rely;

Loading…
Cancel
Save