sige 2 years ago
parent
commit
308694af26
  1. BIN
      doc/A8000测试流程(非最终稿)第二版 2023.5.15.xlsx
  2. 7
      src/main/java/com/dreamworks/boditech/controller/AccountController.java
  3. 10
      src/main/java/com/dreamworks/boditech/controller/DeviceController.java
  4. 10
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeBox.java
  5. 59
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeManager.java
  6. 17
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTube.java
  7. 79
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTubeManager.java
  8. 12
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardBox.java
  9. 12
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java
  10. 82
      src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java
  11. 13
      src/main/java/com/dreamworks/boditech/entity/Project.java
  12. 5
      src/main/java/com/dreamworks/boditech/service/AccountService.java
  13. 5
      src/main/java/com/dreamworks/boditech/service/ActionLogService.java
  14. 3
      src/main/java/com/dreamworks/boditech/service/DeviceService.java
  15. 32
      src/main/java/com/dreamworks/boditech/service/ProjectService.java

BIN
doc/A8000测试流程(非最终稿)第二版 2023.5.15.xlsx

7
src/main/java/com/dreamworks/boditech/controller/AccountController.java

@ -37,7 +37,12 @@ public class AccountController extends BaseController {
return this.success();
}
@ResponseBody
@PostMapping("/api/account/current-get")
public ApiResponse get() {
Account user = this.accountService.getCurAccount();
return this.success(user);
}

10
src/main/java/com/dreamworks/boditech/controller/DeviceController.java

@ -60,16 +60,6 @@ public class DeviceController extends BaseController {
@ResponseBody
@PostMapping("/api/device/load")
public ApiResponse load() {
if ( !this.deviceEnable ) { // @TODO: 测试完成后删除
// this.deviceService.device.testCards.appendByBoxCode(0, "1||CAGGB66U||2024.03.26||1279||06");
// this.deviceService.device.testCards.appendByBoxCode(1, "2||CAGGB66U||2024.03.26||1279||06");
// this.deviceService.device.testCards.appendByBoxCode(2, "3||CAGGB66U||2024.03.26||1279||06");
// this.deviceService.device.testCards.appendByBoxCode(3, "4||CAGGB66U||2024.03.26||1279||06");
// this.deviceService.device.testCards.appendByBoxCode(4, "5||CAGGB66U||2024.03.26||1279||06");
// this.deviceService.device.testCards.appendByBoxCode(5, "6||CAGGB66U||2024.03.26||1279||06");
return this.success();
}
this.deviceService.load();
return this.success();
}

10
src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeBox.java

@ -1,10 +1,16 @@
package com.dreamworks.boditech.driver.consumable;
public class CsmBufferTubeBox {
public static final String STATUS_NOT_LOADED = "NOT_LOADED";
// index of buffer tube box : 0 - 5
public Integer index;
// if the buffer tube box is loaded
public Boolean isLoaded = false;
public Integer projectId;
public String projectName;
public String projectColor;
public Integer tubeAmount;
public static final String STATUS_NOT_LOADED = "NOT_LOADED";
public static final String STATUS_LOADED = "LOADED";
public String status;
}

59
src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeManager.java

@ -1,9 +1,12 @@
package com.dreamworks.boditech.driver.consumable;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.entity.ParamBufferTubeUpdateByBox;
import com.dreamworks.boditech.entity.IdChip;
import com.dreamworks.boditech.entity.Project;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class CsmBufferTubeManager {
// device instance
private final Device device;
@ -24,15 +27,6 @@ public class CsmBufferTubeManager {
box.status = CsmBufferTubeBox.STATUS_NOT_LOADED;
this.bufferTubeBoxes.add(box);
}
// @TODO : 移除demo数据
if ( !this.device.enable ) {
for ( int i=0; i<6; i++ ) {
CsmBufferTubeBox box = this.bufferTubeBoxes.get(i);
box.tubeAmount = 25;
box.projectName = "demo" + i;
}
}
}
// get all buffer tube boxes
@ -48,37 +42,40 @@ public class CsmBufferTubeManager {
/**
* append buffer tube by box code string
* code example : 1||CAGGB66U||2024.03.26||1279||06
* code format : projectCodeNum||lotCode||expireDate||unknown||unknown
* @param index
* @param code
* code example : 01CAGGB66U
* code format : [projectCodeNum(2)][lotCode(8)]
* @link <a href="https://qianqianquege.com/qrcode/barcode/">Generate barcode</a>
* @param index - position of buffer tube in cell
* @param code - box code string
*/
public void appendByCode( Integer index, String code ) {
// @TODO : 由于缺少 code 格式所以都做 "hsCRP" 项目处理
String projectName = "hsCRP";
Project project = this.device.projectService.findByName(projectName);
if ( null == project ) {
throw new RuntimeException("project not found");
String lotCode = code.substring(2);
Integer projectCode = Integer.parseInt(code.substring(0, 2));
Project project = this.device.projectService.activeProjectGetByCodeNum(projectCode, lotCode);
if (!Objects.equals(project.posIndex, index)) {
throw new RuntimeException("BUFFER_TUBE_PROJECT_NOT_MATCHED");
}
// remove all buffer tube A with matched zoneIndex
this.bufferTubeList.removeIf(bufferTubeA -> bufferTubeA.areaIndex.equals(index));
for ( int i=0; i<25; i++ ) {
// append new buffer tube A
CsmBufferTube bufferTube = new CsmBufferTube(this);
bufferTube.areaIndex = index;
bufferTube.position = i;
bufferTube.projectName = project.name;
// @TODO : 这里没法判断是那种盖子所以都做 500μl 处理
bufferTube.coverType = CsmBufferTube.COVER_TYPE_150;
this.bufferTubeList.add(bufferTube);
}
CsmBufferTubeBox box = this.bufferTubeBoxes.get(index);
box.projectName = project.name;
box.projectId = project.id;
box.projectColor = project.color;
box.tubeAmount = 25;
box.isLoaded = true;
box.status = CsmBufferTubeBox.STATUS_LOADED;
}
// list of buffer tube
private final List<CsmBufferTube> bufferTubeList = new ArrayList<>();

17
src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTube.java

@ -1,11 +1,28 @@
package com.dreamworks.boditech.driver.consumable;
public class CsmLargeBufferTube {
// index of tube : 0 - 5
public Integer index = -1;
// if the tube is loaded
public Boolean isLoaded = false;
// position
public Integer position = -1;
// project id
public Integer projectId = 0;
// project name
public String projectName = "";
// project color
public String projectColor = "";
// amount
public Integer amount;
public static final String STATUS_NOT_LOADED = "NOT_LOADED";
public static final String STATUS_LOADED = "LOADED";
// status
public String status = CsmLargeBufferTube.STATUS_NOT_LOADED;
// exists
public Boolean exists = false;

79
src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTubeManager.java

@ -4,6 +4,7 @@ import com.dreamworks.boditech.driver.entity.ParamLargeBufferTubeUpdate;
import com.dreamworks.boditech.entity.Project;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class CsmLargeBufferTubeManager {
// device instance
private final Device device;
@ -13,13 +14,11 @@ public class CsmLargeBufferTubeManager {
// constructor
public CsmLargeBufferTubeManager(Device device) {
this.device = device;
//@TODO: demo 数据
for ( int i=0; i<6; i++ ) {
CsmLargeBufferTube tube = new CsmLargeBufferTube(this);
tube.position = i;
tube.amount = 15;
tube.projectName = "demo" + i;
tube.index = i;
tube.status = CsmLargeBufferTube.STATUS_NOT_LOADED;
this.largeBufferTubes.add(tube);
}
}
@ -35,27 +34,67 @@ public class CsmLargeBufferTubeManager {
}
/**
* append large buffer tube by box code
* @param code box code string
* append large buffer tube by box code string
* code example : 01CAGGB66U
* code format : [projectCodeNum(2)][lotCode(8)]
* @link <a href="https://qianqianquege.com/qrcode/barcode/">Generate barcode</a>
* @param index - position of buffer tube in cell
* @param code - box code string
*/
public void appendByCode( Integer position, String code ) {
// @TODO : code 格式暂无所以都做 "hsCRP" 项目处理
String projectName = "hsCRP";
Project project = this.device.projectService.findByName(projectName);
if ( null == project ) {
throw new RuntimeException("project not found");
public void appendByCode( Integer index, String code ) {
String lotCode = code.substring(2);
Integer projectCode = Integer.parseInt(code.substring(0, 2));
Project project = this.device.projectService.activeProjectGetByCodeNum(projectCode, lotCode);
if (!Objects.equals(project.posIndex, index)) {
throw new RuntimeException("BUFFER_TUBE_PROJECT_NOT_MATCHED");
}
// remove all large buffer tubes with matched position
this.largeBufferTubes.removeIf(largeBufferTube -> largeBufferTube.position.equals(position));
// append new large buffer tubes
CsmLargeBufferTube largeBufferTube = new CsmLargeBufferTube(this);
largeBufferTube.position = position;
largeBufferTube.projectName = "hsCRP";
this.largeBufferTubes.add(largeBufferTube);
CsmLargeBufferTube box = this.largeBufferTubes.get(index);
box.projectName = project.name;
box.projectId = project.id;
box.projectColor = project.color;
box.amount = 25;
box.isLoaded = true;
box.status = CsmLargeBufferTube.STATUS_LOADED;
}
// get large buffer tube
public CsmLargeBufferTube getTubeByProjectName( String projectName ) {
CsmLargeBufferTube tube = null;

12
src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardBox.java

@ -1,12 +1,10 @@
package com.dreamworks.boditech.driver.consumable;
public class CsmTestCardBox {
// status of test card box : OK
public static final String STATUS_OK = "OK";
/**
* index of test card box : 0 - 5
*/
// index of test card box : 0 - 5
public Integer index = -1;
// if the test card box is loaded
public Boolean isLoaded = false;
public Integer projectId;
public String projectName;
@ -15,6 +13,8 @@ public class CsmTestCardBox {
public String lotCode;
public Integer cardAmount = 0;
// status of test card box : OK
public static final String STATUS_OK = "OK";
/**
* status of test card box :
* <li>- OK

12
src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java

@ -16,18 +16,9 @@ public class CsmTestCardManager {
// constructor
public CsmTestCardManager(Device device) {
this.device = device;
String[] colors = new String[]{"red", "green", "blue", "yellow", "purple", "orange"};
for ( int i=0; i<6; i++ ) {
CsmTestCardBox box = new CsmTestCardBox();
box.index = i;
// @TODO : demo 数据
box.projectName = "demo" + i;
box.projectId = 1;
box.projectColor = colors[i];
this.testCardBoxes.add(box);
}
}
@ -76,12 +67,13 @@ public class CsmTestCardManager {
}
Integer projectCodeNum = Integer.parseInt(parts[0]);
Project project = this.device.projectService.activeProjectByCodeNum(projectCodeNum);
Project project = this.device.projectService.activeProjectByCodeNum(index, projectCodeNum, box.lotCode);
box.projectId = project.id;
box.projectName = project.name;
box.projectColor = project.color;
box.cardAmount = 25;
box.status = CsmTestCardBox.STATUS_OK;
box.isLoaded = true;
}

82
src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java

@ -5,16 +5,20 @@ import com.dreamworks.boditech.driver.actuator.ActCodeScanner;
import com.dreamworks.boditech.driver.actuator.ActModuleTestCardBoxCase;
import com.dreamworks.boditech.driver.actuator.ActuatorModule;
public class TaskLoad extends TaskBase {
// arm xy
private ActArmXY armXY;
@Override
public void execute(Executor executor) {
Device device = executor.getDevice();
ActArmXY armXY = (ActArmXY)device.getActuator(ActuatorModule.ARM_XY);
this.armXY = (ActArmXY)device.getActuator(ActuatorModule.ARM_XY);
try {
this.testCardLoad(executor);
this.bufferTubeLoad(executor);
this.largeBufferTubeLoad(executor);
} catch (RuntimeException e) {
armXY.reset();
this.armXY.reset();
throw e;
}
}
@ -22,7 +26,16 @@ public class TaskLoad extends TaskBase {
// load test card
private void testCardLoad(Executor executor) {
Device device = executor.getDevice();
ActArmXY armXY = (ActArmXY)device.getActuator(ActuatorModule.ARM_XY);
if ( !device.enable ) { // @TODO : 移除测试数据
device.testCards.appendByBoxCode(0, "1||CAGGB66U||2024.03.26||1279||06");
device.testCards.appendByBoxCode(1, "2||CAGGB66U||2024.03.26||1279||06");
device.testCards.appendByBoxCode(2, "3||CAGGB66U||2024.03.26||1279||06");
device.testCards.appendByBoxCode(3, "4||CAGGB66U||2024.03.26||1279||06");
device.testCards.appendByBoxCode(4, "5||CAGGB66U||2024.03.26||1279||06");
device.testCards.appendByBoxCode(5, "6||CAGGB66U||2024.03.26||1279||06");
return ;
}
ActCodeScanner codeScanner = (ActCodeScanner)device.getActuator(ActuatorModule.ARM_Z_SCANNER);
// 检查试卡盒仓盖是否关闭
@ -35,7 +48,7 @@ public class TaskLoad extends TaskBase {
Integer scanStartY = device.getLocationByName("testCardScanStart.y");
Integer scanDistance = device.getLocationByName("testCardBoxScanDistance");
for ( int i=0; i<6; i++ ) {
armXY.moveTo(scanStartX, scanStartY + i * scanDistance);
this.armXY.moveTo(scanStartX, scanStartY + i * scanDistance);
String code = codeScanner.scan(500);
if ( "".equals(code) ) {
continue ;
@ -43,13 +56,22 @@ public class TaskLoad extends TaskBase {
device.testCards.appendByBoxCode(i, code);
}
armXY.reset();
this.armXY.reset();
}
// load buffer tube
private void bufferTubeLoad(Executor executor) {
Device device = executor.getDevice();
ActArmXY armXY = (ActArmXY)device.getActuator(ActuatorModule.ARM_XY);
if ( !device.enable ) { // @TODO : 移除测试数据
device.bufferTubes.appendByCode(0, "01CAGGB66U");
device.bufferTubes.appendByCode(1, "02CAGGB66U");
device.bufferTubes.appendByCode(2, "03CAGGB66U");
device.bufferTubes.appendByCode(3, "04CAGGB66U");
device.bufferTubes.appendByCode(4, "05CAGGB66U");
device.bufferTubes.appendByCode(5, "06CAGGB66U");
return ;
}
ActCodeScanner codeScanner = (ActCodeScanner)device.getActuator(ActuatorModule.ARM_Z_SCANNER);
Integer scanStartX = device.getLocationByName("bufferTubeLineOneScanStart.x");
@ -57,7 +79,7 @@ public class TaskLoad extends TaskBase {
// buffer tube line one
for ( int i=0; i<3; i++ ) {
armXY.moveTo(scanStartX - i * 1200, scanStartY);
this.armXY.moveTo(scanStartX - i * 1200, scanStartY);
String code = codeScanner.scan(500);
if ( "".equals(code) ) {
continue ;
@ -69,7 +91,7 @@ public class TaskLoad extends TaskBase {
scanStartX = device.getLocationByName("bufferTubeLineTwoScanStart.x");
scanStartY = device.getLocationByName("bufferTubeLineTwoScanStart.y");
for ( int i=0; i<3; i++ ) {
armXY.moveTo(scanStartX - i * 1200, scanStartY);
this.armXY.moveTo(scanStartX - i * 1200, scanStartY);
String code = codeScanner.scan(500);
if ( "".equals(code) ) {
continue ;
@ -77,6 +99,48 @@ public class TaskLoad extends TaskBase {
device.bufferTubes.appendByCode(i+3, code);
}
armXY.reset();
this.armXY.reset();
}
// load large buffer tube
private void largeBufferTubeLoad(Executor executor) {
Device device = executor.getDevice();
if ( !device.enable ) { // @TODO : 移除测试数据
device.largeBufferTubes.appendByCode(0, "01CAGGB66U");
device.largeBufferTubes.appendByCode(1, "02CAGGB66U");
device.largeBufferTubes.appendByCode(2, "03CAGGB66U");
device.largeBufferTubes.appendByCode(3, "04CAGGB66U");
device.largeBufferTubes.appendByCode(4, "05CAGGB66U");
device.largeBufferTubes.appendByCode(5, "06CAGGB66U");
return ;
}
ActCodeScanner codeScanner = (ActCodeScanner)device.getActuator(ActuatorModule.ARM_Z_SCANNER);
Integer scanStartX = device.getLocationByName("largeBufferTubeRowOneScanStart.x");
Integer scanStartY = device.getLocationByName("largeBufferTubeRowOneScanStart.y");
// row one
for ( int i=0; i<3; i++ ) {
this.armXY.moveTo(scanStartX - i * 300, scanStartY);
String code = codeScanner.scan(500);
if ( "".equals(code) ) {
continue ;
}
device.largeBufferTubes.appendByCode(i, code);
}
// row two
scanStartY -= 600;
for ( int i=0; i<3; i++ ) {
this.armXY.moveTo(scanStartX - i * 300, scanStartY);
String code = codeScanner.scan(500);
if ( "".equals(code) ) {
continue ;
}
device.largeBufferTubes.appendByCode(i + 3, code);
}
this.armXY.reset();
}
}

13
src/main/java/com/dreamworks/boditech/entity/Project.java

@ -7,4 +7,17 @@ public class Project {
// color of project
public String color;
public String steps;
/**
* position code in device, available values are 0, 1, 2, 3, 4, 5.
* this property would not be saved in database.
* @NOT-DATABASE-FIELD
*/
public Integer posIndex = 0;
/**
* lot code of project
* @NOT-DATABASE-FIELD
*/
public String lotCode = "";
}

5
src/main/java/com/dreamworks/boditech/service/AccountService.java

@ -20,6 +20,11 @@ public class AccountService {
// current user
private Account curAccount = null;
// get current user
public Account getCurAccount() {
return this.curAccount;
}
// list-login-accounts
public List<Account> listLoginAccounts(Integer limit) {
return this.userMapper.listLoginAccounts(limit);

5
src/main/java/com/dreamworks/boditech/service/ActionLogService.java

@ -2,6 +2,8 @@ package com.dreamworks.boditech.service;
import com.dreamworks.boditech.entity.ActionLogEntry;
import com.dreamworks.boditech.mapper.ActionLogMapper;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@ -10,6 +12,8 @@ import java.util.ArrayList;
import java.util.List;
@Service
public class ActionLogService {
// logger
private static final Logger LOG = LoggerFactory.getLogger(ActionLogService.class);
@Resource
private ActionLogMapper actionLogMapper;
// user id
@ -34,5 +38,6 @@ public class ActionLogService {
entry.params = String.join(",", paramList);
entry.startedAt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
this.actionLogMapper.insert(entry);
LOG.info("[User:{}#{}] {}", entry.userId, entry.action, entry.params);
}
}

3
src/main/java/com/dreamworks/boditech/service/DeviceService.java

@ -16,6 +16,8 @@ public class DeviceService {
public Device device;
@Resource
public RuntimeVariableService runtimeVariableService;
@Resource
private ActionLogService actionLog;
// tasks
private final List<Task> tasks = new ArrayList<>();
@ -39,6 +41,7 @@ public class DeviceService {
* load consumable resources
*/
public void load() {
this.actionLog.log("device.load");
TaskLoad task = new TaskLoad();
Executor.executeTask(this.device, task);
}

32
src/main/java/com/dreamworks/boditech/service/ProjectService.java

@ -14,30 +14,44 @@ public class ProjectService {
private List<Project> projects;
// project colors
private final String[] colors = new String[]{"red", "green", "blue", "yellow", "orange", "pink"};
// project color index
private Integer colorIndex = 0;
@PostConstruct
public void init() {
this.projects = new ArrayList<>();
for ( int i=0; i<6; i++ ) {
this.projects.add(null);
}
}
// active project
public Project activeProjectByCodeNum(Integer codeNum) {
// get active project by given code num
public Project activeProjectGetByCodeNum( Integer codeNum, String lotCode ) {
for ( Project project : this.projects ) {
if ( project.codeNum.equals(codeNum) ) {
if ( null != project
&& project.codeNum.equals(codeNum)
&& project.lotCode.equals(lotCode)
) {
return project;
}
}
throw new RuntimeException("PROJECT_CODE_NOT_ACTIVE");
}
// active project
public Project activeProjectByCodeNum(Integer posIndex, Integer codeNum, String lotCode) {
Project project = this.projects.get(posIndex);
if ( null != project ) {
throw new RuntimeException("PROJECT_CODE_ALREADY_ACTIVE");
}
Project project = this.findByCodeNum(codeNum);
project = this.findByCodeNum(codeNum);
if ( project == null ) {
throw new RuntimeException("PROJECT_CODE_NOT_AVAILABLE");
}
project.color = this.colors[this.colorIndex % this.colors.length];
this.projects.add(project);
this.colorIndex++;
project.posIndex = posIndex;
project.lotCode = lotCode;
project.color = this.colors[posIndex];
this.projects.set(posIndex, project);
return project;
}

Loading…
Cancel
Save