diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/IMesOfflineService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/IMesOfflineService.java new file mode 100644 index 0000000..9515fab --- /dev/null +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/IMesOfflineService.java @@ -0,0 +1,19 @@ +package cn.estsh.i3plus.ext.mes.api.busi; + +import java.util.List; + +public interface IMesOfflineService { + + /** + * 创建离线排序加工规则 + * 每个总成零件维护一个 + */ + void doCreateSortRuleCfgOfflineData(String organizeCode, List groupCodeList); + + /** + * 生成指定零件生产组的拉动单模板 + * 创建离线排序拉动规则 + * 每个总成零件维护一个 + */ + void doCreatePullOrderOfflineData(String organizeCode, List pullCodeList,List partProdCodeList); +} diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/IMesSortRuleCfgOfflineService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/IMesSortRuleCfgOfflineService.java new file mode 100644 index 0000000..bfdc5c7 --- /dev/null +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/IMesSortRuleCfgOfflineService.java @@ -0,0 +1,26 @@ +package cn.estsh.i3plus.ext.mes.api.busi; + +import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroup; +import cn.estsh.i3plus.pojo.mes.bean.MesPartProdGroupDetail; +import cn.estsh.i3plus.pojo.mes.bean.MesPartPull; +import cn.estsh.i3plus.pojo.mes.bean.MesPartPullDetail; + +import java.util.List; + +public interface IMesSortRuleCfgOfflineService { + /** + * 清空原始表 + */ + void deleteSortRuleOffline(String organizeCode); + + + void doCreateSortRuleOffline(String custPartNo, String erpPartNo, String organizeCode, MesPartProdGroup mesPartProdGroup, MesPartProdGroupDetail detail); + + + void deletePullOffline(String organizeCode); + + void deletePullDetailOffline(String organizeCode); + + + void doCreatePullOffline(String custPartNo, String erpPartNo, String organizeCode, MesPartProdGroup mesPartProdGroup, MesPartProdGroupDetail detail, MesPartPull partPull, List pullDetailList); +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesCreatePullOrderOfflineJob.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesCreatePullOrderOfflineJob.java new file mode 100644 index 0000000..7a94622 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesCreatePullOrderOfflineJob.java @@ -0,0 +1,58 @@ +package cn.estsh.i3plus.ext.mes.apiservice.schedulejob; + +import cn.estsh.i3plus.ext.mes.api.base.IMesConfigService; +import cn.estsh.i3plus.ext.mes.api.base.IMesPullingOrderInfoService; +import cn.estsh.i3plus.ext.mes.api.busi.IMesOfflineService; +import cn.estsh.i3plus.mes.apiservice.schedulejob.BaseMesScheduleJob; +import cn.estsh.impp.framework.boot.init.ApplicationProperties; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * @Description : 根据拉动组和生产工单产生拉动单JOB + * @Reference : + * @Author : gsz + * @CreateDate 2024/9/4 10:01 + * @Modify: + **/ +// 禁止 JOB 并发执行 +@ApiOperation("离线生产所有总成零件的拉动单模板") +@Component +public class MesCreatePullOrderOfflineJob extends BaseMesScheduleJob { + + public static final Logger LOGGER = LoggerFactory.getLogger(MesCreatePullOrderOfflineJob.class); + + @Autowired + private IMesOfflineService mesOfflineService; + + + public MesCreatePullOrderOfflineJob() { + super(MesCreatePullOrderOfflineJob.class, "离线生产所有总成零件的拉动单模板"); + this.setMultiInstance(true); + } + + @Override + public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) { + Map paramMap = (Map) JSONObject.parse(jobParam); + try { + String organizeCode = (String) paramMap.get("organizeCode"); + List pullCodeList = (List) paramMap.get("pullCodeList"); + List partProdCodeList = (List) paramMap.get("partProdCodeList"); + mesOfflineService.doCreatePullOrderOfflineData(organizeCode,pullCodeList,partProdCodeList); + } catch (Exception e) { + LOGGER.error("离线生产所有总成零件的拉动单模板:{}", e.toString()); + } + } + +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesCreateSortRuleCfgOfflineJob.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesCreateSortRuleCfgOfflineJob.java new file mode 100644 index 0000000..77b3c64 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesCreateSortRuleCfgOfflineJob.java @@ -0,0 +1,59 @@ +package cn.estsh.i3plus.ext.mes.apiservice.schedulejob; + +import cn.estsh.i3plus.ext.mes.api.base.IMesConfigService; +import cn.estsh.i3plus.ext.mes.api.base.IMesPullingOrderInfoService; +import cn.estsh.i3plus.ext.mes.api.busi.IMesOfflineService; +import cn.estsh.i3plus.mes.apiservice.schedulejob.BaseMesScheduleJob; +import cn.estsh.impp.framework.boot.init.ApplicationProperties; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.persistence.Column; +import java.util.List; +import java.util.Map; + +/** + * @Description : 根据拉动组和生产工单产生拉动单JOB + * @Reference : + * @Author : gsz + * @CreateDate 2024/9/4 10:01 + * @Modify: + **/ +// 禁止 JOB 并发执行 +@ApiOperation("生产所有总成零件的装配件模板") +@Component +public class MesCreateSortRuleCfgOfflineJob extends BaseMesScheduleJob { + + public static final Logger LOGGER = LoggerFactory.getLogger(MesCreateSortRuleCfgOfflineJob.class); + + + @Autowired + private IMesOfflineService mesOfflineService; + + + public MesCreateSortRuleCfgOfflineJob() { + super(MesCreateSortRuleCfgOfflineJob.class, "生产所有总成零件的装配件模板"); + this.setMultiInstance(true); + } + + @Override + public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) { + Map paramMap = (Map) JSONObject.parse(jobParam); + try { + String organizeCode = (String) paramMap.get("organizeCode"); + List groupCodeList = (List) paramMap.get("partProdCodeList"); + mesOfflineService.doCreateSortRuleCfgOfflineData(organizeCode,groupCodeList); + } catch (Exception e) { + LOGGER.error("生产所有总成零件的装配件模板:{}", e.toString()); + } + } + +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesCreateWorkOrderImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesCreateWorkOrderImpl.java index 474da0e..a0a9d97 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesCreateWorkOrderImpl.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesCreateWorkOrderImpl.java @@ -137,7 +137,7 @@ public class MesCreateWorkOrderImpl implements IMesCreateWorkOrder { //客户订单号 mesWorkOrder.setCustOrderNo(sortInfo.getCustOrderCode()); //车型代码 - mesWorkOrder.setCarModelCode(sortInfo.getVehicleCategory()); +// mesWorkOrder.setCarModelCode(sortInfo.getVehicleCategory()); //车型描述 mesWorkOrder.setCarName = vehicleClassCode //备注取自于车型配置表中 @@ -290,7 +290,6 @@ public class MesCreateWorkOrderImpl implements IMesCreateWorkOrder { List workOrderPartList = new ArrayList<>(); if (partProdGroup.getIsDisassembleBom() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) { workOrderPartList = dismantleBom(partSap.getPartNo(), mesWorkOrder.getQty(), sortInfo.getMatchTime(), bom.getBomCode(), sortInfo.getOrganizeCode(), mesPartProdGroupDetail.getWorkCellCode(), mesWorkOrder.getWorkOrderNo()); - } /** * 总成拆bom,变成子零件 @@ -739,6 +738,7 @@ public class MesCreateWorkOrderImpl implements IMesCreateWorkOrder { private MesProductVersion getProdVersion(String organizeCode, String partNo) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); + DdlPreparedPack.getOrderBy("createDatetime",CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean); List mesProductVersionList = mesProductVersionRao.findByHqlWhere(ddlPackBean); return mesProductVersionList.isEmpty() ? null : mesProductVersionList.get(0); } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesOfflineServiceImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesOfflineServiceImpl.java new file mode 100644 index 0000000..1de0d8b --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesOfflineServiceImpl.java @@ -0,0 +1,108 @@ +package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.api.base.IMesCustomerPartService; +import cn.estsh.i3plus.ext.mes.api.busi.IMesOfflineService; +import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesPartProdGroupDetailService; +import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesPartProdGroupService; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.repository.MesPartPullDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesPartPullRepository; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class MesOfflineServiceImpl implements IMesOfflineService { + + @Autowired + private MesSortRuleCfgOfflineServiceImpl cfgOfflineService; + + + @Autowired + private MesPartProdGroupService partProdGroupService; + + @Autowired + private MesPartProdGroupDetailService partProdGroupDetailService; + + @Autowired + private MesPartPullRepository partPullRao; + + @Autowired + private MesPartPullDetailRepository partPullDetailRao; + + @Override + public void doCreateSortRuleCfgOfflineData(String organizeCode,List groupCodeList) { + //清空表 + cfgOfflineService.deleteSortRuleOffline(organizeCode); + //2.查询零件生产组 + List partProdGroupList = partProdGroupService.findMesPartProdGroups(organizeCode,groupCodeList); + for (MesPartProdGroup mesPartProdGroup : partProdGroupList) { + String partProdGroupCode = mesPartProdGroup.getPartProdGroupCode(); + DdlPackBean detailPartProdDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partProdGroupCode,"partProdGroupCode",detailPartProdDetailPackBean); + List detailList = partProdGroupDetailService.findAll(detailPartProdDetailPackBean); + //3.根据客户零件表中的erp零件,是总成零件号;遍历每个客户零件号生成sortRuleCfgOff表 + for (MesPartProdGroupDetail detail : detailList) { + String erpPartNo = StringUtils.isBlank(detail.getProductPartNo()) ? detail.getPartNo() : detail.getProductPartNo(); + cfgOfflineService.doCreateSortRuleOffline(detail.getCustPartNo(), erpPartNo,organizeCode,mesPartProdGroup,detail); + } + } + + //4.总成零件号打散bom + + //5.打散的bom 获取排序加工规则 + + //6.装配件获取的三种条件 + + //7.保存到离线表中 + + } + + @Override + public void doCreatePullOrderOfflineData(String organizeCode, List pullCodeList,List partProdCodeList) { + //拉动组和生产零件都是按照产线配置的 一对一 + //清空表 + cfgOfflineService.deletePullOffline(organizeCode); + cfgOfflineService.deletePullDetailOffline(organizeCode); + //2.查询零件生产组 + List partProdGroupList = partProdGroupService.findMesPartProdGroups(organizeCode,partProdCodeList); + //3.获取拉动组 + DdlPackBean partPullPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(pullCodeList,"pullCode",partPullPackBean); + List mesPartPullList = partPullRao.findByHqlWhere(partPullPackBean); + Map partPullMap = mesPartPullList.stream().collect(Collectors.toMap(MesPartPull::getWorkCenterCode, Function.identity())); + //4.获取拉动组的详情 + DdlPackBean partPullDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(pullCodeList,"pullCode",partPullDetailPackBean); + List mesPartPullDetailList = partPullDetailRao.findByHqlWhere(partPullDetailPackBean); + Map> detailMapList = mesPartPullDetailList.stream().collect(Collectors.groupingBy(MesPartPullDetail::getPullCode)); + //5.遍历零件生产组 + for (MesPartProdGroup mesPartProdGroup : partProdGroupList) { + String partProdGroupCode = mesPartProdGroup.getPartProdGroupCode(); + DdlPackBean detailPartProdDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partProdGroupCode,"partProdGroupCode",detailPartProdDetailPackBean); + List detailList = partProdGroupDetailService.findAll(detailPartProdDetailPackBean); + //3.根据客户零件表中的erp零件,是总成零件号;遍历每个客户零件号生成sortRuleCfgOff表 + for (MesPartProdGroupDetail detail : detailList) { + String erpPartNo = StringUtils.isBlank(detail.getProductPartNo()) ? detail.getPartNo() : detail.getProductPartNo(); + MesPartPull mesPartPull = partPullMap.get(mesPartProdGroup.getWorkCenterCode()); + List mesPartPullDetails = detailMapList.get(mesPartPull.getPullCode()); + if (mesPartPullDetails == null) { + continue; + } + cfgOfflineService.doCreatePullOffline(detail.getCustPartNo(), erpPartNo,organizeCode,mesPartProdGroup,detail,partPullMap.get(mesPartProdGroup.getWorkCenterCode()), mesPartPullDetails); + } + + + } + + + } +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesSortRuleCfgOfflineServiceImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesSortRuleCfgOfflineServiceImpl.java new file mode 100644 index 0000000..e1994e1 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/busi/MesSortRuleCfgOfflineServiceImpl.java @@ -0,0 +1,439 @@ +package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.api.busi.IMesSortRuleCfgOfflineService; +import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesBomService; +import cn.estsh.i3plus.ext.mes.apiservice.utils.MesException; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.tool.TimeTool; +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.bean.offline.MesProdRuleSortCfgOffline; +import cn.estsh.i3plus.pojo.mes.bean.offline.MesPullingOrderInfoOffline; +import cn.estsh.i3plus.pojo.mes.bean.offline.MesPullingOrderPartInfoOffline; +import cn.estsh.i3plus.pojo.mes.repository.*; +import cn.estsh.i3plus.pojo.mes.repository.offline.MesProdRuleSortCfgOfflineRepository; +import cn.estsh.i3plus.pojo.mes.repository.offline.MesPullingOrderInfoOfflineRepository; +import cn.estsh.i3plus.pojo.mes.repository.offline.MesPullingOrderPartInfoOfflineRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class MesSortRuleCfgOfflineServiceImpl implements IMesSortRuleCfgOfflineService { + + @Autowired + private MesProdRuleSortCfgOfflineRepository cfgOfflineRao; + + @Autowired + private MesProductVersionRepository mesProductVersionRDao; + + @Autowired + private MesBomService mesBomService; + + @Autowired + private MesBomRepository bomRao; + + @Autowired + private MesPartSapRepository mesPartSapRao; + + @Autowired + private MesProdRuleSortCfgRepository mesProdRuleSortCfgRao; + + @Autowired + private MesCustomerPartRepository customerPartRao; + + @Autowired + private MesCustomerCarModelRepository carModelRao; + + @Autowired + private MesPullingOrderInfoOfflineRepository partPullOrderOfflineRao; + + @Autowired + private MesPullingOrderPartInfoOfflineRepository partPullOrderDetailOfflineRao; + + + @Transactional(propagation = Propagation.REQUIRES_NEW) + @Override + public void deleteSortRuleOffline(String organizeCode) { + cfgOfflineRao.deleteByProperty("organizeCode", organizeCode); + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + @Override + public void doCreateSortRuleOffline(String custPartNo, String erpPartNo, String organizeCode, MesPartProdGroup mesPartProdGroup, MesPartProdGroupDetail detail) { + + MesProductVersion mesProductVersion = getMesProductVersion(erpPartNo, organizeCode); + //4.总成零件号打散bom + String bomVersion = mesProductVersion.getAlternativePartList(); + MesBom bom = mesBomService.findBom(organizeCode, bomVersion, erpPartNo); + if (bom == null) { + return; + } + //5.5 获取客户零件号对应的车型配置 + MesCustomerPart mesCustomerPart = getMesCustomerPart(custPartNo, erpPartNo, organizeCode); + if (mesCustomerPart == null) { + return; + } + //5.打散的bom 获取排序加工规则 + List workOrderPartList = dismantleBom(erpPartNo, 1, TimeTool.getNowTime(true), bom.getBomCode(), organizeCode, detail.getWorkCellCode()); + //6.装配件获取的三种条件 + String custCode = mesCustomerPart.getCustCode(); + MesCustomerCarModel mesCustomerCarModel = getMesCustomerCarModel(custPartNo, organizeCode, custCode); + if (mesCustomerCarModel == null) { + return; + } + String carModelCode = mesCustomerCarModel.getCarModelCode(); + List assemblyList = getAssemblyList(detail.getWorkCenterCode(), carModelCode, workOrderPartList, mesPartProdGroup); + //7.保存到离线表中 + for (MesWorkOrderAssembly orderAssembly : assemblyList) { + MesProdRuleSortCfgOffline cfgOffline = new MesProdRuleSortCfgOffline(); + BeanUtils.copyProperties(orderAssembly, cfgOffline); + cfgOffline.setCustPartNo(custPartNo); + cfgOffline.setCustPartName(mesCustomerPart.getCustPartName()); + cfgOffline.setPartNo(erpPartNo); + cfgOffline.setVehicleNo(carModelCode); + cfgOffline.setOrganizeCode(organizeCode); + ConvertBean.saveOrUpdate(cfgOffline, "OFFLINE-JOB"); + cfgOfflineRao.insert(cfgOffline); + } + + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + @Override + public void deletePullOffline(String organizeCode) { + partPullOrderOfflineRao.deleteByProperty("organizeCode", organizeCode); + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + @Override + public void deletePullDetailOffline(String organizeCode) { + partPullOrderDetailOfflineRao.deleteByProperty("organizeCode", organizeCode); + } + + @Override + public void doCreatePullOffline(String custPartNo, String erpPartNo, String organizeCode, MesPartProdGroup mesPartProdGroup, MesPartProdGroupDetail detail, MesPartPull partPull, List pullDetailList) { + MesProductVersion mesProductVersion = getMesProductVersion(erpPartNo, organizeCode); + //4.总成零件号打散bom + String bomVersion = mesProductVersion.getAlternativePartList(); + MesBom bom = mesBomService.findBom(organizeCode, bomVersion, erpPartNo); + if (bom == null) { + return; + } + //5.5 获取客户零件号对应的车型配置 + MesCustomerPart mesCustomerPart = getMesCustomerPart(custPartNo, erpPartNo, organizeCode); + if (mesCustomerPart == null) { + return; + } + //5.打散的bom 获取排序加工规则 + List workOrderPartList = dismantleBom(erpPartNo, 1, TimeTool.getNowTime(true), bom.getBomCode(), organizeCode, detail.getWorkCellCode()); + + //6.过滤出需要拉动的零件号 + List partPullDetailPartNoList = workOrderPartList.stream().map(MesWorkOrderPart::getPartNo).collect(Collectors.toList()); + Map orderPartMap = workOrderPartList.stream().collect(Collectors.toMap(MesWorkOrderPart::getPartNo, Function.identity())); + List pullDetails = pullDetailList.stream().filter(item -> partPullDetailPartNoList.contains(item.getPartNo())).collect(Collectors.toList()); + //7.生成拉动主单模板 MesPullingOrderPartInfoOfflineRepository + MesPullingOrderInfoOffline mesPartPullOffline = new MesPullingOrderInfoOffline(); + mesPartPullOffline.setPullCode(partPull.getPullCode()); + mesPartPullOffline.setCustPartNo(custPartNo); + mesPartPullOffline.setPartNo(erpPartNo); + mesPartPullOffline.setWorkCenterCode(partPull.getWorkCenterCode()); + mesPartPullOffline.setOrganizeCode(organizeCode); + ConvertBean.saveOrUpdate(mesPartPullOffline,"SPS-OFFLINE"); + partPullOrderOfflineRao.insert(mesPartPullOffline); + //8.生成拉动单详情 + for (MesPartPullDetail pullDetail : pullDetails) { + MesPullingOrderPartInfoOffline detailOffline = new MesPullingOrderPartInfoOffline(); + detailOffline.setPid(mesPartPullOffline.getId()); + detailOffline.setPullCode(partPull.getPullCode()); + detailOffline.setCustPartNo(custPartNo); + detailOffline.setAssPartNo(erpPartNo); + detailOffline.setOrganizeCode(organizeCode); + detailOffline.setPartNo(pullDetail.getPartNo()); + detailOffline.setPartName(pullDetail.getPartName()); + detailOffline.setPullQty(orderPartMap.get(pullDetail.getPartNo()).getItemQty()); + detailOffline.setWorkOrderNo(partPull.getWorkCenterCode()); + detailOffline.setWorkCellCode(pullDetail.getWorkCellCode()); + detailOffline.setEquipment(pullDetail.getEquipment()); + detailOffline.setLocation(pullDetail.getPullAddr()); + if (pullDetail.getScanValidationType() == 10) { + detailOffline.setColor(MesExtEnumUtil.PART_PULL_DETAIL_COLOR.WHITE.getCode()); + } else { + detailOffline.setColor(MesExtEnumUtil.PART_PULL_DETAIL_COLOR.RED.getCode()); + } + detailOffline.setCarSeries(pullDetail.getCarSeries()); + + ConvertBean.saveOrUpdate(detailOffline,"SPS-OFFLINE"); + partPullOrderDetailOfflineRao.insert(detailOffline); + } + } + + //客户零件号 + private MesCustomerPart getMesCustomerPart(String custPartNo, String erpPartNo, String organizeCode) { + DdlPackBean custPartPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(custPartNo, "custPartNo", custPartPackBean); + DdlPreparedPack.getStringEqualPack(erpPartNo, "erpPartNo", custPartPackBean); + List customerPartList = customerPartRao.findByHqlTopWhere(custPartPackBean, 1); + if (!customerPartList.isEmpty()) { + return customerPartList.get(0); + } + return null; + } + + //获取车型配置 + private MesCustomerCarModel getMesCustomerCarModel(String custPartNo, String organizeCode, String custCode) { + DdlPackBean carModelPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(custPartNo, "custPartNo", carModelPackBean); + DdlPreparedPack.getStringEqualPack(custCode, "custCode", carModelPackBean); + DdlPreparedPack.getStringEqualPack(organizeCode, "organizeCode", carModelPackBean); + List carModels = carModelRao.findByHqlTopWhere(carModelPackBean, 1); + if (carModels.isEmpty()) { + return null; + } + return carModels.get(0); + } + + //版本号 + private MesProductVersion getMesProductVersion(String partNo, String organizeCode) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); + ddlPackBean.setOrderByStr(" order by createDatetime desc "); + MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean); + if (Objects.isNull(mesProductVersion)) { + MesException.throwMesBusiException("物料【%s】对应的生产版本信息不存在", partNo); + } + return mesProductVersion; + } + + private List dismantleBom(String partNo, double qty, String productTime, String bomCode, String organizeCode, String workCellCode) { + List orderPartList = new ArrayList<>(); + + //1.根据bomCode,partNo productTime organizeCode 查询bom清单 bomList + List bomList = getPlatBom(partNo, productTime, bomCode, organizeCode); + //2.根据bomList中的subPartNo 查询零件清单 partList + List partNoList = bomList.stream().map(MesBom::getItemPartNo).distinct().collect(Collectors.toList()); + + DdlPackBean partPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(partNoList, "partNo", partPackBean); + List partSapList = mesPartSapRao.findByHqlWhere(partPackBean); + Map partMap = partSapList.stream().collect(Collectors.toMap(MesPartSap::getPartNo, Function.identity())); + + + for (MesBom bom : bomList) { + MesWorkOrderPart orderPart = new MesWorkOrderPart(); + MesPartSap partSap = partMap.get(bom.getItemPartNo()); + if (partSap == null) { + return new ArrayList<>(); + } + List orderParts = orderPartList.stream().filter(item -> item.getPartNo().equals(partSap.getPartNo())).collect(Collectors.toList()); + if (!orderParts.isEmpty()) { + MesWorkOrderPart tempPart = orderParts.get(0); + tempPart.setItemQty(tempPart.getItemQty() + bom.getItemQty() * qty); + continue; + } + orderPart.setPartName(partSap.getPartName()); + orderPart.setPartNo(partSap.getPartNo()); + orderPart.setItemQty(bom.getItemQty() * qty); + orderPart.setItemUnit(partSap.getUnit()); + orderPart.setSourceId(bom.getId()); + orderPart.setShippingPartNo(partSap.getPartNo()); + orderPart.setWorkCellCode(workCellCode); + orderPartList.add(orderPart); + } + //3.遍历bomList + return orderPartList; + } + + private List getPlatBom(String partNo, String effectiveTime, String bomCode, String organizeCode) { + if (bomCode == null) { + //首先根据虚结构的零件号查询出最新的一条bom信息作为bomCode + DdlPackBean bomCodePackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", bomCodePackBean); + DdlPreparedPack.getTimeBetweenCol(effectiveTime, "effStartTime", "effEndTime", bomCodePackBean, false); + DdlPreparedPack.getOrderBy("effStartTime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), bomCodePackBean); + List bomList = bomRao.findByHqlTopWhere(bomCodePackBean, 1); + if (bomList == null || bomList.isEmpty()) { + return new ArrayList<>(); + } + bomCode = bomList.get(0).getBomCode(); + } + List bomResultList = new ArrayList<>(); + DdlPackBean bomPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(bomCode, "bomCode", bomPackBean); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", bomPackBean); + DdlPreparedPack.getStringSmallerPack(effectiveTime, "effStartTime", bomPackBean); + DdlPreparedPack.getStringBiggerPack(effectiveTime, "effEndTime", bomPackBean); + List bomList = bomRao.findByHqlWhere(bomPackBean); + + for (MesBom bom : bomList) { + if (bom.getPartType() != null && bom.getPartType().equalsIgnoreCase("X")) { + getPlatBom(bom.getItemPartNo(), effectiveTime, null, organizeCode); + } else { + bom.setBomCode(bom.getBomCode().toLowerCase()); + bomResultList.add(bom); + } + + } + + return bomResultList; + } + + private List getAssemblyList(String workCenterCode, String vehicleNo, List workOrderPartList, MesPartProdGroup mesPartProdGroup) { + //TM_BAS_WORK_ORDER_ASSEMBLY_SETTING 对应 mes_prod_rule_sort_cfg 排序生产规则 + List workOrderAssemblyList = new ArrayList<>(); + List partNoList = workOrderPartList.stream().map(MesWorkOrderPart::getPartNo).collect(Collectors.toList()); + DdlPackBean prodRuleSortPackBean = DdlPackBean.getDdlPackBean(mesPartProdGroup.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", prodRuleSortPackBean); + DdlPreparedPack.getInPackList(partNoList, "assemblyPartNo", prodRuleSortPackBean); + //查询当前产线的所有排序生产规则--分为当前工单清单的装配件 + List sortCfgList = mesProdRuleSortCfgRao.findByHqlWhere(prodRuleSortPackBean); + List sortCfgListFilter = sortCfgList.stream().filter(item -> partNoList.contains(item.getAssemblyPartNo())).collect(Collectors.toList()); + Map> orderPartMap = workOrderPartList.stream().collect(Collectors.groupingBy(MesWorkOrderPart::getPartNo)); + //遍历排序生产规则 + for (MesProdRuleSortCfg sortCfg : sortCfgListFilter) { + List orderPartList = orderPartMap.get(sortCfg.getAssemblyPartNo()); + MesWorkOrderAssembly orderAssembly = new MesWorkOrderAssembly(); +// MesWorkOrderPart orderPart = orderPartList.get(0); + //1.逻辑储量程序sortCfg.isLogicNum + if ((sortCfg.getIsLogicNum() != null && sortCfg.getIsLogicNum() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) && (sortCfg.getLogicNum() != null && sortCfg.getLogicNum() > 0)) { + Double total = orderPartList.stream().map(MesWorkOrderPart::getItemQty).reduce(Double::sum).get(); + if (!total.equals(sortCfg.getLogicNum())) { + continue; + } + } + //2.当排序规则的车型不为空时,则需要与参数匹配,如果不符合 则不加这个装配项 + if (StringUtils.isNotBlank(sortCfg.getVehicleNo()) && !sortCfg.getVehicleNo().equals(vehicleNo)) { + continue; + } + orderAssembly.setAssemblyPartNo(sortCfg.getAssemblyPartNo()); + orderAssembly.setAssemblyPartName(sortCfg.getAssemblyPartName()); + orderAssembly.setProcessName(sortCfg.getProcessName()); + orderAssembly.setWorkCenterCode(sortCfg.getWorkCenterCode()); + orderAssembly.setDisplayRule(sortCfg.getDisplayRule()); + orderAssembly.setMatchRule(sortCfg.getMatchRule()); + orderAssembly.setMatchType(sortCfg.getMatchType()); + orderAssembly.setPrintType(sortCfg.getPrintType()); + orderAssembly.setProcessCode(sortCfg.getProcessCode()); + orderAssembly.setDisplaySeq(sortCfg.getDisplaySeq()); + orderAssembly.setDisplayValue(sortCfg.getDisplayValue()); + orderAssembly.setProcessSeq(sortCfg.getProcessSeq()); + orderAssembly.setCraftName(sortCfg.getCraftName()); + orderAssembly.setCraftCode(sortCfg.getCraftCode()); + orderAssembly.setRouteSeq(sortCfg.getRouteSeq()); + orderAssembly.setWorkCellCode(sortCfg.getWorkCellCode()); +// orderAssembly.setOrderPartId(orderPart.getId().toString()); + orderAssembly.setEquipmentCode(sortCfg.getEquipmentCode()); + orderAssembly.setReportType(sortCfg.getReportType()); + if (sortCfg.getReportType() != null && sortCfg.getReportType() == MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue()) { + orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue()); + } else { + orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue()); + } + orderAssembly.setReportPartNo(sortCfg.getReportPartNo()); + orderAssembly.setImageFileId(sortCfg.getImageFileId()); + orderAssembly.setCraftCode(sortCfg.getCraftCode()); + orderAssembly.setCraftName(sortCfg.getCraftName()); + orderAssembly.setPartTypeCode(sortCfg.getPartTypeCode()); + orderAssembly.setShowColor(sortCfg.getShowColor()); + orderAssembly.setProductPartNo(sortCfg.getProductPartNo()); + orderAssembly.setPid(sortCfg.getId()); + orderAssembly.setWorkCenterCode(workCenterCode); + workOrderAssemblyList.add(orderAssembly); + } + + //车型不为空的逻辑--用于报工 + DdlPackBean reportRuleSortPackBean = DdlPackBean.getDdlPackBean(mesPartProdGroup.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", reportRuleSortPackBean); + DdlPreparedPack.getStringEqualPack(vehicleNo, "vehicleNo", reportRuleSortPackBean); + DdlPreparedPack.getNotInPack(partNoList, "assemblyPartNo", reportRuleSortPackBean); + //查询当前产线的所有排序生产规则--分为当前工单清单的装配件 + List prodCfgList = mesProdRuleSortCfgRao.findByHqlWhere(reportRuleSortPackBean); + for (MesProdRuleSortCfg ruleSortCfg : prodCfgList) { + MesWorkOrderAssembly orderAssembly = new MesWorkOrderAssembly(); + orderAssembly.setAssemblyPartNo(ruleSortCfg.getAssemblyPartNo()); + orderAssembly.setAssemblyPartName(ruleSortCfg.getAssemblyPartName()); + orderAssembly.setProcessName(ruleSortCfg.getProcessName()); + orderAssembly.setWorkCenterCode(ruleSortCfg.getWorkCenterCode()); + orderAssembly.setDisplayRule(ruleSortCfg.getDisplayRule()); + orderAssembly.setMatchRule(ruleSortCfg.getMatchRule()); + orderAssembly.setMatchType(ruleSortCfg.getMatchType()); + orderAssembly.setPrintType(ruleSortCfg.getPrintType()); + orderAssembly.setProcessCode(ruleSortCfg.getProcessCode()); + orderAssembly.setWorkCellCode(ruleSortCfg.getWorkCellCode()); + orderAssembly.setProcessCode(ruleSortCfg.getProcessCode()); + orderAssembly.setProcessName(ruleSortCfg.getProcessName()); + orderAssembly.setCraftCode(ruleSortCfg.getCraftCode()); + orderAssembly.setRouteSeq(ruleSortCfg.getRouteSeq()); + orderAssembly.setEquipmentCode(ruleSortCfg.getEquipmentCode()); + orderAssembly.setReportType(ruleSortCfg.getReportType()); + if (ruleSortCfg.getReportType() != null && ruleSortCfg.getReportType() == MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue()) { + orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue()); + } else { + orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue()); + } + orderAssembly.setReportPartNo(ruleSortCfg.getReportPartNo()); + orderAssembly.setProcessSeq(ruleSortCfg.getProcessSeq()); + orderAssembly.setPid(ruleSortCfg.getId()); + orderAssembly.setImageFileId(ruleSortCfg.getImageFileId()); + orderAssembly.setPartTypeCode(ruleSortCfg.getPartTypeCode()); + orderAssembly.setMaxValue(ruleSortCfg.getMaxValue()); + orderAssembly.setMinValue(ruleSortCfg.getMinValue()); + orderAssembly.setProductPartNo(ruleSortCfg.getProductPartNo()); + workOrderAssemblyList.add(orderAssembly); + } + //查询所有共用的零件 且没有零件号,多用于螺钉---查询排序加工规则 + DdlPackBean prodRuleSortPublicPackBean = DdlPackBean.getDdlPackBean(mesPartProdGroup.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", prodRuleSortPublicPackBean); + DdlPreparedPack.getIsNull("assemblyPartNo", prodRuleSortPublicPackBean); + List ruleSortCfgs = mesProdRuleSortCfgRao.findByHqlWhere(prodRuleSortPublicPackBean); + for (MesProdRuleSortCfg ruleSortCfg : ruleSortCfgs) { + MesWorkOrderAssembly orderAssembly = new MesWorkOrderAssembly(); + orderAssembly.setAssemblyPartNo(ruleSortCfg.getAssemblyPartNo()); + orderAssembly.setAssemblyPartName(ruleSortCfg.getAssemblyPartName()); + orderAssembly.setProcessName(ruleSortCfg.getProcessName()); + orderAssembly.setWorkCenterCode(ruleSortCfg.getWorkCenterCode()); + orderAssembly.setDisplayRule(ruleSortCfg.getDisplayRule()); + orderAssembly.setMatchRule(ruleSortCfg.getMatchRule()); + orderAssembly.setMatchType(ruleSortCfg.getMatchType()); + orderAssembly.setPrintType(ruleSortCfg.getPrintType()); + orderAssembly.setProcessCode(ruleSortCfg.getProcessCode()); + orderAssembly.setWorkCellCode(ruleSortCfg.getWorkCellCode()); + orderAssembly.setProcessCode(ruleSortCfg.getProcessCode()); + orderAssembly.setProcessName(ruleSortCfg.getProcessName()); + orderAssembly.setCraftCode(ruleSortCfg.getCraftCode()); + orderAssembly.setRouteSeq(ruleSortCfg.getRouteSeq()); + orderAssembly.setEquipmentCode(ruleSortCfg.getEquipmentCode()); + orderAssembly.setReportType(ruleSortCfg.getReportType()); + if (ruleSortCfg.getReportType() != null && ruleSortCfg.getReportType() == MesExtEnumUtil.MES_REPORT_TYPE.REPORT.getValue()) { + orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue()); + } else { + orderAssembly.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue()); + } + orderAssembly.setReportPartNo(ruleSortCfg.getReportPartNo()); + orderAssembly.setProcessSeq(ruleSortCfg.getProcessSeq()); + orderAssembly.setPid(ruleSortCfg.getId()); + orderAssembly.setImageFileId(ruleSortCfg.getImageFileId()); + orderAssembly.setPartTypeCode(ruleSortCfg.getPartTypeCode()); + orderAssembly.setMaxValue(ruleSortCfg.getMaxValue()); + orderAssembly.setMinValue(ruleSortCfg.getMinValue()); + orderAssembly.setProductPartNo(ruleSortCfg.getProductPartNo()); + workOrderAssemblyList.add(orderAssembly); + } + return workOrderAssemblyList; + } + + +}