From 19f6fa6a1f355e94b230ce4b748c2fde623b567a Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Wed, 8 Nov 2023 11:53:29 +0800 Subject: [PATCH] jx pcn --- .../api/busi/jx/IJxProdBusiStrategyService.java | 19 +- .../busi/jx/JxProdBusiStrategyCommonService.java | 104 +++++++- .../busi/jx/JxProdBusiStrategyRepairService.java | 11 +- .../busi/jx/JxProdBusiStrategyStandardService.java | 16 +- .../station/jx/JxSnProcessingModuleService.java | 284 +++++++++++++++++++++ .../busi/step/jx/JxBindKeyPartStepService.java | 3 - .../busi/step/jx/JxInitOrderStepService.java | 9 +- .../jx/JxSnProcessingCheckMcOrPsStepService.java | 127 +++++++++ .../step/jx/JxSnProcessingCompleteStepService.java | 54 ++++ .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 5 + 10 files changed, 606 insertions(+), 26 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/station/jx/JxSnProcessingModuleService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCheckMcOrPsStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCompleteStepService.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProdBusiStrategyService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProdBusiStrategyService.java index 0c5f2d8..a6585a0 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProdBusiStrategyService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProdBusiStrategyService.java @@ -24,6 +24,14 @@ public interface IJxProdBusiStrategyService { StepResult execLineOnBindMc(JxProdBusiStrategyParamsBuilder params); /** + * 加工验证 + * @param params 参数 + * @return 结果 + */ + @ApiOperation(value = "加工验证", notes = "加工验证") + StepResult checkProcessing(JxProdBusiStrategyParamsBuilder params); + + /** * 终检验证 * @param params 参数 * @return 结果 @@ -48,11 +56,11 @@ public interface IJxProdBusiStrategyService { StepResult checkLineOff(JxProdBusiStrategyParamsBuilder params); /** - * 完成下线 + * 下线完成 * @param params 参数 * @return 结果 */ - @ApiOperation(value = "完成下线", notes = "完成下线") + @ApiOperation(value = "下线完成", notes = "下线完成") StepResult execLineOff(JxProdBusiStrategyParamsBuilder params); /** @@ -146,4 +154,11 @@ public interface IJxProdBusiStrategyService { @ApiOperation(value = "验证班次启动", notes = "验证班次启动") default StepResult checkShiftStart(JxProdBusiStrategyParamsBuilder params) {return StepResult.getSuccessComplete(); } + /** + * 加工完成 + * @param params 参数 + */ + @ApiOperation(value = "加工完成", notes = "加工完成") + default void execProcessing(JxProdBusiStrategyParamsBuilder params) {} + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyCommonService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyCommonService.java index a0fc590..e12f394 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyCommonService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyCommonService.java @@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx; import cn.estsh.i3plus.ext.mes.pcn.api.base.*; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IOutPutStatisticsService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IPackageExtService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnTravelExtService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxOutPutStatisticsTravelService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService; @@ -14,14 +15,19 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.ConvertBeanExt; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil; import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.busi.dispatch.cachedispatch.WorkCellDataCacheDispatch; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.tool.MathOperation; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesPackageDetail; import cn.estsh.i3plus.pojo.mes.bean.MesPart; import cn.estsh.i3plus.pojo.mes.bean.MesRouteProcess; import cn.estsh.i3plus.pojo.mes.bean.MesShift; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.repository.MesPackageDetailRepository; +import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -31,6 +37,7 @@ import org.springframework.util.StringUtils; import java.util.Comparator; import java.util.List; import java.util.Optional; +import java.util.StringJoiner; import java.util.stream.Collectors; /** @@ -102,8 +109,21 @@ public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyServi @Autowired private IPartExtService partExtService; + @Autowired + private MesPackageExtRepository packageExtRepository; + + @Autowired + private MesPackageDetailRepository packageDetailRepository; + + @Autowired + private IPackageExtService packageExtService; + @Override public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) { + + StepResult stepResult = checkShiftStart(params); + if (!stepResult.isCompleted()) return stepResult; + if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() != params.getOrderModel().getWorkOrderType()) queryBusiData4Mc(params.manageCode(params.getScanInfo())); else queryProduceSnInfo(params.productSn(params.getScanInfo())).scanName(); return StepResult.getSuccessComplete(); @@ -223,8 +243,6 @@ public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyServi if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == produceSnExtDb.getOperateType()) return stepResult.isCompleted(false).msg(String.format("过程条码[%s]产品条码[%s]对应的信息当前业务状态[返修]!", params.getSerialNumber(), params.getProductSn())); - //if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExtDb.getSnStatus()) return stepResult; - produceSnExtDb.setSnStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue()); produceSnExtService.doPackSnExtProcess((StationRequestBean) params.getObj(), produceSnExtDb); ConvertBean.serviceModelUpdate(produceSnExtDb, params.getUserInfo()); @@ -271,9 +289,14 @@ public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyServi public StepResult execLineOnBindMc(JxProdBusiStrategyParamsBuilder params) { return StepResult.getSuccessComplete(); } @Override + public StepResult checkProcessing(JxProdBusiStrategyParamsBuilder params) { return StepResult.getSuccessComplete(); } + + @Override public StepResult checkFinalInspection(JxProdBusiStrategyParamsBuilder params) { - StepResult stepResult = StepResult.getSuccessComplete(); + StepResult stepResult = checkShiftStart(params); + + if (!stepResult.isCompleted()) return stepResult; if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() != params.getOrderModel().getWorkOrderType()) queryBusiData4Mc(params.manageCode(params.getScanInfo())); else queryProduceSnInfo(params.productSn(params.getScanInfo())).scanName(); @@ -295,9 +318,6 @@ public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyServi if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType()) return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo())); - if (MesPcnExtEnumUtil.PRODUCE_SN_QC_STATUS.DEFECTED.getValue() == params.getProduceSnExtDb().getQcStatus()) - return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的产品条码信息当前质量状态[不合格],验证失败!", params.getScanName(), params.getScanInfo())); - return stepResult; } @@ -595,7 +615,24 @@ public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyServi if (null == workCenterExtDb) return stepResult.msg(String.format("生产线[%s]信息不存在,操作失败", params.getWorkCenterCode())); if (StringUtils.isEmpty(workCenterExtDb.getWorkTime()) || StringUtils.isEmpty(workCenterExtDb.getShiftCode())) return stepResult.msg(String.format("生产线[%s]未启动班次,操作失败", params.getWorkCenterCode())); - MesShift shiftDb = shiftExtService.getShiftByShiftCodeAndCenterCode(params.getOrganizeCode(), params.getWorkCenterCode(), workCenterExtDb.getShiftCode()); + WorkCellDataCacheDispatch dispatch = new WorkCellDataCacheDispatch.builder() + .key(new StringJoiner(MesPcnExtConstWords.COLON).add(params.getOrganizeCode()).add(MesPcnExtConstWords.JX_PROD_SHIFT_DATA).toString()) + .item(new StringJoiner(MesPcnExtConstWords.AND).add(params.getWorkCenterCode()).add(workCenterExtDb.getShiftCode()).toString()) + .org(params.getOrganizeCode()).build().get(); + + MesShift shiftDb; + if (null != dispatch && !StringUtils.isEmpty(dispatch.getValue())) shiftDb = JSONObject.parseObject(dispatch.getValue(), MesShift.class); + else { + shiftDb = shiftExtService.getShiftByShiftCodeAndCenterCode(params.getOrganizeCode(), params.getWorkCenterCode(), workCenterExtDb.getShiftCode()); + if (null != shiftDb && !StringUtils.isEmpty(shiftDb.getStartTime()) && !StringUtils.isEmpty(shiftDb.getEndTime())) + new WorkCellDataCacheDispatch.builder() + .key(new StringJoiner(MesPcnExtConstWords.COLON).add(params.getOrganizeCode()).add(MesPcnExtConstWords.JX_PROD_SHIFT_DATA).toString()) + .item(new StringJoiner(MesPcnExtConstWords.AND).add(params.getWorkCenterCode()).add(workCenterExtDb.getShiftCode()).toString()) + .value(JSONObject.toJSONString(shiftDb)) + .timeSecond(MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue()) + .org(params.getOrganizeCode()).build().save(); + } + if (null == shiftDb || (StringUtils.isEmpty(shiftDb.getStartTime()) || StringUtils.isEmpty(shiftDb.getEndTime()))) return stepResult.msg(String.format("未配置有效的生产线[%s]班次代码[%s]信息,操作失败", params.getWorkCenterCode(), workCenterExtDb.getShiftCode())); String workTime = shiftProdCenterRecordService.getWorkTime(shiftDb.getStartTime(), shiftDb.getEndTime()); @@ -626,6 +663,8 @@ public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyServi insertProduceSnTravel(params); + savePackageInfo(params); + saveOutPutStatistics(params); doProductOffLine(params); @@ -667,6 +706,50 @@ public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyServi produceSnExtDb.setLotNo(produceSnExtDb.getWorkTime()); } + private void savePackageInfo(JxProdBusiStrategyParamsBuilder params) { + if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() != params.getOrderModel().getWorkOrderType()) { + MesPackageExt pack = new MesPackageExt(); + pack.setPackageNo(params.getProduceSnExtDb().getProductSn()); + pack.setPartNo(params.getProduceSnExtDb().getPartNo()); + pack.setPartNameRdd(params.getProduceSnExtDb().getPartNameRdd()); + pack.setQty(new Double(1)); + pack.setPackSpecQty(new Double(1)); + pack.setUnit(params.getPartDb().getUnit()); + pack.setIsSealed(MesPcnEnumUtil.PACKAGE_IS_SEALED.SEALED.getValue()); + pack.setPrintStatus(MesPcnEnumUtil.PACKAGE_PRINT_STATUS.PRINTED.getValue()); + pack.setPackLevel(MesPcnEnumUtil.PACKAGE_PACKLEVEL.FIRST.getValue()); + pack.setWorkOrderNo(params.getProduceSnExtDb().getWorkOrderNo()); + pack.setLastWorkOrderNo(pack.getWorkOrderNo()); + pack.setWorkCenterCode(params.getWorkCenterCode()); + pack.setWorkCellCode(params.getWorkCellCode()); + pack.setLotNo(params.getProduceSnExtDb().getLotNo()); + pack.setWorkTime(params.getProduceSnExtDb().getWorkTime()); + pack.setShiftCode(params.getProduceSnExtDb().getShiftCode()); + pack.setOrganizeCode(params.getOrganizeCode()); + ConvertBean.serviceModelInitialize(pack, params.getUserInfo()); + pack.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + new ConvertBeanExt(pack).convertBean(pack); + packageExtRepository.insert(pack); + + MesPackageDetail packageDetail = new MesPackageDetail(); + packageDetail.setPackageNo(pack.getPackageNo()); + packageDetail.setSerialNumber(params.getProduceSnExtDb().getSerialNumber()); + packageDetail.setPartNo(pack.getPartNo()); + packageDetail.setPartNameRdd(pack.getPartNameRdd()); + packageDetail.setOrganizeCode(params.getOrganizeCode()); + packageDetail.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + ConvertBean.serviceModelInitialize(packageDetail, params.getUserInfo()); + packageDetailRepository.insert(packageDetail); + } else { + MesPackageExt pack = packageExtService.getPackageByPackNo(params.getOrganizeCode(), params.getProduceSnExtDb().getProductSn()); + pack.setLastWorkOrderNo(params.getOrderModel().getOrderNo()); + pack.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + ConvertBean.serviceModelUpdate(pack, params.getUserInfo()); + packageExtRepository.save(pack); + } + + } + private void saveOutPutStatistics(JxProdBusiStrategyParamsBuilder params) { MesOutPutStatistics outPutStatistics = outPutStatisticsService.getOutPutStatisticsByTimeAndOrderNo( @@ -738,5 +821,12 @@ public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyServi } } + @Override + public void execProcessing(JxProdBusiStrategyParamsBuilder params) { + + queryProduceSnInfo(params); + + + } } \ No newline at end of file diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyRepairService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyRepairService.java index 8701024..7571681 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyRepairService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyRepairService.java @@ -31,11 +31,11 @@ public class JxProdBusiStrategyRepairService implements IJxProdBusiStrategyServi @Override public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) { - ((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params); + StepResult stepResult = ((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params); - StepResult stepResult = StepResult.getNonComplete(); + if (!stepResult.isCompleted()) return stepResult; - if (null == params.getProduceSnExtDb()) return stepResult.msg(String.format("%s[%s]未匹配到有效的产品条码信息,验证失败!", params.getScanName(), params.getScanInfo())); + if (null == params.getProduceSnExtDb()) return stepResult.isCompleted(false).msg(String.format("%s[%s]未匹配到有效的产品条码信息,验证失败!", params.getScanName(), params.getScanInfo())); return checkLineOn4Ps(params, stepResult); @@ -43,6 +43,8 @@ public class JxProdBusiStrategyRepairService implements IJxProdBusiStrategyServi private StepResult checkLineOn4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) { + stepResult.isCompleted(false); + if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo())) return stepResult.msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo())); @@ -60,6 +62,9 @@ public class JxProdBusiStrategyRepairService implements IJxProdBusiStrategyServi public StepResult execLineOnBindMc(JxProdBusiStrategyParamsBuilder params) { return StepResult.getSuccessComplete(); } @Override + public StepResult checkProcessing(JxProdBusiStrategyParamsBuilder params) { return this.checkFinalInspection(params); } + + @Override public StepResult checkFinalInspection(JxProdBusiStrategyParamsBuilder params) { StepResult stepResult = ((IJxProdBusiStrategyService) params.getStrategyService()).checkFinalInspection(params); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyStandardService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyStandardService.java index f18ae66..3b9ff19 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyStandardService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyStandardService.java @@ -64,11 +64,11 @@ public class JxProdBusiStrategyStandardService implements IJxProdBusiStrategySer @Override public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) { - ((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params); + StepResult stepResult = ((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params); - StepResult stepResult = StepResult.getNonComplete(); + if (!stepResult.isCompleted()) return stepResult; - if (null == params.getManageCodeDb() && null == params.getProduceSnExtDb()) return stepResult.msg(String.format("%s[%s]未匹配到有效的管理编码或产品条码信息,验证失败!", params.getScanName(), params.getScanInfo())); + if (null == params.getManageCodeDb() && null == params.getProduceSnExtDb()) return stepResult.isCompleted(false).msg(String.format("%s[%s]未匹配到有效的管理编码或产品条码信息,验证失败!", params.getScanName(), params.getScanInfo())); if (null != params.getProduceSnExtDb()) return checkLineOn4Ps(params, stepResult); @@ -78,6 +78,8 @@ public class JxProdBusiStrategyStandardService implements IJxProdBusiStrategySer private StepResult checkLineOn4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) { + stepResult.isCompleted(false); + if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo())) return stepResult.msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo())); @@ -99,6 +101,8 @@ public class JxProdBusiStrategyStandardService implements IJxProdBusiStrategySer private StepResult checkLineOn4Mc(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) { + stepResult.isCompleted(false); + if (null != params.getProduceSnMcRecordDb() && !params.getProduceSnMcRecordDb().getWorkOrderNo().equals(params.getOrderModel().getOrderNo())) return stepResult.msg(String.format("%s[%s]已绑定其他生产工单[%s],验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnMcRecordDb().getWorkOrderNo())); @@ -179,6 +183,9 @@ public class JxProdBusiStrategyStandardService implements IJxProdBusiStrategySer } @Override + public StepResult checkProcessing(JxProdBusiStrategyParamsBuilder params) { return this.checkFinalInspection(params); } + + @Override public StepResult checkFinalInspection(JxProdBusiStrategyParamsBuilder params) { StepResult stepResult = ((IJxProdBusiStrategyService) params.getStrategyService()).checkFinalInspection(params); @@ -200,9 +207,6 @@ public class JxProdBusiStrategyStandardService implements IJxProdBusiStrategySer if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnMcRecordDb().getOperateType()) return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的管理编码与工单条码关系信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo())); - if (MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.FALSE.getValue() == params.getProduceSnMcRecordDb().getQcStatus()) - return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的管理编码与工单条码关系信息当前质量状态[不合格],验证失败!", params.getScanName(), params.getScanInfo())); - if (!params.getProduceSnMcRecordDb().getWorkOrderNo().equals(params.getOrderModel().getOrderNo())) return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的管理编码与工单条码关系信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnMcRecordDb().getWorkOrderNo(), params.getOrderModel().getOrderNo())); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/station/jx/JxSnProcessingModuleService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/station/jx/JxSnProcessingModuleService.java new file mode 100644 index 0000000..8238b55 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/station/jx/JxSnProcessingModuleService.java @@ -0,0 +1,284 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnExtService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxSnWorkCellScanModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.IShippingDispatchService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseModuleService; +import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil; +import cn.estsh.i3plus.platform.common.util.MesPcnConstWords; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesRouteProcess; +import cn.estsh.i3plus.pojo.mes.bean.MesStateMachineStatus; +import cn.estsh.i3plus.pojo.mes.model.AttrBean; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.impp.framework.boot.util.ImppRedis; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description : 展示组件:嘉兴条码加工 + * @Reference : + * @Author :wangjie + * @CreateDate : 2020-06-26 11:18 上午 + * @Modify: + **/ +@Slf4j +@Service("jxSnProcessingModuleService") +public class JxSnProcessingModuleService extends BaseModuleService { + + @Autowired + private ISxWorkOrderExtService workOrderExtService; + + @Autowired + private IProduceSnExtService produceSnExtService; + + @Autowired + private IShippingDispatchService shippingDispatchService; + + @Autowired + private IFsmRouteDataService fsmRouteDataService; + + @Resource(name = MesPcnExtConstWords.REDIS_RES_PCN) + private ImppRedis redisMesPcn; + + @Override + public void init(StationRequestBean reqBean) { + MesWorkOrderExt workOrderExt = getCurExecWorkOrder(reqBean); + doLoadData(reqBean, workOrderExt); + } + + @Override + public boolean execStateModule(StationRequestBean reqBean, List states, Map wcpcMap) { + String curExecWorkOrder = (String) doHandleCurExecWorkOrder(reqBean, 1, null); + if (StringUtils.isEmpty(curExecWorkOrder)) return true; + MesWorkOrderExt workOrderExtDb = getCachedWorkOrder(reqBean, curExecWorkOrder); + if (null == workOrderExtDb) return true; + doLoadData(reqBean, workOrderExtDb); + return true; + } + + private MesWorkOrderExt getCurExecWorkOrder(StationRequestBean reqBean) { + String curExecWorkOrder = (String) doHandleCurExecWorkOrder(reqBean, 1, null); + MesWorkOrderExt workOrderExtDb = StringUtils.isEmpty(curExecWorkOrder) ? null : getCachedWorkOrder(reqBean, curExecWorkOrder); + return workOrderExtDb; + } + + private String getDataKey(StationRequestBean reqBean) { + return new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()) + .add(MesPcnExtConstWords.JX_SN_PROCESSING_DATA).add(reqBean.getWorkCenterCode()).add(reqBean.getWorkCellCode()).toString(); + } + + private MesWorkOrderExt getCachedWorkOrder(StationRequestBean reqBean, String curExecWorkOrder) { + return workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrder); + } + + private List packDataAttrList() { + List attrBeanList = new ArrayList<>(); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.INDEX, "序号"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.MANAGE_CODE, "(源)管理码"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.STATUS_NAME, "工序状态"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.SERIAL_NUMBER, "过程条码"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PRODUCT_SN, "产品条码"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.MODIFY_DATE_TIME, "操作时间"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.MODIFY_USER, "操作人"); + return attrBeanList; + } + + private void doLoadData(StationRequestBean reqBean, MesWorkOrderExt workOrderExt) { + StationResultBean resultBean = new StationResultBean(); + + resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CONTENT.getValue()); + resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue()); + resultBean.setCustomPageName(MesPcnExtConstWords.JX_SN_PROCESSING_MODULE); + resultBean.setDataAttrList(packDataAttrList()); + resultBean.setSpecialDisplayData(getStepColIndent(reqBean)); + + if (null != workOrderExt) { + List produceSnList; + if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() != workOrderExt.getWorkOrderType()) + produceSnList = produceSnExtService.getProduceSnExtListByOrderNo(reqBean.getOrganizeCode(), workOrderExt.getOrderNo()); + else + produceSnList = produceSnExtService.getProduceSnExtListByLastOrderNo(reqBean.getOrganizeCode(), workOrderExt.getOrderNo()); + + List processCodeList = getProcessCodeList(reqBean); + + resultBean.setResultMap(packResultMap(workOrderExt, getCompleteQtyByType(reqBean, produceSnList, processCodeList))); + + resultBean.setResultList(packResultListByType(produceSnList, processCodeList)); + } + + this.sendMessage(reqBean, resultBean); + + } + + private List getProcessCodeList(StationRequestBean reqBean) { + if (StringUtils.isEmpty(reqBean.getRouteCode()) || StringUtils.isEmpty(reqBean.getProcessCode())) return null; + List routeProcessList = fsmRouteDataService.getCachedFsmRouteProcessData(reqBean); + Optional routeProcessOp = CollectionUtils.isEmpty(routeProcessList) ? null : + routeProcessList.stream().filter(o -> (null != o && o.getProcessCode().equals(reqBean.getProcessCode()) && o.getRouteCode().equals(reqBean.getRouteCode()))).findFirst(); + if (null == routeProcessOp || !routeProcessOp.isPresent()) return null; + return routeProcessList.stream().filter(o -> (null != o && o.getSeq().compareTo(routeProcessOp.get().getSeq()) >= 0)).map(MesRouteProcess::getProcessCode).collect(Collectors.toList()); + } + + private Integer getCompleteQtyByType(StationRequestBean reqBean, List produceSnList, List processCodeList) { + if (StringUtils.isEmpty(reqBean.getProcessCode()) || CollectionUtils.isEmpty(processCodeList)) return MesPcnExtConstWords.ZERO; + List completeList = CollectionUtils.isEmpty(produceSnList) ? null : produceSnList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getProcessCode()) && processCodeList.contains(o.getProcessCode()))).collect(Collectors.toList()); + return CollectionUtils.isEmpty(completeList) ? MesPcnExtConstWords.ZERO : completeList.size(); + } + + private List packResultListByType(List produceSnList, List processCodeList) { + + if (CollectionUtils.isEmpty(produceSnList) || CollectionUtils.isEmpty(processCodeList)) return null; + + List resultList = null; + + produceSnList = produceSnList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProduceSn::getModifyDatetime).reversed()).collect(Collectors.toList()); + + if (!CollectionUtils.isEmpty(produceSnList) && produceSnList.size() > 50) produceSnList = produceSnList.subList(0, 50); + + Integer index = 1; + for (MesProduceSnExt produceSnExt : produceSnList) { + if (null == produceSnExt) continue; + if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>(); + JxSnWorkCellScanModel result = new JxSnWorkCellScanModel(); + BeanUtils.copyProperties(produceSnExt, result); + + if (!StringUtils.isEmpty(produceSnExt.getProcessCode()) && processCodeList.contains(produceSnExt.getProcessCode())) result.statusName("已完成").color(MesPcnExtConstWords.GREEN); + else if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == produceSnExt.getOperateType()) result.statusName("返修中").color(MesPcnExtConstWords.YELLOW); + else result.statusName("未完成"); + + resultList.add(result.manageCode(produceSnExt.getTrayNo()).index(index)); + index ++; + } + + return resultList; + } + + private Map packResultMap(MesWorkOrderExt workOrderExt, Integer completeQty) { + Map resultMap = new HashMap<>(); + resultMap.put(MesPcnExtConstWords.CUR_WORK_ORDER_NO, workOrderExt.getOrderNo()); + resultMap.put(MesPcnExtConstWords.PART_NO, workOrderExt.getPartNo()); + resultMap.put(MesPcnExtConstWords.PART_NAME_RDD, workOrderExt.getPartNameRdd()); + resultMap.put(MesPcnExtConstWords.WORK_ORDER_TYPE, workOrderExt.getWorkOrderType()); + resultMap.put(MesPcnExtConstWords.WORK_ORDER_TYPE_NAME, MesPcnExtEnumUtil.WORK_ORDER_TYPE.valueOfDescription(workOrderExt.getWorkOrderType())); + resultMap.put(MesPcnExtConstWords.WORK_ORDER_STATUS, workOrderExt.getWorkOrderStatus()); + resultMap.put(MesPcnExtConstWords.WORK_ORDER_STATUS_NAME, MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus())); + resultMap.put(MesPcnExtConstWords.QTY, workOrderExt.getQty().intValue()); + resultMap.put(MesPcnExtConstWords.COMPLETE_QTY, completeQty); + return resultMap; + } + + @Override + public boolean doFunction(StationRequestBean reqBean) { + Boolean result = false; + Map dataMap = reqBean.getDataMap(); + String command = (String) dataMap.get(MesPcnExtConstWords.COMMAND); + Object value = dataMap.get(MesPcnExtConstWords.VALUE); + if (StringUtils.isEmpty(command)) { + this.sendMessage(reqBean, null, "后端未获取到业务功能指令", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return result; + } + + switch (command) { + case MesPcnExtConstWords.CMD_WORK_ORDER : + if (StringUtils.isEmpty(value)) { + this.sendMessage(reqBean, null, "请选择启动状态的生产工单", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return result; + } + + String selectWorkOrderNo = (String) doHandleSelectWorkOrderNo(reqBean, 1, null); + if (!StringUtils.isEmpty(selectWorkOrderNo) && selectWorkOrderNo.equals(value)) return result; + reqBean.setForceJumpProcess(true); + if (StringUtils.isEmpty(selectWorkOrderNo)) { + if ((Boolean) doHandleSelectWorkOrderNo(reqBean, 2, value.toString())) result = true; + else { + this.sendMessage(reqBean, null, String.format("切换的生产工单[%s]缓存失败,请重试", value), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return result; + } + } + break; + case MesPcnExtConstWords.CMD_FORCE_CENTER_PASS : + if (StringUtils.isEmpty(value)) { + this.sendMessage(reqBean, null, "入参缺少产线强制放行的工步代码", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return result; + } + reqBean.setForceSpecStepCode(value.toString()); + result = true; + break; + default: + break; + } + + if (!result) this.sendMessage(reqBean, null, "操作太频繁", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + else { + //跳过工序 + reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean)); + reqBean.setInterfaceType(MesPcnConstWords.SHIPPING); + reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN); + shippingDispatchService.doSendScanQueueNextExec(reqBean); + } + return result; + } + + public synchronized Object doHandleCurExecWorkOrder(StationRequestBean reqBean, Integer flag, String curExecWorkOrder) { + switch (flag) { + case 1: + return redisMesPcn.getHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER); + case 2: + return redisMesPcn.putHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER, curExecWorkOrder, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue()); + case 3: + redisMesPcn.deleteHash(getDataKey(reqBean), MesPcnExtConstWords.CUR_EXEC_WORK_ORDER); + return true; + default: + return null; + } + } + + public synchronized Object doHandleSelectWorkOrderNo(StationRequestBean reqBean, Integer flag, String selectWorkOrderNo) { + switch (flag) { + case 1: + return redisMesPcn.getHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER); + case 2: + return redisMesPcn.putHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER, selectWorkOrderNo, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue()); + case 3: + redisMesPcn.deleteHash(getDataKey(reqBean), MesPcnExtConstWords.CMD_WORK_ORDER); + return true; + default: + return null; + } + } + + public Object doHandleBindKeyPartData(StationRequestBean reqBean, Integer flag, String item, String data) { + switch (flag) { + case 1: + return redisMesPcn.getHash(getDataKey(reqBean), item); + case 2: + return redisMesPcn.putHash(getDataKey(reqBean), item, data, MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue()); + case 3: + String[] itemArr = item.split(MesPcnExtConstWords.COMMA); + for (String s : itemArr) { + redisMesPcn.deleteHash(getDataKey(reqBean), s); + } + return true; + default: + return null; + } + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxBindKeyPartStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxBindKeyPartStepService.java index 9387d31..b7ce0a0 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxBindKeyPartStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxBindKeyPartStepService.java @@ -78,9 +78,6 @@ public class JxBindKeyPartStepService extends BaseStepService { @Autowired private IFsmCommonService fsmCommonService; - @Autowired - private IFsmRouteDataService routeDataService; - private static final String VALIDATION_CODE = "VALIDATION_CODE"; private static final String SHOW_KPSN_RULE = "SHOW_KPSN_RULE"; private static final String RELOAD_KEY_PART_CODE = "RELOAD_KEY_PART_CODE"; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxInitOrderStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxInitOrderStepService.java index 73f7605..c4706c2 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxInitOrderStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxInitOrderStepService.java @@ -5,7 +5,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt; import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil; -import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; import cn.estsh.i3plus.mes.pcn.api.iservice.base.IModuleService; import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService; import cn.estsh.i3plus.platform.common.tool.MathOperation; @@ -19,7 +19,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.lang.reflect.Method; @@ -38,7 +37,7 @@ import java.util.Map; public class JxInitOrderStepService extends BaseStepService { @Autowired - private IFsmRouteDataService routeDataService; + private IFsmCommonService fsmCommonService; @Autowired private ISxWorkOrderExtService workOrderExtService; @@ -113,7 +112,7 @@ public class JxInitOrderStepService extends BaseStepService { } private Object doHandleModuleObjectMethod(StationRequestBean reqBean, StationResultBean resultBean, String methodStr, Integer flag, String value) { - if (CollectionUtils.isEmpty(reqBean.getWcpcMap())) reqBean.setWcpcMap(routeDataService.doHandleFsmWcpcMapData(reqBean)); + fsmCommonService.checkWcpcMapForDoScan(reqBean); try { IModuleService moduleService = (IModuleService) SpringContextsUtil.getBean(reqBean.getWcpcMap().get(MesPcnConstWords.MODULE_OBJECT)); Method method = moduleService.getClass().getDeclaredMethod(methodStr, reqBean.getClass(), Integer.class, String.class); @@ -126,7 +125,7 @@ public class JxInitOrderStepService extends BaseStepService { } private Object execStateModule(StationRequestBean reqBean, StationResultBean resultBean) { - if (CollectionUtils.isEmpty(reqBean.getWcpcMap())) reqBean.setWcpcMap(routeDataService.doHandleFsmWcpcMapData(reqBean)); + fsmCommonService.checkWcpcMapForDoScan(reqBean); try { IModuleService moduleService = (IModuleService) SpringContextsUtil.getBean(reqBean.getWcpcMap().get(MesPcnConstWords.MODULE_OBJECT)); Method method = moduleService.getClass().getDeclaredMethod(MesPcnExtConstWords.execStateModule, reqBean.getClass(), List.class, Map.class); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCheckMcOrPsStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCheckMcOrPsStepService.java new file mode 100644 index 0000000..8f38ce2 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCheckMcOrPsStepService.java @@ -0,0 +1,127 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil; +import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.StringJoiner; + +/** + * @Description : 嘉兴条码加工扫描工步 + * @Reference : + * @Author : wangjie + * @CreateDate : 2019-07-11 + * @Modify: + **/ +@Slf4j +@Service("jxSnProcessingCheckMcOrPsStepService") +public class JxSnProcessingCheckMcOrPsStepService extends BaseStepService { + + @Autowired + private JxSnLineOnModuleService snLineOnModuleService; + + @Autowired + private ISxWorkOrderExtService workOrderExtService; + + @Override + public StepResult guide(StationRequestBean reqBean) { + return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean(), "请扫描管理编码或产品条码!"); + } + + @Override + public StepResult init(StationRequestBean reqBean) { + reqBean.setSerialNumber(null); + reqBean.setProductSn(null); + reqBean.setTray(null); + clearStepContent(reqBean); + snLineOnModuleService.doHandleBindKeyPartData(reqBean, 3, new StringJoiner(MesPcnExtConstWords.COMMA).add(MesPcnExtConstWords.BIND_KEY_PART).add(MesPcnExtConstWords.EXEC_BIND_KEY).toString(), null); + return super.init(reqBean); + } + + @Override + public StepResult execute(StationRequestBean reqBean) { + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnProcessingCheckMcOrPsStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + StepResult stepResult = StepResult.getSuccessComplete(); + + StationResultBean resultBean = new StationResultBean(); + + if (StringUtils.isEmpty(reqBean.getScanInfo())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "入参缺少管理编码或产品条码!"); + + String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean); + + WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo); + + checkScanInfoIsValid(reqBean, resultBean, stepResult, orderModel); + + reqBean.setScanInfo(null); + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnProcessingCheckMcOrPsStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + return stepResult; + } + + private String getCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean) { + String curExecWorkOrderNo = (String) snLineOnModuleService.doHandleCurExecWorkOrder(reqBean, 1, null); + if (StringUtils.isEmpty(curExecWorkOrderNo)) execExpSendMsgAndThrowEx(reqBean, resultBean, "此前操作的工单号已丢失,请选择启动状态的生产工单!"); + return curExecWorkOrderNo; + } + + private WorkOrderExtModel getWorkOrderExtModel(StationRequestBean reqBean, StationResultBean resultBean, String curExecWorkOrderNo) { + WorkOrderExtModel orderModel = !reqBean.getDataMap().containsKey(MesPcnExtConstWords.WORK_ORDER) ? null : + JSONObject.parseObject(JSONObject.toJSONString(reqBean.getDataMap().get(MesPcnExtConstWords.WORK_ORDER)), WorkOrderExtModel.class); + if (null == orderModel) { + MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo); + if (null != workOrderExt) { + orderModel = new WorkOrderExtModel(); + BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID); + } + } + if (null == orderModel) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("此前操作的工单号[%s]对应的信息不存在!", curExecWorkOrderNo)); + return orderModel; + } + + private StepResult checkScanInfoIsValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, WorkOrderExtModel orderModel) { + + JxProdBusiStrategyParamsBuilder params = new JxProdBusiStrategyParamsBuilder.builder() + .organizeCode(reqBean.getOrganizeCode()) + .scanInfo(reqBean.getScanInfo()) + .location(reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()) + .orderModel(orderModel) + .strategyService(SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.COMMON.getClazz())) + .build(); + + StepResult result = ((IJxProdBusiStrategyService) SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.valueOfClazz(orderModel.getWorkOrderType()))).checkProcessing(params); + + this.sendMessage(reqBean, resultBean, result.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, result.isCompleted() ? MesPcnEnumUtil.STATION_DATA_TYPE.TEXT : MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + + stepResult.setCompleted(result.isCompleted()); + + reqBean.setSerialNumber(params.getSerialNumber()); + reqBean.setProductSn(params.getProductSn()); + reqBean.setTray(null == params.getProduceSnMcRecordDb() ? params.getManageCode() : new StringJoiner(MesPcnExtConstWords.AND).add(params.getProduceSnMcRecordDb().getManageCode()).add(params.getProduceSnMcRecordDb().getId().toString()).toString()); + + if (result.isCompleted() && (null != params.getProduceSnMcRecordDb() || null != params.getProduceSnExtDb())) stepResult.nextTriggerEvent(MesPcnExtConstWords.BIND_KEY_PART).isCompleted(false); + + return stepResult; + } + +} \ No newline at end of file diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCompleteStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCompleteStepService.java new file mode 100644 index 0000000..f8b12e0 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCompleteStepService.java @@ -0,0 +1,54 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil; +import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +/** + * @Description : 嘉兴条码加工完成工步 + * @Reference : + * @Author : wangjie + * @CreateDate : 2019-07-11 + * @Modify: + **/ +@Slf4j +@Service("jxSnProcessingCompleteStepService") +public class JxSnProcessingCompleteStepService extends BaseStepService { + + @Override + public StepResult execute(StationRequestBean reqBean) { + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnProcessingCompleteStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + StepResult stepResult = StepResult.getSuccessComplete(); + + StationResultBean resultBean = new StationResultBean(); + + if (StringUtils.isEmpty(reqBean.getSerialNumber()) && StringUtils.isEmpty(reqBean.getProductSn())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "入参缺少过程条码或产品条码!"); + + ((IJxProdBusiStrategyService) SpringContextsUtil.getBean(MesPcnExtEnumUtil.JX_PROD_BUSI_STRATEGY.COMMON.getClazz())) + .checkProcessing(new JxProdBusiStrategyParamsBuilder.builder() + .organizeCode(reqBean.getOrganizeCode()) + .userInfo(reqBean.getUserInfo()) + .location(reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()) + .serialNumber(reqBean.getSerialNumber()) + .productSn(reqBean.getProductSn()) + .obj(reqBean) + .build()); + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnProcessingCompleteStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, + MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("管理编码[%s]过程条码[%s]产品条码[%s]加工完成!", reqBean.getTray(), reqBean.getSerialNumber(), reqBean.getProductSn())); + } + +} \ No newline at end of file diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java index 8ba90f5..2526fa0 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java @@ -906,5 +906,10 @@ public class MesPcnExtConstWords { public static final String doHandleCurExecWorkOrder = "doHandleCurExecWorkOrder"; public static final String execStateModule = "execStateModule"; + public static final String JX_PROD_SHIFT_DATA = "JX_PROD_SHIFT_DATA"; + + public static final String JX_SN_PROCESSING_MODULE = "JX_SN_PROCESSING_MODULE"; + public static final String JX_SN_PROCESSING_DATA = "JX_SN_PROCESSING_DATA"; + }