diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProdBindRecordExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProdBindRecordExtService.java new file mode 100644 index 0000000..249c5ef --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProdBindRecordExtService.java @@ -0,0 +1,49 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProdBindRecordExt; +import cn.estsh.i3plus.pojo.mes.bean.MesProdBindRecord; +import cn.estsh.impp.framework.boot.exception.ImppBusiException; +import io.swagger.annotations.ApiOperation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:22 上午 + * @Description: + **/ +public interface IJxProdBindRecordExtService { + + /** + * 插入产品绑定记录拓展表(新事务,不回滚) + * + * @param prodBindRecordExt 绑定记录拓展 + */ + @ApiOperation(value = "插入产品绑定记录拓展表(新事务,不回滚)", notes = "插入产品绑定记录拓展表(新事务,不回滚)") + @Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {ImppBusiException.class, Exception.class}) + void insertProdBindRecordExtNoRollback(MesProdBindRecordExt prodBindRecordExt); + + /** + * 根据生产工单号,工位代码查询产品绑定记录信息 + * @param organizeCode 组织代码 + * @param workOrderNo 生产工单号 + * @param workCellCode 工位代码 + * @param productSn 产品条码 + * @param thirdPartyPid 管理码关系表ID + * @return 产品绑定记录信息 + */ + @ApiOperation(value = "根据生产工单号,工位代码查询产品绑定记录信息", notes = "根据生产工单号,工位代码查询产品绑定记录信息") + List getProdBindRecordExtListByPsOrMc(String organizeCode, String workOrderNo, String workCellCode, String productSn, String thirdPartyPid); + + /** + * 根据部品条码查询产品绑定记录信息 + * @param organizeCode 组织代码 + * @param kpSn 部品条码 + * @return 产品绑定记录信息 + */ + @ApiOperation(value = "根据部品条码查询产品绑定记录信息", notes = "根据部品条码查询产品绑定记录信息") + List getProdBindRecordListByKpSn(String organizeCode, String kpSn); + +} 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 new file mode 100644 index 0000000..3b4290c --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProdBusiStrategyService.java @@ -0,0 +1,58 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx; + +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.pojo.mes.model.StepResult; +import io.swagger.annotations.ApiOperation; + +public interface IJxProdBusiStrategyService { + + /** + * 上线验证 + * @param params 参数 + * @return 结果 + */ + @ApiOperation(value = "上线验证", notes = "上线验证") + StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params); + + /** + * 从管理码开始查询业务数据 + * @param params 参数 + * @return 结果 + */ + @ApiOperation(value = "从管理码开始查询业务数据", notes = "从管理码开始查询业务数据") + default JxProdBusiStrategyParamsBuilder queryBusiData4Mc(JxProdBusiStrategyParamsBuilder params) { return params; } + + /** + * 从产品条码开始查询业务数据 + * @param params 参数 + * @return 结果 + */ + @ApiOperation(value = "从产品条码开始查询业务数据", notes = "从产品条码开始查询业务数据") + default JxProdBusiStrategyParamsBuilder queryBusiData4Ps(JxProdBusiStrategyParamsBuilder params) { return params; } + + /** + * 查询产品条码业务数据 + * @param params 参数 + * @return 结果 + */ + @ApiOperation(value = "查询产品条码业务数据", notes = "查询产品条码业务数据") + default JxProdBusiStrategyParamsBuilder queryProduceSnInfo(JxProdBusiStrategyParamsBuilder params) { return params; } + + /** + * 查询管理码业务数据 + * @param params 参数 + * @return 结果 + */ + @ApiOperation(value = "查询管理码业务数据", notes = "查询管理码业务数据") + default JxProdBusiStrategyParamsBuilder queryManageCodeInfo(JxProdBusiStrategyParamsBuilder params) { return params; } + + /** + * 获取生产工单已绑数据 + * @param params 参数 + * @return 结果 + */ + @ApiOperation(value = "获取生产工单已绑数据", notes = "获取生产工单已绑数据") + default Integer queryOrderBindedQty(JxProdBusiStrategyParamsBuilder params) { return MesPcnExtConstWords.ZERO; } + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProduceSnExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProduceSnExtService.java new file mode 100644 index 0000000..1ffec93 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProduceSnExtService.java @@ -0,0 +1,32 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import io.swagger.annotations.ApiOperation; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:22 上午 + * @Description: + **/ +public interface IJxProduceSnExtService { + + /** + * 根据过程条码或者产品条码查询产品条码信息 + * @param organizeCode 组织代码 + * @param serialNumber 过程条码 + * @param productSn 产品条码 + * @return 产品条码信息 + */ + @ApiOperation(value = "根据过程条码或者产品条码查询产品条码信息", notes = "根据过程条码或者产品条码查询产品条码信息") + MesProduceSnExt getProduceSnExtDb(String organizeCode, String serialNumber, String productSn); + + /** + * 设置条码产线 工位 工序 下一道工序 + * @param reqBean 工位对象数据 + * @param produceSnExt 条码信息 + */ + @ApiOperation(value = "设置条码产线 工位 工序 下一道工序", notes = "设置条码产线 工位 工序 下一道工序") + void doPackSnExtProcess(StationRequestBean reqBean, MesProduceSnExt produceSnExt); + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProduceSnMcRecordService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProduceSnMcRecordService.java new file mode 100644 index 0000000..d8aab6b --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProduceSnMcRecordService.java @@ -0,0 +1,43 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:22 上午 + * @Description: + **/ +public interface IJxProduceSnMcRecordService { + + /** + * 根据管理码查询管理码信息 + * @param organizeCode 组织代码 + * @param manageCode 管理码 + * @return 管理码信息 + */ + @ApiOperation(value = "根据管理码查询管理码信息", notes = "根据管理码查询管理码信息") + MesManageCode getManageCodeDb(String organizeCode, String manageCode); + + /** + * 根据生产工单查询管理码与工单条码关系信息 + * @param organizeCode 组织代码 + * @param workOrderNo 生产工单 + * @return 管理码与工单条码关系信息 + */ + @ApiOperation(value = "根据生产工单查询产品管理码与工单条码关系信息", notes = "根据生产工单查询产品管理码与工单条码关系信息") + List getProduceSnMcRecordDbList(String organizeCode, String workOrderNo); + + /** + * 根据管理码查询管理码与工单条码关系信息 + * @param organizeCode 组织代码 + * @param manageCode 管理码 + * @return 管理码与工单条码关系信息 + */ + @ApiOperation(value = "根据管理码查询管理码与工单条码关系信息", notes = "根据管理码查询管理码与工单条码关系信息") + MesProduceSnMcRecord getProduceSnMcRecordDb(String organizeCode, String manageCode); + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/QualityDecisionService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/QualityDecisionService.java index ed3a379..9185734 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/QualityDecisionService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/QualityDecisionService.java @@ -104,10 +104,9 @@ public class QualityDecisionService implements IQualityDecisionService { MesProduceSnMcRecord produceSnMcRecordDb = produceSnMcRecordRepository.getByProperty( new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.MANAGE_CODE, MesPcnExtConstWords.SN_STATUS}, - new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), serialNumber, MesPcnExtEnumUtil.MC_RECORD_SN_STATUS.CREATE.getValue()}); + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), serialNumber, MesPcnExtEnumUtil.MC_RECORD_SN_STATUS.LINE_ON.getValue()}); MesProduceSnExt produceSnExt = null; - if(produceSnMcRecordDb != null){ produceSnExt = produceSnExtService.getProduceSnExtBySn(organizeCode, produceSnMcRecordDb.getSerialNumber()); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/ProductEncodeCfgExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/ProductEncodeCfgExtService.java index e6c1b62..86e23d0 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/ProductEncodeCfgExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/ProductEncodeCfgExtService.java @@ -35,6 +35,7 @@ public class ProductEncodeCfgExtService implements IProductEncodeCfgExtService { model.setOrganizeCode(organizeCode); model.setCodeType(codeType); switch (MesPcnExtEnumUtil.ENCODE_CODE_TYPE.getByValue(codeType)) { + case SERIAL_SN : case STANDARD_SERIAL_SN : case REWORK_SERIAL_SN : case ATTEMPT_SERIAL_SN : diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/SxNumberRulePackAttributeService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/SxNumberRulePackAttributeService.java index f93fdc9..7df2f72 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/SxNumberRulePackAttributeService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/SxNumberRulePackAttributeService.java @@ -238,4 +238,25 @@ public class SxNumberRulePackAttributeService implements ISxNumberRulePackAttrib return serialNoModel; } + /** + * 动态字符包含 生产线 工单号 + * 编码规则可增加 日 时 分 秒 前缀 流水号 配置 + */ + private GenSerialNoModel jxMethodDynamicCenterAndOrder(Map map, GenSerialNoModel serialNoModel){ + String workOrderNo = (String) map.get(MesPcnExtConstWords.WORK_ORDER_NO); + String workCenterCode = (String) map.get(MesPcnExtConstWords.WORK_CENTER_CODE); + serialNoModel.setDynamicRule(new StringJoiner(MesPcnExtConstWords.COMMA).add(workCenterCode).add(workOrderNo).toString()); + return serialNoModel; + } + + /** + * 动态字符包含 工单号 + * 编码规则可增加 日 时 分 秒 前缀 流水号 配置 + */ + private GenSerialNoModel jxMethodDynamicOrder(Map map, GenSerialNoModel serialNoModel){ + String workOrderNo = (String) map.get(MesPcnExtConstWords.WORK_ORDER_NO); + serialNoModel.setDynamicRule(workOrderNo); + return serialNoModel; + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBindRecordExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBindRecordExtService.java new file mode 100644 index 0000000..0bdf132 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBindRecordExtService.java @@ -0,0 +1,64 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBindRecordExtService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProdBindRecordExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProdBindRecordExtRepository; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesProdBindRecord; +import cn.estsh.i3plus.pojo.mes.repository.MesProdBindRecordRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:41 上午 + * @Description: + **/ +@Slf4j +@Service +public class JxProdBindRecordExtService implements IJxProdBindRecordExtService { + + @Autowired + private MesProdBindRecordExtRepository prodBindRecordExtRepository; + + @Autowired + private MesProdBindRecordRepository prodBindRecordRepository; + + @Override + public void insertProdBindRecordExtNoRollback(MesProdBindRecordExt prodBindRecordExt) { + prodBindRecordExtRepository.insert(prodBindRecordExt); + } + + @Override + public List getProdBindRecordExtListByPsOrMc(String organizeCode, String workOrderNo, String workCellCode, String productSn, String thirdPartyPid) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workOrderNo) || StringUtils.isEmpty(workCellCode)) return null; + if (StringUtils.isEmpty(productSn) && StringUtils.isEmpty(thirdPartyPid)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workOrderNo, MesPcnExtConstWords.WORK_ORDER_NO, packBean); + DdlPreparedPack.getStringEqualPack(workCellCode, MesPcnExtConstWords.WORK_CELL_CODE, packBean); + DdlPreparedPack.getStringEqualPack(productSn, MesPcnExtConstWords.PRODUCT_SN, packBean); + DdlPreparedPack.getStringEqualPack(thirdPartyPid, MesPcnExtConstWords.THIRD_PARTY_PID, packBean); + List prodBindRecordExtList = prodBindRecordExtRepository.findByHqlWhere(packBean); + prodBindRecordExtList = CollectionUtils.isEmpty(prodBindRecordExtList) ? null : + prodBindRecordExtList.stream().filter(o -> (null != o && MesPcnExtEnumUtil.MES_ACTION_TYPE.BIND.getValue() == o.getActionType())).collect(Collectors.toList()); + return prodBindRecordExtList; + } + + @Override + public List getProdBindRecordListByKpSn(String organizeCode, String kpSn) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(kpSn)) return null; + return prodBindRecordRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.KP_SN}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), kpSn}); + } +} \ 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/JxProdBusiStrategyAttemptService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyAttemptService.java new file mode 100644 index 0000000..b3da557 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyAttemptService.java @@ -0,0 +1,70 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.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.pojo.mes.model.StepResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:41 上午 + * @Description: 试制工单 + **/ +@Slf4j +@Service +public class JxProdBusiStrategyAttemptService implements IJxProdBusiStrategyService { + + @Override + public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) { + + ((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params); + + StepResult stepResult = StepResult.getNonComplete(); + + if (null == params.getManageCodeDb() && null == params.getProduceSnExtDb()) return stepResult.msg(String.format("%s[%s]未匹配到有效的管理编码或产品条码信息,验证失败!", params.getScanName(), params.getScanInfo())); + + if (null != params.getProduceSnExtDb()) return checkLineOn4Ps(params, stepResult); + + return checkLineOn4Mc(params, stepResult); + + } + + private StepResult checkLineOn4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) { + + 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())); + + if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= params.getProduceSnExtDb().getSnStatus()) + return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus()))); + + if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType()) + return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo())); + + return stepResult.isCompleted(true).msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo())); + + } + + private StepResult checkLineOn4Mc(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) { + + if (null != params.getProduceSnMcRecordDb()) { + if (!params.getProduceSnMcRecordDb().getWorkOrderNo().equals(params.getOrderModel().getOrderNo())) + return stepResult.msg(String.format("%s[%s]已绑定其他生产工单[%s],验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnMcRecordDb().getWorkOrderNo())); + + if (MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() == params.getProduceSnMcRecordDb().getLineOnStatus()) + return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息当前状态[已上线],验证失败!", params.getScanName(), params.getScanInfo())); + else + return stepResult.isCompleted(true).msg(String.format("%s[%s]此前上线未完成,验证成功!", params.getScanName(), params.getScanInfo())); + } else { + Integer count = ((IJxProdBusiStrategyService) params.getStrategyService()).queryOrderBindedQty(params); + if (count >= params.getOrderModel().getQty()) + return stepResult.msg(String.format("生产工单[%s]计划数量[%s]上线数量已达标,请切换生产工单!", params.getOrderModel().getOrderNo(), params.getOrderModel().getQty())); + + return stepResult.isCompleted(true).msg(String.format("%s[%s]验证成功!", params.getScanName(), params.getScanInfo())); + } + + } + + +} \ 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/JxProdBusiStrategyCommonService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyCommonService.java new file mode 100644 index 0000000..70b0e9f --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyCommonService.java @@ -0,0 +1,104 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnMcRecordService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord; +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.pojo.mes.model.StepResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:41 上午 + * @Description: 工单通用处理 + **/ +@Slf4j +@Service +public class JxProdBusiStrategyCommonService implements IJxProdBusiStrategyService { + + @Autowired + private IJxProduceSnMcRecordService produceSnMcRecordService; + + @Autowired + private IJxProduceSnExtService produceSnExtService; + + @Override + public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) { + 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(); + } + + @Override + public JxProdBusiStrategyParamsBuilder queryBusiData4Mc(JxProdBusiStrategyParamsBuilder params) { + + queryManageCodeInfo(params.manageCode(params.getScanInfo())); + + if (null == params.getManageCodeDb()) params.productSn(params.getScanInfo()); + + queryProduceSnInfo(params); + + return params.scanName(); + + } + + @Override + public JxProdBusiStrategyParamsBuilder queryBusiData4Ps(JxProdBusiStrategyParamsBuilder params) { + + queryProduceSnInfo(params.productSn(params.getScanInfo())); + + if (null == params.getProduceSnExtDb()) params.manageCode(params.getScanInfo()); + + queryManageCodeInfo(params); + + return params.scanName(); + + } + + @Override + public JxProdBusiStrategyParamsBuilder queryManageCodeInfo(JxProdBusiStrategyParamsBuilder params) { + + if (StringUtils.isEmpty(params.getManageCode())) return params; + + MesManageCode manageCodeDb = produceSnMcRecordService.getManageCodeDb(params.getOrganizeCode(), params.getManageCode()); + + if (null == manageCodeDb) return params.manageCode(); + + MesProduceSnMcRecord produceSnMcRecordDb = produceSnMcRecordService.getProduceSnMcRecordDb(params.getOrganizeCode(), params.getManageCode()); + + if (null != produceSnMcRecordDb) params.produceSnMcRecordDb(produceSnMcRecordDb).sn(produceSnMcRecordDb.getSerialNumber(), produceSnMcRecordDb.getProductSn()); + + return params.manageCodeDb(manageCodeDb); + } + + @Override + public JxProdBusiStrategyParamsBuilder queryProduceSnInfo(JxProdBusiStrategyParamsBuilder params) { + + if (StringUtils.isEmpty(params.getSerialNumber()) && StringUtils.isEmpty(params.getProductSn())) return params; + + MesProduceSnExt produceSnExtDb = produceSnExtService.getProduceSnExtDb(params.getOrganizeCode(), params.getSerialNumber(), params.getProductSn()); + + if (null == produceSnExtDb) return params.sn(); + + return params.produceSnExtDb(produceSnExtDb).sn(produceSnExtDb.getSerialNumber(), produceSnExtDb.getProductSn()).manageCode(produceSnExtDb.getTrayNo()); + + } + + @Override + public Integer queryOrderBindedQty(JxProdBusiStrategyParamsBuilder params) { + List produceSnMcRecordList = produceSnMcRecordService.getProduceSnMcRecordDbList(params.getOrganizeCode(), params.getOrderModel().getOrderNo()); + return CollectionUtils.isEmpty(produceSnMcRecordList) ? MesPcnExtConstWords.ZERO : produceSnMcRecordList.size(); + } + +} \ 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 new file mode 100644 index 0000000..8c1b374 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyRepairService.java @@ -0,0 +1,47 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.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.pojo.mes.model.StepResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:41 上午 + * @Description: 返工工单 + **/ +@Slf4j +@Service +public class JxProdBusiStrategyRepairService implements IJxProdBusiStrategyService { + + @Override + public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) { + + ((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params); + + StepResult stepResult = StepResult.getNonComplete(); + + if (null == params.getProduceSnExtDb()) return stepResult.msg(String.format("%s[%s]未匹配到有效的产品条码信息,验证失败!", params.getScanName(), params.getScanInfo())); + + return checkLineOn4Ps(params, stepResult); + + } + + private StepResult checkLineOn4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) { + + 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())); + + if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= params.getProduceSnExtDb().getSnStatus()) + return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus()))); + + if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType()) + return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo())); + + return stepResult.isCompleted(true).msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo())); + + } + +} \ 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/JxProdBusiStrategyStandardService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyStandardService.java new file mode 100644 index 0000000..abcf4c1 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProdBusiStrategyStandardService.java @@ -0,0 +1,74 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.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.pojo.mes.model.StepResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:41 上午 + * @Description: 正常工单 + **/ +@Slf4j +@Service +public class JxProdBusiStrategyStandardService implements IJxProdBusiStrategyService { + + @Override + public StepResult checkLineOn(JxProdBusiStrategyParamsBuilder params) { + + ((IJxProdBusiStrategyService) params.getStrategyService()).checkLineOn(params); + + StepResult stepResult = StepResult.getNonComplete(); + + if (null == params.getManageCodeDb() && null == params.getProduceSnExtDb()) return stepResult.msg(String.format("%s[%s]未匹配到有效的管理编码或产品条码信息,验证失败!", params.getScanName(), params.getScanInfo())); + + if (null != params.getProduceSnExtDb()) return checkLineOn4Ps(params, stepResult); + + return checkLineOn4Mc(params, stepResult); + + } + + private StepResult checkLineOn4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) { + + 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())); + + if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= params.getProduceSnExtDb().getSnStatus()) + return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus()))); + + if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType()) + return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo())); + + if (null != params.getProduceSnMcRecordDb() && MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.FALSE.getValue() == params.getProduceSnMcRecordDb().getQcStatus()) + return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo())); + + if (null != params.getProduceSnMcRecordDb() && !params.getProduceSnMcRecordDb().getWorkOrderNo().equals(params.getOrderModel().getOrderNo())) + return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnMcRecordDb().getWorkOrderNo(), params.getOrderModel().getOrderNo())); + + return stepResult.isCompleted(true).msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo())); + + } + + private StepResult checkLineOn4Mc(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) { + + 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())); + + if (null != params.getProduceSnMcRecordDb()) + return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息存在,但未找到对应的产品条码信息,验证失败!", params.getScanName(), params.getScanInfo())); + + Integer count = ((IJxProdBusiStrategyService) params.getStrategyService()).queryOrderBindedQty(params); + + if (count >= params.getOrderModel().getQty()) + return stepResult.msg(String.format("生产工单[%s]计划数量[%s]管理编码绑定数量已达标,请切换生产工单!", params.getOrderModel().getOrderNo(), params.getOrderModel().getQty())); + + return stepResult.isCompleted(true).msg(String.format("%s[%s]验证成功!", params.getScanName(), params.getScanInfo())); + + } + + + +} \ 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/JxProduceSnExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProduceSnExtService.java new file mode 100644 index 0000000..e89c600 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProduceSnExtService.java @@ -0,0 +1,68 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnExtService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnExtRepository; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesRouteProcess; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Optional; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:41 上午 + * @Description: + **/ +@Slf4j +@Service +public class JxProduceSnExtService implements IJxProduceSnExtService { + + @Autowired + private MesProduceSnExtRepository produceSnExtRepository; + + @Autowired + private IFsmRouteDataService fsmRouteDataService; + + @Override + public MesProduceSnExt getProduceSnExtDb(String organizeCode, String serialNumber, String productSn) { + if (StringUtils.isEmpty(organizeCode) || (StringUtils.isEmpty(serialNumber) && StringUtils.isEmpty(productSn))) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(serialNumber, MesPcnExtConstWords.SERIAL_NUMBER, packBean); + DdlPreparedPack.getStringEqualPack(productSn, MesPcnExtConstWords.PRODUCT_SN, packBean); + return produceSnExtRepository.getByProperty(packBean); + } + + @Override + public void doPackSnExtProcess(StationRequestBean reqBean, MesProduceSnExt produceSnExt) { + if (null == reqBean || null == produceSnExt) return; + + List routeProcessList = fsmRouteDataService.getCachedFsmRouteProcessData(reqBean); + + if (CollectionUtils.isEmpty(routeProcessList)) return; + + produceSnExt.setRouteCode(reqBean.getRouteCode()); + produceSnExt.setProcessCode(reqBean.getProcessCode()); + produceSnExt.setNextProcessCode(getNextProcessCode(reqBean.getProcessCode(), routeProcessList)); + + if (produceSnExt.getWorkCenterCode().equals(reqBean.getWorkCenterCode())) produceSnExt.setWorkCellCode(reqBean.getWorkCellCode()); + + } + + private String getNextProcessCode(String processCode, List routeProcessList) { + Optional routeProcessOp = routeProcessList.stream().filter(o -> (null != o && o.getProcessCode().equals(processCode))).findFirst(); + if (null == routeProcessOp || !routeProcessOp.isPresent()) return null; + return routeProcessOp.get().getNextProcess(); + } + + +} \ 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/JxProduceSnMcRecordService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProduceSnMcRecordService.java new file mode 100644 index 0000000..5458c02 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProduceSnMcRecordService.java @@ -0,0 +1,57 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnMcRecordService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord; +import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesManageCodeRepository; +import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnMcRecordRepository; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.List; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:41 上午 + * @Description: + **/ +@Slf4j +@Service +public class JxProduceSnMcRecordService implements IJxProduceSnMcRecordService { + + @Autowired + private MesManageCodeRepository manageCodeRepository; + + @Autowired + private MesProduceSnMcRecordRepository produceSnMcRecordRepository; + + @Override + public MesManageCode getManageCodeDb(String organizeCode, String manageCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(manageCode)) return null; + return manageCodeRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.MANAGE_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), manageCode}); + } + + @Override + public List getProduceSnMcRecordDbList(String organizeCode, String workOrderNo) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workOrderNo)) return null; + return produceSnMcRecordRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_ORDER_NO}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workOrderNo}); + } + + @Override + public MesProduceSnMcRecord getProduceSnMcRecordDb(String organizeCode, String manageCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(manageCode)) return null; + return produceSnMcRecordRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.MANAGE_CODE, MesPcnExtConstWords.SN_STATUS}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), manageCode, MesPcnExtEnumUtil.MC_RECORD_SN_STATUS.LINE_ON.getValue()}); + } + +} \ 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/station/jx/JxSnLineOnModuleService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/station/jx/JxSnLineOnModuleService.java new file mode 100644 index 0000000..f1934ca --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/station/jx/JxSnLineOnModuleService.java @@ -0,0 +1,303 @@ +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.api.busi.jx.IJxProduceSnMcRecordService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxSnLineOnModel; +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.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.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("jxSnLineOnModuleService") +public class JxSnLineOnModuleService extends BaseModuleService { + + @Autowired + private IJxProduceSnMcRecordService produceSnMcRecordService; + + @Autowired + private ISxWorkOrderExtService workOrderExtService; + + @Autowired + private IProduceSnExtService produceSnExtService; + + @Autowired + private IShippingDispatchService shippingDispatchService; + + @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_LINE_ON_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.BIND_STATUS, "关键件绑定情况"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.SERIAL_NUMBER, "过程条码"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PRODUCT_SN, "产品条码"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.CREATE_DATE_TIME, "操作时间"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.CREATE_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_LINE_ON_MODULE); + resultBean.setDataAttrList(packDataAttrList()); + resultBean.setSpecialDisplayData(getStepColIndent(reqBean)); + + if (null != workOrderExt) { + List produceSnList = null; + List produceSnMcRecordList = null; + if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.STANDARD_ORDER.getValue() == workOrderExt.getWorkOrderType()) + produceSnList = produceSnExtService.getProduceSnExtListByOrderNo(reqBean.getOrganizeCode(), workOrderExt.getOrderNo()); + else if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() == workOrderExt.getWorkOrderType()) + produceSnList = produceSnExtService.getProduceSnExtListByLastOrderNo(reqBean.getOrganizeCode(), workOrderExt.getOrderNo()); + else + produceSnMcRecordList = produceSnMcRecordService.getProduceSnMcRecordDbList(reqBean.getOrganizeCode(), workOrderExt.getOrderNo()); + + resultBean.setResultMap(packResultMap(workOrderExt, getCompleteQtyByType(workOrderExt.getWorkOrderType(), produceSnList, produceSnMcRecordList))); + + resultBean.setResultList(packResultListByType(workOrderExt.getWorkOrderType(), produceSnList, produceSnMcRecordList)); + } + + this.sendMessage(reqBean, resultBean); + + } + + private Integer getCompleteQtyByType(Integer workOrderType, List produceSnList, List produceSnMcRecordList) { + if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.ATTEMPT_ORDER.getValue() != workOrderType) return CollectionUtils.isEmpty(produceSnList) ? MesPcnExtConstWords.ZERO : produceSnList.size(); + else return CollectionUtils.isEmpty(produceSnMcRecordList) ? MesPcnExtConstWords.ZERO : produceSnMcRecordList.size(); + } + + private List packResultListByType(Integer workOrderType, List produceSnList, List produceSnMcRecordList) { + if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.ATTEMPT_ORDER.getValue() != workOrderType) return packResultListByType1(produceSnList); + else return packResultListByType2(produceSnMcRecordList); + } + + private List packResultListByType1(List produceSnList) { + List resultList = null; + + if (CollectionUtils.isEmpty(produceSnList)) return resultList; + + 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; + JxSnLineOnModel result = new JxSnLineOnModel(); + BeanUtils.copyProperties(produceSnExt, result); + result.setManageCode(produceSnExt.getTrayNo()); + result.setBindStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExt.getSnStatus() ? "已完成" : "未完成"); + if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExt.getSnStatus()) result.setColor(MesPcnExtConstWords.GREEN); + result.setIndex(index); + index ++; + if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>(); + resultList.add(result); + } + + return resultList; + } + + private List packResultListByType2(List produceSnMcRecordList) { + List resultList = null; + + if (CollectionUtils.isEmpty(produceSnMcRecordList)) return resultList; + + produceSnMcRecordList = produceSnMcRecordList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProduceSnMcRecord::getModifyDatetime).reversed()).collect(Collectors.toList()); + + if (!CollectionUtils.isEmpty(produceSnMcRecordList) && produceSnMcRecordList.size() > 50) produceSnMcRecordList = produceSnMcRecordList.subList(0, 50); + + Integer index = 1; + for (MesProduceSnMcRecord produceSnMcRecord : produceSnMcRecordList) { + if (null == produceSnMcRecordList) continue; + JxSnLineOnModel result = new JxSnLineOnModel(); + BeanUtils.copyProperties(produceSnMcRecord, result); + result.setBindStatus(MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() <= produceSnMcRecord.getLineOnStatus() ? "已完成" : "未完成"); + if (MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() <= produceSnMcRecord.getLineOnStatus()) result.setColor(MesPcnExtConstWords.GREEN); + result.setIndex(index); + index ++; + if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>(); + resultList.add(result); + } + + 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; + 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); + if (StringUtils.isEmpty(reqBean.getForceSpecStepCode())) reqBean.setForceJumpProcess(true); + 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 new file mode 100644 index 0000000..68d9af1 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxBindKeyPartStepService.java @@ -0,0 +1,510 @@ +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.IWorkOrderProcessBomService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBindRecordExtService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProcessBom; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProdBindRecordExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderProcessBom; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.ProcessBomModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProcessBomRepository; +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.IFsmCommonService; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.IShippingDispatchService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService; +import cn.estsh.i3plus.mes.pcn.util.LocaleUtil; +import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.tool.MathOperation; +import cn.estsh.i3plus.platform.common.util.MesPcnConstWords; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesKpsnRule; +import cn.estsh.i3plus.pojo.mes.bean.MesProdBindRecord; +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.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.repository.MesKpsnRuleRepository; +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.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.lang.reflect.Method; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description : 嘉兴绑定关键件工步 + * @Reference : + * @Author : wangjie + * @CreateDate : 2019-04-18 + * @Modify: + **/ +@Slf4j +@Service("jxBindKeyPartStepService") +public class JxBindKeyPartStepService extends BaseStepService { + + @Autowired + private JxSnLineOnModuleService snLineOnModuleService; + + @Autowired + private ISxWorkOrderExtService workOrderExtService; + + @Autowired + private IWorkOrderProcessBomService workOrderProcessBomService; + + @Autowired + private MesKpsnRuleRepository kpsnRuleRepository; + + @Autowired + private IJxProdBindRecordExtService prodBindRecordExtService; + + @Autowired + private MesProcessBomRepository processBomRepository; + + @Autowired + private IShippingDispatchService shippingDispatchService; + + @Autowired + private IFsmCommonService fsmCommonService; + + private static final String METHOD = "doHandleBindKeyPartData"; + + 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"; + + @Override + public StepResult init(StationRequestBean reqBean) { + + log.info("工厂{}生产线{}工位{}: --- STEP INIT --- JxBindKeyPartStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + StationResultBean resultBean = new StationResultBean(); + + if (StringUtils.isEmpty(reqBean.getTray()) && StringUtils.isEmpty(reqBean.getProductSn())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, "入参缺少管理编码或产品条码!"); + + Object moduleService = getModuleService(reqBean); + + Method method = getModuleServiceMethod(reqBean, resultBean, moduleService); + + StepResult stepResult = StepResult.getSuccessComplete(); + + if (!StringUtils.isEmpty(doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 1, MesPcnExtConstWords.BIND_KEY_PART, null))) return stepResult; + + String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean); + + WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo); + + List pbList = getProcessBomList(reqBean, orderModel); + + if (CollectionUtils.isEmpty(pbList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "没有需要绑定的清单,请维护!"); + + if (checkIsShowKpsnRule(reqBean)) restorePbList(reqBean, pbList); + + checkAndPackPbListIsExistBindedData(reqBean, orderModel, pbList); + + doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 2, MesPcnExtConstWords.BIND_KEY_PART, JSONObject.toJSONString(pbList)); + + this.refresh(reqBean, pbList); + + log.info("工厂{}生产线{}工位{}: --- STEP INIT --- JxBindKeyPartStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + return StepResult.getSuccessComplete(); + + } + + @Override + public StepResult execute(StationRequestBean reqBean) { + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxBindKeyPartStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + StationResultBean resultBean = new StationResultBean(); + + if (StringUtils.isEmpty(reqBean.getTray()) && StringUtils.isEmpty(reqBean.getProductSn())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, "入参缺少管理编码或产品条码!"); + + Object moduleService = getModuleService(reqBean); + + Method method = getModuleServiceMethod(reqBean, resultBean, moduleService); + + String appendItem = new StringJoiner(MesPcnExtConstWords.COMMA).add(MesPcnExtConstWords.BIND_KEY_PART).add(MesPcnExtConstWords.EXEC_BIND_KEY).toString(); + + if (checkReloadKeyPartData(reqBean, resultBean, moduleService, method, appendItem)) execSendMsgAndThrowEx(reqBean, resultBean, "重载关键件成功!"); + + StepResult stepResult = StepResult.getSuccessComplete(); + + String suffix = StringUtils.isEmpty(reqBean.getProductSn()) ? String.format("管理编码[%s]", getManageCode(reqBean.getTray(), 1)) : String.format("产品条码[%s]", reqBean.getProductSn()); + + if (checkIsJumpState(reqBean, resultBean, moduleService, method, appendItem, false)) + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("%s已跳过关键件绑定业务", suffix)); + + Object data = doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 1, MesPcnExtConstWords.BIND_KEY_PART, null); + + if (null == data) data = execInit(reqBean, resultBean, moduleService, method); + + if (null == data) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, checkIsJumpState(reqBean, resultBean, moduleService, method, appendItem, true), "没有需要绑定的清单,请维护!"); + + List pbList = this.refresh(reqBean, JSONObject.parseArray((String) data, ProcessBomModel.class)); + + List kpsnRuleList = getKpsnRuleList(reqBean, pbList); + + String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean); + + WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo); + + checkKpsnRule4PbList(reqBean, resultBean, kpsnRuleList, pbList, orderModel); + + if (checkPbListIsComplete(reqBean, resultBean, moduleService, method, appendItem, pbList, false)) + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("%s:关键件已绑定完毕!", suffix)); + + List okList = matchKpsnRule4ScanInfo(reqBean, resultBean, moduleService, method, kpsnRuleList, suffix); + + ProcessBomModel processBomModel = getMatchPbData(reqBean, resultBean, pbList, okList, suffix); + + checkKeyPartIsRepeatBind(reqBean, resultBean, processBomModel, suffix); + + insertMesProdBindRecordExt(reqBean, orderModel, processBomModel, okList); + + overrideMatchPbData(processBomModel); + + this.refresh(reqBean, pbList); + + if (!checkPbListIsComplete(reqBean, resultBean, moduleService, method, appendItem, pbList, true)) + execSendMsgAndThrowEx(reqBean, resultBean, String.format("关键件条码[%s]绑定%s成功,请继续扫描关键件!", reqBean.getScanInfo(), suffix)); + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxBindKeyPartStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("关键件条码[%s]绑定%s成功,关键件绑定完毕!", reqBean.getScanInfo(), suffix)); + + } + + private List getProcessBomList(StationRequestBean reqBean, WorkOrderExtModel orderModel) { + List processBomList = getProcessBomListByProcessCodeAndPartNo(reqBean.getOrganizeCode(), reqBean.getProcessCode(), orderModel.getPartNo()); + if (CollectionUtils.isEmpty(processBomList)) return null; + if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() != orderModel.getWorkOrderType()) return getProcessBomList(processBomList); + return getProcessBomList(reqBean, orderModel, processBomList); + } + + private List getProcessBomList(List processBomList) { + List pbList = null; + for (MesProcessBom processBom : processBomList) { + if (null == processBom) continue; + ProcessBomModel pb = new ProcessBomModel(); + BeanUtils.copyProperties(processBom, pb); + if (CollectionUtils.isEmpty(pbList)) pbList = new ArrayList<>(); + pbList.add(pb); + } + return pbList; + } + + private List getProcessBomList(StationRequestBean reqBean, WorkOrderExtModel orderModel, List processBomList) { + List workOrderProcessBomList = workOrderProcessBomService.getWorkOrderProcessBomList(reqBean.getOrganizeCode(), orderModel.getOrderNo(), reqBean.getProcessCode(), orderModel.getPartNo()); + if (CollectionUtils.isEmpty(workOrderProcessBomList)) return null; + Map> bindKeyPartNoMap = processBomList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProcessBom::getItemPartNo)); + List pbList = null; + for (MesWorkOrderProcessBom workOrderProcessBom : workOrderProcessBomList) { + if (null == workOrderProcessBom) continue; + List itemList = bindKeyPartNoMap.get(workOrderProcessBom.getItemPartNo()); + if (CollectionUtils.isEmpty(itemList)) continue; + ProcessBomModel pb = new ProcessBomModel(); + BeanUtils.copyProperties(itemList.get(0), pb); + pb.setQty(workOrderProcessBom.getQty()); + if (CollectionUtils.isEmpty(pbList)) pbList = new ArrayList<>(); + pbList.add(pb); + } + return pbList; + } + + private List getProcessBomListByProcessCodeAndPartNo(String organizeCode, String processCode, String partNo) { + return processBomRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, + MesPcnExtConstWords.IS_BIND_KEY, MesPcnExtConstWords.PROCESS_CODE, MesPcnExtConstWords.PART_NO}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), + CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), processCode, partNo}); + } + + private Boolean checkIsShowKpsnRule(StationRequestBean reqBean) { + if (!CollectionUtils.isEmpty(reqBean.getWcpcMap()) && reqBean.getWcpcMap().containsKey(SHOW_KPSN_RULE)) return true; + return false; + } + + private void restorePbList(StationRequestBean reqBean, List pbList) { + List kpsnRuleList = getKpsnRuleList(reqBean, pbList); + Map> kpsnRuleMap = getKpsnRuleMap(kpsnRuleList); + if (CollectionUtils.isEmpty(kpsnRuleMap)) return; + for (ProcessBomModel pb : pbList) { + List itemList = kpsnRuleMap.get(pb.getItemPartNo()); + if (CollectionUtils.isEmpty(itemList)) continue; + pb.setLength(itemList.get(0).getLength()); + pb.setCheckContent(StringUtils.isEmpty(itemList.get(0).getFix1()) ? itemList.get(0).getFix2() : itemList.get(0).getFix1()); + } + } + + private List getKpsnRuleList(StationRequestBean reqBean, List pbList) { + List itemPartNoList = new ArrayList<>(); + pbList.forEach(p -> itemPartNoList.add(p.getItemPartNo())); + DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); + DdlPreparedPack.getInPackList(itemPartNoList, MesPcnExtConstWords.PART_NO, packBean); + return kpsnRuleRepository.findByHqlWhere(packBean); + } + + private Map> getKpsnRuleMap(List kpsnRuleList) { + return CollectionUtils.isEmpty(kpsnRuleList) ? null : + kpsnRuleList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartNo()))).collect(Collectors.groupingBy(MesKpsnRule::getPartNo)); + } + + private void checkAndPackPbListIsExistBindedData(StationRequestBean reqBean, WorkOrderExtModel orderModel, List pbList) { + + List prodBindRecordList = prodBindRecordExtService.getProdBindRecordExtListByPsOrMc(reqBean.getOrganizeCode(), orderModel.getOrderNo(), reqBean.getWorkCellCode(), reqBean.getProductSn(), getThirdPartyPid(reqBean.getTray())); + Map> bindedMap = CollectionUtils.isEmpty(prodBindRecordList) ? null : + prodBindRecordList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getItemPartNo()))).collect(Collectors.groupingBy(MesProdBindRecord::getItemPartNo)); + for (ProcessBomModel pb : pbList) { + if (null == pb) continue; + if (!CollectionUtils.isEmpty(bindedMap)) { + if (!bindedMap.containsKey(pb.getItemPartNo())) continue; + pb.setBoundQty(new Double(bindedMap.get(pb.getItemPartNo()).size())); + if (MathOperation.compareTo(pb.getBoundQty(), pb.getQty()) >= 0) { + pb.setIsBind(true); + pb.setIsBindName("是"); + pb.setColor(MesPcnExtConstWords.GREEN); + } + } + } + } + + private String getThirdPartyPid(String manageCode) { + if (StringUtils.isEmpty(manageCode) || !manageCode.contains(MesPcnExtConstWords.AND)) return null; + return getManageCode(manageCode, 2); + } + + private String getManageCode(String manageCode, Integer length) { + if (StringUtils.isEmpty(manageCode)) return null; + String[] manageCodeArr = manageCode.split(MesPcnExtConstWords.AND); + if (manageCodeArr.length >= length) return manageCodeArr[length - 1]; + else return null; + } + + private List refresh(StationRequestBean reqBean, List pbList) { + List attrBeanList = new ArrayList<>(); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ITEM_PART_NO, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "原材料物料号")); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ITEM_PART_NAME, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "原材料物料名称")); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.QTY, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "需求数量")); + if (checkIsShowKpsnRule(reqBean)) PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.CHECK_CONTENT, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "校验字符")); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.BOUND_QTY, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "已绑数量")); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.IS_BIND_NAME, LocaleUtil.transferLanguage(reqBean.getUserInfo(), "是否绑定")); + + StationResultBean resultBean = new StationResultBean(); + resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue()); + resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLE.getValue()); + resultBean.setResultList(pbList); + resultBean.setDataAttrList(attrBeanList); + this.sendMessage(reqBean, resultBean); + return pbList; + } + + private Boolean checkReloadKeyPartData(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method, String appendItem) { + if (!StringUtils.isEmpty(reqBean.getScanInfo()) && !CollectionUtils.isEmpty(reqBean.getWcpcMap()) && reqBean.getWcpcMap().containsKey(RELOAD_KEY_PART_CODE) && + !StringUtils.isEmpty(reqBean.getWcpcMap().get(RELOAD_KEY_PART_CODE)) && reqBean.getWcpcMap().get(RELOAD_KEY_PART_CODE).equals(reqBean.getScanInfo())) { + doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 3, appendItem, null); + this.sendMessage(reqBean, resultBean, "关键件重载码验证成功!即将重载关键件...", MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + StationRequestBean chReq = new StationRequestBean(); + chReq.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean)); + chReq.setInterfaceType(MesPcnConstWords.SHIPPING); + chReq.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN); + chReq.setUserInfo(reqBean.getUserInfo()); + chReq.setOrganizeCode(reqBean.getOrganizeCode()); + chReq.setWorkCellCode(reqBean.getWorkCellCode()); + chReq.setWorkCenterCode(reqBean.getWorkCenterCode()); + chReq.setTriggerAutoFsm(true); + shippingDispatchService.doSendScanQueueNextExec(chReq); + return true; + } + return false; + } + + private Boolean checkIsJumpState(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method, String appendItem, Boolean flag) { + if (flag || (!StringUtils.isEmpty(reqBean.getScanInfo()) && !CollectionUtils.isEmpty(reqBean.getWcpcMap()) && reqBean.getWcpcMap().containsKey(VALIDATION_CODE) && + !StringUtils.isEmpty(reqBean.getWcpcMap().get(VALIDATION_CODE)) && reqBean.getWcpcMap().get(VALIDATION_CODE).equals(reqBean.getScanInfo()))) { + doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 3, appendItem, null); + return true; + } + return false; + } + + private Object execInit(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method) { + this.init(reqBean); + return doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 1, MesPcnExtConstWords.BIND_KEY_PART, null); + } + + private void checkKpsnRule4PbList(StationRequestBean reqBean, StationResultBean resultBean, List kpsnRuleList, List pbList, WorkOrderExtModel orderModel) { + Map> kpsnRuleMap = getKpsnRuleMap(kpsnRuleList); + if (CollectionUtils.isEmpty(kpsnRuleMap)) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产工单[%s]对应的物料编码[%s]所需绑定的关键件物料均未配置关键件条码校验规则", orderModel.getOrderNo(), orderModel.getPartNo())); + for (ProcessBomModel pb : pbList) { + if (CollectionUtils.isEmpty(kpsnRuleMap.get(pb.getItemPartNo()))) + execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产工单[%s]对应的物料编码[%s]所需绑定的关键件物料[%s]未配置关键件条码校验规则", orderModel.getOrderNo(), orderModel.getPartNo(), pb.getItemPartNo())); + } + } + + private Boolean checkPbListIsComplete(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method, String appendItem, List pbList, Boolean isCacheFlag) { + Optional unBindOpt = pbList.stream().filter(o -> (null != o && !o.getIsBindVal())).findFirst(); + if (null != unBindOpt && unBindOpt.isPresent()) { + if (isCacheFlag) doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 2, MesPcnExtConstWords.BIND_KEY_PART, JSONObject.toJSONString(pbList)); + return false; + } else { + doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 3, appendItem, null); + return true; + } + } + + private List matchKpsnRule4ScanInfo(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method, List kpsnRuleList, String suffix) { + List okList = null; + if (!StringUtils.isEmpty(reqBean.getScanInfo())) { + for (MesKpsnRule item : kpsnRuleList) { + if (reqBean.getScanInfo().length() != item.getLengthVal()) continue; + if (!checkIsNotEmpty(item.getFrom1Val(), item.getTo1Val(), item.getFix1())) continue; + if (!reqBean.getScanInfo().substring(item.getFrom1Val() - 1, item.getTo1Val()).equals(item.getFix1())) continue; + if (checkIsNotEmpty(item.getFrom2Val(), item.getTo2Val(), item.getFix2()) && !reqBean.getScanInfo().substring(item.getFrom2Val() - 1, item.getTo2Val()).equals(item.getFix2())) continue; + + if (CollectionUtils.isEmpty(okList)) okList = new ArrayList<>(); + okList.add(item); + } + } + if (CollectionUtils.isEmpty(okList)) { + if (StringUtils.isEmpty(doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 1, MesPcnExtConstWords.EXEC_BIND_KEY, null))) { + doHandleBindKeyPartData(reqBean, resultBean, moduleService, method, 2, MesPcnExtConstWords.EXEC_BIND_KEY, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()); + execSendGuideAndThrowEx(reqBean, resultBean, String.format("请扫描关键件!当前生产对象:%s", suffix)); + } else { + if (!StringUtils.isEmpty(reqBean.getScanInfo())) + this.sendMessage(reqBean, resultBean, String.format("关键件条码[%s]没有匹配到规则,请检查扫描是否正确!", reqBean.getScanInfo()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + + execSendGuideAndThrowEx(reqBean, resultBean, String.format("请继续扫描关键件!当前生产对象:%s", suffix)); + } + } + return okList; + } + + private Boolean checkIsNotEmpty(int from, int to, String fix) { + if (StringUtils.isEmpty(from) || StringUtils.isEmpty(to) || StringUtils.isEmpty(fix)) return false; + return true; + } + + private ProcessBomModel getMatchPbData(StationRequestBean reqBean, StationResultBean resultBean, List pbList, List okList, String suffix) { + List okPartNoList = okList.stream().filter(o -> null != o).map(MesKpsnRule::getPartNo).collect(Collectors.toList()); + Optional pb = pbList.stream().filter(o -> (null != o && okPartNoList.contains(o.getItemPartNo()) && (StringUtils.isEmpty(o.getIsBind()) || !o.getIsBind()))).findFirst(); + if (null == pb || !pb.isPresent()) { + this.sendMessage(reqBean, resultBean, String.format("与关键件条码[%s]匹配的关键件的绑定数量已达标,操作失败!", reqBean.getScanInfo()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + execSendGuideAndThrowEx(reqBean, resultBean, String.format("请继续扫描关键件!当前生产对象:%s", suffix)); + } + return pb.get(); + } + + private void checkKeyPartIsRepeatBind(StationRequestBean reqBean, StationResultBean resultBean, ProcessBomModel processBomModel, String suffix) { + if (processBomModel.getIsRepeatVal() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) return; + List prodBindRecordDbList = prodBindRecordExtService.getProdBindRecordListByKpSn(reqBean.getOrganizeCode(), reqBean.getScanInfo()); + Optional prodBindRecordOp = CollectionUtils.isEmpty(prodBindRecordDbList) ? null : + prodBindRecordDbList.stream().filter(o -> (null != o && MesPcnExtEnumUtil.MES_ACTION_TYPE.BIND.getValue() == o.getActionType())).findFirst(); + if (null == prodBindRecordOp || !prodBindRecordOp.isPresent()) return; + + this.sendMessage(reqBean, resultBean, String.format("关键件条码[%s]已被绑定过其他产品,操作失败!", reqBean.getScanInfo()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + execSendGuideAndThrowEx(reqBean, resultBean, String.format("请继续扫描关键件!当前生产对象:%s", suffix)); + } + + + private void insertMesProdBindRecordExt(StationRequestBean reqBean, WorkOrderExtModel orderModel, ProcessBomModel processBomModel, List okList) { + MesKpsnRule matchKpsnRule = okList.stream().filter(o -> (null != o && o.getPartNo().equals(processBomModel.getItemPartNo()))).collect(Collectors.toList()).get(0); + + MesProdBindRecordExt pbr = new MesProdBindRecordExt(); + pbr.setWorkOrderNo(orderModel.getOrderNo()); + pbr.setSerialNumber(reqBean.getSerialNumber()); + pbr.setPartNo(orderModel.getPartNo()); + pbr.setWorkCenterCode(reqBean.getWorkCenterCode()); + pbr.setWorkCellCode(reqBean.getWorkCellCode()); + pbr.setItemPartNo(processBomModel.getItemPartNo()); + pbr.setItemPartName(processBomModel.getItemPartName()); + pbr.setKpSn(reqBean.getScanInfo()); + pbr.setKpQty(new Double(1)); + pbr.setIsBindKey(processBomModel.getIsBindKey()); + pbr.setActionType(MesPcnEnumUtil.MES_ACTION_TYPE.BIND.getValue()); + pbr.setOrganizeCode(reqBean.getOrganizeCode()); + pbr.setSupplierCode(matchKpsnRule.getSupplierCode()); + pbr.setProcessCode(processBomModel.getProcessCode()); + pbr.setProcessName(processBomModel.getProcessName()); + pbr.setPartNameRdd(orderModel.getPartNameRdd()); + pbr.setProductSn(reqBean.getProductSn()); + pbr.setManageCode(getManageCode(reqBean.getTray(), 1)); + pbr.setThirdPartyPid(getThirdPartyPid(reqBean.getTray())); + ConvertBean.serviceModelInitialize(pbr, reqBean.getUserInfo()); + pbr.setLotNo(pbr.getCreateDatetime()); + new ConvertBeanExt(pbr).convertBean(pbr); + prodBindRecordExtService.insertProdBindRecordExtNoRollback(pbr); + } + + private void overrideMatchPbData(ProcessBomModel processBomModel) { + processBomModel.setBoundQty(StringUtils.isEmpty(processBomModel.getBoundQtyVal()) ? new Double(1) : MathOperation.add(processBomModel.getBoundQtyVal(), new Double(1))); + if (MathOperation.compareTo(processBomModel.getBoundQty(), processBomModel.getQty()) >= 0) { + processBomModel.setIsBind(true); + processBomModel.setIsBindName("是"); + processBomModel.setColor(MesPcnExtConstWords.GREEN); + } + } + + private Object getModuleService(StationRequestBean reqBean) { + fsmCommonService.checkWcpcMapForDoScan(reqBean); + return SpringContextsUtil.getBean(reqBean.getWcpcMap().get(MesPcnConstWords.MODULE_OBJECT)); + } + + private Method getModuleServiceMethod(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService) { + Method method = null; + try { + method = moduleService.getClass().getMethod(METHOD, reqBean.getClass(), Integer.class, String.class, String.class); + } catch (Exception e) { + } + if (null == method) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("展示组件缺失[%s]方法", METHOD)); + return method; + } + + private Object doHandleBindKeyPartData(StationRequestBean reqBean, StationResultBean resultBean, Object moduleService, Method method, Integer flag, String item, String data) { + Object obj = null; + try { + obj = method.invoke(moduleService, reqBean, flag, item, data); + } catch (Exception e) { + execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("参数ITEM[%s]FLAG[%s]调用展示组件[%s]方法执行异常:[%s]", item, flag, METHOD, e.getMessage())); + } + return obj; + } + + 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; + } + + +} + diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxCenterPlcPassStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxCenterPlcPassStepService.java new file mode 100644 index 0000000..424d281 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxCenterPlcPassStepService.java @@ -0,0 +1,52 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService; +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 lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.StringJoiner; + +/** + * @Description : 嘉兴通知PLC放行工步 + * @Reference : + * @Author : wangjie + * @CreateDate : 2019-07-11 + * @Modify: + **/ +@Slf4j +@Service("jxCenterPlcPassStepService") +public class JxCenterPlcPassStepService extends BaseStepService { + + @Override + public StepResult execute(StationRequestBean reqBean) { + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxCenterPlcPassStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + StationResultBean resultBean = new StationResultBean(); + + String forceCmdKey = new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.FORCE).add(reqBean.getStepCode()).toString(); + Boolean forceCmd = reqBean.getDataMap().containsKey(forceCmdKey); + if (forceCmd) reqBean.getDataMap().remove(forceCmdKey); + + //通知PLC放行逻辑暂无 + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxCenterPlcPassStepService --- SUCCESS ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + if (!forceCmd) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, + String.format("%s产线放行成功!", StringUtils.isEmpty(reqBean.getProductSn()) ? String.format("管理编码[%s]", getManageCode(reqBean.getTray(), 1)) : String.format("产品条码[%s]", reqBean.getProductSn()))); + else return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, "产线强制放行成功!"); + } + + private String getManageCode(String manageCode, Integer length) { + if (StringUtils.isEmpty(manageCode)) return null; + String[] manageCodeArr = manageCode.split(MesPcnExtConstWords.AND); + if (manageCodeArr.length >= length) return manageCodeArr[length - 1]; + else 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/JxSnLineOnBindMcStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnLineOnBindMcStepService.java new file mode 100644 index 0000000..a7e190c --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnLineOnBindMcStepService.java @@ -0,0 +1,206 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IPartExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProductEncodeCfgExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxNumberRulePackAttributeService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesPartExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord; +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.repository.MesProduceSnExtRepository; +import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnMcRecordRepository; +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.api.iservice.busi.ISyncFuncService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.base.bean.BaseResultBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +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 com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +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.HashMap; +import java.util.Map; +import java.util.StringJoiner; + +/** + * @Description : 嘉兴条码上线绑定工步 + * @Reference : + * @Author : wangjie + * @CreateDate : 2019-07-11 + * @Modify: + **/ +@Slf4j +@Service("jxSnLineOnBindMcStepService") +public class JxSnLineOnBindMcStepService extends BaseStepService { + + @Autowired + private JxSnLineOnModuleService snLineOnModuleService; + + @Autowired + private ISxWorkOrderExtService workOrderExtService; + + @Autowired + private IProductEncodeCfgExtService productEncodeCfgExtService; + + @Autowired + private IPartExtService partExtService; + + @Autowired + private ISxNumberRulePackAttributeService numberRulePackAttributeService; + + @Autowired + private ISyncFuncService syncFuncService; + + @Autowired + private MesProduceSnMcRecordRepository produceSnMcRecordRepository; + + @Autowired + private MesProduceSnExtRepository produceSnExtRepository; + + @Override + public StepResult guide(StationRequestBean reqBean) { + return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean(), "请扫描管理编码或产品条码!"); + } + + @Override + public StepResult execute(StationRequestBean reqBean) { + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnBindMcStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + StationResultBean resultBean = new StationResultBean(); + + if (StringUtils.isEmpty(reqBean.getTray())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, "入参缺少管理编码!"); + + String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean); + + WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo); + + if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() == orderModel.getWorkOrderType()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, "返工工单已跳过管理编码绑定!"); + + MesPartExt partDb = partExtService.getPartExt(reqBean.getOrganizeCode(), orderModel.getPartNo()); + if (null == partDb) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]关联的物料编码[%s]信息不存在!", orderModel.getOrderNo(), orderModel.getPartNo())); + + String serialNumber = null; + if (MesPcnExtEnumUtil.WORK_ORDER_TYPE.STANDARD_ORDER.getValue() == orderModel.getWorkOrderType()) serialNumber = execSerialNumber(reqBean, resultBean, orderModel, partDb); + + MesProduceSnMcRecord produceSnMcRecord = insertMcAndSn(reqBean, orderModel, serialNumber); + + reqBean.setSerialNumber(serialNumber); + reqBean.setTray(new StringJoiner(MesPcnExtConstWords.AND).add(produceSnMcRecord.getManageCode()).add(produceSnMcRecord.getId().toString()).toString()); + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnBindMcStepService --- SUCCESS --- MesProduceSnMcRecord:{} ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), JSONObject.toJSONString(produceSnMcRecord)); + + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, String.format("管理编码[%s]%s绑定生产工单[%s]成功!", + reqBean.getTray(), !StringUtils.isEmpty(serialNumber) ? String.format("关联过程条码[%s]", serialNumber) : MesPcnExtConstWords.EMPTY, orderModel.getOrderNo())); + } + + 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 String execSerialNumber(StationRequestBean reqBean, StationResultBean resultBean, WorkOrderExtModel orderModel, MesPartExt partDb) { + + String ruleCode = null; + try { + ruleCode = productEncodeCfgExtService.getRuleCodeByMatchType(reqBean.getOrganizeCode(), MesPcnExtEnumUtil.ENCODE_CODE_TYPE.SERIAL_SN.getValue(), partDb, orderModel.getWorkCenterCode()); + } catch (Exception e) { + execExpSendMsgAndThrowEx(reqBean, resultBean, e.getMessage()); + } + + if (StringUtils.isEmpty(ruleCode)) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("工单号[%s]关联的物料编码[%s]未配置有效的过程编码匹配规则!", orderModel.getOrderNo(), orderModel.getPartNo())); + + Map map = new HashMap<>(); + map.put(MesPcnExtConstWords.ORGANIZE_CODE, reqBean.getOrganizeCode()); + map.put(MesPcnExtConstWords.RULE_CODE, ruleCode); + map.put(MesPcnExtConstWords.PART_EXT, partDb); + map.put(MesPcnExtConstWords.WORK_ORDER_NO, orderModel.getOrderNo()); + map.put(MesPcnExtConstWords.WORK_CENTER_CODE, orderModel.getWorkCenterCode()); + GenSerialNoModel genSerialNoModel = numberRulePackAttributeService.doPackGenSerialNoModel(map); + + BaseResultBean baseResultBean = syncFuncService.syncSerialNo(genSerialNoModel, reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1); + if (null == baseResultBean || (!baseResultBean.isSuccess() || CollectionUtils.isEmpty(baseResultBean.getResultList()))) + execExpSendMsgAndThrowEx(reqBean, resultBean, String.format( + "工单号[%s]关联的物料编码[%s]配置的过程编码匹配规则编码[%s]生成过程条码失败:%s!", orderModel.getOrderNo(), orderModel.getPartNo(), ruleCode, null != baseResultBean ? baseResultBean.getErrorMsg() : null)); + + return baseResultBean.getResultList().get(0); + } + + private MesProduceSnMcRecord insertMcAndSn(StationRequestBean reqBean, WorkOrderExtModel orderModel, String serialNumber) { + MesProduceSnMcRecord produceSnMcRecord = insertProduceSnMcRecord(reqBean, orderModel, serialNumber); + if (!StringUtils.isEmpty(serialNumber)) insertProduceSnExt(reqBean, orderModel, serialNumber); + return produceSnMcRecord; + } + + private MesProduceSnMcRecord insertProduceSnMcRecord(StationRequestBean reqBean, WorkOrderExtModel orderModel, String serialNumber) { + MesProduceSnMcRecord produceSnMcRecord = new MesProduceSnMcRecord(); + produceSnMcRecord.setManageCode(reqBean.getTray()); + produceSnMcRecord.setSerialNumber(serialNumber); + produceSnMcRecord.setPartNo(orderModel.getPartNo()); + produceSnMcRecord.setPartNameRdd(orderModel.getPartNameRdd()); + produceSnMcRecord.setWorkCenterCode(orderModel.getWorkCenterCode()); + produceSnMcRecord.setWorkOrderNo(orderModel.getOrderNo()); + produceSnMcRecord.setSnStatus(MesPcnExtEnumUtil.MC_RECORD_SN_STATUS.LINE_ON.getValue()); + produceSnMcRecord.setLineOnStatus(MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.FALSE.getValue()); + produceSnMcRecord.setQcStatus(MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.TRUE.getValue()); + produceSnMcRecord.setOrganizeCode(reqBean.getOrganizeCode()); + produceSnMcRecord.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + ConvertBean.serviceModelInitialize(produceSnMcRecord, reqBean.getUserInfo()); + return produceSnMcRecordRepository.insert(produceSnMcRecord); + } + + private void insertProduceSnExt(StationRequestBean reqBean, WorkOrderExtModel orderModel, String serialNumber) { + MesProduceSnExt produceSnExt = new MesProduceSnExt(); + produceSnExt.setSerialNumber(serialNumber); + produceSnExt.setWorkOrderNo(orderModel.getOrderNo()); + produceSnExt.setLastWorkOrderNo(orderModel.getOrderNo()); + produceSnExt.setPartNo(orderModel.getPartNo()); + produceSnExt.setPartNameRdd(orderModel.getPartNameRdd()); + produceSnExt.setPrintStatus(MesPcnExtEnumUtil.PRODUCE_SN_PRINT_STATUS.UNPRINT.getValue()); + produceSnExt.setPrintCount(0); + produceSnExt.setSnStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue()); + produceSnExt.setQcStatus(MesPcnExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue()); + produceSnExt.setSnType(MesPcnExtEnumUtil.PRODUCE_SN_TYPE.STANDARD_SN.getValue()); + produceSnExt.setQty(1d); + produceSnExt.setWorkCenterCode(orderModel.getWorkCenterCode()); + produceSnExt.setTrayNo(reqBean.getTray()); + produceSnExt.setOperateType(MesPcnExtEnumUtil.SN_OPERATE_TYPE.QUALIFIED.getValue()); + produceSnExt.setIfCompensate(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + produceSnExt.setOrganizeCode(orderModel.getOrganizeCode()); + ConvertBean.serviceModelInitialize(produceSnExt, reqBean.getUserInfo()); + produceSnExt.setInWorkCenterTime(produceSnExt.getCreateDatetime()); + produceSnExt.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + new ConvertBeanExt(produceSnExt).convertBean(produceSnExt); + produceSnExtRepository.insert(produceSnExt); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnLineOnCheckMcOrPsStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnLineOnCheckMcOrPsStepService.java new file mode 100644 index 0000000..4f29651 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnLineOnCheckMcOrPsStepService.java @@ -0,0 +1,128 @@ +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("jxSnLineOnCheckMcOrPsStepService") +public class JxSnLineOnCheckMcOrPsStepService 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); + snLineOnModuleService.doHandleBindKeyPartData(reqBean, 3, new StringJoiner(MesPcnExtConstWords.COMMA).add(MesPcnExtConstWords.BIND_KEY_PART).add(MesPcnExtConstWords.EXEC_BIND_KEY).toString(), null); + return StepResult.getSuccessComplete(); + } + + @Override + public StepResult execute(StationRequestBean reqBean) { + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCheckMcOrPsStepService --- 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); + + if (!checkScanInfoIsValid(reqBean, resultBean, stepResult, orderModel).isCompleted()) return stepResult; + + this.sendMessage(reqBean, resultBean, stepResult.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCheckMcOrPsStepService --- 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()))).checkLineOn(params); + + if (!result.isCompleted()) this.sendMessage(reqBean, resultBean, result.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + else reqBean.setTray(params.getManageCode()); + + stepResult.setCompleted(result.isCompleted()); + + if (result.isCompleted() && (null != params.getProduceSnMcRecordDb() || null != params.getProduceSnExtDb())) { + reqBean.setSerialNumber(params.getSerialNumber()); + reqBean.setProductSn(params.getProductSn()); + if (null != params.getProduceSnMcRecordDb()) reqBean.setTray(new StringJoiner(MesPcnExtConstWords.AND).add(params.getProduceSnMcRecordDb().getManageCode()).add(params.getProduceSnMcRecordDb().getId().toString()).toString()); + stepResult.nextTriggerEvent(MesPcnExtConstWords.BIND_KEY_PART).isCompleted(false); + } + + return stepResult; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnLineOnCompleteStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnLineOnCompleteStepService.java new file mode 100644 index 0000000..ad51d44 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnLineOnCompleteStepService.java @@ -0,0 +1,115 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnTravelExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnExtService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord; +import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnExtRepository; +import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnMcRecordRepository; +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.serviceimpl.base.BaseStepService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +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 lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +/** + * @Description : 嘉兴条码上线完成工步 + * @Reference : + * @Author : wangjie + * @CreateDate : 2019-07-11 + * @Modify: + **/ +@Slf4j +@Service("jxSnLineOnCompleteStepService") +public class JxSnLineOnCompleteStepService extends BaseStepService { + + @Autowired + private JxSnLineOnModuleService snLineOnModuleService; + + @Autowired + private IJxProduceSnExtService produceSnExtService; + + @Autowired + private MesProduceSnMcRecordRepository produceSnMcRecordRepository; + + @Autowired + private MesProduceSnExtRepository produceSnExtRepository; + + @Autowired + private IProduceSnTravelExtService produceSnTravelExtService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCompleteStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + StationResultBean resultBean = new StationResultBean(); + + if (StringUtils.isEmpty(reqBean.getTray()) && StringUtils.isEmpty(reqBean.getProductSn())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, "入参缺少管理编码或产品条码!"); + + String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean); + + MesProduceSnExt produceSnExtDb = saveProduceSn(reqBean, resultBean); + + saveProduceSnMcRecord(reqBean, resultBean); + + insertProduceSnTravel(produceSnExtDb); + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCompleteStepService --- SUCCESS ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, StepResult.getSuccessComplete(), true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, + String.format("管理编码[%s]过程条码[%s]产品条码[%s]关联生产工单[%s]上线完成!", reqBean.getTray(), reqBean.getSerialNumber(), reqBean.getProductSn(), curExecWorkOrderNo)); + } + + 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 MesProduceSnExt saveProduceSn(StationRequestBean reqBean, StationResultBean resultBean) { + if (StringUtils.isEmpty(reqBean.getSerialNumber()) && StringUtils.isEmpty(reqBean.getProductSn())) return null; + MesProduceSnExt produceSnExtDb = produceSnExtService.getProduceSnExtDb(reqBean.getOrganizeCode(), reqBean.getSerialNumber(), reqBean.getProductSn()); + + if (null == produceSnExtDb) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("过程条码[%s]产品条码[%s]对应的信息不存在!", reqBean.getSerialNumber(), reqBean.getProductSn())); + + if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == produceSnExtDb.getOperateType()) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("过程条码[%s]产品条码[%s]对应的信息当前业务状态[返修]!", reqBean.getSerialNumber(), reqBean.getProductSn())); + + if (MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue() <= produceSnExtDb.getSnStatus()) return produceSnExtDb; + + produceSnExtDb.setSnStatus(MesPcnExtEnumUtil.PRODUCE_SN_STATUS.PROCESS.getValue()); + produceSnExtService.doPackSnExtProcess(reqBean, produceSnExtDb); + ConvertBean.serviceModelUpdate(produceSnExtDb, reqBean.getUserInfo()); + produceSnExtDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + new ConvertBeanExt(produceSnExtDb).convertBean(produceSnExtDb); + return produceSnExtRepository.save(produceSnExtDb); + } + + private void saveProduceSnMcRecord(StationRequestBean reqBean, StationResultBean resultBean) { + if (StringUtils.isEmpty(reqBean.getTray()) || !reqBean.getTray().contains(MesPcnExtConstWords.AND)) return; + String[] manageCodeArr = reqBean.getTray().split(MesPcnExtConstWords.AND); + MesProduceSnMcRecord produceSnMcRecordDb = produceSnMcRecordRepository.getById(Long.parseLong(manageCodeArr[1])); + if (null == produceSnMcRecordDb) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("管理编码[%s]ID[%s]对应的管理编码与工单条码关系信息不存在!", manageCodeArr[0], manageCodeArr[1])); + if (MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.FALSE.getValue() == produceSnMcRecordDb.getQcStatus()) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("管理编码[%s]ID[%s]对应的管理编码与工单条码关系信息当前业务状态[返修]!", manageCodeArr[0], manageCodeArr[1])); + if (MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue() == produceSnMcRecordDb.getLineOnStatus()) return; + produceSnMcRecordDb.setLineOnStatus(MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.TRUE.getValue()); + ConvertBean.serviceModelUpdate(produceSnMcRecordDb, reqBean.getUserInfo()); + produceSnMcRecordDb.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + produceSnMcRecordRepository.save(produceSnMcRecordDb); + } + + private void insertProduceSnTravel(MesProduceSnExt produceSnExtDb) { + if (null == produceSnExtDb) return; + produceSnTravelExtService.insertProduceSnTravelExt(produceSnExtDb); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnLineOnInitOrderStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnLineOnInitOrderStepService.java new file mode 100644 index 0000000..f2eea02 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnLineOnInitOrderStepService.java @@ -0,0 +1,107 @@ +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.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.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.platform.common.tool.MathOperation; +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 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; + +/** + * @Description : 嘉兴条码上线初始化工单工步 + * @Reference : + * @Author : wangjie + * @CreateDate : 2019-07-11 + * @Modify: + **/ +@Slf4j +@Service("jxSnLineOnInitOrderStepService") +public class JxSnLineOnInitOrderStepService extends BaseStepService { + + @Autowired + private JxSnLineOnModuleService snLineOnModuleService; + + @Autowired + private ISxWorkOrderExtService workOrderExtService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnInitOrderStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + StepResult stepResult = StepResult.getSuccessComplete(); + + StationResultBean resultBean = new StationResultBean(); + + String selectWorkOrderNo = (String) snLineOnModuleService.doHandleSelectWorkOrderNo(reqBean, 1, null); + String curExecWorkOrderNo = (String) snLineOnModuleService.doHandleCurExecWorkOrder(reqBean, 1, null); + + if (!StringUtils.isEmpty(selectWorkOrderNo)) snLineOnModuleService.doHandleSelectWorkOrderNo(reqBean, 3, null); + if (!StringUtils.isEmpty(selectWorkOrderNo) && !StringUtils.isEmpty(curExecWorkOrderNo)) { + if (selectWorkOrderNo.equals(curExecWorkOrderNo)) selectWorkOrderNo = null; + else curExecWorkOrderNo = null; + } + + MesWorkOrderExt workOrderExt = null; + + if (!StringUtils.isEmpty(selectWorkOrderNo)) { + workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), selectWorkOrderNo); + checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("选择的工单号[%s]", selectWorkOrderNo), true); + doCacheCurExecWorkOrderNo(reqBean, resultBean, stepResult, selectWorkOrderNo); + } + + if (!StringUtils.isEmpty(curExecWorkOrderNo)) { + workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo); + checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("此前操作的工单号[%s]", curExecWorkOrderNo), false); + } + + if (null == workOrderExt || !stepResult.isCompleted()) execSendGuideAndThrowEx(reqBean, resultBean, "请选择启动状态的生产工单!"); + + cacheOrderModel(reqBean, workOrderExt); + + log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnInitOrderStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + return stepResult; + } + + private void doCacheCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, String selectWorkOrderNo) { + Boolean flag = (Boolean) snLineOnModuleService.doHandleCurExecWorkOrder(reqBean, 2, selectWorkOrderNo); + if (!flag) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("选择的工单号[%s]初始化失败!", selectWorkOrderNo)); + else { + snLineOnModuleService.execStateModule(reqBean, null, null); + if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean, String.format("选择的工单号[%s]初始化成功!", selectWorkOrderNo), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + } + } + + private void checkWorkOrderExtIsValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkOrderExt workOrderExt, String suffix, Boolean flag) { + + if (null == workOrderExt) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s对应的工单信息不存在!", suffix)); + + if (stepResult.isCompleted() && MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() != workOrderExt.getWorkOrderStatus()) + execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s状态[%s],不支持在此工位操作!", suffix, MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus()))); + + if (stepResult.isCompleted() && MathOperation.compareTo(workOrderExt.getQty(), new Double(0)) <= 0) + execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s计划数量为[0],不支持在此工位操作!", suffix)); + + if (!stepResult.isCompleted()) return; + + } + + private void cacheOrderModel(StationRequestBean reqBean, MesWorkOrderExt workOrderExt) { + WorkOrderExtModel orderModel = new WorkOrderExtModel(); + BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID); + reqBean.getDataMap().put(MesPcnExtConstWords.WORK_ORDER, orderModel); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/bean/MesProdBindRecordExt.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/bean/MesProdBindRecordExt.java index 7362110..1b36cc0 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/bean/MesProdBindRecordExt.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/bean/MesProdBindRecordExt.java @@ -26,7 +26,9 @@ import java.io.Serializable; @Table(name = "MES_PROD_BIND_RECORD_EXT",indexes = { @Index(columnList = "ORGANIZE_CODE_EXT"), @Index(columnList = "CREATE_DATE_TIME_EXT"), - @Index(columnList = "MODIFY_DATE_TIME_EXT") + @Index(columnList = "MODIFY_DATE_TIME_EXT"), + @Index(columnList = "PRODUCT_SN"), + @Index(columnList = "THIRD_PARTY_PID") }) @PrimaryKeyJoinColumn(name = "PID") @Api("产品绑定记录表拓展") @@ -73,4 +75,21 @@ public class MesProdBindRecordExt extends MesProdBindRecord implements Serializa @Column(name="MODIFY_DATE_TIME_EXT") @ApiParam(value = "修改日期") public String modifyDatetimeExt; + + @Column(name = "PRODUCT_SN") + @ApiParam("产品条码") + private String productSn; + + @Column(name = "PART_NAME_RDD") + @ApiParam("物料名称") + private String partNameRdd; + + @Column(name = "MANAGE_CODE") + @ApiParam(value = "管理编码") + private String manageCode; + + @Column(name = "THIRD_PARTY_PID") + @ApiParam("关联ID") + private String thirdPartyPid; + } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/bean/MesProduceSnMcRecord.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/bean/MesProduceSnMcRecord.java index 4477b0f..7ad920d 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/bean/MesProduceSnMcRecord.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/bean/MesProduceSnMcRecord.java @@ -29,7 +29,7 @@ import java.io.Serializable; @Index(columnList = "SYSTEM_SYNC_STATUS"), @Index(columnList = "MANAGE_CODE"), @Index(columnList = "MANAGE_CODE, SN_STATUS"), - @Index(columnList = "SERIAL_NUMBER, WORK_ORDER_NO") + @Index(columnList = "WORK_ORDER_NO") }) @Api("管理码与工单条码关系表") public class MesProduceSnMcRecord extends BaseBean implements Serializable { @@ -76,7 +76,12 @@ public class MesProduceSnMcRecord extends BaseBean implements Serializable { @Column(name = "QC_STATUS") @ApiParam("质量状态") - @AnnoOutputColumn(refClass = MesPcnExtEnumUtil.MC_RECORD_SN_QC_STATUS.class, refForeignKey = "value", value = "description") + @AnnoOutputColumn(refClass = MesPcnExtEnumUtil.MC_RECORD_QC_STATUS.class, refForeignKey = "value", value = "description") private Integer qcStatus; + @Column(name = "LINE_ON_STATUS") + @ApiParam("上线状态") + @AnnoOutputColumn(refClass = MesPcnExtEnumUtil.MC_RECORD_LINE_ON_STATUS.class, refForeignKey = "value", value = "description") + private Integer lineOnStatus; + } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/jx/JxProdBusiStrategyParamsBuilder.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/jx/JxProdBusiStrategyParamsBuilder.java new file mode 100644 index 0000000..9c4747d --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/jx/JxProdBusiStrategyParamsBuilder.java @@ -0,0 +1,176 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesManageCode; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnMcRecord; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkCenterExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel; +import cn.estsh.i3plus.pojo.mes.bean.MesPart; +import lombok.Data; +import org.springframework.util.StringUtils; + +import java.io.Serializable; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:41 上午 + * @Description: 产品条码业务策略实现参数构建器 + **/ +@Data +public class JxProdBusiStrategyParamsBuilder implements Serializable { + + private static final long serialVersionUID = 2545853707952640078L; + + private String organizeCode; + + private String scanInfo; + + private String scanName; + + private String manageCode; + + private String serialNumber; + + private String productSn; + + private String userInfo; + + private String workCenterCode; + + private String workCellCode; + + private MesManageCode manageCodeDb; + + private MesProduceSnMcRecord produceSnMcRecordDb; + + private MesWorkCenterExt workCenterExtDb; + + private WorkOrderExtModel orderModel; + + private MesProduceSnExt produceSnExtDb; + + private MesPart partDb; + + private Object strategyService; + + public static class builder { + + JxProdBusiStrategyParamsBuilder params = new JxProdBusiStrategyParamsBuilder(); + + public builder organizeCode(String organizeCode) { + params.organizeCode = organizeCode; + return this; + } + + public builder scanInfo(String scanInfo) { + params.scanInfo = scanInfo; + return this; + } + + public builder manageCode(String manageCode) { + params.manageCode = manageCode; + return this; + } + + public builder serialNumber(String serialNumber) { + params.serialNumber = serialNumber; + return this; + } + + public builder productSn(String productSn) { + params.productSn = productSn; + return this; + } + + public builder userInfo(String userInfo) { + params.userInfo = userInfo; + return this; + } + + public builder location(String workCenterCode, String workCellCode) { + params.workCenterCode = workCenterCode; + params.workCellCode = workCellCode; + return this; + } + + public builder orderModel(WorkOrderExtModel orderModel) { + params.orderModel = orderModel; + return this; + } + + public builder workCenterExtDb(MesWorkCenterExt workCenterExtDb) { + params.workCenterExtDb = workCenterExtDb; + return this; + } + + public builder partDb(MesPart partDb) { + params.partDb = partDb; + return this; + } + + public builder strategyService(Object strategyService) { + params.strategyService = strategyService; + return this; + } + + public JxProdBusiStrategyParamsBuilder build() { + return params; + } + + } + + public JxProdBusiStrategyParamsBuilder manageCodeDb(MesManageCode manageCodeDb) { + this.manageCodeDb = manageCodeDb; + return this; + } + + public JxProdBusiStrategyParamsBuilder produceSnMcRecordDb(MesProduceSnMcRecord produceSnMcRecordDb) { + this.produceSnMcRecordDb = produceSnMcRecordDb; + return this; + } + + public JxProdBusiStrategyParamsBuilder produceSnExtDb(MesProduceSnExt produceSnExtDb) { + this.produceSnExtDb = produceSnExtDb; + return this; + } + + public JxProdBusiStrategyParamsBuilder manageCode() { + this.manageCode = null; + return this; + } + + public JxProdBusiStrategyParamsBuilder manageCode(String manageCode) { + if (!StringUtils.isEmpty(manageCode)) this.manageCode = manageCode; + return this; + } + + public JxProdBusiStrategyParamsBuilder sn() { + this.serialNumber = null; + this.productSn = null; + return this; + } + + public JxProdBusiStrategyParamsBuilder sn(String serialNumber, String productSn) { + if (!StringUtils.isEmpty(serialNumber)) this.serialNumber = serialNumber; + if (!StringUtils.isEmpty(productSn)) this.productSn = productSn; + return this; + } + + public JxProdBusiStrategyParamsBuilder serialNumber(String serialNumber) { + if (!StringUtils.isEmpty(serialNumber)) this.serialNumber = serialNumber; + return this; + } + + public JxProdBusiStrategyParamsBuilder productSn(String productSn) { + if (!StringUtils.isEmpty(productSn)) this.productSn = productSn; + return this; + } + + public JxProdBusiStrategyParamsBuilder scanName() { + if (!StringUtils.isEmpty(manageCode) && this.scanInfo.equals(manageCode)) this.scanName = "管理编码"; + else if (!StringUtils.isEmpty(productSn) && this.scanInfo.equals(productSn)) this.scanName = "产品条码"; + else this.scanName = "扫描信息"; + return this; + } + +} \ 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/model/jx/JxProduceSnExtModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/jx/JxProduceSnExtModel.java new file mode 100644 index 0000000..0b1b207 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/jx/JxProduceSnExtModel.java @@ -0,0 +1,20 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author wangjie + * @version 1.0 + * @date 2021/1/15 15:32 + **/ +@Data +@ApiModel("嘉兴松下条码 MODEL") +public class JxProduceSnExtModel extends MesProduceSnExt implements Serializable { + + private static final long serialVersionUID = -4159841236145582296L; + +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/jx/JxSnLineOnModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/jx/JxSnLineOnModel.java new file mode 100644 index 0000000..27d3a4f --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/jx/JxSnLineOnModel.java @@ -0,0 +1,44 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiParam; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author wangjie + * @version 1.0 + * @date 2021/1/15 15:32 + **/ +@Data +@ApiModel("嘉兴松下条码上线 MODEL") +public class JxSnLineOnModel implements Serializable { + + private static final long serialVersionUID = 8683799945479864228L; + + @ApiParam("序号") + private Integer index; + + @ApiParam("创建时间") + private String createDatetime; + + @ApiParam("创建人") + private String createUser; + + @ApiParam("管理码") + private String manageCode; + + @ApiParam("过程条码") + private String serialNumber; + + @ApiParam("产品条码") + private String productSn; + + @ApiParam("关键件绑定情况") + private String bindStatus; + + @ApiParam("颜色") + private String color; + +} 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 ce90e2a..5227607 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 @@ -79,6 +79,8 @@ public class MesPcnExtConstWords { public static final String PRINT_STATUS_NAME = "printStatusName"; // 条码类型 public static final String SN_TYPE = "snType"; + // 条码类型 + public static final String SN_TYPE_NAME = "snTypeName"; // 下线时间 public static final String OUT_WC_TIME = "outWorkCenterTime"; // 状态 @@ -91,6 +93,8 @@ public class MesPcnExtConstWords { public static final String LAST_WORK_ORDER_NO = "lastWorkOrderNo"; // 工单状态 public static final String WORK_ORDER_STATUS = "workOrderStatus"; + // 工单状态 + public static final String WORK_ORDER_STATUS_NAME = "workOrderStatusName"; // 工单类型 public static final String WORK_ORDER_TYPE = "workOrderType"; // 工单类型 @@ -490,6 +494,7 @@ public class MesPcnExtConstWords { //绑定关键件 public static final String BIND_KEY_PART_MODULE = "BIND_KEY_PART_MODULE"; public static final String BIND_KEY_PART = "BIND_KEY_PART"; + public static final String EXEC_BIND_KEY = "EXEC_BIND_KEY"; public static final String IS_BIND_KEY = "isBindKey"; public static final String CHECK_CONTENT = "checkContent"; public static final String BOUND_QTY = "boundQty"; @@ -875,4 +880,13 @@ public class MesPcnExtConstWords { //是否解冻 public static final String IS_UNFREEZE = "isUnfreeze"; + + public static final String JX_SN_LINE_ON_MODULE = "JX_SN_LINE_ON_MODULE"; + public static final String JX_SN_LINE_ON_DATA = "JX_SN_LINE_ON_DATA"; + public static final String CMD_FORCE_CENTER_PASS = "CMD_FORCE_CENTER_PASS"; + public static final String FORCE = "FORCE"; + + public static final Integer ZERO = 0; + + public static final String THIRD_PARTY_PID = "thirdPartyPid"; } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtEnumUtil.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtEnumUtil.java index 439c31d..8866423 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtEnumUtil.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtEnumUtil.java @@ -1170,6 +1170,7 @@ public class MesPcnExtEnumUtil { @JsonFormat(shape = JsonFormat.Shape.OBJECT) public enum ENCODE_CODE_TYPE { + SERIAL_SN(5, "过程条码"), STANDARD_SERIAL_SN(10, "正常产品条码"), ATTEMPT_SERIAL_SN(20, "试制产品条码"), REWORK_SERIAL_SN(30, "再生产品条码"), @@ -3359,8 +3360,8 @@ public class MesPcnExtEnumUtil { */ @JsonFormat(shape = JsonFormat.Shape.OBJECT) public enum MC_RECORD_SN_STATUS { - CREATE(10, "上线"), - OFFLINE(20, "下线"); + LINE_ON(10, "管理码上线"), + LINE_OFF(20, "管理码下线"); private int value; private String description; @@ -3409,17 +3410,71 @@ public class MesPcnExtEnumUtil { } /** + * 管理码与工单条码关系上线状态 + */ + @JsonFormat(shape = JsonFormat.Shape.OBJECT) + public enum MC_RECORD_LINE_ON_STATUS { + TRUE(10, "已上线"), + FALSE(20, "半上线"); + + private int value; + private String description; + + MC_RECORD_LINE_ON_STATUS(int value, String description) { + this.value = value; + this.description = description; + } + + public int getValue() { + return value; + } + + public String getDescription() { + return description; + } + + public static String valueOfDescription(int val) { + String tmp = null; + for (int i = 0; i < values().length; i++) { + if (values()[i].value == val) { + tmp = values()[i].description; + } + } + return tmp; + } + + public static String valueOf(int val) { + String tmp = null; + for (int i = 0; i < values().length; i++) { + if (values()[i].value == val) { + tmp = values()[i].description; + } + } + return tmp; + } + + public static MC_RECORD_LINE_ON_STATUS getByValue(int value) { + for (MC_RECORD_LINE_ON_STATUS produceSnStatus : values()) { + if (produceSnStatus.getValue() == value) { + return produceSnStatus; + } + } + return null; + } + } + + /** * 管理码与工单条码关系质量状态 */ @JsonFormat(shape = JsonFormat.Shape.OBJECT) - public enum MC_RECORD_SN_QC_STATUS { + public enum MC_RECORD_QC_STATUS { TRUE(10, "合格"), - FALSE(20, "不合格"); + FALSE(20, "返修"); private int value; private String description; - MC_RECORD_SN_QC_STATUS(int value, String description) { + MC_RECORD_QC_STATUS(int value, String description) { this.value = value; this.description = description; } @@ -3452,8 +3507,8 @@ public class MesPcnExtEnumUtil { return tmp; } - public static MC_RECORD_SN_QC_STATUS getByValue(int value) { - for (MC_RECORD_SN_QC_STATUS produceSnStatus : values()) { + public static MC_RECORD_QC_STATUS getByValue(int value) { + for (MC_RECORD_QC_STATUS produceSnStatus : values()) { if (produceSnStatus.getValue() == value) { return produceSnStatus; } @@ -3562,4 +3617,58 @@ public class MesPcnExtEnumUtil { } } + + @JsonFormat(shape = JsonFormat.Shape.OBJECT) + public enum JX_PROD_BUSI_STRATEGY { + COMMON(0, "通用处理", "jxProdBusiStrategyCommonService"), + STANDARD_ORDER(10, "正常工单", "jxProdBusiStrategyStandardService"), + ATTEMPT_ORDER(20, "试制工单", "jxProdBusiStrategyAttemptService"), + REWORK_ORDER(30, "返工工单", "jxProdBusiStrategyRepairService"); + + private int value; + private String description; + private String clazz; + + JX_PROD_BUSI_STRATEGY(int value, String description, String clazz) { + this.value = value; + this.description = description; + this.clazz = clazz; + } + + public int getValue() { + return this.value; + } + + public String getDescription() { + return this.description; + } + + public String getClazz() { + return this.clazz; + } + + public static JX_PROD_BUSI_STRATEGY getByValue(int value) { + for (JX_PROD_BUSI_STRATEGY strategy : values()) { + if (strategy.getValue() == value) { + return strategy; + } + } + return null; + } + + public static String valueOfClazz(int val) { + String tmp = null; + + for (int i = 0; i < values().length; ++i) { + if (values()[i].value == val) { + tmp = values()[i].clazz; + } + } + + return tmp; + } + + } + + }