diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesPartPackageTypeService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesPartPackageTypeService.java new file mode 100644 index 0000000..c13ebf4 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesPartPackageTypeService.java @@ -0,0 +1,7 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.base; + +import cn.estsh.i3plus.pojo.mes.bean.MesPartPackageType; + +public interface IMesPartPackageTypeService { + MesPartPackageType getMesPartPackageType(String organizeCode, String packageTypeCode); +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPartPackageTypeServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPartPackageTypeServiceImpl.java new file mode 100644 index 0000000..d043263 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPartPackageTypeServiceImpl.java @@ -0,0 +1,27 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartPackageTypeService; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesPartPackageType; +import cn.estsh.i3plus.pojo.mes.repository.IMesPartPackageTypeRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author jason + */ +@Service +@Slf4j +public class MesPartPackageTypeServiceImpl implements IMesPartPackageTypeService { + @Autowired + private IMesPartPackageTypeRepository partPackageTypeRDao; + + @Override + public MesPartPackageType getMesPartPackageType(String organizeCode, String packageTypeCode) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(packageTypeCode, "packageTypeCode", packBean); + return partPackageTypeRDao.getByProperty(packBean); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/sortshipping/strategy/ChengDuVolvoShippingPrintStrategyService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/sortshipping/strategy/ChengDuVolvoShippingPrintStrategyService.java new file mode 100644 index 0000000..449860f --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/sortshipping/strategy/ChengDuVolvoShippingPrintStrategyService.java @@ -0,0 +1,164 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.sortshipping.strategy; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartPackageTypeService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPartShippingGroupService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesPart; +import cn.estsh.i3plus.pojo.mes.bean.MesPartPackageType; +import cn.estsh.i3plus.pojo.mes.bean.MesPartShippingGroup; +import cn.estsh.i3plus.pojo.mes.bean.edi.cd.MesCimVolvoJisRackId; +import cn.estsh.i3plus.pojo.mes.bean.edi.cd.MesCimVolvoJisRackIdDetail; +import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagement; +import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagementDetail; +import cn.estsh.i3plus.pojo.mes.model.ChengDuVolvoShippingPrintModel; +import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesShippingOrderManagementDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.edi.cd.MesCimVolvoJisRackIdDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.edi.cd.MesCimVolvoJisRackIdRepository; +import cn.estsh.impp.framework.boot.auth.AuthUtil; +import cn.estsh.impp.framework.boot.util.ResultBean; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description : 成都volvo发运单打印策略 + * @Reference : + * @Author : jason.niu + * @CreateDate : 2025/03/20 16:43 + * @Modify: + **/ +@Component +@Slf4j +public class ChengDuVolvoShippingPrintStrategyService implements IPrintTemplateStrategyService { + @Autowired + private MesShippingOrderManagementDetailRepository shippingOrderDetailRDao; + @Autowired + private MesCimVolvoJisRackIdRepository rackIdRDao; + @Autowired + private MesCimVolvoJisRackIdDetailRepository rackIdDetailRDao; + @Autowired + private MesPartRepository partRDao; + @Autowired + private IMesPartShippingGroupService shippingGroupService; + @Autowired + private IMesPartPackageTypeService partPackageTypeService; + + @Override + public ResultBean execute(MesShippingOrderManagement bean, List shippingOrderManagementList) { + List modelList = new ArrayList<>(); + for (MesShippingOrderManagement loadingList : shippingOrderManagementList) { + ChengDuVolvoShippingPrintModel model = getPrintData(loadingList); + if (model != null) { + modelList.add(model); + } + } + return ResultBean.success("装车单打印成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(modelList); + } + + private ChengDuVolvoShippingPrintModel getPrintData(MesShippingOrderManagement shippingOrder) { + final String organizeCode = AuthUtil.getOrganize().getOrganizeCode(); + final String userName = AuthUtil.getSessionUser().getUserName(); + + ChengDuVolvoShippingPrintModel model = new ChengDuVolvoShippingPrintModel(); + DdlPackBean shippingDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(shippingOrder.getId(), "pid", shippingDetailPackBean); + List shippingDetails = shippingOrderDetailRDao.findByHqlWhere(shippingDetailPackBean); + if (CollectionUtils.isEmpty(shippingDetails)) { + return null; + } + + List partNos = new ArrayList<>(); + List rackDetailIdList = new ArrayList<>(); + for (MesShippingOrderManagementDetail shippingDetail : shippingDetails) { + if (shippingDetail.getSourceId() != null) { + rackDetailIdList.add(shippingDetail.getSourceId()); + } + if (!partNos.contains(shippingDetail.getPartNo())) { + partNos.add(shippingDetail.getPartNo()); + } + } + DdlPackBean rackDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(rackDetailIdList, "id", rackDetailPackBean); + List rackIdDetails = rackIdDetailRDao.findByHqlWhere(rackDetailPackBean); + if (CollectionUtils.isEmpty(rackIdDetails)) { + return null; + } + + List rackIdList = new ArrayList<>(); + for (MesCimVolvoJisRackIdDetail rackIdDetail : rackIdDetails) { + if (rackIdDetail.getJisRackIdFid() != null && !rackIdList.contains(rackIdDetail.getJisRackIdFid())) { + rackIdList.add(rackIdDetail.getJisRackIdFid()); + } + } + DdlPackBean rackPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(rackIdList, "id", rackPackBean); + List rackIds = rackIdRDao.findByHqlWhere(rackPackBean); + if (CollectionUtils.isEmpty(rackIds)) { + return null; + } + + // 净重 + double totalNetWeight = 0.0; + // 净重单位 + String netWom = ""; + // 包装重量 + double packageWeight = 0.0; + // 包装重量单位 + String tmpGwUom = ""; + DdlPackBean partPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(partNos, "partNo", rackPackBean); + List parts = partRDao.findByHqlWhere(partPackBean); + if (!CollectionUtils.isEmpty(parts)) { + for (MesPart mesPart : parts) { + if (mesPart.getNetWeight() != null) { + totalNetWeight += mesPart.getNetWeight(); + } + netWom = mesPart.getWeightUom(); + } + } + MesPartShippingGroup shippingGroup = shippingGroupService.getMesPartShippingGroup(organizeCode, shippingOrder.getShippingGroupCode()); + if (shippingGroup != null && !StringUtils.isEmpty(shippingGroup.getPackageTypeCode()) && (shippingGroup.getPackageTypeCode().startsWith("P") || shippingGroup.getPackageTypeCode().startsWith("p"))) { + MesPartPackageType partPackageType = partPackageTypeService.getMesPartPackageType(organizeCode, shippingGroup.getPackageTypeCode()); + if (partPackageType != null) { + packageWeight = partPackageType.getNetWeight() != null ? partPackageType.getNetWeight() : 0; + tmpGwUom = partPackageType.getWeightUom(); + } + } + + MesCimVolvoJisRackId rackId = rackIds.get(0); + model.setRecelver(rackId.getShipToId()); + model.setDock(rackId.getIdForPlaceOfDischarge()); + model.setAdviceNoteNo(rackId.getAsnNo()); + model.setAdviceNoteBarCode(rackId.getAsnNo()); + model.setSupplierAddress(StringUtils.isEmpty(rackId.getShipFrom()) ? rackId.getShipFromId() : rackId.getShipFrom()); + model.setNetWeight(String.format("%.2f", totalNetWeight)); + model.setNWUom(netWom); + model.setGrossWeight(String.format("%.2f", totalNetWeight + packageWeight)); + model.setGWUom(tmpGwUom); + model.setRackId(rackId.getJisRackId()); + model.setRackBarCode(rackId.getJisRackId()); + model.setFirstPreNo(rackId.getFirstSequenceNumber()); + model.setFirstPreBarCode(rackId.getFirstSequenceNumber()); + model.setLastPreNo(rackId.getLastSequenceNumber()); + model.setLastPreBarCode(rackId.getLastSequenceNumber()); + model.setSupplierID(rackId.getSellerId()); + model.setSupplierBarCode(rackId.getSellerId()); + model.setCountryOfOrigin("CN"); + model.setNoofCars(rackDetailIdList.size()); + model.setDescription(rackId.getRackReference()); + model.setPackageId(rackId.getJisRackId()); + model.setPackageBarCode(rackId.getJisRackId()); + model.setProcess("LDJIS"); + + return model; + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java index f3a8399..e5e4e0e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java @@ -153,42 +153,36 @@ public class MesWorkOrderQueueAcceptStepService extends BaseStepService { } //验证是否满足腔数 - if (CollectionUtils.isEmpty(curPushList) || curPushList.size() < cellEquipContext.getCavity()) { - return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, - false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, - CollectionUtils.isEmpty(curPushList) ? "当前未接收到工位工单队列,持续监听中..." : String.format("当前接收到到工位工单队列个数[%s]不满足腔数[%s],持续监听中...", curPushList.size(), cellEquipContext.getCavity()), - getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); - } + if (!CollectionUtils.isEmpty(curPushList) && curPushList.size() == cellEquipContext.getCavity()) { - //搜集工单号 - List workOrderNoList = curPushList.stream().filter(o -> null != o).map(MesQueueOrderPush::getWorkOrderNo).collect(Collectors.toList()); + //搜集工单号 + List workOrderNoList = curPushList.stream().filter(o -> null != o).map(MesQueueOrderPush::getWorkOrderNo).collect(Collectors.toList()); - //发送工步内容 - productionCustomContextStepService.sendStepContextMessage(reqBean, workOrderNoList.toString(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + //发送工步内容 + productionCustomContextStepService.sendStepContextMessage(reqBean, workOrderNoList.toString(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); - List equipVariableCollectContextList = new ArrayList<>(); - workOrderNoList.stream().filter(o -> !StringUtils.isEmpty(o)).forEach(o -> - equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), o, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()))); - //保存上下文扫/读信息:加工单 - productionDispatchContextStepService.dispatchScanWorkOrderNoContext(reqBean, equipVariableCollectContextList); + List equipVariableCollectContextList = new ArrayList<>(); + workOrderNoList.stream().filter(o -> !StringUtils.isEmpty(o)).forEach(o -> + equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), o, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()))); + //保存上下文扫/读信息:加工单 + productionDispatchContextStepService.dispatchScanWorkOrderNoContext(reqBean, equipVariableCollectContextList); - this.sendMessage(reqBean, new StationResultBean().writeDbLog().checkRepeat(), String.format("获取到工位工单推送队列%s!", workOrderNoList.toString()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + this.sendMessage(reqBean, new StationResultBean().writeDbLog().checkRepeat(), String.format("获取到工位工单推送队列%s!", workOrderNoList.toString()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); - //加工单验证工步 【排序】 - stepResult = ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCheckSortStepService")).executeInState(reqBean); + //加工单验证工步 【排序】 + stepResult = ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCheckSortStepService")).executeInState(reqBean); - if (!stepResult.isCompleted()) { - stepThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, stepResult, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, - getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); - } + if (stepResult.isCompleted()) { - //保存上下文推单信息 - productionDispatchContextStepService.dispatchSortQueuePushContext(reqBean, curPushList); + //保存上下文推单信息 + productionDispatchContextStepService.dispatchSortQueuePushContext(reqBean, curPushList); - log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- QUEUE_ORDER_PUSH:{}", - reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(curPushList)); + log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- QUEUE_ORDER_PUSH:{}", + reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(curPushList)); - return stepResult; + return stepResult; + } + } } finally { //当需要加锁且满足腔数的情况下, 保存排序线工单队列推送锁数据 @@ -202,6 +196,16 @@ public class MesWorkOrderQueueAcceptStepService extends BaseStepService { if (!CollectionUtils.isEmpty(queuePushMap2Locked)) queuePushMap2Locked.values().forEach(o -> unLock(reqBean, o)); } + if (!stepResult.isCompleted()) { + stepThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, stepResult, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, + getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, + CollectionUtils.isEmpty(curPushList) ? "当前未接收到工位工单队列,持续监听中..." : String.format("当前接收到到工位工单队列个数[%s]不满足腔数[%s],持续监听中...", curPushList.size(), cellEquipContext.getCavity()), + getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } //加锁