From ff16c5c25c01c81029c18d7760bcf5b44c4334ac Mon Sep 17 00:00:00 2001 From: sige Date: Sun, 18 Feb 2024 17:32:26 +0800 Subject: [PATCH] log --- .../my/graphiteDigesterBg/api/ApiOperationLog.java | 42 ++++++++++ .../graphiteDigesterBg/diframe/DiActiveRecord.java | 8 ++ .../diframe/DiActiveRecordCriteria.java | 2 + .../com/my/graphiteDigesterBg/diframe/DiTask.java | 3 + .../my/graphiteDigesterBg/diframe/DiTaskBase.java | 14 ++++ .../graphiteDigesterBg/diframe/api/DiApiTask.java | 11 ++- .../diframe/mapper/DiActiveRecordMapper.java | 12 +++ .../graphiteDigesterBg/model/MdbOperationLog.java | 32 ++++++++ .../my/graphiteDigesterBg/task/TaskDigestion.java | 3 + .../my/graphiteDigesterBg/task/TaskDoorClose.java | 3 + .../my/graphiteDigesterBg/task/TaskDoorOpen.java | 3 + .../my/graphiteDigesterBg/task/TaskHeating.java | 3 + .../my/graphiteDigesterBg/task/TaskLiquidAdd.java | 3 + .../my/graphiteDigesterBg/task/TaskSampleAdd.java | 2 + .../task/TaskSampleMoveToHeatPlate.java | 3 + .../task/TaskSampleMoveToLiquidPlate.java | 2 + .../graphiteDigesterBg/task/TaskSampleTakeOut.java | 3 + .../my/graphiteDigesterBg/task/TaskStartReset.java | 3 + .../my/graphiteDigesterBg/task/TaskStopReset.java | 3 + .../task/TaskTubeMoveToErrorSlot.java | 4 + src/web/src/pages/main/contents/History.vue | 90 ++++++++++++++++------ src/web/src/utils/ApiClient.js | 5 ++ 22 files changed, 231 insertions(+), 23 deletions(-) create mode 100644 src/src/main/java/com/my/graphiteDigesterBg/api/ApiOperationLog.java create mode 100644 src/src/main/java/com/my/graphiteDigesterBg/model/MdbOperationLog.java diff --git a/src/src/main/java/com/my/graphiteDigesterBg/api/ApiOperationLog.java b/src/src/main/java/com/my/graphiteDigesterBg/api/ApiOperationLog.java new file mode 100644 index 0000000..c09d82f --- /dev/null +++ b/src/src/main/java/com/my/graphiteDigesterBg/api/ApiOperationLog.java @@ -0,0 +1,42 @@ +package com.my.graphiteDigesterBg.api; +import com.my.graphiteDigesterBg.diframe.DiActiveRecord; +import com.my.graphiteDigesterBg.diframe.DiActiveRecordCriteria; +import com.my.graphiteDigesterBg.diframe.DiApiControllerBase; +import com.my.graphiteDigesterBg.diframe.DiApiResponse; +import com.my.graphiteDigesterBg.diframe.model.DiMdbUser; +import com.my.graphiteDigesterBg.model.MdbDigestionTask; +import com.my.graphiteDigesterBg.model.MdbOperationLog; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import java.util.ArrayList; +import java.util.Map; +@Controller +public class ApiOperationLog extends DiApiControllerBase { + @ResponseBody + @PostMapping("/api/operation-log/list") + public DiApiResponse list(@RequestBody Map params ) { + Integer offset = (Integer)params.get("offset"); + Integer limit = (Integer)params.get("limit"); + + var criteria = new DiActiveRecordCriteria(); + criteria.limit = limit == null ? 10 : limit; + criteria.offset = offset == null ? 0 : offset; + var logs = DiActiveRecord.find(MdbOperationLog.class, criteria); + + var list = new ArrayList>(); + for ( var log : logs ) { + var map = log.toMap(); + map.put("user", null); + if ( 0 != log.userId ) { + var user = DiActiveRecord.findOne(DiMdbUser.class, log.userId); + map.put("user", user.toMap()); + } + list.add(map); + } + + var total = DiActiveRecord.count(MdbOperationLog.class, criteria); + return this.success(Map.of("list",list, "total", total)); + } +} diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecord.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecord.java index 4d13142..a6e1f7b 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecord.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecord.java @@ -90,6 +90,14 @@ public class DiActiveRecord { return model; } + // count by criteria + public static Integer count( Class modelClass, DiActiveRecordCriteria criteria ) { + criteria.tableName = DiActiveRecord.getTableNameFromModelClass(modelClass); + var context = DiApplicationContextProvider.getContext(); + DiActiveRecordMapper mapper = context.getBean(DiActiveRecordMapper.class); + return mapper.count(criteria); + } + // find all by criteria public static List find( Class modelClass, DiActiveRecordCriteria criteria ) { criteria.tableName = DiActiveRecord.getTableNameFromModelClass(modelClass); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecordCriteria.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecordCriteria.java index 8a22a42..588c32c 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecordCriteria.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecordCriteria.java @@ -7,4 +7,6 @@ public class DiActiveRecordCriteria { public Map conditions; // limit public Integer limit; + // offset + public Integer offset; } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java index 520ad88..3d58685 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java @@ -1,4 +1,5 @@ package com.my.graphiteDigesterBg.diframe; +import com.my.graphiteDigesterBg.diframe.model.DiMdbUser; public interface DiTask { // task status enum TaskStatus { NEW, RUNNING, FINISHED, CANCELLED, WAITING, READY } @@ -15,4 +16,6 @@ public interface DiTask { // stop void stop(); void setStatus(TaskStatus status); + void setUser(DiMdbUser user); + DiMdbUser getUser(); } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java index 6bc3576..0b8d31e 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java @@ -1,4 +1,5 @@ package com.my.graphiteDigesterBg.diframe; +import com.my.graphiteDigesterBg.diframe.model.DiMdbUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; abstract public class DiTaskBase implements DiTask { @@ -12,11 +13,14 @@ abstract public class DiTaskBase implements DiTask { private TaskStatus status; // request task stop private Boolean isRequestTaskStop = false; + // user + private DiMdbUser user; // constructor public DiTaskBase() { this.uuid = java.util.UUID.randomUUID().toString(); this.status = TaskStatus.NEW; + this.user = null; } @Override @@ -48,6 +52,16 @@ abstract public class DiTaskBase implements DiTask { this.device = device; } + @Override + public void setUser(DiMdbUser user) { + this.user = user; + } + + // get user + public DiMdbUser getUser() { + return this.user; + } + // run @Override public void run() { diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java index ae23583..81f9966 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java @@ -1,6 +1,8 @@ package com.my.graphiteDigesterBg.diframe.api; import com.my.graphiteDigesterBg.diframe.*; +import com.my.graphiteDigesterBg.diframe.model.DiMdbUser; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -23,7 +25,13 @@ public class DiApiTask extends DiApiControllerBase { */ @ResponseBody @PostMapping("/api/task/append") - public DiApiResponse append(@RequestBody Map params) { + public DiApiResponse append(HttpServletRequest request, @RequestBody Map params) { + String accessToken = request.getHeader("App-Access-Token"); + var user = DiActiveRecord.findOne(DiMdbUser.class, Map.of("accessToken", accessToken)); + if ( null == user ) { + return this.error("invalid access token"); + } + DiTaskExecutor executor = this.device.getTaskManager().getExecutor(); if ( null == executor ) { return this.error("task executor is not running"); @@ -33,6 +41,7 @@ public class DiApiTask extends DiApiControllerBase { Object taskParams = params.get("params"); DiTaskManager taskManager = this.device.getTaskManager(); DiTask task = taskManager.generateTask(name, taskParams); + task.setUser(user); executor.appendTask(task); return this.success(Map.of("id", task.getUUID())); } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/mapper/DiActiveRecordMapper.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/mapper/DiActiveRecordMapper.java index c0aa6ae..2362fe7 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/mapper/DiActiveRecordMapper.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/mapper/DiActiveRecordMapper.java @@ -15,10 +15,22 @@ public interface DiActiveRecordMapper { " " + "ORDER BY id DESC " + "LIMIT #{limit} " + + "OFFSET #{offset}" + "" ) List> find(DiActiveRecordCriteria criteria); + @Select( + "" + ) + Integer count(DiActiveRecordCriteria criteria); + @Select("SELECT * FROM ${tableName} WHERE id = #{id}") Map findById(String tableName, Integer id); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/model/MdbOperationLog.java b/src/src/main/java/com/my/graphiteDigesterBg/model/MdbOperationLog.java new file mode 100644 index 0000000..271bdef --- /dev/null +++ b/src/src/main/java/com/my/graphiteDigesterBg/model/MdbOperationLog.java @@ -0,0 +1,32 @@ +package com.my.graphiteDigesterBg.model; +import com.my.graphiteDigesterBg.diframe.ActiveRecordField; +import com.my.graphiteDigesterBg.diframe.DiActiveRecord; +import com.my.graphiteDigesterBg.diframe.model.DiMdbUser; + +public class MdbOperationLog extends DiActiveRecord { + @ActiveRecordField + public Integer id; + + @ActiveRecordField + public Integer userId; + + @ActiveRecordField + public String content; + + @ActiveRecordField + public Integer time; + + // get table name + public static String getTableName() { + return "app_operation_logs"; + } + + // log + public static void log(DiMdbUser user, String content, Object ... args ) { + var log = new MdbOperationLog(); + log.userId = user.id; + log.content = String.format(content, args); + log.time = (int)(System.currentTimeMillis() / 1000); + log.save(); + } +} diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java index b411929..a0760aa 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java @@ -3,6 +3,7 @@ import com.my.graphiteDigesterBg.diframe.DiActiveRecord; import com.my.graphiteDigesterBg.diframe.DiTaskStepTaskBase; import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.model.MdbDigestionTask; +import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; import java.util.Map; @@ -25,6 +26,8 @@ public class TaskDigestion extends DiTaskStepTaskBase { slot.digestionName = taskModel.name; this.loadStepsByJson(taskModel.steps); + + MdbOperationLog.log(this.getUser(), "试管架%d : 执行预设【%s】", this.slotIndex, taskModel.name); } @Override diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorClose.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorClose.java index 8380df5..81e99cb 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorClose.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorClose.java @@ -3,11 +3,14 @@ import com.my.graphiteDigesterBg.MyDevice; import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; +import com.my.graphiteDigesterBg.model.MdbOperationLog; + @Task(name="DoorClose") public class TaskDoorClose extends DiTaskBase { @Override public void run() { this.setStatus(TaskStatus.RUNNING); + MdbOperationLog.log(this.getUser(), "关闭设备门"); DiActMotor doorMotor = this.getActuator(MyDevice.ACT_DOOR_MOTOR, DiActMotor.class); doorMotor.moveToIO(1, 1); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorOpen.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorOpen.java index 8f44448..cd5585f 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorOpen.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorOpen.java @@ -3,11 +3,14 @@ import com.my.graphiteDigesterBg.MyDevice; import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; +import com.my.graphiteDigesterBg.model.MdbOperationLog; + @Task(name="DoorOpen") public class TaskDoorOpen extends DiTaskBase { @Override public void run() { this.setStatus(TaskStatus.RUNNING); + MdbOperationLog.log(this.getUser(), "打开设备门"); DiActMotor doorMotor = this.getActuator(MyDevice.ACT_DOOR_MOTOR, DiActMotor.class); doorMotor.reset(); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java index 0c00fe4..68c36cd 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java @@ -2,6 +2,7 @@ package com.my.graphiteDigesterBg.task; import com.my.graphiteDigesterBg.diframe.DiTask; import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; +import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,6 +21,8 @@ public class TaskHeating extends DiTaskBase { @Override public void run() { + MdbOperationLog.log(this.getUser(), "试管架%d : 样本加热 温度=%d, 时间=%d", this.slotIndex, this.temperature, this.duration); + var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); var slot = slotMan.getSlotByIndex(this.slotIndex); slot.destTemperature = this.temperature; diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java index 786c8b2..bbecc9d 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java @@ -1,6 +1,7 @@ package com.my.graphiteDigesterBg.task; import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; +import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.move.MoveLiquidAdd; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate; @@ -26,6 +27,8 @@ public class TaskLiquidAdd extends DiTaskBase { moveTubeRackFromHeatPlateToLiquidPlate.slotIndex = this.slotIndex; moveTubeRackFromHeatPlateToLiquidPlate.run(); + MdbOperationLog.log(this.getUser(), "试管架%d : 样本加液 类型=%s, 加液量=%d", this.slotIndex, this.liquidType, this.liquidVolume); + // add liquid var liquidAdd = new MoveLiquidAdd(); liquidAdd.setDevice(this.getDevice()); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java index 23df8f0..71ac602 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java @@ -3,6 +3,7 @@ import com.my.graphiteDigesterBg.MyDevice; import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; +import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; @@ -17,6 +18,7 @@ public class TaskSampleAdd extends DiTaskBase { public void run() { ResHeatingTubeRackSlotManager slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); ResHeatingTubeRackSlot slot = slotMan.allocFreeSlot(); + MdbOperationLog.log(this.getUser(), "试管架%d : 放入样本", slot.index); DiActMotor transLrMotor = this.getActuator(MyDevice.ACT_TRANSFER_LR_MOTOR, DiActMotor.class); DiActMotor transUdMotor = this.getActuator(MyDevice.ACT_TRANSFER_UD_MOTOR, DiActMotor.class); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java index 85b15cf..0e399b2 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java @@ -1,6 +1,7 @@ package com.my.graphiteDigesterBg.task; import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; +import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; @@ -22,6 +23,8 @@ public class TaskSampleMoveToHeatPlate extends DiTaskBase { throw new RuntimeException("liquid plate slot not found"); } + MdbOperationLog.log(this.getUser(), "试管架%d : 样本移至加热区", slotIndex); + var move = new MoveMoveTubeRackFromLiquidPlateToHeatPlate(); move.setDevice(this.getDevice()); move.slotIndex = slotIndex; diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java index 86a8727..40424c3 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java @@ -2,6 +2,7 @@ package com.my.graphiteDigesterBg.task; import com.my.graphiteDigesterBg.MyDevice; import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; +import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate; @Task(name="SampleMoveToLiquidPlate") public class TaskSampleMoveToLiquidPlate extends DiTaskBase { @@ -11,6 +12,7 @@ public class TaskSampleMoveToLiquidPlate extends DiTaskBase { @Override public void run() { this.setStatus(TaskStatus.RUNNING); + MdbOperationLog.log(this.getUser(), "试管架%d : 样本移至加液区", this.slotIndex); var move = new MoveMoveTubeRackFromHeatPlateToLiquidPlate(); move.setDevice(this.getDevice()); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java index b102834..bc0822f 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java @@ -1,6 +1,7 @@ package com.my.graphiteDigesterBg.task; import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; +import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; @@ -11,6 +12,8 @@ public class TaskSampleTakeOut extends DiTaskBase { @Override public void run() { + MdbOperationLog.log(this.getUser(), "试管架%d : 取出样本", this.slotIndex); + var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); var slot = slotMan.getSlotByIndex(this.slotIndex); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java index 2cb1e41..e537272 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java @@ -5,10 +5,13 @@ import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump; import com.my.graphiteDigesterBg.diframe.actuator.DiActServo; +import com.my.graphiteDigesterBg.model.MdbOperationLog; + @Task(name="StartReset") public class TaskStartReset extends DiTaskBase { @Override public void run() { + MdbOperationLog.log(this.getUser(), "设备初始化"); var runtimeVars = this.getDevice().getRuntimeVariables(); runtimeVars.setString("IsDeviceReady", "NO"); runtimeVars.setString("IsTaskStartResetExecuting", "YES"); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStopReset.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStopReset.java index b76ea66..e10e923 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStopReset.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStopReset.java @@ -1,11 +1,14 @@ package com.my.graphiteDigesterBg.task; import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; +import com.my.graphiteDigesterBg.model.MdbOperationLog; @Task(name="StopReset") public class TaskStopReset extends DiTaskBase { @Override public void run() { this.setStatus(TaskStatus.RUNNING); + MdbOperationLog.log(this.getUser(), "停止复位"); + // @TODO : 停止并复位 try { Thread.sleep(3000); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskTubeMoveToErrorSlot.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskTubeMoveToErrorSlot.java index d8ddd4f..4aad685 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskTubeMoveToErrorSlot.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskTubeMoveToErrorSlot.java @@ -1,6 +1,7 @@ package com.my.graphiteDigesterBg.task; import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; +import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate; import com.my.graphiteDigesterBg.move.MoveTubeToErrorRackSlot; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; @@ -13,6 +14,7 @@ public class TaskTubeMoveToErrorSlot extends DiTaskBase { @Override public void run() { this.setStatus(TaskStatus.RUNNING); + var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); var errorSlot = slotMan.getErrorSlot(); var emptyTubeIndexList = errorSlot.allocEmptyTubeIndexes(this.tubeIndexList.size()); @@ -27,6 +29,8 @@ public class TaskTubeMoveToErrorSlot extends DiTaskBase { throw new RuntimeException("liquid plate slot not found"); } + MdbOperationLog.log(this.getUser(), "试管架%d移动试管到异常位", slotIndex); + // move tube rack from liquid plate to heat plate var move = new MoveMoveTubeRackFromLiquidPlateToHeatPlate(); move.setDevice(this.getDevice()); diff --git a/src/web/src/pages/main/contents/History.vue b/src/web/src/pages/main/contents/History.vue index 07c2294..a06048c 100644 --- a/src/web/src/pages/main/contents/History.vue +++ b/src/web/src/pages/main/contents/History.vue @@ -1,29 +1,75 @@ +
+ + + +
+ \ No newline at end of file diff --git a/src/web/src/utils/ApiClient.js b/src/web/src/utils/ApiClient.js index b48964e..d2039bc 100644 --- a/src/web/src/utils/ApiClient.js +++ b/src/web/src/utils/ApiClient.js @@ -126,4 +126,9 @@ export default class ApiClient { async resourceActionExecute(name, action, params) { return await this.call('resource/action-execute',{name,action, params}); } + + // operation log list + async operationLogList(params) { + return await this.call('operation-log/list', params); + } } \ No newline at end of file