sige 1 year ago
parent
commit
ff16c5c25c
  1. 42
      src/src/main/java/com/my/graphiteDigesterBg/api/ApiOperationLog.java
  2. 8
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecord.java
  3. 2
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecordCriteria.java
  4. 3
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java
  5. 14
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java
  6. 11
      src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java
  7. 12
      src/src/main/java/com/my/graphiteDigesterBg/diframe/mapper/DiActiveRecordMapper.java
  8. 32
      src/src/main/java/com/my/graphiteDigesterBg/model/MdbOperationLog.java
  9. 3
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java
  10. 3
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorClose.java
  11. 3
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorOpen.java
  12. 3
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java
  13. 3
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java
  14. 2
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java
  15. 3
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java
  16. 2
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java
  17. 3
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java
  18. 3
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java
  19. 3
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskStopReset.java
  20. 4
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskTubeMoveToErrorSlot.java
  21. 90
      src/web/src/pages/main/contents/History.vue
  22. 5
      src/web/src/utils/ApiClient.js

42
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<String,Object> 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<Map<String,Object>>();
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));
}
}

8
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecord.java

@ -90,6 +90,14 @@ public class DiActiveRecord {
return model; return model;
} }
// count by criteria
public static Integer count( Class<? extends DiActiveRecord> 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 // find all by criteria
public static <T extends DiActiveRecord> List<T> find( Class<T> modelClass, DiActiveRecordCriteria criteria ) { public static <T extends DiActiveRecord> List<T> find( Class<T> modelClass, DiActiveRecordCriteria criteria ) {
criteria.tableName = DiActiveRecord.getTableNameFromModelClass(modelClass); criteria.tableName = DiActiveRecord.getTableNameFromModelClass(modelClass);

2
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecordCriteria.java

@ -7,4 +7,6 @@ public class DiActiveRecordCriteria {
public Map<String,Object> conditions; public Map<String,Object> conditions;
// limit // limit
public Integer limit; public Integer limit;
// offset
public Integer offset;
} }

3
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java

@ -1,4 +1,5 @@
package com.my.graphiteDigesterBg.diframe; package com.my.graphiteDigesterBg.diframe;
import com.my.graphiteDigesterBg.diframe.model.DiMdbUser;
public interface DiTask { public interface DiTask {
// task status // task status
enum TaskStatus { NEW, RUNNING, FINISHED, CANCELLED, WAITING, READY } enum TaskStatus { NEW, RUNNING, FINISHED, CANCELLED, WAITING, READY }
@ -15,4 +16,6 @@ public interface DiTask {
// stop // stop
void stop(); void stop();
void setStatus(TaskStatus status); void setStatus(TaskStatus status);
void setUser(DiMdbUser user);
DiMdbUser getUser();
} }

14
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java

@ -1,4 +1,5 @@
package com.my.graphiteDigesterBg.diframe; package com.my.graphiteDigesterBg.diframe;
import com.my.graphiteDigesterBg.diframe.model.DiMdbUser;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
abstract public class DiTaskBase implements DiTask { abstract public class DiTaskBase implements DiTask {
@ -12,11 +13,14 @@ abstract public class DiTaskBase implements DiTask {
private TaskStatus status; private TaskStatus status;
// request task stop // request task stop
private Boolean isRequestTaskStop = false; private Boolean isRequestTaskStop = false;
// user
private DiMdbUser user;
// constructor // constructor
public DiTaskBase() { public DiTaskBase() {
this.uuid = java.util.UUID.randomUUID().toString(); this.uuid = java.util.UUID.randomUUID().toString();
this.status = TaskStatus.NEW; this.status = TaskStatus.NEW;
this.user = null;
} }
@Override @Override
@ -48,6 +52,16 @@ abstract public class DiTaskBase implements DiTask {
this.device = device; this.device = device;
} }
@Override
public void setUser(DiMdbUser user) {
this.user = user;
}
// get user
public DiMdbUser getUser() {
return this.user;
}
// run // run
@Override @Override
public void run() { public void run() {

11
src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java

@ -1,6 +1,8 @@
package com.my.graphiteDigesterBg.diframe.api; package com.my.graphiteDigesterBg.diframe.api;
import com.my.graphiteDigesterBg.diframe.*; import com.my.graphiteDigesterBg.diframe.*;
import com.my.graphiteDigesterBg.diframe.model.DiMdbUser;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
@ -23,7 +25,13 @@ public class DiApiTask extends DiApiControllerBase {
*/ */
@ResponseBody @ResponseBody
@PostMapping("/api/task/append") @PostMapping("/api/task/append")
public DiApiResponse append(@RequestBody Map<String,Object> params) {
public DiApiResponse append(HttpServletRequest request, @RequestBody Map<String,Object> 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(); DiTaskExecutor executor = this.device.getTaskManager().getExecutor();
if ( null == executor ) { if ( null == executor ) {
return this.error("task executor is not running"); return this.error("task executor is not running");
@ -33,6 +41,7 @@ public class DiApiTask extends DiApiControllerBase {
Object taskParams = params.get("params"); Object taskParams = params.get("params");
DiTaskManager taskManager = this.device.getTaskManager(); DiTaskManager taskManager = this.device.getTaskManager();
DiTask task = taskManager.generateTask(name, taskParams); DiTask task = taskManager.generateTask(name, taskParams);
task.setUser(user);
executor.appendTask(task); executor.appendTask(task);
return this.success(Map.of("id", task.getUUID())); return this.success(Map.of("id", task.getUUID()));
} }

12
src/src/main/java/com/my/graphiteDigesterBg/diframe/mapper/DiActiveRecordMapper.java

@ -15,10 +15,22 @@ public interface DiActiveRecordMapper {
"</if> " + "</if> " +
"ORDER BY id DESC " + "ORDER BY id DESC " +
"<if test='limit != null'>LIMIT #{limit}</if> " + "<if test='limit != null'>LIMIT #{limit}</if> " +
"<if test='offset != null'>OFFSET #{offset}</if>" +
"</script>" "</script>"
) )
List<Map<String,Object>> find(DiActiveRecordCriteria criteria); List<Map<String,Object>> find(DiActiveRecordCriteria criteria);
@Select(
"<script>" +
"SELECT COUNT(*) FROM ${tableName} " +
"<if test='conditions != null'>" +
"WHERE " +
"<foreach collection='conditions' item='value' index='key' separator=' AND '>${key} = #{value}</foreach>" +
"</if>" +
"</script>"
)
Integer count(DiActiveRecordCriteria criteria);
@Select("SELECT * FROM ${tableName} WHERE id = #{id}") @Select("SELECT * FROM ${tableName} WHERE id = #{id}")
Map<String,Object> findById(String tableName, Integer id); Map<String,Object> findById(String tableName, Integer id);

32
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();
}
}

3
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.DiTaskStepTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.model.MdbDigestionTask; import com.my.graphiteDigesterBg.model.MdbDigestionTask;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager;
import java.util.Map; import java.util.Map;
@ -25,6 +26,8 @@ public class TaskDigestion extends DiTaskStepTaskBase {
slot.digestionName = taskModel.name; slot.digestionName = taskModel.name;
this.loadStepsByJson(taskModel.steps); this.loadStepsByJson(taskModel.steps);
MdbOperationLog.log(this.getUser(), "试管架%d : 执行预设【%s】", this.slotIndex, taskModel.name);
} }
@Override @Override

3
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.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
@Task(name="DoorClose") @Task(name="DoorClose")
public class TaskDoorClose extends DiTaskBase { public class TaskDoorClose extends DiTaskBase {
@Override @Override
public void run() { public void run() {
this.setStatus(TaskStatus.RUNNING); this.setStatus(TaskStatus.RUNNING);
MdbOperationLog.log(this.getUser(), "关闭设备门");
DiActMotor doorMotor = this.getActuator(MyDevice.ACT_DOOR_MOTOR, DiActMotor.class); DiActMotor doorMotor = this.getActuator(MyDevice.ACT_DOOR_MOTOR, DiActMotor.class);
doorMotor.moveToIO(1, 1); doorMotor.moveToIO(1, 1);

3
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.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
@Task(name="DoorOpen") @Task(name="DoorOpen")
public class TaskDoorOpen extends DiTaskBase { public class TaskDoorOpen extends DiTaskBase {
@Override @Override
public void run() { public void run() {
this.setStatus(TaskStatus.RUNNING); this.setStatus(TaskStatus.RUNNING);
MdbOperationLog.log(this.getUser(), "打开设备门");
DiActMotor doorMotor = this.getActuator(MyDevice.ACT_DOOR_MOTOR, DiActMotor.class); DiActMotor doorMotor = this.getActuator(MyDevice.ACT_DOOR_MOTOR, DiActMotor.class);
doorMotor.reset(); doorMotor.reset();

3
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.DiTask;
import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -20,6 +21,8 @@ public class TaskHeating extends DiTaskBase {
@Override @Override
public void run() { public void run() {
MdbOperationLog.log(this.getUser(), "试管架%d : 样本加热 温度=%d, 时间=%d", this.slotIndex, this.temperature, this.duration);
var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class);
var slot = slotMan.getSlotByIndex(this.slotIndex); var slot = slotMan.getSlotByIndex(this.slotIndex);
slot.destTemperature = this.temperature; slot.destTemperature = this.temperature;

3
src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java

@ -1,6 +1,7 @@
package com.my.graphiteDigesterBg.task; package com.my.graphiteDigesterBg.task;
import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
import com.my.graphiteDigesterBg.move.MoveLiquidAdd; import com.my.graphiteDigesterBg.move.MoveLiquidAdd;
import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate;
import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate;
@ -26,6 +27,8 @@ public class TaskLiquidAdd extends DiTaskBase {
moveTubeRackFromHeatPlateToLiquidPlate.slotIndex = this.slotIndex; moveTubeRackFromHeatPlateToLiquidPlate.slotIndex = this.slotIndex;
moveTubeRackFromHeatPlateToLiquidPlate.run(); moveTubeRackFromHeatPlateToLiquidPlate.run();
MdbOperationLog.log(this.getUser(), "试管架%d : 样本加液 类型=%s, 加液量=%d", this.slotIndex, this.liquidType, this.liquidVolume);
// add liquid // add liquid
var liquidAdd = new MoveLiquidAdd(); var liquidAdd = new MoveLiquidAdd();
liquidAdd.setDevice(this.getDevice()); liquidAdd.setDevice(this.getDevice());

2
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.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager;
@ -17,6 +18,7 @@ public class TaskSampleAdd extends DiTaskBase {
public void run() { public void run() {
ResHeatingTubeRackSlotManager slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); ResHeatingTubeRackSlotManager slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class);
ResHeatingTubeRackSlot slot = slotMan.allocFreeSlot(); ResHeatingTubeRackSlot slot = slotMan.allocFreeSlot();
MdbOperationLog.log(this.getUser(), "试管架%d : 放入样本", slot.index);
DiActMotor transLrMotor = this.getActuator(MyDevice.ACT_TRANSFER_LR_MOTOR, DiActMotor.class); DiActMotor transLrMotor = this.getActuator(MyDevice.ACT_TRANSFER_LR_MOTOR, DiActMotor.class);
DiActMotor transUdMotor = this.getActuator(MyDevice.ACT_TRANSFER_UD_MOTOR, DiActMotor.class); DiActMotor transUdMotor = this.getActuator(MyDevice.ACT_TRANSFER_UD_MOTOR, DiActMotor.class);

3
src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java

@ -1,6 +1,7 @@
package com.my.graphiteDigesterBg.task; package com.my.graphiteDigesterBg.task;
import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager;
@ -22,6 +23,8 @@ public class TaskSampleMoveToHeatPlate extends DiTaskBase {
throw new RuntimeException("liquid plate slot not found"); throw new RuntimeException("liquid plate slot not found");
} }
MdbOperationLog.log(this.getUser(), "试管架%d : 样本移至加热区", slotIndex);
var move = new MoveMoveTubeRackFromLiquidPlateToHeatPlate(); var move = new MoveMoveTubeRackFromLiquidPlateToHeatPlate();
move.setDevice(this.getDevice()); move.setDevice(this.getDevice());
move.slotIndex = slotIndex; move.slotIndex = slotIndex;

2
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.MyDevice;
import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate;
@Task(name="SampleMoveToLiquidPlate") @Task(name="SampleMoveToLiquidPlate")
public class TaskSampleMoveToLiquidPlate extends DiTaskBase { public class TaskSampleMoveToLiquidPlate extends DiTaskBase {
@ -11,6 +12,7 @@ public class TaskSampleMoveToLiquidPlate extends DiTaskBase {
@Override @Override
public void run() { public void run() {
this.setStatus(TaskStatus.RUNNING); this.setStatus(TaskStatus.RUNNING);
MdbOperationLog.log(this.getUser(), "试管架%d : 样本移至加液区", this.slotIndex);
var move = new MoveMoveTubeRackFromHeatPlateToLiquidPlate(); var move = new MoveMoveTubeRackFromHeatPlateToLiquidPlate();
move.setDevice(this.getDevice()); move.setDevice(this.getDevice());

3
src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java

@ -1,6 +1,7 @@
package com.my.graphiteDigesterBg.task; package com.my.graphiteDigesterBg.task;
import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager;
@ -11,6 +12,8 @@ public class TaskSampleTakeOut extends DiTaskBase {
@Override @Override
public void run() { public void run() {
MdbOperationLog.log(this.getUser(), "试管架%d : 取出样本", this.slotIndex);
var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class);
var slot = slotMan.getSlotByIndex(this.slotIndex); var slot = slotMan.getSlotByIndex(this.slotIndex);

3
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.DiActMotor;
import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump; import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump;
import com.my.graphiteDigesterBg.diframe.actuator.DiActServo; import com.my.graphiteDigesterBg.diframe.actuator.DiActServo;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
@Task(name="StartReset") @Task(name="StartReset")
public class TaskStartReset extends DiTaskBase { public class TaskStartReset extends DiTaskBase {
@Override @Override
public void run() { public void run() {
MdbOperationLog.log(this.getUser(), "设备初始化");
var runtimeVars = this.getDevice().getRuntimeVariables(); var runtimeVars = this.getDevice().getRuntimeVariables();
runtimeVars.setString("IsDeviceReady", "NO"); runtimeVars.setString("IsDeviceReady", "NO");
runtimeVars.setString("IsTaskStartResetExecuting", "YES"); runtimeVars.setString("IsTaskStartResetExecuting", "YES");

3
src/src/main/java/com/my/graphiteDigesterBg/task/TaskStopReset.java

@ -1,11 +1,14 @@
package com.my.graphiteDigesterBg.task; package com.my.graphiteDigesterBg.task;
import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
@Task(name="StopReset") @Task(name="StopReset")
public class TaskStopReset extends DiTaskBase { public class TaskStopReset extends DiTaskBase {
@Override @Override
public void run() { public void run() {
this.setStatus(TaskStatus.RUNNING); this.setStatus(TaskStatus.RUNNING);
MdbOperationLog.log(this.getUser(), "停止复位");
// @TODO : 停止并复位 // @TODO : 停止并复位
try { try {
Thread.sleep(3000); Thread.sleep(3000);

4
src/src/main/java/com/my/graphiteDigesterBg/task/TaskTubeMoveToErrorSlot.java

@ -1,6 +1,7 @@
package com.my.graphiteDigesterBg.task; package com.my.graphiteDigesterBg.task;
import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.DiTaskBase;
import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate;
import com.my.graphiteDigesterBg.move.MoveTubeToErrorRackSlot; import com.my.graphiteDigesterBg.move.MoveTubeToErrorRackSlot;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager;
@ -13,6 +14,7 @@ public class TaskTubeMoveToErrorSlot extends DiTaskBase {
@Override @Override
public void run() { public void run() {
this.setStatus(TaskStatus.RUNNING); this.setStatus(TaskStatus.RUNNING);
var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class);
var errorSlot = slotMan.getErrorSlot(); var errorSlot = slotMan.getErrorSlot();
var emptyTubeIndexList = errorSlot.allocEmptyTubeIndexes(this.tubeIndexList.size()); var emptyTubeIndexList = errorSlot.allocEmptyTubeIndexes(this.tubeIndexList.size());
@ -27,6 +29,8 @@ public class TaskTubeMoveToErrorSlot extends DiTaskBase {
throw new RuntimeException("liquid plate slot not found"); throw new RuntimeException("liquid plate slot not found");
} }
MdbOperationLog.log(this.getUser(), "试管架%d移动试管到异常位", slotIndex);
// move tube rack from liquid plate to heat plate // move tube rack from liquid plate to heat plate
var move = new MoveMoveTubeRackFromLiquidPlateToHeatPlate(); var move = new MoveMoveTubeRackFromLiquidPlateToHeatPlate();
move.setDevice(this.getDevice()); move.setDevice(this.getDevice());

90
src/web/src/pages/main/contents/History.vue

@ -1,29 +1,75 @@
<template> <template>
<div class="p-1">
<a-table :dataSource="dataSource" :columns="columns"></a-table>
</div>
</template>
<div class="p-1">
<a-table
:pagination="pagination"
:dataSource="dataSource"
:columns="columns"
@change="actionTableChange"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'user'">
{{ record.user.account }}
</template>
<template v-else-if="column.key === 'time'">
{{ formatTime(record.time) }}
</template>
</template>
</a-table>
</div>
</template>
<script setup> <script setup>
import { ref } from 'vue';
import ApiClient from '@/utils/ApiClient';
import { onMounted, ref } from 'vue';
/** @var {Array<Object>} */ /** @var {Array<Object>} */
const columns = [ const columns = [
{key:'account',dataIndex:'account',title:'用户',align:'center'},
{key:'slot',dataIndex:'slot',title:'试管架',align:'center'},
{key:'action',dataIndex:'action',title:'动作',align:'center'},
{key:'createdAt',dataIndex: 'createdAt',title:'时间',align:'center'},
{key:'user',dataIndex:'user',title:'用户',align:'left'},
{key:'content',dataIndex:'content',title:'操作',align:'left'},
{key:'time',dataIndex: 'time',title:'时间',align:'right'},
]; ];
/** @var {Array<Object>} */ /** @var {Array<Object>} */
const dataSource = ref([
{account:'admin',slot:'A-1',action:'加入试管',createdAt:'2021-08-01 12:00:00'},
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'},
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'},
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'},
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'},
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'},
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'},
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'},
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'},
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'},
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'},
]);
const dataSource = ref([]);
/** @var {Object} */
const pagination = ref({
current: 1,
pageSize: 10,
total: 0,
showSizeChanger: false,
});
// on mounted
onMounted(mounted);
// on mounted
async function mounted() {
await refresh();
}
// format time
function formatTime(time) {
let date = new Date(time * 1000);
let year = date.getFullYear();
let month = (date.getMonth()+1).toString().padStart(2,'0');
let day = (date.getDate()).toString().padStart(2,'0');
let hour = (date.getHours()).toString().padStart(2,'0');
let minute = (date.getMinutes()).toString().padStart(2,'0');
let second = (date.getSeconds()).toString().padStart(2,'0');
return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
}
// refresh
async function refresh() {
let client = ApiClient.getClient();
let response = await client.operationLogList({
offset : (pagination.value.current-1)*pagination.value.pageSize,
limit : pagination.value.pageSize,
});
dataSource.value = response.list;
pagination.value.total = response.total;
}
// action table change
async function actionTableChange(page) {
pagination.value.current = page.current;
pagination.value.pageSize = page.pageSize;
await refresh();
}
</script> </script>

5
src/web/src/utils/ApiClient.js

@ -126,4 +126,9 @@ export default class ApiClient {
async resourceActionExecute(name, action, params) { async resourceActionExecute(name, action, params) {
return await this.call('resource/action-execute',{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);
}
} }
Loading…
Cancel
Save