diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderCutService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderCutService.java index 0054521..33d62e5 100644 --- a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderCutService.java +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderCutService.java @@ -4,6 +4,7 @@ import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCut; import io.swagger.annotations.ApiOperation; import java.util.List; +import java.util.Map; /** * @Description: @@ -13,12 +14,16 @@ import java.util.List; public interface IMesWorkOrderCutService extends IBaseMesService { @ApiOperation("生成裁片工单") - void doGenerateCutWorkOrder(List workOrderIds, String cutCode, String remark, String organizeCode, String userName); + void doGenerateCutWorkOrder(List workOrderIds, String cutCode, String remark, String organizeCode, + String userName, Integer editionNumber); @ApiOperation("发布裁片工单") void doReleaseCutWorkOrder(List cutWorkOrderNos, String organizeCode, String userName); @ApiOperation("打印裁片工单") - void doPrintCutWorkOrder(List cutWorkOrderNos, String organizeCode, String userName); + List> doPrintCutWorkOrder(List cutWorkOrderNos, String organizeCode, String userName); + + @ApiOperation("重新打印-修改同步状态为未同步") + void doUpdatePrintStatus(List cutWorkOrderIds, String organizeCode, String userName); } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderCutController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderCutController.java index 95adaa1..e5c781b 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderCutController.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesWorkOrderCutController.java @@ -30,13 +30,14 @@ public class MesWorkOrderCutController extends BaseMesController impl @Autowired private MesWorkOrderCutDetailRepository workOrderCutDetailRepository; + @Autowired + private MesLabelTemplateRepository labelTemplateRepository; + + @Autowired + private MesLabelTemplateParamRepository labelTemplateParamRepository; + protected void setPackQueryBean(MesWorkOrderCut bean, DdlPackBean packBean) { DdlPreparedPack.getStringLikerPack(bean.getCutWorkOrderNo(), MesExtConstWords.CUT_WORK_ORDER_NO, packBean); DdlPreparedPack.getStringLikerPack(bean.getCutCode(), MesExtConstWords.CUT_CODE, packBean); @@ -64,123 +75,170 @@ public class MesWorkOrderCutService extends BaseMesService impl } @Override - public void doGenerateCutWorkOrder(List workOrderIds, String cutCode, String remark, String organizeCode, String userName) { - DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getInPackList(workOrderIds, MesExtConstWords.ID, packBean); - List workOrderList = workOrderRepository.findByHqlWhere(packBean); + public void doGenerateCutWorkOrder(List workOrderIds, String cutCode, String remark, String organizeCode, + String userName, Integer editionNumber) { - if (CollectionUtils.isEmpty(workOrderList)) { - MesException.throwMesBusiException("工单信息不存在"); - } + List workOrderList = getMesWorkOrders(workOrderIds, organizeCode); - List workOrderIdDbList = workOrderList.stream().map(MesWorkOrder::getId).collect(Collectors.toList()); + Map> workOrderListMapByPartNo = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getPartNo)); - for (Long workOrderId : workOrderIds) { - if (!workOrderIdDbList.contains(workOrderId)) { - MesException.throwMesBusiException("工单信息ID【%s】不存在", workOrderId); - } - } + MesCutScheme cutScheme = getMesCutScheme(cutCode, organizeCode); - for (MesWorkOrder mesWorkOrder : workOrderList) { - if (mesWorkOrder.getWorkOrderStatus() != MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()) { - MesException.throwMesBusiException("工单状态不为【%s】", MesExtEnumUtil.ORDER_STATUS.valueOfDescription(mesWorkOrder.getWorkOrderStatus())); - } - } + List cutSchemeMaterialList = getMesCutSchemeMaterials(cutCode, organizeCode); - Map> workOrderListMapByPartNo = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getPartNo)); + List cutSchemeFgList = getMesCutSchemeFgs(cutCode, organizeCode); - MesCutScheme cutScheme = getCutScheme(cutCode, organizeCode); + // 校验工单物料是否已在成品配置中进行维护 + checkWorkOrderPartValid(workOrderList, cutSchemeFgList); - if (cutScheme == null) - MesException.throwMesBusiException("裁片方案【%s】无效", cutCode); + editionNumber = editionNumber == null ? 1 : editionNumber; - List cutSchemeMaterialList = getCutSchemeMaterialList(cutCode, organizeCode); + Map workOrderUnCompleteMap = new HashMap<>(); + List workOrderCutDetailtList = new ArrayList<>(); + List workOrderCuttList = new ArrayList<>(); + List workOrderCutMaterialList = new ArrayList<>(); - if (CollectionUtils.isEmpty(cutSchemeMaterialList)) MesException.throwMesBusiException("裁片方案【%s】缺少原材料配置", cutCode); + // 校验工单未完成数量是否满足计划数量 + checkQtyIsEnough(editionNumber, workOrderListMapByPartNo, cutScheme, cutSchemeFgList, workOrderUnCompleteMap); + + // 预计生成裁片工单数量 + for (Integer count = 0; count < editionNumber; count++) { + MesWorkOrderCut workOrderCut = new MesWorkOrderCut(); + ConvertBean.serviceModelInitialize(workOrderCut, userName); + workOrderCut.setCutCode(cutScheme.getCutCode()); + workOrderCut.setCutName(cutScheme.getCutName()); + workOrderCut.setWorkCenterCode(cutScheme.getWorkCenterCode()); + workOrderCut.setWorkOrderStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == cutScheme.getIsAutoRelease() ? MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue() : MesExtEnumUtil.CUT_ORDER_STATUS.CREATE.getValue()); + workOrderCut.setRemark(remark); + + String cutWorkOrderNo = doGenerateSerialNo(cutScheme.getCutCode(), organizeCode, userName); + + log.info("裁片工单号:{}", cutWorkOrderNo); + + workOrderCut.setCutWorkOrderNo(cutWorkOrderNo); + workOrderCut.setOrganizeCode(organizeCode); + + for (MesCutSchemeMaterial cutSchemeMaterial : cutSchemeMaterialList) { + MesWorkOrderCutMaterial workOrderCutMaterial = new MesWorkOrderCutMaterial(); + BeanUtils.copyProperties(cutSchemeMaterial, workOrderCutMaterial, MesExtConstWords.ID); + ConvertBean.serviceModelInitialize(workOrderCutMaterial, userName); + workOrderCutMaterial.setOrganizeCode(organizeCode); + workOrderCutMaterial.setCutWorkOrderNo(workOrderCut.getCutWorkOrderNo()); + workOrderCutMaterial.setSystemSyncStatus(CommonEnumUtil.FALSE); + workOrderCutMaterialList.add(workOrderCutMaterial); + } - List cutSchemeFgList = getCutSchemeFgList(cutCode, organizeCode); + for (MesCutSchemeFg cutSchemeFg : cutSchemeFgList) { + List workOrders = workOrderListMapByPartNo.get(cutSchemeFg.getPartNo()); + MesWorkOrder workOrder = workOrders.get(0); + MesWorkOrderCutDetail detail = new MesWorkOrderCutDetail(); + ConvertBean.serviceModelInitialize(detail, userName); + detail.setOrganizeCode(organizeCode); + detail.setCutWorkOrderNo(cutWorkOrderNo); + detail.setPartNo(workOrder.getPartNo()); + detail.setPartName(workOrder.getPartName()); + detail.setWorkOrderNo(workOrder.getWorkOrderNo()); + detail.setRemark(cutSchemeFg.getRemark()); + detail.setQty(cutSchemeFg.getQty()); + workOrderCutDetailtList.add(detail); + } + } - if (CollectionUtils.isEmpty(cutSchemeFgList)) MesException.throwMesBusiException("裁片方案【%s】缺少裁片方案成品配置", cutCode); + workOrderCutMaterialRepository.saveAll(workOrderCutMaterialList); + workOrderCutDetailRepository.saveAll(workOrderCutDetailtList); + workOrderCutRepository.saveAll(workOrderCuttList); - List partNoList = workOrderList.stream().map(MesWorkOrder::getPartNo).distinct().collect(Collectors.toList()); - List fgPartNoList = cutSchemeFgList.stream().map(MesCutSchemeFg::getPartNo).distinct().collect(Collectors.toList()); + String nowTime = TimeTool.getNowTime(true); + workOrderList.forEach(o -> { + o.setUnCompleteQty(workOrderUnCompleteMap.get(o.getWorkOrderNo())); + o.setModifyUser(userName); + o.setModifyDatetime(nowTime); + o.setSystemSyncStatus(CommonEnumUtil.FALSE); + }); - partNoList.removeAll(fgPartNoList); + workOrderRepository.saveAll(workOrderList); - if (!CollectionUtils.isEmpty(partNoList)) MesException.throwMesBusiException("零件号【%s】未在裁片方案成品中维护", partNoList); + } - Map workOrderUnCompleteMap = new HashMap<>(); - List workOrderCutDetailtList = new ArrayList<>(); + private static void checkQtyIsEnough(Integer editionNumber, Map> workOrderListMapByPartNo, MesCutScheme cutScheme, List cutSchemeFgList, Map workOrderUnCompleteMap) { for (MesCutSchemeFg cutSchemeFg : cutSchemeFgList) { List workOrders = workOrderListMapByPartNo.get(cutSchemeFg.getPartNo()); - if (workOrders.size() > 1) { - MesException.throwMesBusiException("零件号【%s】存在多个工单", cutSchemeFg.getPartNo()); - } - MesWorkOrder workOrder = workOrders.get(0); + if (workOrders.size() > 1) + MesException.throwMesBusiException("零件号【%s】存在多个工单", cutSchemeFg.getPartNo()); + if (!workOrder.getWorkCenterCode().equals(cutScheme.getWorkCenterCode())) MesException.throwMesBusiException("工单【%s】关联产线【%】与裁片方案【%】关联产线不一致!", workOrder.getWorkCenterCode(), cutScheme.getWorkCenterCode()); - if (cutSchemeFg.getQty().compareTo(workOrder.getUnCompleteQty()) > 0) + // 成品配置计划数量 * 版数 = 裁片工单该成品总消耗数量 + Double totalQty = MathOperation.mul(cutSchemeFg.getQty(), editionNumber); + + if (totalQty.compareTo(workOrder.getUnCompleteQty()) > 0) MesException.throwMesBusiException("零件号【%s】工单未完成数量【%s】不满足产成总数【%s】", - cutSchemeFg.getPartNo(), workOrder.getUnCompleteQty(), cutSchemeFg.getQty()); + cutSchemeFg.getPartNo(), workOrder.getUnCompleteQty(), totalQty); - Double unCompleteQty = workOrder.getUnCompleteQty(); + workOrderUnCompleteMap.put(workOrder.getWorkOrderNo(), MathOperation.sub(workOrder.getUnCompleteQty(), totalQty)); - workOrderUnCompleteMap.put(workOrder.getWorkOrderNo(), unCompleteQty - cutSchemeFg.getQty()); + } + } - MesWorkOrderCutDetail detail = new MesWorkOrderCutDetail(); - ConvertBean.serviceModelInitialize(detail, userName); - detail.setOrganizeCode(organizeCode); - detail.setPartNo(workOrder.getPartNo()); - detail.setPartName(workOrder.getPartName()); - detail.setWorkOrderNo(workOrder.getWorkOrderNo()); - detail.setRemark(cutSchemeFg.getRemark()); - detail.setQty(cutSchemeFg.getQty()); - workOrderCutDetailtList.add(detail); + private List getMesWorkOrders(List workOrderIds, String organizeCode) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(workOrderIds, MesExtConstWords.ID, packBean); + List workOrderList = workOrderRepository.findByHqlWhere(packBean); + + if (CollectionUtils.isEmpty(workOrderList)) { + MesException.throwMesBusiException("工单信息不存在"); + } + + List workOrderIdDbList = workOrderList.stream().map(MesWorkOrder::getId).collect(Collectors.toList()); + for (Long workOrderId : workOrderIds) { + if (!workOrderIdDbList.contains(workOrderId)) { + MesException.throwMesBusiException("工单信息ID【%s】不存在", workOrderId); + } } - MesWorkOrderCut workOrderCut = new MesWorkOrderCut(); - ConvertBean.serviceModelInitialize(workOrderCut, userName); - workOrderCut.setCutCode(cutScheme.getCutCode()); - workOrderCut.setCutName(cutScheme.getCutName()); - workOrderCut.setWorkOrderStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == cutScheme.getIsAutoRelease() ? MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue() : MesExtEnumUtil.CUT_ORDER_STATUS.CREATE.getValue()); - workOrderCut.setRemark(remark); + for (MesWorkOrder mesWorkOrder : workOrderList) { + if (mesWorkOrder.getWorkOrderStatus() != MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()) { + MesException.throwMesBusiException("工单状态不为【%s】", MesExtEnumUtil.ORDER_STATUS.valueOfDescription(mesWorkOrder.getWorkOrderStatus())); + } + } + return workOrderList; + } - String cutWorkOrderNo = doGenerateSerialNo(cutScheme.getCutCode(), organizeCode, userName); + private MesCutScheme getMesCutScheme(String cutCode, String organizeCode) { + MesCutScheme cutScheme = getCutScheme(cutCode, organizeCode); - log.info("裁片工单号:{}", cutWorkOrderNo); + if (cutScheme == null) + MesException.throwMesBusiException("裁片方案【%s】无效", cutCode); + return cutScheme; + } - workOrderCut.setCutWorkOrderNo(cutWorkOrderNo); - workOrderCut.setOrganizeCode(organizeCode); + private static void checkWorkOrderPartValid(List workOrderList, List cutSchemeFgList) { + List partNoList = workOrderList.stream().map(MesWorkOrder::getPartNo).distinct().collect(Collectors.toList()); + List fgPartNoList = cutSchemeFgList.stream().map(MesCutSchemeFg::getPartNo).distinct().collect(Collectors.toList()); - workOrderCutDetailtList.forEach(o-> o.setCutWorkOrderNo(workOrderCut.getCutWorkOrderNo())); + partNoList.removeAll(fgPartNoList); - List workOrderCutMaterialList = new ArrayList<>(); - for (MesCutSchemeMaterial cutSchemeMaterial : cutSchemeMaterialList) { - MesWorkOrderCutMaterial workOrderCutMaterial = new MesWorkOrderCutMaterial(); - BeanUtils.copyProperties(cutSchemeMaterial, workOrderCutMaterial, MesExtConstWords.ID); - ConvertBean.serviceModelInitialize(workOrderCutMaterial, userName); - workOrderCutMaterial.setOrganizeCode(organizeCode); - workOrderCutMaterial.setCutWorkOrderNo(workOrderCut.getCutWorkOrderNo()); - workOrderCutMaterial.setSystemSyncStatus(CommonEnumUtil.FALSE); - workOrderCutMaterialList.add(workOrderCutMaterial); - } + if (!CollectionUtils.isEmpty(partNoList)) MesException.throwMesBusiException("零件号【%s】未在裁片方案成品配置中维护", partNoList); + } - workOrderCutMaterialRepository.saveAll(workOrderCutMaterialList); - workOrderCutDetailRepository.saveAll(workOrderCutDetailtList); - workOrderCutRepository.save(workOrderCut); + private List getMesCutSchemeFgs(String cutCode, String organizeCode) { + List cutSchemeFgList = getCutSchemeFgList(cutCode, organizeCode); - for (MesWorkOrder mesWorkOrder : workOrderList) { - mesWorkOrder.setUnCompleteQty(workOrderUnCompleteMap.get(mesWorkOrder.getWorkOrderNo())); - } + if (CollectionUtils.isEmpty(cutSchemeFgList)) MesException.throwMesBusiException("裁片方案【%s】缺少裁片方案成品配置", cutCode); + return cutSchemeFgList; + } - workOrderRepository.saveAll(workOrderList); + private List getMesCutSchemeMaterials(String cutCode, String organizeCode) { + List cutSchemeMaterialList = getCutSchemeMaterialList(cutCode, organizeCode); + if (CollectionUtils.isEmpty(cutSchemeMaterialList)) MesException.throwMesBusiException("裁片方案【%s】缺少原材料配置", cutCode); + return cutSchemeMaterialList; } @Override @@ -215,13 +273,14 @@ public class MesWorkOrderCutService extends BaseMesService impl } @Override - public void doPrintCutWorkOrder(List cutWorkOrderNos, String organizeCode, String userName) { + public List> doPrintCutWorkOrder(List cutWorkOrderNos, String organizeCode, String userName) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getInPackList(cutWorkOrderNos, MesExtConstWords.CUT_WORK_ORDER_NO, packBean); List workOrderCutDbList = workOrderCutRepository.findByHqlWhere(packBean); - List cutWorkOrderNoDbList = workOrderCutDbList.stream().map(MesWorkOrderCut::getCutWorkOrderNo).collect(Collectors.toList()); + List cutWorkOrderNoDbList = workOrderCutDbList.stream().map(MesWorkOrderCut::getCutWorkOrderNo) + .distinct().collect(Collectors.toList()); if (CollectionUtils.isEmpty(cutWorkOrderNoDbList)) MesException.throwMesBusiException("裁片工单不存在"); @@ -230,8 +289,91 @@ public class MesWorkOrderCutService extends BaseMesService impl if (!CollectionUtils.isEmpty(cutWorkOrderNos)) MesException.throwMesBusiException("裁片工单【%s】不存在", cutWorkOrderNos); - List cutCode = workOrderCutDbList.stream().map(MesWorkOrderCut::getCutCode).distinct().collect(Collectors.toList()); + workOrderCutDbList.forEach(o -> { + if (o.getPrintStatus() == MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue()) + MesException.throwMesBusiException("裁片工单【%s】已打印过标签,无法再次打印", o.getCutWorkOrderNo()); + }); + + List> resultMapList = new ArrayList<>(); + List cutCodeList = workOrderCutDbList.stream().map(MesWorkOrderCut::getCutCode) + .distinct().collect(Collectors.toList()); + + // 根据裁片方案代码分组裁片工单 + Map> workOrderCutMapByCutCode = workOrderCutDbList.stream().collect( + Collectors.groupingBy(MesWorkOrderCut::getCutCode)); + + // 获取裁片方案 + List mesCutSchemes = queryCutSchemeList(cutCodeList, organizeCode); + + // 根据裁片方案代码分组 + Map cutSchemeMapByTemplate = mesCutSchemes.stream().collect( + Collectors.toMap(MesCutScheme::getTemplateCode, Function.identity(), (x, y) -> y)); + + for (Map.Entry entry : cutSchemeMapByTemplate.entrySet()) { + + MesCutScheme cutScheme = entry.getValue(); + List workOrderCutList = workOrderCutMapByCutCode.get(entry.getKey()); + + MesLabelTemplate labelTemplate = getLabelTemplate(cutScheme.getTemplateCode(), organizeCode); + + //模板信息丢失抛出异常 + if (labelTemplate == null) + MesException.throwBusiException("请检查裁片方案,裁片工单号[%s]所属裁片方案模板代码[%s]无效!", cutScheme.getTemplateCode()); + + //根据反射获取策略类--封装打印数据 + String methodCode = labelTemplate.getMethodCode(); + + //模板信息丢失抛出异常 + if (methodCode == null) + MesException.throwBusiException("裁片方案[%s]模板代码[%s]方法类[%s]无效,请配置!", cutScheme.getCutCode(), labelTemplate.getTemplateCode(), labelTemplate.getMethodCode()); + + MesProduceSnPrintModel mesProduceSnPrintModel = new MesProduceSnPrintModel(); + mesProduceSnPrintModel.setMesLabelTemplate(labelTemplate); + mesProduceSnPrintModel.setSourceData(workOrderCutList); + mesProduceSnPrintModel.setPrinter(cutScheme.getPrinter()); + + IPrintTemplateStrategyService strategyService = (IPrintTemplateStrategyService) SpringContextsUtil.getBean(methodCode); + MesProduceSnPrintModel printModel = strategyService.execute(null, mesProduceSnPrintModel, null); + + resultMapList.addAll(printModel.getPrintContextList()); + + } + + workOrderCutDbList.forEach(o -> { + o.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue()); + ConvertBean.serviceModelUpdate(o, userName); + o.setSystemSyncStatus(CommonEnumUtil.FALSE); + }); + + workOrderCutRepository.saveAll(workOrderCutDbList); + + return resultMapList; + + } + + private MesLabelTemplate getLabelTemplate(String templateCode, String organizeCode) { + DdlPackBean templatePackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(templateCode, MesExtConstWords.TEMPLATE_CODE, templatePackBean); + MesLabelTemplate mesLabelTemplate = labelTemplateRepository.getByProperty(templatePackBean); + if (mesLabelTemplate != null) { + //级联获取labelTemplateParam + DdlPackBean templateParamPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(mesLabelTemplate.getId(), "templateId", templateParamPackBean); + List params = labelTemplateParamRepository.findByHqlWhere(templateParamPackBean); + mesLabelTemplate.setLabelTemplateParamList(params); + } + return mesLabelTemplate; + } + + @Override + public void doUpdatePrintStatus(List cutWorkOrderIds, String organizeCode, String userName) { + + for (String cutWorkOrderId : cutWorkOrderIds) { + workOrderCutRepository.updateByProperties(MesExtConstWords.ID, Long.parseLong(cutWorkOrderId), + new String[]{MesExtConstWords.IS_DELETED, MesExtConstWords.MODIFY_USER, MesExtConstWords.MODIFY_DATE_TIME, MesExtConstWords.SYSTEM_SYNC_STATUS, MesExtConstWords.PRINT_STATUS}, + new Object[]{CommonEnumUtil.VALID,userName,TimeTool.getNowTime(true), CommonEnumUtil.FALSE, MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()}); + } } @@ -249,6 +391,14 @@ public class MesWorkOrderCutService extends BaseMesService impl } + private List queryCutSchemeList(List cutCodeList, String organizeCode) { + + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(cutCodeList, MesExtConstWords.CUT_CODE, packBean); + return cutSchemeRepository.findByHqlWhere(packBean); + + } + private List getCutSchemeFgList(String cutCode, String organizeCode) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(cutCode, MesExtConstWords.CUT_CODE, packBean); diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/print/IPrintTemplateStrategyService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/print/IPrintTemplateStrategyService.java new file mode 100644 index 0000000..18bfb71 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/print/IPrintTemplateStrategyService.java @@ -0,0 +1,25 @@ +package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.print; + +import cn.estsh.i3plus.ext.mes.pojo.model.MesProduceSnPrintModel; +import cn.estsh.i3plus.pojo.mes.bean.MesNumberRule; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; + +/** + * @Description : 根据不同的条码,封装不同的数据来源 content 是打印模板,dataList + * @Reference : + * @Author : Castle + * @CreateDate : 2024/6/6 16:39 + * @Modify: + **/ +public interface IPrintTemplateStrategyService { + + /** + * GenSerialNoModel 生成条码的规则 + * mesProduceSnPrintModel 需要的数据 + * @param model + * @param mesProduceSnPrintModel + * @return + */ + MesProduceSnPrintModel execute(GenSerialNoModel model, MesProduceSnPrintModel mesProduceSnPrintModel, MesNumberRule numberRule); + +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/print/strategy/CutWorkOrderNoPrintStrategy.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/print/strategy/CutWorkOrderNoPrintStrategy.java new file mode 100644 index 0000000..109179c --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/print/strategy/CutWorkOrderNoPrintStrategy.java @@ -0,0 +1,223 @@ +package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.print.strategy; + +import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.print.IPrintTemplateStrategyService; +import cn.estsh.i3plus.ext.mes.pojo.model.MesProduceSnPrintModel; +import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords; +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.*; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.repository.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description : 裁片工单标签打印 + * @Reference : + * @Author : Castle + * @CreateDate : 2024/6/17 16:43 + * @Modify: + **/ +@Component +@Slf4j +public class CutWorkOrderNoPrintStrategy implements IPrintTemplateStrategyService { + + @Autowired + private MesCutSchemeFgRepository cutSchemeFgRepository; + + @Autowired + private MesCutSchemeMaterialRepository cutSchemeMaterialRepository; + + @Autowired + private MesCutSchemeEquipmentRepository cutSchemeEquipmentRepository; + + @Autowired + private MesCutSchemeEquipmentDetailRepository cutSchemeEquipmentDetailRepository; + + public static final int EQUIP_PARAM_TITLE_NUM = 4; + + @Override + public MesProduceSnPrintModel execute(GenSerialNoModel genSerialNoModel, + MesProduceSnPrintModel model, + MesNumberRule numberRule) { + + List workOrderCutList = (List)model.getSourceData(); + List> printDataMapList = new ArrayList<>(); + + // 裁片方案代码集合 + List cutCodeList = workOrderCutList.stream().map(MesWorkOrderCut::getCutCode).distinct().collect(Collectors.toList()); + + List cutSchemeFgList = getMesCutSchemeFgs(cutCodeList); + + List cutSchemeMaterialList = getMesCutSchemeMaterials(cutCodeList); + + //根据裁片方案代码对裁片方案成品明细分组 + Map> cutSchemeFgMapByCutCode = cutSchemeFgList.stream().collect(Collectors.groupingBy(MesCutSchemeFg::getCutCode)); + + //根据裁片方案代码对裁片方案原材料分组 + Map> cutSchemeMaterialMapByCutCode = cutSchemeMaterialList.stream().collect(Collectors.groupingBy(MesCutSchemeMaterial::getCutCode)); + + List cutSchemeEquipmentList = getMesCutSchemeEquipments(model, cutCodeList); + + cutSchemeEquipmentList = cutSchemeEquipmentList.stream().filter(o -> o.getIsPrint() != null && o.getIsPrint() == CommonEnumUtil.VALID).collect(Collectors.toList()); + + // 根据裁片方案代码对裁片设备信息分组 + Map> cutSchemeEquipmentMapByCutCode = CollectionUtils.isEmpty(cutSchemeEquipmentList) ? null : cutSchemeEquipmentList.stream().collect(Collectors.groupingBy(MesCutSchemeEquipment::getCutCode)); + + List cutSchemeEquipmentDetailList = getMesCutSchemeEquipmentDetails(model, cutSchemeEquipmentList); + + Map> cutSchemeEquipmentDetailMapByPid = cutSchemeEquipmentDetailList.stream().collect(Collectors.groupingBy(MesCutSchemeEquipmentDetail::getPid)); + + for (MesWorkOrderCut workOrderCut : workOrderCutList) { + + List mesCutSchemeFgList = cutSchemeFgMapByCutCode.get(workOrderCut.getCutCode()); + + List mesCutSchemeMaterialList = cutSchemeMaterialMapByCutCode.get(workOrderCut.getCutCode()); + + MesCutSchemeMaterial cutSchemeMaterial = mesCutSchemeMaterialList.get(0); + + List cutSchemeEquipmentListByCutCode = CollectionUtils.isEmpty(cutSchemeEquipmentMapByCutCode) ? null : cutSchemeEquipmentMapByCutCode.get(workOrderCut.getCutCode()); + + if (!CollectionUtils.isEmpty(cutSchemeEquipmentListByCutCode)) cutSchemeEquipmentListByCutCode.sort(Comparator.comparing(MesCutSchemeEquipment::getSeq)); + + Map resultMap = new HashMap<>(); + + resultMap.put(MesExtConstWords.CUT_WORK_ORDER_NO, workOrderCut.getCutWorkOrderNo()); + resultMap.put(MesExtConstWords.CUT_NAME, workOrderCut.getCutName()); + // 拉料信息 START + // 原材料零件号 + resultMap.put(MesExtConstWords.RAW_PART_NO, cutSchemeMaterial.getPartNo()); + resultMap.put(MesExtConstWords.PULLING_MATERIAL_LENGTH, cutSchemeMaterial.getPullingMaterialLength()); + resultMap.put(MesExtConstWords.PULLING_MATERIAL_LAYER_NUMBER, cutSchemeMaterial.getPullingMaterialLayerNumber()); + resultMap.put(MesExtConstWords.PER_LAYER_NUMBER, cutSchemeMaterial.getPerLayerNumber()); + resultMap.put(MesExtConstWords.MATERIAL_DOSAGE, cutSchemeMaterial.getMaterialDosage()); + resultMap.put(MesExtConstWords.USING_LENGTH, cutSchemeMaterial.getUsingLength()); + resultMap.put(MesExtConstWords.LAYER_NUMBER, cutSchemeMaterial.getLayerNumber()); + resultMap.put(MesExtConstWords.TENSION_PARAM, cutSchemeMaterial.getTensionParam()); + // 拉料信息 END + + + //int index = 1; + //for (MesCutSchemeEquipment mesCutSchemeEquipment : cutSchemeEquipmentListByCutCode) { + // //设备信息 + // resultMap.put(MesExtConstWords.TITLE + index, mesCutSchemeEquipment.getValue()); + // + // index++; + //} + + MesCutSchemeEquipment mesCutSchemeEquipment = CollectionUtils.isEmpty(cutSchemeEquipmentListByCutCode) ? null : cutSchemeEquipmentListByCutCode.get(0); + + List equipParamNameList = new ArrayList<>(); + List equipParamValueList = new ArrayList<>(); + List cutSchemeEquipmentDetails = mesCutSchemeEquipment == null ? new ArrayList<>() : cutSchemeEquipmentDetailMapByPid.get(mesCutSchemeEquipment.getId()); + + for (int i = 0; i < EQUIP_PARAM_TITLE_NUM; i++) { + if (cutSchemeEquipmentDetails.size() > i) { + equipParamNameList.add(cutSchemeEquipmentDetails.get(i).getValue()); + equipParamValueList.add(cutSchemeEquipmentDetails.get(i).getName()); + } else { + equipParamNameList.add(""); + equipParamValueList.add(""); + } + } + + for (MesCutSchemeEquipmentDetail cutSchemeEquipmentDetail : cutSchemeEquipmentDetails) { + equipParamNameList.add(cutSchemeEquipmentDetail.getValue()); + equipParamValueList.add(cutSchemeEquipmentDetail.getName()); + } + + //设备参数值标题 + resultMap.put(MesExtConstWords.EQUIPMENT_NAME+1, mesCutSchemeEquipment == null ? "" : mesCutSchemeEquipment.getEquipmentName()); + //设备参数值标题1 + resultMap.put(MesExtConstWords.EQUIP_PARAM_NAME+1, equipParamNameList.get(0)); + //设备参数值标题2 + resultMap.put(MesExtConstWords.EQUIP_PARAM_NAME+2, equipParamNameList.get(1)); + //设备参数值标题3 + resultMap.put(MesExtConstWords.EQUIP_PARAM_NAME+3, equipParamNameList.get(2)); + //设备参数值标题4 + resultMap.put(MesExtConstWords.EQUIP_PARAM_NAME+4, equipParamNameList.get(3)); + //设备参数值1 + resultMap.put(MesExtConstWords.EQUIP_PARAM_VALUE+1, equipParamValueList.get(0)); + //设备参数值2 + resultMap.put(MesExtConstWords.EQUIP_PARAM_VALUE+2, equipParamValueList.get(1)); + //设备参数值3 + resultMap.put(MesExtConstWords.EQUIP_PARAM_VALUE+3, equipParamValueList.get(2)); + //设备参数值4 + resultMap.put(MesExtConstWords.EQUIP_PARAM_VALUE+4, equipParamValueList.get(3)); + + String partValue = ""; + if (!CollectionUtils.isEmpty(mesCutSchemeFgList)) { + BigDecimal[] bigDecimals = divideAndRemainder(mesCutSchemeFgList.get(0).getQty(), mesCutSchemeFgList.get(0).getPackageQty()); + BigDecimal remainder = bigDecimals[1]; + Double boxQty = remainder.doubleValue() > 0 ? bigDecimals[0].add(new BigDecimal("1")).doubleValue() : bigDecimals[0].doubleValue(); + partValue = mesCutSchemeFgList.get(0).getPartNo() + " " + boxQty.intValue() +"箱"; + } + + //产品信息 + resultMap.put(MesExtConstWords.FG_PART_NO, partValue); + + printDataMapList.add(resultMap); + + } + + model.setPrintContextList(packResultMapList(model, printDataMapList)); + + return model; + } + + private BigDecimal[] divideAndRemainder(Double qty, Double packageQty) { + BigDecimal dividend = new BigDecimal(qty.toString()); + BigDecimal divisor = new BigDecimal(packageQty.toString()); + return dividend.divideAndRemainder(divisor); + } + + private List getMesCutSchemeEquipmentDetails(MesProduceSnPrintModel model, List cutSchemeEquipmentList) { + if (!CollectionUtils.isEmpty(cutSchemeEquipmentList)) { + List idList = cutSchemeEquipmentList.stream().map(MesCutSchemeEquipment::getId).collect(Collectors.toList()); + DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode()); + DdlPreparedPack.getInPackList(idList, MesExtConstWords.ID, packBean); + return cutSchemeEquipmentDetailRepository.findByHqlWhere(packBean); + } + return null; + } + + private List getMesCutSchemeEquipments(MesProduceSnPrintModel model, List cutCodeList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode()); + DdlPreparedPack.getInPackList(cutCodeList, MesExtConstWords.CUT_CODE, packBean); + List cutSchemeEquipmentList = cutSchemeEquipmentRepository.findByHqlWhere(packBean); + return cutSchemeEquipmentList; + } + + private List getMesCutSchemeMaterials(List cutCodeList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getInPackList(cutCodeList, MesExtConstWords.CUT_CODE, packBean); + List cutSchemeMaterialList = cutSchemeMaterialRepository.findByHqlWhere(packBean); + return cutSchemeMaterialList; + } + + private List getMesCutSchemeFgs(List cutCodeList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getInPackList(cutCodeList, MesExtConstWords.CUT_CODE, packBean); + List cutSchemeFgList = cutSchemeFgRepository.findByHqlWhere(packBean); + return cutSchemeFgList; + } + + private List> packResultMapList(MesProduceSnPrintModel printModel, List> printTemplateDateList) { + List> resultMapList = new ArrayList<>(); + Map resultMap = new HashMap<>(); + resultMap.put(MesExtConstWords.LABEL_TEMPLATE, printModel.getMesLabelTemplate()); + resultMap.put(MesExtConstWords.TEMPLATE_DATA, printTemplateDateList); + resultMap.put(MesExtConstWords.TEMPLATE_CODE, printModel.getMesLabelTemplate().getTemplateCode()); + resultMap.put(MesExtConstWords.PRINTER, printModel.getPrinter()); + resultMapList.add(resultMap); + return resultMapList; + } + +} diff --git a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/MesProduceSnPrintModel.java b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/MesProduceSnPrintModel.java new file mode 100644 index 0000000..18fda4d --- /dev/null +++ b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/MesProduceSnPrintModel.java @@ -0,0 +1,82 @@ +package cn.estsh.i3plus.ext.mes.pojo.model; + +import cn.estsh.i3plus.pojo.mes.bean.MesLabelTemplate; +import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine; +import cn.estsh.i3plus.pojo.mes.bean.MesPrintedSnLog; +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import io.swagger.annotations.ApiParam; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @Description : 条码补打Model + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/13 15:48 + * @Modify: + **/ +@Data +public class MesProduceSnPrintModel { + + @ApiParam("工厂代码") + private String organizeCode; + + @ApiParam("物料号") + private String partNo; + + @ApiParam("物料名称") + private String partName; + + @ApiParam("条码") + private String productSn; + + @ApiParam("打印数量") + private Integer printQty; + + @ApiParam("标包数量") + private Double qty; + + @ApiParam("打印模板") + private String printTemplate; + + @ApiParam("条码规则") + private String snRule; + + @ApiParam(name = "包装规则代码") + private String packCode; + + @ApiParam(name = "用户名") + private String userName; + + @ApiParam(value = "打印机") + private String printer; + + @ApiParam("客户物料号") + private String custPartNo; + + @ApiParam(name = "包装定义维护") + List mesPackingDefineList; + + @ApiParam(name = "打印模板信息") + private MesLabelTemplate mesLabelTemplate; + + @ApiParam(name = "产品条码信息") + //private List mesProduceSnPrintDataModelList = new ArrayList<>(); + + private List mesProduceSnList = new ArrayList<>(); + + private List mesPrintedSnLogList = new ArrayList<>(); + + @ApiParam(name = "源数据 使用功能:1-裁片") + private Object sourceData; + + @ApiParam(name = "打印内容 使用功能:1-裁片") + List> printContextList = new ArrayList<>(); + + public Double getQty() { + return qty == null || qty <= 0d ? 1d : qty; + } +} diff --git a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/MesWorkOrderCutPrintModel.java b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/MesWorkOrderCutPrintModel.java new file mode 100644 index 0000000..045ca9b --- /dev/null +++ b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/MesWorkOrderCutPrintModel.java @@ -0,0 +1,27 @@ +package cn.estsh.i3plus.ext.mes.pojo.model; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +/** + * @Description : 工单标签补打Model + * @Reference : + * @Author : xinwang.yi + * @CreateDate 2024/6/13 15:48 + * @Modify: + **/ +@Data +public class MesWorkOrderCutPrintModel { + + @ApiParam("工厂代码") + private String organizeCode; + + @ApiParam("裁片方案代码") + private String cutCode; + + @ApiParam("裁片方案名称") + private String cutName; + + @ApiParam("裁片工单号") + private String cutWorkOrderNo; +} diff --git a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/util/MesExtConstWords.java b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/util/MesExtConstWords.java index 1384413..6cca86b 100644 --- a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/util/MesExtConstWords.java +++ b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/util/MesExtConstWords.java @@ -33,6 +33,8 @@ public class MesExtConstWords { public static final String WORK_CELL_NAME = "workCellName"; // 设备代码 public static final String EQUIPMENT_CODE = "equipmentCode"; + // 设备名称 + public static final String EQUIPMENT_NAME = "equipmentName"; // 开模记录ID public static final String MOULD_RECORD_ID = "mouldRecordId"; // 设备数据变量ID @@ -261,5 +263,39 @@ public class MesExtConstWords { public static final String PRINT_STATUS = "printStatus"; //客户编码 public static final String CUST_CODE = "custCode"; + // 模板代码 + public static final String TEMPLATE_CODE = "templateCode"; + //打印模板 + public static final String LABEL_TEMPLATE = "labelTemplate"; + //打印模板数据 + public static final String TEMPLATE_DATA = "templateData"; + //打印机 + public static final String PRINTER = "printer"; + + //原材料 + public static final String RAW_PART_NO = "rawPartNo"; + //拉料长度 + public static final String PULLING_MATERIAL_LENGTH = "pullingMaterialLength"; + //拉料层数 + public static final String PULLING_MATERIAL_LAYER_NUMBER = "pullingMaterialLayerNumber"; + //每层套数 + public static final String PER_LAYER_NUMBER = "perLayerNumber"; + //调取长度 + public static final String USING_LENGTH = "usingLength"; + //材料用量 + public static final String MATERIAL_DOSAGE = "materialDosage"; + //层数 + public static final String LAYER_NUMBER = "layerNumber"; + //张力参数 + public static final String TENSION_PARAM = "tensionParam"; + //设备参数名称 + public static final String EQUIP_PARAM_NAME = "equipParamName"; + //设备参数值 + public static final String EQUIP_PARAM_VALUE = "equipParamValue"; + //参数 + public static final String PARAM = "param"; + //成品零件号 + public static final String FG_PART_NO = "fgPartNo"; + }