From b3a2fb8f99f7ac12f8bc7600dcfea7363b47ee68 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 9 Oct 2024 16:57:46 +0800 Subject: [PATCH] update --- .../a8k/hardware/type/a8kcanprotocol/A8kEcode.java | 3 + .../app/appctrl/ConsumablesScanService.java | 42 ++++++- .../appctrl/mainflowctrl/CondtionMgrService.java | 8 +- .../action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java | 130 ++++++++++++--------- .../mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java | 3 +- .../service/app/appdata/AppProjInfoMgrService.java | 54 +++++++-- .../app/appdata/AppReactionResultMgrService.java | 2 +- .../EmergencySamplePosStateMgrService.java | 42 +++++-- .../app/appstate/IncubationPlateMgrService.java | 13 ++- .../app/appstate/OptScanModuleStateMgrService.java | 2 +- .../service/app/appstate/TubeStateMgrService.java | 55 +++++---- .../app/appstate/type/IncubationSubTank.java | 11 +- .../service/app/appstate/type/OptScanModule.java | 3 +- .../app/appstate/type/ProjProcessContext.java | 14 +-- .../java/a8k/service/app/appstate/type/Tube.java | 19 +-- .../java/a8k/service/db/type/A8kProjectInfo.java | 2 +- src/main/java/a8k/type/consumables/LarBSGroup.java | 19 +-- .../java/a8k/type/consumables/LittBSGroup.java | 18 +-- .../a8k/type/consumables/ReactionPlateGroup.java | 14 ++- .../java/a8k/type/consumables/ScanResultState.java | 5 +- src/main/java/a8k/utils/A8kProjCfg.java | 7 +- src/main/java/a8k/utils/ProjBriefInfo.java | 27 +++++ 22 files changed, 327 insertions(+), 166 deletions(-) create mode 100644 src/main/java/a8k/utils/ProjBriefInfo.java diff --git a/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java b/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java index 5c6dcce..20c805b 100644 --- a/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java +++ b/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java @@ -60,6 +60,9 @@ public enum A8kEcode { ConsumeNotEnough(142),//耗材不足 TipNotEnough(143),//tip不足 TakeTubeFail(143),//取试管失败 + ProjIndexIsEmpty(144),//项目ID为空 + CanNotFindProjInfo(145),//找不到项目信息 + ProjInfoIsNotExist(146),//项目信息不存在 /** * 特殊服务错误码 diff --git a/src/main/java/a8k/service/app/appctrl/ConsumablesScanService.java b/src/main/java/a8k/service/app/appctrl/ConsumablesScanService.java index 371551f..2c9f9f4 100644 --- a/src/main/java/a8k/service/app/appctrl/ConsumablesScanService.java +++ b/src/main/java/a8k/service/app/appctrl/ConsumablesScanService.java @@ -5,6 +5,8 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.service.app.appdata.AppProjInfoMgrService; import a8k.service.app.appstate.GStateService; import a8k.service.app.devicedriver.ctrl.ConsumablesScanCtrl; +import a8k.service.db.type.A8kProjOptConfig; +import a8k.service.db.type.A8kProjectInfo; import a8k.type.ConsumableGroup; import a8k.type.consumables.LarBSGroup; import a8k.type.consumables.LittBSGroup; @@ -80,10 +82,33 @@ public class ConsumablesScanService { return ret; } + + //检查项目信息是否存在 + A8kProjectInfo projInfo = appProjMgr.getProjInfoByProjIndex(rp2dcode.projIndex); + if (projInfo == null) { + ret.state = ScanResultState.UnSupportProj; + return ret; + } + + Integer subProjNum = projInfo.subProjNum; + if (subProjNum == null || subProjNum <= 0) { + logger.error("项目信息不完整,项目ID:{},子项目数量为零", rp2dcode.projIndex); + ret.state = ScanResultState.CodeErrorProjInfoIsError; + return ret; + } + + List projOptConfigList = appProjMgr.getProjOptConfigListByProjIndex(rp2dcode.projIndex); + if (projOptConfigList == null || projOptConfigList.size() != subProjNum) { + logger.error("项目操作配置信息不完整,项目ID:{},缺少光学配置", rp2dcode.projIndex); + ret.state = ScanResultState.CodeErrorProjInfoIsError; + return ret; + } + + //通过项目ID卡获取项目需要的耗材 A8kReactionFlowType reactionType = appProjMgr.getA8kReactionFlowTypeByProjIndex(rp2dcode.projIndex); if (reactionType == null) { - ret.state = ScanResultState.ProjInfoIsInComplete; + ret.state = ScanResultState.CodeErrorProjInfoIsInComplete; return ret; } @@ -117,16 +142,19 @@ public class ConsumablesScanService { A8kIdCardInfo a8kIdCardInfo = appProjMgr.getA8kIdCardInfoByLotId(result.lotId); A8kReactionFlowType reactionType = appProjMgr.getA8kReactionFlowTypeByProjIndex(result.projIndex); + A8kProjectInfo projInfo = appProjMgr.getProjInfoByProjIndex(result.projIndex); + assert a8kIdCardInfo != null; assert reactionType != null; + assert projInfo != null; - cState.reactionPlateGroup[ch] = new ReactionPlateGroup(result.projIndex, a8kIdCardInfo.projName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); + cState.reactionPlateGroup[ch] = new ReactionPlateGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); if (reactionType.equals(A8kReactionFlowType.FlowType1)) { - cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); + cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); cState.larBSGroup[ch] = new LarBSGroup(); } else if (reactionType.equals(A8kReactionFlowType.FlowType2)) { - cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); - cState.larBSGroup[ch] = new LarBSGroup(result.projIndex, a8kIdCardInfo.projName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); + cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); + cState.larBSGroup[ch] = new LarBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); } else { throw new RuntimeException("未知的反应流程类型"); } @@ -172,7 +200,9 @@ public class ConsumablesScanService { var scanResult = scanCtrlService.doScanOneCh(chNum); var result = parseScanResult(chNum, scanResult); - LoadingConsumables(chNum, result); + if (result.state != ScanResultState.PASS) { + LoadingConsumables(chNum, result); + } Map ret = new java.util.HashMap<>(); ret.put("scanResult", result); ret.put("scanRawResult", scanResult); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java index d6e8490..244de68 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java @@ -89,7 +89,7 @@ public class CondtionMgrService { //没有试管在处理 或者 当前试管处理完成 Boolean cond2 = tube.state.equals(TubeState.PENDING); //急诊有待处理的试管,或者试管架正在处理 - Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size()); + Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projInfo.size()); return cond1 && cond2 && cond3; } @@ -103,7 +103,7 @@ public class CondtionMgrService { //没有试管在处理 或者 当前试管处理完成 Boolean cond2 = tube.state.equals(TubeState.RESOURCE_IS_READY); //急诊有待处理的试管,或者试管架正在处理 - Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size()); + Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projInfo.size()); return cond1 && cond2 && cond3; } @@ -117,7 +117,7 @@ public class CondtionMgrService { //没有试管在处理 或者 当前试管处理完成 Boolean cond2 = tube.state.equals(TubeState.PRE_PROCESSED); //急诊有待处理的试管,或者试管架正在处理 - Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size()); + Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projInfo.size()); return cond1 && cond2 && cond3; } @@ -131,7 +131,7 @@ public class CondtionMgrService { //没有试管在处理 或者 当前试管处理完成 Boolean cond2 = tube.state.equals(TubeState.PROCESSED); //急诊有待处理的试管,或者试管架正在处理 - Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size()); + Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projInfo.size()); return cond1 && cond2 && cond3; } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java index 2fdc63a..dfe8689 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -1,5 +1,7 @@ package a8k.service.app.appctrl.mainflowctrl.action; +import a8k.service.app.appdata.AppProjInfoMgrService; +import a8k.service.app.appstate.type.Tube; import a8k.service.bases.AppEventBusService; import a8k.service.bases.appevent.AppWarningNotifyEvent; import a8k.hardware.A8kCanBusService; @@ -15,6 +17,7 @@ import a8k.service.app.appstate.type.TubeHolder; import a8k.service.app.appstate.type.state.TubeHolderState; import a8k.service.app.appstate.type.state.TubeState; import a8k.service.app.devicedriver.ctrl.SampleScanTransportCtrl; +import a8k.service.db.type.A8kProjectInfo; import a8k.type.exception.AppException; import a8k.type.tube_setting.TubeHolderSetting; import a8k.type.type.A8kTubeHolderType; @@ -59,19 +62,21 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { @Resource - GStateService gstate; + GStateService gstate; @Resource - CondtionMgrService cmgr; + CondtionMgrService cmgr; @Resource - SampleScanTransportCtrl stc; + SampleScanTransportCtrl stc; @Resource - AppEventBusService ebus; + AppEventBusService ebus; @Resource - A8kCanBusService canBus; + A8kCanBusService canBus; @Resource - TubeSettingMgrService tubeSettingMgrService; + TubeSettingMgrService tubeSettingMgrService; @Resource - TubeStateMgrService tubeStateMgrService; + TubeStateMgrService tubeStateMgrService; + @Resource + AppProjInfoMgrService appProjInfoMgr; SampleScanResult scanTubeHodler() throws AppException { @@ -93,7 +98,6 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { String tubeType = stc.moveTubeRackToScanPosAndScan(); if (tubeType.isEmpty()) { logger.warn("扫描试管架类型失败,弹出试管架"); - stc.ejectTubeHolder(); ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.ScanTubeholderTypeTimeout)); return null; } @@ -118,7 +122,6 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { if (!hasTube) { logger.error("试管架中没有试管"); ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.TubeHolderTypeIsNotSupport)); - stc.ejectTubeHolder(); return null; } result.tubeHolderType = tubeType; @@ -126,66 +129,81 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { return result; } + + A8kEcode parseOneTube(Tube tube, Integer i, SampleScanResult scanResult, TubeHolderSetting setting) { + + if (!scanResult.tubesScanResults[i].isTubeExist) { + tube.state = TubeState.EMPTY; + return A8kEcode.NoError; + } + + tube.state = TubeState.TO_BE_PROCESSED; + tube.isHighTube = scanResult.tubesScanResults[i].isHighTube; + + + //首先赋值默认值 + tube.bloodType = BloodType.WHOLE_BLOOD; + tube.sampleBarcode = ""; + tube.userid = ""; + tube.projInfo = List.of();//不做任何项目 + + //然后赋值用户配置的数值 + if (setting != null) { + tube.bloodType = setting.tubeSettings[i].bloodType; + tube.sampleBarcode = setting.tubeSettings[i].sampleBarcode; + tube.userid = setting.tubeSettings[i].userid; + tube.projInfo = appProjInfoMgr.getProjBrifInfo(setting.tubeSettings[i].projIndex); + if (tube.projInfo == null) { + logger.error("项目信息不存在,{}", setting.tubeSettings[i].projIndex); + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.ProjInfoIsNotExist)); + return A8kEcode.ProjInfoIsNotExist; + } + } + + if (tube.userid.isEmpty()) { + tube.userid = genUserId(i); + } + return A8kEcode.NoError; + + //补全试管中的项目信息 + //最后赋值扫描到的数值 + // + //TODO:添加请求后台的代码 + // + // state.tubeStates[i].bloodType = ; + // state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; + // state.tubeStates[i].userid = setting.tubeSettings[i].userid; + // state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex; + } + TubeHolder parseScanResult(SampleScanResult scanResult) throws AppException { - TubeHolder state = new TubeHolder(); - TubeHolderSetting setting = tubeSettingMgrService.getThelastActiveTubeHolderSettingAndLock(); + TubeHolder tubeholder = new TubeHolder(); + TubeHolderSetting setting = tubeSettingMgrService.getThelastActiveTubeHolderSettingAndLock(); try { //获取试管架类型 A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType); if (tubeHolderType == null) { logger.error("不支持的试管架类型"); ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.TubeHolderTypeIsNotSupport)); - stc.ejectTubeHolder(); return null; } - assert setting == null || setting.tubeSettings.length == state.tubes.length; + assert setting == null || setting.tubeSettings.length == tubeholder.tubes.length; //逐个赋值试管配置信息 updaetGroupId(); - for (int i = 0; i < state.tubes.length; i++) { - - if (!scanResult.tubesScanResults[i].isTubeExist) { - state.tubes[i].state = TubeState.EMPTY; - continue; - } - - state.tubes[i].state = TubeState.TO_BE_PROCESSED; - state.tubes[i].isHighTube = scanResult.tubesScanResults[i].isHighTube; - - - //首先赋值默认值 - state.tubes[i].bloodType = BloodType.WHOLE_BLOOD; - state.tubes[i].sampleBarcode = ""; - state.tubes[i].userid = ""; - state.tubes[i].projIndex = List.of();//不做任何项目 - - //然后赋值用户配置的数值 - if (setting != null) { - state.tubes[i].bloodType = setting.tubeSettings[i].bloodType; - state.tubes[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; - state.tubes[i].userid = setting.tubeSettings[i].userid; - state.tubes[i].projIndex = setting.tubeSettings[i].projIndex; - } - - if (state.tubes[i].userid.isEmpty()) { - state.tubes[i].userid = genUserId(i); + for (int i = 0; i < tubeholder.tubes.length; i++) { + A8kEcode ecode = parseOneTube(tubeholder.tubes[i], i, scanResult, setting); + if (ecode != A8kEcode.NoError) { + ebus.pushEvent(new AppWarningNotifyEvent(ecode)); + return null; } - - //最后赋值扫描到的数值 - // - //TODO:添加请求后台的代码 - // - // state.tubeStates[i].bloodType = ; - // state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; - // state.tubeStates[i].userid = setting.tubeSettings[i].userid; - // state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex; } //设置试管架状态 - state.state = TubeHolderState.PROCESSING; + tubeholder.state = TubeHolderState.PROCESSING; //删除之前的试管架配置 tubeSettingMgrService.removeTubeHolderSetting(setting); - return state; + return tubeholder; } catch (AppException e) { //回滚部分状态 @@ -199,20 +217,22 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { logger.info("开始扫描试管架"); var scanResult = scanTubeHodler(); if (scanResult == null) { + stc.ejectTubeHolder(); return; } logger.info("解析扫描结果"); - TubeHolder state = parseScanResult(scanResult); - if (state == null) { + TubeHolder tubeholder = parseScanResult(scanResult); + if (tubeholder == null) { + stc.ejectTubeHolder(); return; } logger.info("将样本信息写入数据库"); - tubeStateMgrService.createNewTubeContexts(state.tubes); + tubeStateMgrService.createNewTubeContexts(tubeholder.tubes); logger.info("更新试管架状态"); - gstate.setTubeHolder(state); + gstate.setTubeHolder(tubeholder); } @Override public Boolean checkCondition() { diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java index f1237f9..6e361ec 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java @@ -18,6 +18,7 @@ import a8k.type.TipPos; import a8k.type.exception.AppException; import a8k.service.db.type.a8kidcard.zenum.A8kReactionFlowType; import a8k.service.db.type.A8kIdCardInfo; +import a8k.utils.ProjBriefInfo; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.slf4j.Logger; @@ -68,7 +69,7 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction { @Override public void doaction() throws AppException { Tube tube = gstate.getCurProcessingTube(); assert tube != null; - List projs = gstate.getCurProcessingTube().projIndex; + List projs = gstate.getCurProcessingTube().getProjIndex(); //检查是否有足够的耗材 for (Integer projin : projs) { diff --git a/src/main/java/a8k/service/app/appdata/AppProjInfoMgrService.java b/src/main/java/a8k/service/app/appdata/AppProjInfoMgrService.java index effd3ac..42fc6f4 100644 --- a/src/main/java/a8k/service/app/appdata/AppProjInfoMgrService.java +++ b/src/main/java/a8k/service/app/appdata/AppProjInfoMgrService.java @@ -1,6 +1,7 @@ package a8k.service.app.appdata; +import a8k.service.app.appstate.type.Tube; import a8k.service.bases.appevent.*; import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.service.db.A8kProjIdCardDBService; @@ -19,12 +20,14 @@ import a8k.service.db.type.a8kidcard.zenum.A8kReactionFlowType; import a8k.service.db.type.A8kIdCardInfo; import a8k.utils.A8kIdCardDataParser; import a8k.utils.A8kProjCfg; +import a8k.utils.ProjBriefInfo; import a8k.utils.wq.ZWorkQueue; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.slf4j.Logger; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.List; @Component @@ -131,6 +134,25 @@ public class AppProjInfoMgrService { return a8kProjIdCardDBService.getAllIdCards(); } + + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // STATUS + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + @ExtApiFn(name = "ID卡状态") + public Boolean idCardStatus() { + try { + return canBus.moduleGetReg(MId.A8kIdCardReader, RegIndex.kreg_id_card_reader_is_online) == 1; + } catch (AppException ignored) { + } + return false; + } + + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // 数据处理 + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + public A8kIdCardInfo getA8kIdCardInfoByLotId(String lotid) { return a8kProjIdCardDBService.getIdCard(lotid); } @@ -147,6 +169,10 @@ public class AppProjInfoMgrService { return projCfg; } + public List getProjOptConfigListByProjIndex(Integer projIndex) { + return a8kProjOptConfigDBService.findByProjIndex(projIndex); + } + public String getProjNameByLotId(Integer projIndex) { var idCard = a8kProjIdCardDBService.getProjInfoByProjIndex(projIndex); if (idCard == null) { @@ -168,17 +194,25 @@ public class AppProjInfoMgrService { return projInfo.reactionFlowType; } + public ProjBriefInfo getProjBriefInfoByProjIndex(Integer projIndex) { + var projInfo = getProjInfoByProjIndex(projIndex); + if (projInfo == null) { + return null; + } + return new ProjBriefInfo(projInfo.projIndex, projInfo.projName, projInfo.projShortName, projInfo.color); + } - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // STATUS - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - @ExtApiFn(name = "ID卡状态") - public Boolean idCardStatus() { - try { - return canBus.moduleGetReg(MId.A8kIdCardReader, RegIndex.kreg_id_card_reader_is_online) == 1; - } catch (AppException ignored) { + public List getProjBrifInfo(List projIndex) { + List ret = new ArrayList<>(); + for (Integer index : projIndex) { + var projInfo = getProjInfoByProjIndex(index); + if (projInfo == null) { + logger.error("项目信息不存在,项目ID:{}", index); + return null; + } + ret.add(new ProjBriefInfo(projInfo.projIndex, projInfo.projName, projInfo.projShortName, projInfo.color)); } - return false; + return ret; } + } diff --git a/src/main/java/a8k/service/app/appdata/AppReactionResultMgrService.java b/src/main/java/a8k/service/app/appdata/AppReactionResultMgrService.java index f7eb6a9..15b9807 100644 --- a/src/main/java/a8k/service/app/appdata/AppReactionResultMgrService.java +++ b/src/main/java/a8k/service/app/appdata/AppReactionResultMgrService.java @@ -56,7 +56,7 @@ public class AppReactionResultMgrService { record.sampleBarcode = tubeContext.sampleBarcode; record.sampleUserid = tubeContext.userid; record.sampleId = tubeContext.sampleid; - record.projName = projContext.projName; + record.projName = projContext.projInfo.projName; record.lotId = projContext.projCfg.idCardInfo.lotId; record.projIndex = projContext.projCfg.idCardInfo.projIndex; record.expiryDate = projContext.projCfg.idCardInfo.expiryDate; diff --git a/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java b/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java index 3f8570f..607c213 100644 --- a/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java +++ b/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java @@ -5,17 +5,25 @@ import a8k.extapi_controler.utils.EnginnerPageActionParam; import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.service.app.appdata.AppProjInfoMgrService; import a8k.service.app.appstate.type.EmergencyTubePos; import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.state.TubeState; import a8k.type.exception.AppException; import a8k.type.type.BloodType; +import a8k.utils.ProjBriefInfo; +import a8k.utils.ZJsonHelper; import jakarta.annotation.Resource; +import org.slf4j.Logger; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; + @ExtApiTab(cfg = ExtApiTabConfig.EmergencySamplePosStateMgrService) @Component public class EmergencySamplePosStateMgrService { + static Logger logger = org.slf4j.LoggerFactory.getLogger(EmergencySamplePosStateMgrService.class); @Resource GStateService gstate; @@ -23,6 +31,9 @@ public class EmergencySamplePosStateMgrService { @Resource TubeStateMgrService tubeStateMgrService; + @Resource + AppProjInfoMgrService appProjInfoMgrService; + /** * 提交紧急样本设置 * @param userid 用户ID @@ -35,19 +46,34 @@ public class EmergencySamplePosStateMgrService { @ExtApiFn(name = "提交紧急样本设置", group = "紧急样本设置") public void commitEmergencySampleSetting(String userid, String sampleBarcode, BloodType bloodType,// @EnginnerPageActionParam(name = "逗号分割项目列表(例子1,2,3)") String projIndexList) throws AppException { - EmergencyTubePos emergencyTubePos = gstate.getEmergencyTubePos(); - Tube tube = emergencyTubePos.tube; + EmergencyTubePos emergencyTubePos = gstate.getEmergencyTubePos(); + Tube tube = emergencyTubePos.tube; + List projIndex = new ArrayList<>(); + List projInfo = new ArrayList<>(); if (tube.state.equals(TubeState.EMPTY) || tube.state.equals(TubeState.PROCESS_COMPLETE)) { + + for (String index : projIndexList.split(",")) { + projIndex.add(Integer.parseInt(index)); + } + + if (projIndex.isEmpty()) { + throw new AppException(A8kEcode.ProjIndexIsEmpty); + } + + projInfo = appProjInfoMgrService.getProjBrifInfo(projIndex); + if (projInfo == null || projInfo.size() != projIndex.size()) { + throw new AppException(A8kEcode.CanNotFindProjInfo); + } + + tube.userid = userid; tube.bloodType = bloodType; tube.sampleBarcode = sampleBarcode; - tube.projIndex.clear(); - tube.isEmergency = true; - for (String index : projIndexList.split(",")) { - tube.projIndex.add(Integer.parseInt(index)); - } - tube.state = TubeState.TO_BE_PROCESSED; + tube.isEmergency = true; + tube.projInfo = projInfo; + tube.state = TubeState.TO_BE_PROCESSED; tubeStateMgrService.createNewEmergencyTubeContext(tube); + logger.info("添加紧急样本设置成功 {}", ZJsonHelper.objectToJson(tube)); } else { throw new AppException(A8kEcode.EmergencySampleIsProcessing); } diff --git a/src/main/java/a8k/service/app/appstate/IncubationPlateMgrService.java b/src/main/java/a8k/service/app/appstate/IncubationPlateMgrService.java index 9211a7a..e0bd99a 100644 --- a/src/main/java/a8k/service/app/appstate/IncubationPlateMgrService.java +++ b/src/main/java/a8k/service/app/appstate/IncubationPlateMgrService.java @@ -3,6 +3,7 @@ package a8k.service.app.appstate; import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiTab; import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.service.app.appdata.AppProjInfoMgrService; import a8k.service.app.appstate.type.IncubationSubTank; import a8k.service.app.appstate.type.ProjProcessContext; import a8k.service.app.appstate.type.Tube; @@ -21,6 +22,9 @@ public class IncubationPlateMgrService { @Resource GStateService gstate; + @Resource + AppProjInfoMgrService appProjInfoMgrService; + synchronized public Boolean isHasEnoughIncubationIDLEPos(Integer num) { var incubationState = gstate.getIncubationPlate(); var subtanks = incubationState.subtanks; @@ -56,7 +60,7 @@ public class IncubationPlateMgrService { for (IncubationSubTank subtank : subtanks) { if (subtank.state.equals(IncubationSubTankState.INCUBATING)) { - var now = new Date(); + var now = new Date(); var diff = now.getTime() - subtank.startIncubatedTime.getTime(); if (diff > subtank.incubatedTimeSec * 1000) { return true; @@ -73,7 +77,7 @@ public class IncubationPlateMgrService { for (IncubationSubTank subtank : subtanks) { if (subtank.state.equals(IncubationSubTankState.INCUBATING)) { - var now = new Date(); + var now = new Date(); var diff = now.getTime() - subtank.startIncubatedTime.getTime(); if (diff > subtank.incubatedTimeSec * 1000) { return subtank; @@ -142,8 +146,7 @@ public class IncubationPlateMgrService { subtanks[context.incubatorPos.off].bloodType = tube.bloodType; subtanks[context.incubatorPos.off].sampleBarcode = tube.sampleBarcode; subtanks[context.incubatorPos.off].userid = tube.userid; - subtanks[context.incubatorPos.off].projIndex = context.projIndex; - subtanks[context.incubatorPos.off].projName = context.projName; + subtanks[context.incubatorPos.off].projInfo = context.projInfo; } } @@ -154,7 +157,7 @@ public class IncubationPlateMgrService { for (ProjProcessContext context : tube.projProcessContexts) { subtanks[context.incubatorPos.off].state = IncubationSubTankState.INCUBATING; subtanks[context.incubatorPos.off].startIncubatedTime = new Date(); - subtanks[context.incubatorPos.off].incubatedTimeSec = incubatedTimeSec; + subtanks[context.incubatorPos.off].incubatedTimeSec = incubatedTimeSec; } } diff --git a/src/main/java/a8k/service/app/appstate/OptScanModuleStateMgrService.java b/src/main/java/a8k/service/app/appstate/OptScanModuleStateMgrService.java index e016563..64f328d 100644 --- a/src/main/java/a8k/service/app/appstate/OptScanModuleStateMgrService.java +++ b/src/main/java/a8k/service/app/appstate/OptScanModuleStateMgrService.java @@ -20,7 +20,7 @@ public class OptScanModuleStateMgrService { optScanModule.bloodType = tank.bloodType; optScanModule.sampleBarcode = tank.sampleBarcode; optScanModule.userid = tank.userid; - optScanModule.projIndex = tank.projIndex; + optScanModule.projInfo = tank.projInfo; optScanModule.projProcessContxt = tank.projProcessContxt; } diff --git a/src/main/java/a8k/service/app/appstate/TubeStateMgrService.java b/src/main/java/a8k/service/app/appstate/TubeStateMgrService.java index 4a2c69c..411953c 100644 --- a/src/main/java/a8k/service/app/appstate/TubeStateMgrService.java +++ b/src/main/java/a8k/service/app/appstate/TubeStateMgrService.java @@ -10,6 +10,7 @@ import a8k.type.IncubatorPos; import a8k.type.TipPos; import a8k.service.db.type.A8kIdCardInfo; import a8k.utils.A8kProjCfg; +import a8k.utils.ProjBriefInfo; import jakarta.annotation.Resource; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; @@ -53,47 +54,47 @@ public class TubeStateMgrService { cxt.bloodType = tube.bloodType; cxt.sampleBarcode = tube.sampleBarcode; cxt.userid = tube.userid; - cxt.projIndex = tube.projIndex; + cxt.projIndex = ProjBriefInfo.toPorjIndex(tube.projInfo); cxt.projProcessContext = tube.projProcessContexts; } - private void addSampleRecord(Tube[] state) { + private void addSampleRecord(Tube[] tube) { Date intertime = new Date(); - for (int i = 0; i < state.length; i++) { - if (state[i] == null) { + for (int i = 0; i < tube.length; i++) { + if (tube[i] == null) { continue; } - if (state[i].state.equals(TubeState.EMPTY)) { + if (tube[i].state.equals(TubeState.EMPTY)) { continue; } SampleRecord record = new SampleRecord(); - record.bloodType = state[i].bloodType; - record.sampleBarcode = state[i].sampleBarcode; - record.userid = state[i].userid; + record.bloodType = tube[i].bloodType; + record.sampleBarcode = tube[i].sampleBarcode; + record.userid = tube[i].userid; record.date = intertime; - record.isEmergency = state[i].isEmergency; + record.isEmergency = tube[i].isEmergency; record.sampleid = generateSampleId(intertime, i); - record.projIndex = state[i].projIndex; - state[i].sampleid = record.sampleid; + record.projIndex = ProjBriefInfo.toPorjIndex((tube[i].projInfo)); + tube[i].sampleid = record.sampleid; sampleRecordDBService.add(record); } } - private void addEmergencySampleRecord(Tube state) { + private void addEmergencySampleRecord(Tube tube) { Date intertime = new Date(); SampleRecord record = new SampleRecord(); - state.isEmergency = true; + tube.isEmergency = true; - record.bloodType = state.bloodType; - record.sampleBarcode = state.sampleBarcode; - record.userid = state.userid; + record.bloodType = tube.bloodType; + record.sampleBarcode = tube.sampleBarcode; + record.userid = tube.userid; record.date = intertime; record.isEmergency = true; record.sampleid = generateSampleId(intertime, -1); - record.projIndex = state.projIndex; - state.sampleid = record.sampleid; + record.projIndex = ProjBriefInfo.toPorjIndex(tube.projInfo); + tube.sampleid = record.sampleid; sampleRecordDBService.add(record); } @@ -129,15 +130,13 @@ public class TubeStateMgrService { synchronized public void createProjProcessContext(@NotNull Tube tube, @NotNull A8kProjCfg projCfg, @NotNull Consumable consumable, @NotNull List tipPos, @NotNull IncubatorPos incubatorPos) { ProjProcessContext context = new ProjProcessContext(); - context.projIndex = projCfg.projectInfo.projIndex; - context.projName = projCfg.projectInfo.projName; - context.projShortName = projCfg.projectInfo.projShortName; - context.projCfg = projCfg; - context.consumable = consumable; - context.incubatorPos = incubatorPos; - context.tipPos = tipPos; - context.sampleId = tube.sampleid; - context.uuid = UUID.randomUUID().toString(); + context.projInfo = projCfg.getProjBriefInfo(); + context.projCfg = projCfg; + context.consumable = consumable; + context.incubatorPos = incubatorPos; + context.tipPos = tipPos; + context.sampleId = tube.sampleid; + context.uuid = UUID.randomUUID().toString(); tube.projProcessContexts.add(context); } @@ -154,7 +153,7 @@ public class TubeStateMgrService { @NotNull List incubatorPos) { Tube tube = gstate.getCurProcessingTube(); assert tube != null; - for (int i = 0; i < tube.projIndex.size(); i++) { + for (int i = 0; i < tube.projInfo.size(); i++) { createProjProcessContext(tube, a8kconfig.get(i), consumable.get(i), tipPos.get(i), incubatorPos.get(i)); } tube.state = TubeState.RESOURCE_IS_READY; diff --git a/src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java b/src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java index d230449..d04a8fd 100644 --- a/src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java +++ b/src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java @@ -4,6 +4,7 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.service.app.appstate.type.state.IncubationSubTankState; import a8k.type.IncubatorPos; import a8k.type.type.BloodType; +import a8k.utils.ProjBriefInfo; import java.util.Date; @@ -15,12 +16,10 @@ public class IncubationSubTank { public IncubationSubTankState state = IncubationSubTankState.EMPTY; //孵育盘状态 //Info - public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型 - public String sampleBarcode = ""; //用于请求用户信息的条码ID - public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 - public Integer projIndex = 0; //项目代码 - public String projName = ""; //项目名称 - + public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型 + public String sampleBarcode = ""; //用于请求用户信息的条码ID + public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 + public ProjBriefInfo projInfo; //项目信息 // public ProjProcessContext projProcessContxt; diff --git a/src/main/java/a8k/service/app/appstate/type/OptScanModule.java b/src/main/java/a8k/service/app/appstate/type/OptScanModule.java index 4ca24bd..e55e78e 100644 --- a/src/main/java/a8k/service/app/appstate/type/OptScanModule.java +++ b/src/main/java/a8k/service/app/appstate/type/OptScanModule.java @@ -2,6 +2,7 @@ package a8k.service.app.appstate.type; import a8k.service.app.appstate.type.state.OptScanModuleState; import a8k.type.type.BloodType; +import a8k.utils.ProjBriefInfo; public class OptScanModule { public OptScanModuleState state = OptScanModuleState.EMPTY; //模块状态 @@ -9,7 +10,7 @@ public class OptScanModule { public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型 public String sampleBarcode = ""; //用于请求用户信息的条码ID public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 - public Integer projIndex = 0; //项目代码 + public ProjBriefInfo projInfo; public ProjProcessContext projProcessContxt; } diff --git a/src/main/java/a8k/service/app/appstate/type/ProjProcessContext.java b/src/main/java/a8k/service/app/appstate/type/ProjProcessContext.java index 66e4b38..961bfdd 100644 --- a/src/main/java/a8k/service/app/appstate/type/ProjProcessContext.java +++ b/src/main/java/a8k/service/app/appstate/type/ProjProcessContext.java @@ -3,8 +3,8 @@ package a8k.service.app.appstate.type; import a8k.type.Consumable; import a8k.type.IncubatorPos; import a8k.type.TipPos; -import a8k.service.db.type.A8kIdCardInfo; import a8k.utils.A8kProjCfg; +import a8k.utils.ProjBriefInfo; import java.util.List; @@ -12,12 +12,10 @@ public class ProjProcessContext { public String uuid; public String sampleId; //样本ID-系统生成-唯一标识一个样本 - public Integer projIndex;//项目代码 - public String projName; - public String projShortName; - public A8kProjCfg projCfg;//项目配置 - public Consumable consumable;//耗材绑定的通道号 - public IncubatorPos incubatorPos;//孵育位置 - public List tipPos;//吸头位置 + public ProjBriefInfo projInfo;//项目信息 + public A8kProjCfg projCfg;//项目配置 + public Consumable consumable;//耗材绑定的通道号 + public IncubatorPos incubatorPos;//孵育位置 + public List tipPos;//吸头位置 } diff --git a/src/main/java/a8k/service/app/appstate/type/Tube.java b/src/main/java/a8k/service/app/appstate/type/Tube.java index 021a897..5fa7b30 100644 --- a/src/main/java/a8k/service/app/appstate/type/Tube.java +++ b/src/main/java/a8k/service/app/appstate/type/Tube.java @@ -3,6 +3,7 @@ package a8k.service.app.appstate.type; import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.service.app.appstate.type.state.TubeState; import a8k.type.type.BloodType; +import a8k.utils.ProjBriefInfo; import java.util.ArrayList; import java.util.List; @@ -13,15 +14,19 @@ public class Tube { public Boolean isHighTube = false; public Boolean isEmergency = false; - public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型 - public String sampleBarcode = ""; //用于请求用户信息的条码ID - public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 - public List projIndex = new ArrayList<>(); //项目代码 - public List projName = new ArrayList<>(); //项目名称 + public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型 + public String sampleBarcode = ""; //用于请求用户信息的条码ID + public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 + public List projInfo = new ArrayList<>(); //项目信息 // - public TubeState state = TubeState.EMPTY; //样本被处理的状态 + public TubeState state = TubeState.EMPTY; //样本被处理的状态 public List projProcessContexts; - public A8kEcode ecode = null; + public A8kEcode ecode = null; + + + public List getProjIndex() { + return ProjBriefInfo.toPorjIndex(projInfo); + } } diff --git a/src/main/java/a8k/service/db/type/A8kProjectInfo.java b/src/main/java/a8k/service/db/type/A8kProjectInfo.java index a9e39d9..997ca1d 100644 --- a/src/main/java/a8k/service/db/type/A8kProjectInfo.java +++ b/src/main/java/a8k/service/db/type/A8kProjectInfo.java @@ -9,7 +9,7 @@ public class A8kProjectInfo { public Integer projIndex; //项目index public String projName; //项目名称 public String projShortName;//项目缩写词 - public Integer projNum; //是否是多联卡 + public Integer subProjNum; //是否是多联卡 public Integer reactionTemperature; //反应温度 public String color; //项目颜色 diff --git a/src/main/java/a8k/type/consumables/LarBSGroup.java b/src/main/java/a8k/type/consumables/LarBSGroup.java index 6432068..c7e66fc 100644 --- a/src/main/java/a8k/type/consumables/LarBSGroup.java +++ b/src/main/java/a8k/type/consumables/LarBSGroup.java @@ -3,20 +3,23 @@ package a8k.type.consumables; public class LarBSGroup { public Integer projIndex; //项目ID public String projName; //项目名称 - public String lotId = ""; //批次号 - public String color = ""; //颜色 + public String projShortName;//项目缩写名称 + public String lotId = ""; //批次号 + public String color = ""; //颜色 public Integer num = 0; public Boolean enable = false; public LarBSGroup() { } - public LarBSGroup(Integer projIndex, String projName, String lotId, String color, Integer num) { - this.projIndex = projIndex; - this.projName = projName; - this.lotId = lotId; - this.color = color; - this.num = num; + public LarBSGroup(Integer projIndex, String projName, String projShortName, String lotId, String color, Integer num) { + this.projIndex = projIndex; + this.projName = projName; + this.projShortName = projShortName; + this.lotId = lotId; + this.color = color; + this.num = num; + enable = true; } } diff --git a/src/main/java/a8k/type/consumables/LittBSGroup.java b/src/main/java/a8k/type/consumables/LittBSGroup.java index af5c9e7..e111018 100644 --- a/src/main/java/a8k/type/consumables/LittBSGroup.java +++ b/src/main/java/a8k/type/consumables/LittBSGroup.java @@ -3,7 +3,8 @@ package a8k.type.consumables; public class LittBSGroup { public Integer projIndex; //项目ID public String projName; //项目名称 - public String lotId = ""; //批次号 + public String projShortName;//项目缩写名称 + public String lotId = ""; //批次号 public String color = ""; //颜色 public Boolean enable = false;//是否可以被修改, public Integer num = 0; @@ -12,12 +13,13 @@ public class LittBSGroup { enable = false; } - public LittBSGroup(Integer projIndex, String projName, String lotId, String color, Integer num) { - this.projIndex = projIndex; - this.projName = projName; - this.lotId = lotId; - this.color = color; - this.num = num; - enable = true; + public LittBSGroup(Integer projIndex, String projName, String projShortName, String lotId, String color, Integer num) { + this.projIndex = projIndex; + this.projName = projName; + this.projShortName = projShortName; + this.lotId = lotId; + this.color = color; + this.num = num; + enable = true; } } diff --git a/src/main/java/a8k/type/consumables/ReactionPlateGroup.java b/src/main/java/a8k/type/consumables/ReactionPlateGroup.java index b9997a7..f8af518 100644 --- a/src/main/java/a8k/type/consumables/ReactionPlateGroup.java +++ b/src/main/java/a8k/type/consumables/ReactionPlateGroup.java @@ -3,6 +3,7 @@ package a8k.type.consumables; public class ReactionPlateGroup { public Integer projIndex; //项目ID public String projName; //项目名称 + public String projShortName;//项目缩写名称 public String lotId = ""; //批次号 public String color = ""; //颜色 public Boolean enable = false; @@ -12,11 +13,12 @@ public class ReactionPlateGroup { public ReactionPlateGroup() { } - public ReactionPlateGroup(Integer projIndex, String projName, String lotId, String color, Integer num) { - this.projIndex = projIndex; - this.projName = projName; - this.lotId = lotId; - this.color = color; - this.num = num; + public ReactionPlateGroup(Integer projIndex, String projName, String projShortName, String lotId, String color, Integer num) { + this.projIndex = projIndex; + this.projName = projName; + this.projShortName = projShortName; + this.lotId = lotId; + this.color = color; + this.num = num; } } diff --git a/src/main/java/a8k/type/consumables/ScanResultState.java b/src/main/java/a8k/type/consumables/ScanResultState.java index 036a14a..207201d 100644 --- a/src/main/java/a8k/type/consumables/ScanResultState.java +++ b/src/main/java/a8k/type/consumables/ScanResultState.java @@ -13,5 +13,8 @@ public enum ScanResultState { LarBSLotIdIsNotMatch,//大缓冲液批号不匹配 NoMatchingProjIDCardFound,//未找到匹配的项目ID卡 - ProjInfoIsInComplete,//项目信息不全 + IDCardProjInfoIsNotCompleted,//ID卡信息缺失 + CodeErrorProjInfoIsInComplete,//项目信息不全 + CodeErrorProjInfoIsError,//项目信息不全 + UnSupportProj,//不支持的项目 } diff --git a/src/main/java/a8k/utils/A8kProjCfg.java b/src/main/java/a8k/utils/A8kProjCfg.java index 3b02f1d..c89faed 100644 --- a/src/main/java/a8k/utils/A8kProjCfg.java +++ b/src/main/java/a8k/utils/A8kProjCfg.java @@ -10,4 +10,9 @@ public class A8kProjCfg { public A8kProjectInfo projectInfo; public A8kIdCardInfo idCardInfo; public List projOptConfigList; -} + + + public ProjBriefInfo getProjBriefInfo() { + return new ProjBriefInfo(projectInfo.projIndex, projectInfo.projName, projectInfo.projShortName, projectInfo.color); + } +} \ No newline at end of file diff --git a/src/main/java/a8k/utils/ProjBriefInfo.java b/src/main/java/a8k/utils/ProjBriefInfo.java new file mode 100644 index 0000000..1740029 --- /dev/null +++ b/src/main/java/a8k/utils/ProjBriefInfo.java @@ -0,0 +1,27 @@ +package a8k.utils; + +import java.util.ArrayList; +import java.util.List; + +public class ProjBriefInfo { + public Integer projIndex; //项目代码 + public String projName;//项目名称 + public String projShotName; //项目缩写名称 + public String color; + + public ProjBriefInfo(Integer projIndex, String projName, String projShotName, String color) { + this.projIndex = projIndex; + this.projName = projName; + this.projShotName = projShotName; + this.color = color; + } + + + public static List toPorjIndex(List projBriefInfoList) { + List projIndexList = new ArrayList<>(); + for (ProjBriefInfo projBriefInfo : projBriefInfoList) { + projIndexList.add(projBriefInfo.projIndex); + } + return projIndexList; + } +}