diff --git a/doc/A8000测试流程(非最终稿)第二版 2023.5.15.xlsx b/doc/A8000测试流程(非最终稿)第二版 2023.5.15.xlsx new file mode 100644 index 0000000..b4d2a6b Binary files /dev/null and b/doc/A8000测试流程(非最终稿)第二版 2023.5.15.xlsx differ diff --git a/src/main/java/com/dreamworks/boditech/controller/AccountController.java b/src/main/java/com/dreamworks/boditech/controller/AccountController.java index a64437e..4134130 100644 --- a/src/main/java/com/dreamworks/boditech/controller/AccountController.java +++ b/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); + } diff --git a/src/main/java/com/dreamworks/boditech/controller/DeviceController.java b/src/main/java/com/dreamworks/boditech/controller/DeviceController.java index 2c0d744..d4e4ee1 100644 --- a/src/main/java/com/dreamworks/boditech/controller/DeviceController.java +++ b/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(); } diff --git a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeBox.java b/src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeBox.java index e0ee325..44773a3 100644 --- a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeBox.java +++ b/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; } diff --git a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeManager.java b/src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeManager.java index 208c445..d372ac4 100644 --- a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmBufferTubeManager.java +++ b/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 Generate barcode + * @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 bufferTubeList = new ArrayList<>(); diff --git a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTube.java b/src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTube.java index de9df7b..c5e3008 100644 --- a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTube.java +++ b/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; diff --git a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTubeManager.java b/src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTubeManager.java index ac127e8..2649f30 100644 --- a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmLargeBufferTubeManager.java +++ b/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 Generate barcode + * @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; diff --git a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardBox.java b/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardBox.java index 0c9a8ec..5894bf6 100644 --- a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardBox.java +++ b/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 : *
  • - OK diff --git a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java b/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java index 24b2e5d..3b7f9a0 100644 --- a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java +++ b/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; } diff --git a/src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java b/src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java index 61dfe97..195c679 100644 --- a/src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java +++ b/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(); } } diff --git a/src/main/java/com/dreamworks/boditech/entity/Project.java b/src/main/java/com/dreamworks/boditech/entity/Project.java index 5e66beb..4294be4 100644 --- a/src/main/java/com/dreamworks/boditech/entity/Project.java +++ b/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 = ""; } diff --git a/src/main/java/com/dreamworks/boditech/service/AccountService.java b/src/main/java/com/dreamworks/boditech/service/AccountService.java index 17e2f51..34b107d 100644 --- a/src/main/java/com/dreamworks/boditech/service/AccountService.java +++ b/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 listLoginAccounts(Integer limit) { return this.userMapper.listLoginAccounts(limit); diff --git a/src/main/java/com/dreamworks/boditech/service/ActionLogService.java b/src/main/java/com/dreamworks/boditech/service/ActionLogService.java index 3775ce9..e967530 100644 --- a/src/main/java/com/dreamworks/boditech/service/ActionLogService.java +++ b/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); } } diff --git a/src/main/java/com/dreamworks/boditech/service/DeviceService.java b/src/main/java/com/dreamworks/boditech/service/DeviceService.java index 03d32c7..86349ca 100644 --- a/src/main/java/com/dreamworks/boditech/service/DeviceService.java +++ b/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 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); } diff --git a/src/main/java/com/dreamworks/boditech/service/ProjectService.java b/src/main/java/com/dreamworks/boditech/service/ProjectService.java index 8799215..ec23596 100644 --- a/src/main/java/com/dreamworks/boditech/service/ProjectService.java +++ b/src/main/java/com/dreamworks/boditech/service/ProjectService.java @@ -14,30 +14,44 @@ public class ProjectService { private List 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; }