diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesPullingOrderInfoController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesPullingOrderInfoController.java new file mode 100644 index 0000000..aa1545f --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesPullingOrderInfoController.java @@ -0,0 +1,16 @@ +package cn.estsh.i3plus.ext.mes.apiservice.controller.base; + +import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant; +import cn.estsh.i3plus.pojo.mes.bean.MesPullingOrderInfo; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 拉动单 + */ +@Api("拉动单") +@RestController +@RequestMapping(MesCommonConstant.MES_YANFEN + "/mesPullingOrderInfo") +public class MesPullingOrderInfoController extends BaseMesController { +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesPullingOrderPartInfoController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesPullingOrderPartInfoController.java new file mode 100644 index 0000000..1cf731a --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/base/MesPullingOrderPartInfoController.java @@ -0,0 +1,18 @@ +package cn.estsh.i3plus.ext.mes.apiservice.controller.base; + +import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant; +import cn.estsh.i3plus.pojo.mes.bean.MesPullingOrderInfo; +import cn.estsh.i3plus.pojo.mes.bean.MesPullingOrderPartInfo; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 拉动单 + */ +@Api("拉动单") +@RestController +@RequestMapping(MesCommonConstant.MES_YANFEN + "/mesPullingOrderPartInfo") +public class MesPullingOrderPartInfoController extends BaseMesController { + +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesCreatePullOrderByPullGroupAndWorkOrderJob.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesCreatePullOrderByPullGroupAndWorkOrderJob.java index 4f94856..d0c4fcf 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesCreatePullOrderByPullGroupAndWorkOrderJob.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesCreatePullOrderByPullGroupAndWorkOrderJob.java @@ -57,7 +57,7 @@ public class MesCreatePullOrderByPullGroupAndWorkOrderJob extends BaseMesSchedul } String[] organizeCodeList = jobParam.split(","); LOGGER.info("根据拉动组和生产工单产生拉动单JOB开始 -----start"); - String userName = "job"; + String userName = "CreatePullOrderJob"; for (String organizeCode : organizeCodeList) { pullingOrderInfoService.doCreatePullOrderByPullGroupAndWorkOrder(organizeCode,userName); } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesPullingOrderInfoService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesPullingOrderInfoService.java index ef8224c..1b5f6ae 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesPullingOrderInfoService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesPullingOrderInfoService.java @@ -3,8 +3,13 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base; import cn.estsh.i3plus.ext.mes.api.base.IMesPartPullService; import cn.estsh.i3plus.ext.mes.api.base.IMesPullingOrderInfoService; import cn.estsh.i3plus.ext.mes.apiservice.utils.MesException; +import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant; +import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords; +import cn.estsh.i3plus.icloud.core.sdk.ICoreUtilCloud; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; +import cn.estsh.i3plus.platform.common.util.WmsConstWords; +import cn.estsh.i3plus.pojo.base.bean.BaseResultBean; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; @@ -15,21 +20,23 @@ import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ValidatorBean; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.util.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; @Service @Slf4j public class MesPullingOrderInfoService extends BaseMesService implements IMesPullingOrderInfoService { - + public static final Logger LOGGER = LoggerFactory.getLogger(MesPullingOrderInfoService.class); + @Autowired + private MesPullingOrderInfoRepository mesPullingOrderInfoRepository; @Autowired private MesPullingOrderPartInfoRepository mesPullingOrderPartInfoRepository; @Autowired @@ -37,13 +44,21 @@ public class MesPullingOrderInfoService extends BaseMesService pulliGroupList = mesPartPullRDao.findByHqlWhere(ddlPackBean); - if (CollectionUtils.isEmpty(pulliGroupList)){ + if (CollectionUtils.isEmpty(pulliGroupList)) { + LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->{}拉动组不存在", organizeCode); return; } + Map> pullCodeMap = pulliGroupList.stream().collect(Collectors.groupingBy(MesPartPull::getPullCode)); + Map> pullCodeCenterMap = pulliGroupList.stream().collect(Collectors.groupingBy(p -> p.getWorkCenterCode() + "=" + p.getPullCode())); + DdlPackBean ddlPackBeanDetail = DdlPackBean.getDdlPackBean(organizeCode); List pullDetailList = mesPartPullDetailRDao.findByHqlWhere(ddlPackBeanDetail); - if (CollectionUtils.isEmpty(pullDetailList)){ + if (CollectionUtils.isEmpty(pullDetailList)) { + LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->{}拉动组明细不存在", organizeCode); return; } + Map> partPullDetailListMap = pullDetailList.stream().collect(Collectors.groupingBy(MesPartPullDetail::getPartNo)); //2.客户物料集合 [PART_NO] in 拉动组明细物料集合 //3.产线数据 DdlPackBean workPackBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getInPackList(pulliGroupList.stream().map(MesPartPull::getWorkCenterCode).collect(Collectors.toList()), "workCenterCode", workPackBean); + List workCenterList = pulliGroupList.stream().map(MesPartPull::getWorkCenterCode).collect(Collectors.toList()); + DdlPreparedPack.getInPackList(workCenterList, "workCenterCode", workPackBean); List mesWorkCenterList = mesWorkCenterRepository.findByHqlWhere(workPackBean); + if (CollectionUtils.isEmpty(mesWorkCenterList)) { + LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->工厂号{},拉动组对应产线信息不存在-->{}", organizeCode, workCenterList); + return; + } + Map> workCenterListMap = mesWorkCenterList.stream().collect(Collectors.groupingBy(MesWorkCenter::getWorkCenterCode)); + + //4.生产工单 在加工状态 [PULLING_STATUS] =0 未创建 + DdlPackBean packBeanWorkOrder = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(workCenterList, "workCenterCode", packBeanWorkOrder); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue(), "workOrderStatus", packBeanWorkOrder); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.NOTCREATE.getValue(), "pullingStatus", packBeanWorkOrder); + List workOrderList = mesWorkOrderRepository.findByHqlWhere(packBeanWorkOrder); + if (CollectionUtils.isEmpty(workOrderList)) { + LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->工厂号{},产线信息没有【未创建】【在加工】状态的工单-->{}", organizeCode, workCenterList); + return; + } + Map> workOrderListMap = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getWorkOrderNo)); + + DdlPackBean packBeanWorkOrderPart = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(workOrderList.stream().map(MesWorkOrder::getWorkOrderNo).collect(Collectors.toList()), "workOrderNo", workPackBean); + List mesWorkOrderPartList = workOrderPartRepository.findByHqlWhere(packBeanWorkOrderPart); + if (CollectionUtils.isEmpty(mesWorkOrderPartList)) { + LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->工厂号{},产线对应的工单对应工单零件不存在-->{}", organizeCode, workCenterList); + return; + } + //5.取工单零件和拉动组交集,根据拉动主表对应的类型 生成相应的拉动单和拉动单明细 + Map> workOrderNoListMap = mesWorkOrderPartList.stream().collect(Collectors.groupingBy(MesWorkOrderPart::getWorkOrderNo)); + + + for (Map.Entry> stringListEntry : workOrderNoListMap.entrySet()) { + //需要生成拉动单的工单号 对应工单 + List mesWorkOrders = workOrderListMap.get(stringListEntry.getKey()); + MesWorkOrder mesWorkOrder = mesWorkOrders.get(0); + + //工单对应的工单零件号 + List workOrderParts = stringListEntry.getValue(); + //待生成的拉动组明细 + List pullDetailListNew = new ArrayList<>(); + for (MesWorkOrderPart workOrderPart : workOrderParts) { + if (!CollectionUtils.isEmpty(partPullDetailListMap.get(workOrderPart.getPartNo()))) { + pullDetailListNew.addAll(partPullDetailListMap.get(workOrderPart.getPartNo())); + } + } + if (CollectionUtils.isEmpty(pullDetailListNew)) { + LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->工厂号{},产线-->{}对应的工单号-->{}没有需要生成拉动单零件", + organizeCode, mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getWorkOrderNo()); + continue; + } + Map> workOrderPartListMap = workOrderParts.stream().collect(Collectors.groupingBy(MesWorkOrderPart::getPartNo)); + //生成拉动单 如果是多个拉动组的话都要产生拉动单 + Map> pullCodeListMap = pullDetailListNew.stream().collect(Collectors.groupingBy(MesPartPullDetail::getPullCode)); + for (Map.Entry> stringListEntryDetail : pullCodeListMap.entrySet()) { + String pullCode = stringListEntryDetail.getKey(); + List mesPartPulls = pullCodeMap.get(pullCode); + MesPartPull mesPartPull = mesPartPulls.get(0);//拉动组明细拉动单号对应拉动组 + List mesPartPullDetails = stringListEntryDetail.getValue(); + //调用平台生成拉动单号流水 -yyyyMMdd00001 + String orderNo = ""; + if (mesPartPull.getPullOrderType() == MesExtEnumUtil.PART_PULL_ORDER_TYPE.KITTING_PULL.getValue()) { + orderNo = "KITTING"; + } else if (mesPartPull.getPullOrderType() == MesExtEnumUtil.PART_PULL_ORDER_TYPE.JIS_PULL.getValue()) { + orderNo = "JIS"; + } else if (mesPartPull.getPullOrderType() == MesExtEnumUtil.PART_PULL_ORDER_TYPE.SPS_PULL.getValue()) { + orderNo = "SPS"; + } else if (mesPartPull.getPullOrderType() == MesExtEnumUtil.PART_PULL_ORDER_TYPE.BENZ_PULL.getValue()) { + orderNo = "BENZ"; + } else if (mesPartPull.getPullOrderType() == MesExtEnumUtil.PART_PULL_ORDER_TYPE.PICK_PULL.getValue()) { + orderNo = "PICK"; + } + + BaseResultBean orderResutlBean = sysOrderNoRuleCloud.getOrderNo(MesCommonConstant.MES_PULL_ORDER_NO); + if (orderResutlBean != null && orderResutlBean.isSuccess()) { + orderNo += orderResutlBean.getResultObject().get(WmsConstWords.CORE_ORDER_NO).toString(); + } else { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.WMS.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode()) + .setErrorDetail("生成单号失败") + .setErrorSolution("【MES_PULL_ORDER_NO】请重新操作或查看服务!") + .build(); + } + MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo(); + pullingOrder.setPullingOrderNo(orderNo); + pullingOrder.setPullOrderType(mesPartPull.getPullOrderType()); + pullingOrder.setPullGroupFid(mesPartPull.getId()); + pullingOrder.setCustOrderNo(StringUtil.isEmpty(mesWorkOrder.getCustOrderNo()) ? "" : mesWorkOrder.getCustOrderNo()); + pullingOrder.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); + pullingOrder.setWorkOrderSeq(StringUtil.isEmpty(mesWorkOrder.getWorkOrderSeq()) ? "" : mesWorkOrder.getWorkOrderSeq()); + pullingOrder.setIsPrint(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + pullingOrder.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); + pullingOrder.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.KITTING_PULL.getValue()); + pullingOrder.setWorkCenterCode(mesPartPull.getWorkCenterCode()); + pullingOrder.setPullCode(mesPartPull.getPullCode()); + pullingOrder.setCustPartNo(mesWorkOrder.getCustPartNo()); + pullingOrder.setProduceSeq(StringUtil.isEmpty(mesWorkOrder.getProduceSeq()) ? 0 : mesWorkOrder.getProduceSeq()); + + ConvertBean.serviceModelInitialize(pullingOrder, userName); + mesPullingOrderInfoRepository.insert(pullingOrder); + + for (MesPartPullDetail partInfo : mesPartPullDetails) { + MesPullingOrderPartInfo pullingOrderPartInfo = new MesPullingOrderPartInfo(); + pullingOrderPartInfo.setPullCode(partInfo.getPullCode()); + pullingOrderPartInfo.setPullingOrderNo(pullingOrder.getPullingOrderNo()); + pullingOrderPartInfo.setWorkOrderNo(pullingOrder.getWorkOrderNo()); + pullingOrderPartInfo.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + pullingOrderPartInfo.setCustOrderNo(pullingOrder.getCustOrderNo()); + pullingOrderPartInfo.setPartNo(partInfo.getPartNo()); + pullingOrderPartInfo.setPartName(partInfo.getPartName()); + MesWorkOrderPart mesWorkOrderPart = workOrderPartListMap.get(partInfo.getPartNo()).get(0); + pullingOrderPartInfo.setPullQty(mesWorkOrderPart.getItemQty()); + pullingOrderPartInfo.setCustOrderNo(pullingOrder.getCustOrderNo()); + pullingOrderPartInfo.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + pullingOrderPartInfo.setWaterSeq(pullingOrder.getProduceSeq()); + pullingOrderPartInfo.setWorkCellCode(mesWorkOrderPart.getWorkCellCode()); + pullingOrderPartInfo.setEquipment(partInfo.getEquipment()); + pullingOrderPartInfo.setLocation(partInfo.getPullAddr());//todo + pullingOrderPartInfo.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1,未送料为0 + pullingOrderPartInfo.setCustPartNo(pullingOrder.getCustPartNo()); + + ConvertBean.serviceModelInitialize(pullingOrderPartInfo, userName); + mesPullingOrderPartInfoRepository.insert(pullingOrderPartInfo); + } + } + //6.产生拉动单后更新工单拉动状态为已拉动 + mesWorkOrder.setPullingStatus(MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.SUBMIT.getValue()); + mesWorkOrderRepository.update(mesWorkOrder); + //7.拉动组+加工单号+生成拉动单状态的对应关系中间表,每次新增都要记录 + + + } } @@ -103,7 +255,7 @@ public class MesPullingOrderInfoService extends BaseMesService byHqlWhere = mesPullingOrderPartInfoRepository.findByHqlWhere(partPackBean); - resultMap.put("",mesPullingOrder); + resultMap.put("", mesPullingOrder); resultMap.put("success", true); - String message ="更新SPS状态成功,已发送SPS信息给设备! id:"+mesPullingOrder.getId()+ "Code:" + mesPullingOrder.getPullingOrderNo() + "产线" + assemblyLine + "拉动组" + pullingGroupCode + ""; + String message = "更新SPS状态成功,已发送SPS信息给设备! id:" + mesPullingOrder.getId() + "Code:" + mesPullingOrder.getPullingOrderNo() + "产线" + assemblyLine + "拉动组" + pullingGroupCode + ""; resultMap.put("message", message); //更新主表状态 源系统为25配料完成 现在-【已发送设备-30】 mesPullingOrder.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.SPS_PULL.getValue()); diff --git a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/constant/MesCommonConstant.java b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/constant/MesCommonConstant.java index 7266a5a..1cb3a62 100644 --- a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/constant/MesCommonConstant.java +++ b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/constant/MesCommonConstant.java @@ -58,4 +58,5 @@ public class MesCommonConstant { public static final String CLIENT_HANDLE_ID = "CLIENT_HANDLE_ID"; public static final String QC_ORDER_PRINT_TEMPLATE = "QC_ORDER_PRINT_TEMPLATE"; + public static final String MES_PULL_ORDER_NO = "MES_PULL_ORDER_NO"; }