diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesReworkTaskService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesReworkTaskService.java index c8f5536..8a78ff0 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesReworkTaskService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesReworkTaskService.java @@ -7,10 +7,8 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesReworkTaskRequestModel; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly; -import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; -import cn.estsh.i3plus.pojo.mes.bean.MesShift; -import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspectionDetail; import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTask; +import cn.estsh.i3plus.pojo.mes.model.MesProductionAssemblyModel; import io.swagger.annotations.ApiOperation; import java.util.List; @@ -34,6 +32,9 @@ public interface IMesReworkTaskService { List assemblyQuery(MesReworkTaskRequestModel requestModel); + @ApiOperation(value = "装配件树查询") + List queryAssemblyTree(MesReworkTaskRequestModel requestModel); + boolean validateSn(MesReworkTaskRequestModel requestModel); void doAssemblySnRepeat(MesReworkTaskRequestModel requestModel); diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java index f340ab4..dd75b04 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderService.java @@ -2,10 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; -import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; -import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; -import cn.estsh.i3plus.pojo.mes.bean.MesShift; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +import cn.estsh.i3plus.pojo.mes.bean.*; import io.swagger.annotations.ApiOperation; import java.util.List; @@ -24,6 +21,9 @@ public interface IMesWorkOrderService { public MesWorkOrder queryMesWorkOrder(MesWorkOrder workOrder); @ApiOperation(value = "查询工单") + MesWorkOrder findMesWorkOrderList(String organizeCode,String workOrderNo); + + @ApiOperation(value = "查询工单") public List queryMesWorkOrderList(MesWorkOrder workOrder); @ApiOperation(value = "查询工单") @@ -61,4 +61,7 @@ public interface IMesWorkOrderService { @ApiOperation(value = "生产报工") void doProductReport(MesWorkOrder mesWorkOrder,String userName); + + @ApiOperation(value = "报工调整") + void doProductReportReversal(MesWorkOrder mesWorkOrder,MesProductVersion mesProductVersion,String userName); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesReworkTaskController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesReworkTaskController.java index dcc23f6..e242600 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesReworkTaskController.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesReworkTaskController.java @@ -96,6 +96,19 @@ public class MesReworkTaskController { } } + @PostMapping("/queryAssemblyTree") + @ApiOperation(value = "装配件树查询") + public ResultBean queryAssemblyTree(@RequestBody MesReworkTaskRequestModel requestModel) { + try { + ValidatorBean.checkNotNull(requestModel.getCustSn(), "客户条码不能为空"); + return ResultBean.success("查询成功").setResultList(mesReworkTaskService.queryAssemblyTree(requestModel)); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + @GetMapping("/assemblySnRepeat") @ApiOperation(value = "装配件替换") public ResultBean assemblySnRepeat(MesReworkTaskRequestModel requestModel) { @@ -135,9 +148,9 @@ public class MesReworkTaskController { } } - @GetMapping("/reworkSuccess") + @PostMapping("/reworkSuccess") @ApiOperation(value = "返工成功") - public ResultBean reworkSuccess(MesReworkTaskRequestModel requestModel) { + public ResultBean reworkSuccess(@RequestBody MesReworkTaskRequestModel requestModel) { // 数据校验 //ValidatorBean.checkNotNull(requestModel.getSn(), "条码不能为空"); try { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesReworkTaskServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesReworkTaskServiceImpl.java index fed45ea..91c12c8 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesReworkTaskServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesReworkTaskServiceImpl.java @@ -4,9 +4,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdOrgExtService; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesReworkTaskService; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesTemplateService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesAssemblyExtService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext; @@ -31,11 +29,13 @@ import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspectionDetail; import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTask; import cn.estsh.i3plus.pojo.mes.bean.rework.MesReworkTaskDetail; import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.model.MesProductionAssemblyModel; import cn.estsh.i3plus.pojo.mes.repository.*; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import com.alibaba.fastjson.JSONArray; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.map.HashedMap; import org.slf4j.Logger; @@ -118,6 +118,18 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService { @Autowired private MesProductionAssemblyUniqueRepository mesProductionAssemblyUniqueRepository; + @Autowired + private IMesConfigService mesConfigService; + + @Autowired + private IMesProductionRecordService mesProductionRecordService; + + @Autowired + private IMesWorkOrderService mesWorkOrderService; + + @Autowired + private IMesProductVersionService mesProductVersionService; + @Override public ListPager queryReworkTask(MesReworkTask mesReworkTask, Pager pager) { String organizeCode = !StringUtils.isEmpty(mesReworkTask.getOrganizeCode())?mesReworkTask.getOrganizeCode():AuthUtil.getOrganizeCode(); @@ -221,22 +233,21 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService { return mesProductionAssemblies; } - - public void recursionAssemblySn(List mesProductionAssemblyList,MesReworkTaskRequestModel requestModel){ + @Override + public List queryAssemblyTree(MesReworkTaskRequestModel requestModel) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(requestModel.getOrganizeCode()); - DdlPreparedPack.getInPackList(mesProductionAssemblyList.stream().map(MesProductionAssembly::getAssemblySn).distinct().collect(Collectors.toList()), "productSn", packBean); - DdlPreparedPack.getNumEqualPack(requestModel.getIsOrigSn(), "isOrigSn", packBean); - if (!StringUtils.isEmpty(requestModel.getAssemblyPartNo())) { - DdlPreparedPack.getStringEqualPack(requestModel.getAssemblyPartNo(), "assemblyPartNo", packBean); - } - if (!Objects.isNull(requestModel.getAssemblyPartStatus())) { - DdlPreparedPack.getNumEqualPack(requestModel.getAssemblyPartStatus(), "assemblyStatus", packBean); - } + DdlPreparedPack.getStringEqualPack(requestModel.getCustSn(), "custSn", packBean); + DdlPreparedPack.getStringEqualPack(requestModel.getAssemblyPartNo(), "assemblyPartNo", packBean); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue(), "assemblyStatus", packBean); + List mesProductionAssemblies = mesProductionAssemblyRepository.findByHqlWhere(packBean); - if(!CollectionUtils.isEmpty(mesProductionAssemblies)){ - recursionAssemblySn(mesProductionAssemblies,requestModel); - mesProductionAssemblyList.addAll(mesProductionAssemblies); + if (CollectionUtils.isEmpty(mesProductionAssemblies)) { + MesPcnException.throwFlowException("装配件信息不存在"); } + //查询装配树 + List assemblyTree = parseArray(mesProductionAssemblies); + recursionAssemblySnTree(assemblyTree, requestModel); + return assemblyTree; } @Override @@ -254,6 +265,11 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService { mesReworkTask.setReworkedQty(requestModel.getReworkedQty()); mesReworkTask.setScrapQty(requestModel.getScrapQty()); } else { + //拆解 + if(!CollectionUtils.isEmpty(requestModel.getAssemblyModelList())){ + doAssemblyDisassembly(requestModel, mesReworkTask.getSn()); + } + if (MesExtEnumUtil.NC_TYPE.REWORK.getValue() == requestModel.getType()) { mesReworkTask.setReworkedQty(mesReworkTask.getQty()); } else if (MesExtEnumUtil.NC_TYPE.SCRAP.getValue() == requestModel.getType()) { @@ -279,7 +295,7 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService { if (!CollectionUtils.isEmpty(reworkTaskDetails)) { MesPcnException.throwFlowException("还有位置未返工完成,请检查"); } - MesProduceSn sn = checkProduceSn(requestModel.getSn(), organizeCode); + MesProduceSn sn = getMesProduceSn(organizeCode,requestModel.getSn()); //查询物料信息 MesPart mesPart = mesPartService.getMesPartByPartNo(sn.getPartNo(), organizeCode); String prodLabelTemplate = sn.getProdLabelTemplate(); @@ -383,67 +399,6 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService { } } - private void updateProductSn(MesReworkTaskRequestModel requestModel, MesProductionAssembly assembly, MesProductionAssemblyContext context) { - List produceSnList = produceSnExtService.getProduceSnList(requestModel.getOrganizeCode(), requestModel.getSn()); - if (CollectionUtils.isEmpty(produceSnList)) MesPcnException.throwFlowException("零件条码[%s]信息不存在!", requestModel.getSn()); - Optional optional = produceSnList.stream().filter(sn->sn.getId().equals(context.getProductSnId())).findFirst(); - if (!optional.isPresent()) MesPcnException.throwFlowException("零件条码[%s]信息不存在!", requestModel.getSn()); - // 更新新替换得条码为已装配 - updateNewSn(optional.get(), requestModel.getUserName()); - //更新原条码状态为已拆解 - updateOldSn(assembly); - } - - private void saveProductionAssemblyUnique(MesReworkTaskRequestModel requestModel, String assemblySN, MesProductionAssembly productionAssembly) { - //绑定数据解绑 - saveProductionAssemblyUnique(requestModel, assemblySN); - //唯一性校验数据保存 - saveProductionAssemblyUnique(productionAssembly); - } - - private void saveProductionAssemblyUnique(MesReworkTaskRequestModel requestModel, String assemblySN) { - List assemblyUniqueList = mesAssemblyExtService.getProductionAssemblyUniqueList(requestModel.getOrganizeCode(), assemblySN); - if(!CollectionUtils.isEmpty(assemblyUniqueList)){ - assemblyUniqueList.forEach(t->{ - t.setSystemSyncStatus(CommonEnumUtil.FALSE); - t.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_20.getValue()); - ConvertBean.serviceModelUpdate(t, requestModel.getUserName()); - }); - mesProductionAssemblyUniqueRepository.saveAll(assemblyUniqueList); - } - } - - private void saveProductionAssemblyUnique(MesProductionAssembly productionAssembly) { - MesProductionAssemblyUnique productionAssemblyUnique = new MesProductionAssemblyUnique(); - BeanUtils.copyProperties(productionAssembly, productionAssemblyUnique, MesPcnExtConstWords.ID); - productionAssemblyUnique.setPid(productionAssembly.getId()); - mesProductionAssemblyUniqueRepository.insert(productionAssemblyUnique); - } - - private Object getContext(MesReworkTaskRequestModel requestModel, MesProductionAssembly mesProductionAssembly,Map mesWorkCenterMap) { - if(StringUtils.isEmpty(mesProductionAssembly.getWorkCenterCode())) MesPcnException.throwFlowException("产线代码不存在"); - Object context = null; - MesWorkCenter workCenterDb = null; - //产线类型 - if(!mesWorkCenterMap.containsKey(mesProductionAssembly.getWorkCenterCode())){ - workCenterDb = prodOrgExtService.getWorkCenterDb(requestModel.getOrganizeCode(), mesProductionAssembly.getWorkCenterCode()); - if(Objects.isNull(workCenterDb)) MesPcnException.throwFlowException("产线【%s】信息不存在", mesProductionAssembly.getWorkCenterCode()); - mesWorkCenterMap.put(mesProductionAssembly.getWorkCenterCode(),workCenterDb); - }else{ - workCenterDb = mesWorkCenterMap.get(mesProductionAssembly.getWorkCenterCode()); - } - if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenterDb.getCenterType()) context = new MesProductionAssemblySortContext().copy(mesProductionAssembly); - else context = new MesProductionAssemblyNosortContext().copy(mesProductionAssembly); - return context; - } - - private String doGererateSerialNo(MesPart part,String organizeCode,String userName) { - if(StringUtils.isEmpty(part.getProductMatchRule())) MesPcnException.throwMesBusiException("请检查零件信息,零件[%s]信息未维护零件条码编码规则!", part.getPartNo()); - return syncFuncService.syncSerialNo( - new GenSerialNoModel(part.getProductMatchRule()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(organizeCode), - userName, organizeCode, 1).getResultList().get(0).toString(); - } - @Override public boolean validateSn(MesReworkTaskRequestModel requestModel) { // @@ -564,7 +519,7 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService { updateNewSn(mesProduceSn,requestModel.getUserName()); // 更新原条码状态为已拆解 ConvertBean.serviceModelUpdate(mesProductionAssembly,requestModel.getUserName()); - updateOldSn(mesProductionAssembly); + updateOldSn(mesProductionAssembly.getOrganizeCode(),mesProductionAssembly.getAssemblySn(),requestModel.getUserName(), null); // 原装配件记录为已解绑 mesProductionAssemblyRepository.update(mesProductionAssembly); // 新装配件记录为已装配 @@ -588,35 +543,233 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService { } + public void recursionAssemblySnTree(List assemblyTree, MesReworkTaskRequestModel requestModel) { + for (MesProductionAssemblyModel assembly : assemblyTree) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(requestModel.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(assembly.getAssemblySn(), "productSn", packBean); + DdlPreparedPack.getStringEqualPack(requestModel.getAssemblyPartNo(), "assemblyPartNo", packBean); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue(), "assemblyStatus", packBean); + List mesProductionAssemblies = mesProductionAssemblyRepository.findByHqlWhere(packBean); + if (!CollectionUtils.isEmpty(mesProductionAssemblies)) { + assembly.setChildTreeList(parseArray(mesProductionAssemblies)); + recursionAssemblySnTree(assembly.getChildTreeList(), requestModel); + } + } + } + + private List parseArray(List mesProductionAssemblies) { + return JSONArray.parseArray(JSONArray.toJSONString(mesProductionAssemblies), MesProductionAssemblyModel.class); + } + + + public void recursionAssemblySn(List mesProductionAssemblyList,MesReworkTaskRequestModel requestModel){ + DdlPackBean packBean = DdlPackBean.getDdlPackBean(requestModel.getOrganizeCode()); + DdlPreparedPack.getInPackList(mesProductionAssemblyList.stream().map(MesProductionAssembly::getAssemblySn).distinct().collect(Collectors.toList()), "productSn", packBean); + DdlPreparedPack.getNumEqualPack(requestModel.getIsOrigSn(), "isOrigSn", packBean); + if (!StringUtils.isEmpty(requestModel.getAssemblyPartNo())) { + DdlPreparedPack.getStringEqualPack(requestModel.getAssemblyPartNo(), "assemblyPartNo", packBean); + } + if (!Objects.isNull(requestModel.getAssemblyPartStatus())) { + DdlPreparedPack.getNumEqualPack(requestModel.getAssemblyPartStatus(), "assemblyStatus", packBean); + } + List mesProductionAssemblies = mesProductionAssemblyRepository.findByHqlWhere(packBean); + if(!CollectionUtils.isEmpty(mesProductionAssemblies)){ + recursionAssemblySn(mesProductionAssemblies,requestModel); + mesProductionAssemblyList.addAll(mesProductionAssemblies); + } + } + private void updateNewSn(MesProduceSn mesProduceSn,String userName) { mesProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY.getValue()); ConvertBean.serviceModelUpdate(mesProduceSn, userName); mesProduceSnRepository.update(mesProduceSn); } - private void updateOldSn(MesProductionAssembly mesProductionAssembly) { - DdlPackBean oldSnPackBean = DdlPackBean.getDdlPackBean(); - DdlPreparedPack.getStringEqualPack(mesProductionAssembly.getAssemblySn(), "productSn", oldSnPackBean); + private void updateOldSn(String organizeCode, String productSn, String userName, Integer qcStatus) { + MesProduceSn oldProduceSn = getMesProduceSn(organizeCode,productSn); + if(!Objects.isNull(qcStatus)){ + oldProduceSn.setQcStatus(qcStatus); + } + oldProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY_BACK.getValue()); + ConvertBean.serviceModelUpdate(oldProduceSn,userName); + mesProduceSnRepository.update(oldProduceSn); + } + + private void doAssemblyDisassembly(MesReworkTaskRequestModel requestModel, String productSn) { + //总成拆解 + doProductReportReversal(requestModel,productSn); + //装配件数据处理 + recursionCheck(requestModel.getAssemblyModelList(), requestModel.getOrganizeCode(), requestModel.getUserName(),mesConfigService.getCfgValue(requestModel.getOrganizeCode(), MesPcnExtConstWords.DISASSEMBLY_DEST_LOCATE)); + } + + private void doProductReportReversal(MesReworkTaskRequestModel requestModel, String productSn) { + //更新条码状态为总成拆解 + MesProduceSn produceSnDb = getMesProduceSn(requestModel.getOrganizeCode(), productSn); + produceSnDb.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY_DISASSEMBLY.getValue()); + ConvertBean.serviceModelUpdate(produceSnDb, requestModel.getUserName()); + mesProduceSnRepository.update(produceSnDb); + //拆解返工单完成后,总成反向移库(NC责任人对应库位(MesMove最后一条记录的库位)-->默认库位(生产版本中的receive_inventory_point)),若总成已汇报,自动做一个报工调整 + List productionRecordList = mesProductionRecordService.findProductionRecordList(produceSnDb.getOrganizeCode(), produceSnDb.getProductSn(), produceSnDb.getPartNo()); + if(CollectionUtils.isEmpty(productionRecordList)){ + return; + } + Optional optional = productionRecordList.stream().filter(o -> (null != o && MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_20.getValue() == o.getReportStatus())).findFirst(); + if (!optional.isPresent() || StringUtils.isEmpty(optional.get().getWorkOrderNo())) { + return; + } + //报工调整 + MesWorkOrder mesWorkOrderDb = mesWorkOrderService.findMesWorkOrderList(requestModel.getOrganizeCode(), optional.get().getWorkOrderNo()); + MesProductVersion productVersion = getProductVersion(mesWorkOrderDb); + mesWorkOrderDb.setNum(MesPcnExtConstWords.ONE); + mesWorkOrderService.doProductReportReversal(mesWorkOrderDb,productVersion, requestModel.getUserName()); + //移库 + requestModel.setSn(produceSnDb.getProductSn()); + createMove(requestModel,getDestLocateNo(requestModel.getOrganizeCode(), produceSnDb.getProductSn()),productVersion.getReceiveInventoryPoint(),mesWorkOrderDb.getErpWorkCenter(),mesWorkOrderDb.getPartNo()); + } + + private MesProductVersion getProductVersion(MesWorkOrder mesWorkOrderDb) { + MesProductVersion mesProductVersion = mesProductVersionService.getMesProductVersion(mesWorkOrderDb.getOrganizeCode(),mesWorkOrderDb.getPartNo(),mesWorkOrderDb.getProductVersion()); + if (null == mesProductVersion) { + MesPcnException.throwMesBusiException("物料【%s】生产版本【%s】信息不存在", mesWorkOrderDb.getPartNo(), mesWorkOrderDb.getProductVersion()); + } + return mesProductVersion; + } + + public void recursionCheck(List assemblyModelList,String organizeCode,String userName,String destLocate){ + for (MesProductionAssemblyModel assemblyModel : assemblyModelList) { + //勾选 + if (assemblyModel.getFlag() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) { + //报废 + if(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_10.getValue() == assemblyModel.getMatchType()){ + updateOldSn(organizeCode,assemblyModel.getAssemblySn(), userName, MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue()); + } + //对于已勾选报废的子件,对于有零件号的项,产生移库(产线的材料库位->报废库(系统参数配置))。移库数量为报废时的明细数量; + createMove(getMesWorkCenter(organizeCode, assemblyModel.getWorkCenterCode()),destLocate, assemblyModel,userName); + //循环处理数据 + if(!CollectionUtils.isEmpty(assemblyModel.getChildTreeList())){ + recursionCheck(assemblyModel.getChildTreeList(),organizeCode,userName,destLocate); + } + } else if (assemblyModel.getFlag() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) { + //装配解绑 + saveProductionAssembly(organizeCode, userName, assemblyModel.getAssemblySn()); + //自制件更新条码状态 条码状态可用 + if(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_10.getValue() == assemblyModel.getMatchType()){ + updateOldSn(organizeCode,assemblyModel.getAssemblySn(), userName, null); + //唯一性表中删除 + }else if(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_30.getValue() == assemblyModel.getMatchType()){ + saveProductionAssemblyUnique(organizeCode, userName, assemblyModel.getAssemblySn()); + } + } + } + } + + private void updateProductSn(MesReworkTaskRequestModel requestModel, MesProductionAssembly assembly, MesProductionAssemblyContext context) { + List produceSnList = produceSnExtService.getProduceSnList(requestModel.getOrganizeCode(), requestModel.getSn()); + if (CollectionUtils.isEmpty(produceSnList)) MesPcnException.throwFlowException("零件条码[%s]信息不存在!", requestModel.getSn()); + Optional optional = produceSnList.stream().filter(sn->sn.getId().equals(context.getProductSnId())).findFirst(); + if (!optional.isPresent()) MesPcnException.throwFlowException("零件条码[%s]信息不存在!", requestModel.getSn()); + // 更新新替换得条码为已装配 + updateNewSn(optional.get(), requestModel.getUserName()); + //更新原条码状态为已拆解 + updateOldSn(assembly.getOrganizeCode(),assembly.getAssemblySn(),requestModel.getUserName(), null); + } + + private void saveProductionAssemblyUnique(MesReworkTaskRequestModel requestModel, String assemblySN, MesProductionAssembly productionAssembly) { + //绑定数据解绑 + saveProductionAssemblyUnique(requestModel.getOrganizeCode(),requestModel.getUserName(), assemblySN); + //唯一性校验数据保存 + saveProductionAssemblyUnique(productionAssembly); + } + + private void saveProductionAssemblyUnique(String organizeCode,String userName, String assemblySN) { + List assemblyUniqueList = mesAssemblyExtService.getProductionAssemblyUniqueList(organizeCode, assemblySN); + if(!CollectionUtils.isEmpty(assemblyUniqueList)){ + assemblyUniqueList.forEach(t->{ + t.setSystemSyncStatus(CommonEnumUtil.FALSE); + t.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_20.getValue()); + ConvertBean.serviceModelUpdate(t, userName); + }); + mesProductionAssemblyUniqueRepository.saveAll(assemblyUniqueList); + } + } + + private void saveProductionAssembly(String organizeCode,String userName, String assemblySN) { + List assemblyList = mesAssemblyExtService.getProductionAssemblyList(organizeCode, assemblySN); + if(CollectionUtils.isEmpty(assemblyList)){ + return; + } + assemblyList = assemblyList.stream().filter(o->MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue() == o.getAssemblyStatus()).collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(assemblyList)){ + assemblyList.forEach(t->{ + t.setSystemSyncStatus(CommonEnumUtil.FALSE); + t.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_20.getValue()); + ConvertBean.serviceModelUpdate(t, userName); + }); + mesProductionAssemblyRepository.saveAll(assemblyList); + } + } + + private void saveProductionAssemblyUnique(MesProductionAssembly productionAssembly) { + MesProductionAssemblyUnique productionAssemblyUnique = new MesProductionAssemblyUnique(); + BeanUtils.copyProperties(productionAssembly, productionAssemblyUnique, MesPcnExtConstWords.ID); + productionAssemblyUnique.setPid(productionAssembly.getId()); + mesProductionAssemblyUniqueRepository.insert(productionAssemblyUnique); + } + + private Object getContext(MesReworkTaskRequestModel requestModel, MesProductionAssembly mesProductionAssembly,Map mesWorkCenterMap) { + if(StringUtils.isEmpty(mesProductionAssembly.getWorkCenterCode())) MesPcnException.throwFlowException("产线代码不存在"); + Object context = null; + MesWorkCenter workCenterDb = null; + //产线类型 + if(!mesWorkCenterMap.containsKey(mesProductionAssembly.getWorkCenterCode())){ + workCenterDb = getMesWorkCenter(requestModel.getOrganizeCode(), mesProductionAssembly.getWorkCenterCode()); + mesWorkCenterMap.put(mesProductionAssembly.getWorkCenterCode(),workCenterDb); + }else{ + workCenterDb = mesWorkCenterMap.get(mesProductionAssembly.getWorkCenterCode()); + } + if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenterDb.getCenterType()) context = new MesProductionAssemblySortContext().copy(mesProductionAssembly); + else context = new MesProductionAssemblyNosortContext().copy(mesProductionAssembly); + return context; + } + + private MesProduceSn getMesProduceSn(String organizeCode, String productSn) { + DdlPackBean oldSnPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(productSn, "productSn", oldSnPackBean); DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, oldSnPackBean); - MesProduceSn oldProduceSn = mesProduceSnRepository.getByProperty(oldSnPackBean); - if (oldProduceSn == null) { - MesPcnException.throwFlowException(String.format("原条码信息不存在【%s】", mesProductionAssembly.getProductSn())); + MesProduceSn produceSnDb = mesProduceSnRepository.getByProperty(oldSnPackBean); + if (produceSnDb == null) { + MesPcnException.throwFlowException(String.format("条码【%s】信息不存在", productSn)); } + return produceSnDb; + } - ConvertBean.serviceModelUpdate(oldProduceSn, mesProductionAssembly.getModifyUser()); - oldProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY_BACK.getValue()); - mesProduceSnRepository.update(oldProduceSn); + private MesWorkCenter getMesWorkCenter(String organizeCode, String workCenterCode) { + MesWorkCenter workCenterDb = prodOrgExtService.getWorkCenterDb(organizeCode,workCenterCode); + if(Objects.isNull(workCenterDb)) MesPcnException.throwFlowException("产线【%s】信息不存在", workCenterCode); + return workCenterDb; + } + + private String doGererateSerialNo(MesPart part,String organizeCode,String userName) { + if(StringUtils.isEmpty(part.getProductMatchRule())) MesPcnException.throwMesBusiException("请检查零件信息,零件[%s]信息未维护零件条码编码规则!", part.getPartNo()); + return syncFuncService.syncSerialNo( + new GenSerialNoModel(part.getProductMatchRule()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(organizeCode), + userName, organizeCode, 1).getResultList().get(0).toString(); + } + + private String getDestLocateNo(String organizeCode, String productSn) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(productSn, "productSn", packBean); + DdlPreparedPack.getOrderBy(null, null, packBean); + MesMove mesMove = moveRepository.getByProperty(packBean); + return Objects.isNull(mesMove) ? null : mesMove.getUmlgo(); } private MesPartInspection getMesPartInspection(MesReworkTask mesReworkTask) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesReworkTask.getOrganizeCode()); DdlPreparedPack.getStringEqualPack(mesReworkTask.getSn(), "sn", packBean); - - MesPartInspection mesPartInspection = mesPartInspectionRepository.getByProperty(packBean); - - return mesPartInspection; + return mesPartInspectionRepository.getByProperty(packBean); } private List getMesPartInspectionDetail(List reworkTaskDetails) { @@ -668,27 +821,12 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService { } private void updateMesProduceSn(MesReworkTaskRequestModel requestModel) { - MesProduceSn produceSn = checkProduceSn(requestModel.getSn(), requestModel.getOrganizeCode()); + MesProduceSn produceSn = getMesProduceSn(requestModel.getOrganizeCode(),requestModel.getSn()); produceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.SCRAP.getValue()); ConvertBean.serviceModelUpdate(produceSn,requestModel.getUserName()); mesProduceSnRepository.update(produceSn); } - private MesProduceSn checkProduceSn(String serialNumber, String org) { - //根据扫描的条码查询条码是否存在 - DdlPackBean packBean = DdlPackBean.getDdlPackBean(org); - DdlPreparedPack.getStringEqualPack(serialNumber, "productSn", packBean); - DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean); - MesProduceSn produceSn = mesProduceSnRepository.getByProperty(packBean); - - //若不存在则提示条码不存在 - if (StringUtils.isEmpty(produceSn)) { - throw new ImppBusiException(String.format("【%s】此条码不存在,请检查数据", serialNumber)); - } - - return produceSn; - } - private MesMove createMove(String oldSn, String sn, String organizeCode, String userName) { MesMove move = new MesMove(); move.setOrganizeCode(organizeCode); @@ -701,4 +839,40 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService { ConvertBean.serviceModelInitialize(move, userName); return moveRepository.insert(move); } + + private void createMove(MesWorkCenter mesWorkCenter, String destLocate, MesProductionAssemblyModel assemblyModel,String userName) { + MesMove move = new MesMove(); + move.setMatnr(assemblyModel.getAssemblyPartNo()); + move.setOrganizeCode(mesWorkCenter.getOrganizeCode()); + move.setFactoryCode(mesWorkCenter.getOrganizeCode()); + move.setLgort(mesWorkCenter.getRawLocate()); + move.setUmlgo(destLocate); + move.setMenge(assemblyModel.getScrapQty()); + move.setPostDate(TimeTool.getToday()); + move.setPostTime(TimeTool.getTimeShortWithColon()); + move.setMoveType(MesExtEnumUtil.MOVE_TYPE.SCRAP_MOVE.getValue()); + move.setProductSn(assemblyModel.getAssemblySn()); + move.setWorkCenter(mesWorkCenter.getErpWorkCenter()); + ConvertBean.serviceModelInitialize(move, userName); + moveRepository.insert(move); + } + + private void createMove(MesReworkTaskRequestModel requestModel,String srcLocate, String destLocate,String workCenterCode,String partNo) { + MesPartSap mesPartSap = mesPartService.getMesPartSapByPartNo(partNo, requestModel.getOrganizeCode()); + MesMove move = new MesMove(); + move.setMatnr(mesPartSap.getPartNo()); + move.setOrganizeCode(requestModel.getOrganizeCode()); + move.setFactoryCode(requestModel.getOrganizeCode()); + move.setLgort(srcLocate); + move.setUmlgo(destLocate); + move.setMenge(1d); + move.setMeins(mesPartSap.getUnit()); + move.setPostDate(TimeTool.getToday()); + move.setPostTime(TimeTool.getTimeShortWithColon()); + move.setMoveType(MesExtEnumUtil.MOVE_TYPE.SCRAP_MOVE.getValue()); + move.setProductSn(requestModel.getSn()); + move.setWorkCenter(workCenterCode); + ConvertBean.serviceModelInitialize(move, requestModel.getUserName()); + moveRepository.insert(move); + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java index fbd62b5..8b61255 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderService.java @@ -131,6 +131,17 @@ public class MesWorkOrderService implements IMesWorkOrderService { } @Override + public MesWorkOrder findMesWorkOrderList(String organizeCode,String workOrderNo) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workOrderNo, "workOrderNo", packBean); + MesWorkOrder mesWorkOrder = workOrderRepository.getByProperty(packBean); + if(Objects.isNull(mesWorkOrder)){ + MesPcnException.throwMesBusiException("工单【%s】信息不存在",workOrderNo); + } + return mesWorkOrder; + } + + @Override public List queryMesWorkOrderList(MesWorkOrder workOrder) { DdlPackBean packBean = getDdlPackBean(workOrder); @@ -351,14 +362,14 @@ public class MesWorkOrderService implements IMesWorkOrderService { mesProductOffLineRDao.saveAll(mesProductOffLineList); } - private void updateMesWorkOrder(MesWorkOrder mesWorkOrder, String userName,double qty) { + private void updateMesWorkOrder(MesWorkOrder mesWorkOrder, String userName,MesExtEnumUtil.WORK_ORDER_LOG_TYPE type,double qty) { //修改工单,需要重新同步 mesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); ConvertBean.serviceModelUpdate(mesWorkOrder, userName); mesWorkOrder.setModifyDatetime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")).format(new Date())); workOrderExtService.update(mesWorkOrder); //保存记录 - saveMesWorkOrderLog(mesWorkOrder,MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT.getValue(),qty); + saveMesWorkOrderLog(mesWorkOrder,type.getValue(),qty); } public void saveMesWorkOrderLog(MesWorkOrder mesWorkOrder,int type,double qty) { @@ -1011,9 +1022,9 @@ public class MesWorkOrderService implements IMesWorkOrderService { } mesWorkOrderDb.setCompleteQty(mesWorkOrderDb.getReportedQty()); mesWorkOrderDb.setRemark(mesWorkOrder.getRemark()); - String sn = getOrderNo(mesWorkOrder.getOrganizeCode(),userName); + String sn = getReportSn(mesWorkOrder.getOrganizeCode(),userName); //更新工单 - updateMesWorkOrder(mesWorkOrderDb, userName,mesWorkOrder.getNum()); + updateMesWorkOrder(mesWorkOrderDb, userName,MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT,mesWorkOrder.getNum()); //记录条码表&加工记录表 //insertMesProductionRecord(insertMesProduceSn(mesPart, sn, userName, mesWorkOrder),mesWorkOrderDb); insertMesProduceSn(mesPart, sn, userName, mesWorkOrder); @@ -1029,6 +1040,33 @@ public class MesWorkOrderService implements IMesWorkOrderService { } } + @Override + public void doProductReportReversal(MesWorkOrder mesWorkOrder,MesProductVersion mesProductVersion, String userName) { + //查询物料信息 + MesPart mesPart = iMesPartService.getMesPartByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode()); + //物料+生产版本获取bom信息 + List mesBomList = findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); + //报工调整数量加- + mesWorkOrder.setAdjustQty((MathOperation.add(mesWorkOrder.getNum(), mesWorkOrder.getAdjustQty()))); + //冲销数量大于工单完成数量报错 + if (mesWorkOrder.getAdjustQty() > mesWorkOrder.getReportedQty()) { + MesPcnException.throwMesBusiException("冲销数量【%s】大于工单完成数量【%s】,不允许冲销", mesWorkOrder.getAdjustQty(), mesWorkOrder.getReportedQty()); + } + String sn = getReportSn(mesWorkOrder.getOrganizeCode(), userName); + //更新工单 + updateMesWorkOrder(mesWorkOrder, userName, MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT_ADJUST,mesWorkOrder.getNum()); + //试制单不报工 + if (Objects.isNull(mesWorkOrder.getOrderFlag()) || !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(mesWorkOrder.getOrderFlag())) { + //保存数据 + List mesProductOffLineList = new ArrayList<>(); + String nowTime = TimeTool.getNowTime(true); + for (MesBom mesBom : mesBomList) { + mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, nowTime)); + } + mesProductOffLineRDao.saveAll(mesProductOffLineList); + } + } + private MesProductVersion getProductVersion(MesWorkOrder mesWorkOrderDb) { MesProductVersion mesProductVersion = mesProductVersionService.getMesProductVersion(mesWorkOrderDb.getOrganizeCode(),mesWorkOrderDb.getPartNo(),mesWorkOrderDb.getProductVersion()); if (null == mesProductVersion) { @@ -1252,7 +1290,7 @@ public class MesWorkOrderService implements IMesWorkOrderService { return DateUtil.parse(dateStr, (DateParser) DatePattern.NORM_DATETIME_FORMAT); } - private String getOrderNo(String organizeCode,String userName) { + private String getReportSn(String organizeCode,String userName) { return syncFuncService.syncSerialNo(new GenSerialNoModel(MesCommonConstant.REPORT_SN).organizeCode(organizeCode),userName, organizeCode, 1).getResultList().iterator().next().toString(); } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesReworkTaskRequestModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesReworkTaskRequestModel.java index ed3b948..9757a7d 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesReworkTaskRequestModel.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesReworkTaskRequestModel.java @@ -1,8 +1,11 @@ package cn.estsh.i3plus.ext.mes.pcn.pojo.model; +import cn.estsh.i3plus.pojo.mes.model.MesProductionAssemblyModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + @Data public class MesReworkTaskRequestModel { @@ -58,4 +61,7 @@ public class MesReworkTaskRequestModel { @ApiModelProperty("ids") private Long[] ids; + @ApiModelProperty("装配拆解List") + private List assemblyModelList; + } 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 432030c..77a83ae 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 @@ -412,4 +412,7 @@ public class MesPcnExtConstWords { //发运解析条码最大长度 public static final String MAX_SHIPPING_BARCODE_LENGTH = "MAX_SHIPPING_BARCODE_LENGTH"; + + //拆解目标库位 + public static final String DISASSEMBLY_DEST_LOCATE = "DISASSEMBLY_DEST_LOCATE"; }