diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java index bcf0461..8751358 100644 --- a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java @@ -74,4 +74,10 @@ public interface IMesWorkOrderService extends IBaseMesService { @ApiOperation(value = "BTO工单看板") List orderBoard(MesWorkOrderBoardReqModel workOrderBoardReqModel); + @ApiOperation(value = "根据工单状态改变--生成拉动单") + void doCreateKittingOrder(List workOrderListNew,MesPartPull mesPartPull,MesWorkCenter mesWorkCenter); + + @ApiOperation(value = "根据工单状态改变--关闭拉动但") + void doCloseKittingOrder(MesWorkOrder mesWorkOrder,String userName); + } diff --git a/modules/i3plus-ext-mes-apiservice/src/groovy/MesKittingOrderToWms.groovy b/modules/i3plus-ext-mes-apiservice/src/groovy/MesKittingOrderToWms.groovy new file mode 100644 index 0000000..a507589 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/groovy/MesKittingOrderToWms.groovy @@ -0,0 +1,97 @@ +import cn.estsh.i3plus.platform.common.tool.TimeTool +import cn.estsh.i3plus.pojo.mes.dbinterface.MesInterfaceDataMapper +import cn.estsh.i3plus.pojo.mes.repository.MesPullingOrderInfoRepository +import cn.estsh.i3plus.pojo.mes.repository.MesPullingOrderPartInfoRepository +import lombok.Getter +import lombok.Setter +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate +import org.springframework.util.CollectionUtils +import cn.estsh.i3plus.platform.plugin.datasource.DynamicDataSourceProxy +import javax.annotation.Resource +import java.sql.Connection + +/** + * @Description :mes同步wms kitting拉动单 + * @Reference : + * @Author : castle + * @CreateDate 2024/7/5 10:43 + * @Modify: + * */ +class MesKittingOrderToWms { + + public static final Logger LOGGER = LoggerFactory.getLogger(MesKittingOrderToWms.class) + + + @Resource(name = "yfasDataSource") + private DynamicDataSourceProxy yfasDataSource; + + @Resource(name = "mesDataSource") + private DynamicDataSourceProxy mesDataSource; + + @Getter + @Setter + private Connection mesConn; + + @Resource + private MesPullingOrderPartInfoRepository mesPullingOrderPartInfoRao; + + @Resource + private MesPullingOrderInfoRepository mesPullingOrderInfoRao; + + def readData(MesInterfaceDataMapper mapper) throws Exception { + + LOGGER.info("-------- Read Start 读取kitting拉动单 ---------------") + List updateList = new ArrayList<>(); + Map params = new HashMap<>(); + String sql = "select * from " + mapper.getSrcTableName() + " where " + mapper.getSrcWhere() + " order by " + mapper.getSrcOrderBy() + " limit " + mapper.getSrcGetLimit() + //查询待同步的数据 + List> dataList = queryDataTable(sql, params); + List> result = new ArrayList<>(); + for (Map map in dataList){ + Map params1 = new HashMap<>(); + def pullingOrderNo = map.get("pulling_order_no") + def organizeCode = map.get("organize_code") + params1.put("pullingOrderNo",pullingOrderNo); + params1.put("srcOrganizeCode",organizeCode) + String detailSql = "select * from mes_pulling_order_part_info where organize_code = :srcOrganizeCode and pulling_order_no = :pullingOrderNo"; + List> dataDetailList = queryDataTable(detailSql, params1); + + for (Map detail in dataDetailList){ + Map params2 = new HashMap<>(); + def workOrderNo = map.get("work_order_no") + params2.put("workOrderNo",workOrderNo); + params2.put("srcOrganizeCode",organizeCode) + String workOrderSql = "select * from mes_work_order where organize_code = :srcOrganizeCode and work_order_no = :workOrderNo"; + List> workOrderList = queryDataTable(workOrderSql, params2) + def mesWorkOrder = workOrderList.get(0) + detail.put("pull_part_no",detail.get("part_no")) + detail.put("pull_part_name",detail.get("part_name")) + detail.put("part_no",map.get("part_no")) + detail.put("part_name",map.get("part_name")) + detail.put("work_center_code",map.get("work_center_code")) + detail.put("status",map.get("pull_order_status")) + detail.put("shift",mesWorkOrder.get("shift_code")+":"+mesWorkOrder.get("shift_name")) + result.add(detail); + } + updateList.add("update "+mapper.getSrcTableName()+" set system_sync_status=1 , system_sync_date_time = '"+ TimeTool.getNowTime(true)+"' where pulling_order_no= '" + pullingOrderNo + "' ;") + } + + //更新同步标识 + if (!CollectionUtils.isEmpty(updateList) && updateList.size() > 0) { + this.mesConn = mesDataSource.getWriteConnectionWithoutPool(); + mesDataSource.executeAsBatch(updateList, mesConn) + mesDataSource.closeConnectionWithoutPoll(this.mesConn) + } + return result; + } + + private List> queryDataTable(String sql, Map params) { + NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(mesDataSource.getDataSource()) + + List> dataMap = namedJdbcTemplate.queryForList(sql, params) + + return dataMap; + } +} \ No newline at end of file diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java index 8a8fa88..94e2e42 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java @@ -39,6 +39,7 @@ import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.map.CaseInsensitiveMap; import org.apache.commons.collections.map.HashedMap; +import org.python.antlr.ast.While; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; @@ -48,6 +49,7 @@ import org.springframework.util.StringUtils; import javax.persistence.EntityManager; import javax.persistence.Query; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalTime; import java.util.*; @@ -186,6 +188,26 @@ public class MesWorkOrderService extends BaseMesService implements @Autowired private MesPartProdGroupRepository mesPartProdGroupRao; + @Autowired + private MesPullingOrderInfoRepository mesPullingOrderInfoRao; + + @Autowired + private MesPullingOrderPartInfoRepository pullingOrderPartInfoRao; + + @Autowired + private MesPartPullRepository partPullRao; + + @Autowired + private MesWorkCenterRepository workCenterRao; + + @Autowired + private MesPartPullDetailRepository partPullDetailRao; + + @Autowired + private MesBomRepository bomRao; + + + @Override public MesWorkOrder insert(MesWorkOrder bean) { // 数据校验 @@ -220,6 +242,10 @@ public class MesWorkOrderService extends BaseMesService implements //非排序 } else if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) { insertUnSortWorkOrder(bean, mesWorkCenter); + //创建kitting + List kittingList = new ArrayList<>(); + kittingList.add(bean); + doCreateKitting(kittingList,bean.getOrganizeCode()); //bto } else { insertBtoWorkOrder(bean); @@ -269,15 +295,53 @@ public class MesWorkOrderService extends BaseMesService implements closeMesPrintQueue(bean.getWorkOrderNo(), bean.getOrganizeCode(), AuthUtilExt.getUserName()); } result.setWorkOrderStatus(bean.getWorkOrderStatus()); + //非排序关闭订单 需要关闭kitting + doCloseKittingOrder(bean,bean.getModifyUser()); + List list = new ArrayList<>(); + list.add(bean); + doCreateKitting(list,bean.getOrganizeCode()); + } updateMesWorkOrder(result,MesExtEnumUtil.WORK_ORDER_LOG_TYPE.UPDATE,0); - if (isSavePrintQueue) insertPrintQueue(result); - + if (isSavePrintQueue) { + insertPrintQueue(result); + //发布时 校验是否需要生成拉动单 + List list = new ArrayList<>(); + list.add(result); + doCreateKitting(list,result.getOrganizeCode()); + } return result; } - + public void doCloseKittingOrder(MesWorkOrder mesWorkOrder,String userName){ + String organizeCode = mesWorkOrder.getOrganizeCode(); + DdlPackBean pullOrderPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"workOrderNo",pullOrderPackBean); + List pullingOrderInfoList = pullingOrderInfoRepository.findByHqlWhere(pullOrderPackBean); + if (pullingOrderInfoList != null && !pullingOrderInfoList.isEmpty()) { + List infoList = pullingOrderInfoList.stream().filter(item -> item.getPullOrderStatus() != MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_50.getValue()).collect(Collectors.toList()); + + if (!infoList.isEmpty()) { + MesPullingOrderInfo info = infoList.get(0); + String pullCode = info.getPullCode(); + //查询出拉动组,判断是否需要关闭拉动单 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(pullCode,"pullCode",ddlPackBean); + List mesPartPullList = partPullRao.findByHqlWhere(ddlPackBean); + if (mesPartPullList!= null && !mesPartPullList.isEmpty()) { + MesPartPull mesPartPull = mesPartPullList.get(0); + String pullOrderCloseState = mesPartPull.getPullOrderCloseState(); + if (!StringUtils.isEmpty(pullOrderCloseState)){ + List closeState = Arrays.asList(pullOrderCloseState.split(",")); + if (closeState.contains(mesWorkOrder.getWorkOrderStatus().toString())){ + mesPullingOrderInfoRao.updateByProperties(new String[]{"workOrderNo"}, new Object[]{mesWorkOrder.getWorkOrderNo()}, new String[]{"pullOrderStatus","modifyUser"}, new Object[]{ MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_50.getValue(),userName}); + } + } + } + } + } + } @Override protected void setPackQueryBean(MesWorkOrder bean, DdlPackBean packBean) { DdlPreparedPack.getStringLikerPack(bean.getWorkOrderNo(), MesExtConstWords.WORK_ORDER_NO, packBean); @@ -665,6 +729,7 @@ public class MesWorkOrderService extends BaseMesService implements seqList = syncFuncService.syncSerialNo(orderSeqSerialNoModel.organizeCode(next.getOrganizeCode()), next.getCreateUser(), next.getOrganizeCode(), mesWorkOrderList.size()).getResultList(); } List mesWorkOrderLogList = new ArrayList<>(); + List workOrderListForKitting = new ArrayList<>(); int index = 0; for (MesWorkOrder item : mesWorkOrderList) { //获取相同类型 相同标识 生产序号最大值的 @@ -687,6 +752,7 @@ public class MesWorkOrderService extends BaseMesService implements ConvertBean.serviceModelInitialize(copyMesWorkOrder, item.getCreateUser()); index++; baseRDao.insert(copyMesWorkOrder); + //保存记录 MesWorkOrderLog workOrderLog = new MesWorkOrderLog(); BeanUtils.copyProperties(item, workOrderLog,MesExtConstWords.ID,MesExtConstWords.SYSTEM_SYNC_STATUS); @@ -713,6 +779,7 @@ public class MesWorkOrderService extends BaseMesService implements item.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); ConvertBean.serviceModelInitialize(item, item.getCreateUser()); baseRDao.insert(item); + workOrderListForKitting.add(item); index++; //保存记录 MesWorkOrderLog workOrderLog = new MesWorkOrderLog(); @@ -723,6 +790,328 @@ public class MesWorkOrderService extends BaseMesService implements if (!CollectionUtils.isEmpty(mesWorkOrderLogList)) { workOrderLogService.insertBatch(mesWorkOrderLogList); } + //创建kitting + doCreateKitting(workOrderListForKitting, next.organizeCode); + } + + private void doCreateKitting(List mesWorkOrderList,String organizeCode) { + mesWorkOrderList = mesWorkOrderList.stream().filter(item ->item.getPullingStatus()!=MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.SUBMIT.getValue()).collect(Collectors.toList()); + if (mesWorkOrderList.isEmpty()){ + return; + } + //1.拉动组获取 -- 根据拉动组类型获取kitting,需要判断是否生成是否生成拉动单开关 + DdlPackBean partPullPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PART_PULL_ORDER_TYPE.KITTING_PULL.getValue(),"pullOrderType", partPullPackBean); + DdlPreparedPack.getNumEqualPack(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(),"isAutoCreatePullOrder", partPullPackBean); + List mesPartPullList = partPullRao.findByHqlWhere(partPullPackBean); + //2.工单 过滤出未生成拉动单的工单pullingStatus,按照拉动组产线分组,每组按照工单序号排序 + Map> workOrderMap = mesWorkOrderList.stream().filter(item -> item.getPullingStatus() == MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.NOTCREATE.getValue()).collect(Collectors.groupingBy(MesWorkOrder::getWorkCenterCode)); + + //3.查询2中所有的产线信息 ,判断生成拉动单的工单状态 generateStatus 与工单状态对比 是否生成拉动单 MesExtEnumUtil.GENERATE_STATUS需要和工单类型一致才生成拉动单 + List workOrderCenterList = new ArrayList<>(workOrderMap.keySet()); + DdlPackBean workCenterPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(workOrderCenterList,"workCenterCode", workCenterPackBean); + List workCenterList = workCenterRao.findByHqlWhere(workCenterPackBean); + Map> workCenterMap = workCenterList.stream().collect(Collectors.groupingBy(MesWorkCenter::getWorkCenterCode)); + //4.遍历拉动组 + for (MesPartPull mesPartPull : mesPartPullList) { + String workCenterCode = mesPartPull.getWorkCenterCode(); + //按数量圆整 + if(mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_BY_QUANTITY.getValue()){ + List workOrderList = workOrderMap.get(workCenterCode); + //遍历工单,打散成bom 生成拉动单 + List mesWorkCenters = workCenterMap.get(workCenterCode); + if (CollectionUtils.isEmpty(workOrderList) || CollectionUtils.isEmpty(mesWorkCenters)) { + continue; + } + //判断当前产线是否需要生成拉动单 + MesWorkCenter mesWorkCenter = mesWorkCenters.get(0); + Integer generateStatus = mesWorkCenter.getGenerateStatus(); + if (generateStatus == null){ + generateStatus = MesExtEnumUtil.GENERATE_STATUS.GENERATE_STATUS_20.getValue(); + } + Map> orderMap = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getPartNo)); + for (String producePartNoAndTime : orderMap.keySet()) { + List workOrderListNew = orderMap.get(producePartNoAndTime); + Integer finalGenerateStatus = generateStatus; + //过滤掉不生成拉动单的工单 + workOrderListNew = workOrderListNew.stream().filter(item -> item.getWorkOrderStatus().equals(finalGenerateStatus)).collect(Collectors.toList()); + if (!workOrderListNew.isEmpty()) { + doCreateKittingOrder(workOrderListNew,mesPartPull,mesWorkCenter); + } + + } + //按成套圆整 + } else if (mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_DOOR_PANELS_NUMBER.getValue()) { + //按成套圆整 会是同一个拉动组 生成拉动单 + List workOrderList1 = workOrderMap.get(workCenterCode); + if (CollectionUtils.isEmpty(workOrderList1)) { + continue; + } + Map> groupCodeMap = workOrderList1.stream().collect(Collectors.groupingBy(MesWorkOrder::getGroupCode)); + for (Long l : groupCodeMap.keySet()) { + List workOrderList = groupCodeMap.get(l); + List mesWorkCenters = workCenterMap.get(workCenterCode); + if (CollectionUtils.isEmpty(workOrderList) || CollectionUtils.isEmpty(mesWorkCenters)) { + continue; + } + doCreateGroupKittingOrder(workOrderList,mesPartPull,mesWorkCenters.get(0)); + } + + } + } + } + //按成套圆整 + private void doCreateGroupKittingOrder(List workOrderListNew,MesPartPull mesPartPull,MesWorkCenter mesWorkCenter){ + String organizeCode = mesPartPull.getOrganizeCode(); + List list = new ArrayList<>(); + //1.查询拉动组详情 + DdlPackBean pullPartDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesPartPull.getPullCode(),"pullCode", pullPartDetailPackBean); + List mesPartPullDetailList = partPullDetailRao.findByHqlWhere(pullPartDetailPackBean); + if (CollectionUtils.isEmpty(mesPartPullDetailList)) { + return; + } + // 打散所有的工单的bom + List pullPartNoList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPullPartNo).collect(Collectors.toList()); + Map pullDetailMap = mesPartPullDetailList.stream().collect(Collectors.toMap(MesPartPullDetail::getPullPartNo, Function.identity())); + for (MesWorkOrder mesWorkOrder : workOrderListNew) { + List bomList = getPlatBom(null, mesWorkOrder.getPartNo(), TimeTool.getNowTime(true), organizeCode); + List collect = bomList.stream().filter(item -> pullPartNoList.contains(item.getItemPartNo())).collect(Collectors.toList()); + mesBomRDao.detachList(collect); + collect.forEach(item -> item.setItemQty(item.getItemQty() * mesWorkOrder.getQty())); + list.addAll(collect); + } + if (list.isEmpty()){ + return; + } + // 计算所有拉动单的数量,生成拉动单 + String kittingOrderNoRuleCode = mesConfigService.getCfgValue(organizeCode, "KITTING_ORDER_NO_RULE_CODE"); + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(kittingOrderNoRuleCode); + genSerialNoModel.setDynamicRule(mesPartPull.getPullCode()); + List resultList = syncFuncService.syncSerialNo(genSerialNoModel.organizeCode(organizeCode), AuthUtil.getSessionUser().getUserName(), organizeCode, 1).getResultList(); + String serialNo = resultList.get(0); + String workOrderStr = workOrderListNew.stream().map(MesWorkOrder::getWorkOrderNo).collect(Collectors.joining("/r/n")); + String workOrderPartNoStr = workOrderListNew.stream().map(MesWorkOrder::getPartNo).collect(Collectors.joining("/r/n")); + String workOrderPartNameStr = workOrderListNew.stream().map(MesWorkOrder::getPartName).collect(Collectors.joining("/r/n")); + String custPartNo = workOrderListNew.stream().map(MesWorkOrder::getCustPartNo).collect(Collectors.joining("/r/n")); + MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo(); + pullingOrder.setOrganizeCode(organizeCode); + pullingOrder.setPullingOrderNo(serialNo); //拉动单号 + 8位年月日 + 5位流水号 + pullingOrder.setPullOrderType(mesPartPull.getPullOrderType()); + pullingOrder.setPullGroupFid(mesPartPull.getId()); + pullingOrder.setWorkOrderNo(workOrderStr); + pullingOrder.setIsPrint(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + pullingOrder.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); + pullingOrder.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_10.getValue()); + pullingOrder.setWorkCenterCode(mesPartPull.getWorkCenterCode()); + pullingOrder.setPullCode(mesPartPull.getPullCode()); + pullingOrder.setPartNo(workOrderPartNoStr); + pullingOrder.setPartName(workOrderPartNameStr); + pullingOrder.setCustPartNo(custPartNo); + pullingOrder.setCarModelCode(workOrderListNew.get(0).getCarModelCode()); + pullingOrder.setOrderFlag(workOrderListNew.get(0).getOrderFlag()); + ConvertBean.serviceModelInitialize(pullingOrder, AuthUtil.getSessionUser().getUserName()); + mesPullingOrderInfoRao.insert(pullingOrder); + // 需要合并同类项 + Map> itemBomMap = list.stream().collect(Collectors.groupingBy(MesBom::getItemPartNo)); + for (String itemPartNo : itemBomMap.keySet()) { + List mesBoms = itemBomMap.get(itemPartNo); + double sum = mesBoms.stream().collect(Collectors.summarizingDouble(MesBom::getItemQty)).getSum(); + MesPullingOrderPartInfo detail = new MesPullingOrderPartInfo(); + detail.setOrganizeCode(organizeCode); + detail.setPullCode(pullingOrder.getPullCode()); + detail.setPullingOrderNo(pullingOrder.getPullingOrderNo()); + detail.setWorkOrderNo(pullingOrder.getWorkOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + MesBom mesBom = mesBoms.get(0); + detail.setPartNo(mesBom.getItemPartNo()); + detail.setPartName(mesBom.getItemPartName()); + detail.setPullQty(sum); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setWaterSeq(pullingOrder.getProductSeq()); + detail.setWorkCellCode(mesWorkCenter.getWorkCenterCode()); + detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1,未送料为0 + detail.setCustPartNo(pullingOrder.getCustPartNo()); + detail.setCarSeries(pullDetailMap.get(itemPartNo) == null ? "" : pullDetailMap.get(itemPartNo).getCarSeries()); + detail.setOrderFlag(pullingOrder.getOrderFlag()); + ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName()); + pullingOrderPartInfoRao.insert(detail); + } + + } + public void doCreateKittingOrder(List workOrderListNew,MesPartPull mesPartPull,MesWorkCenter mesWorkCenter) { + String organizeCode = mesWorkCenter.getOrganizeCode(); + //1.查询拉动组详情 + DdlPackBean pullPartDetailPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesPartPull.getPullCode(),"pullCode", pullPartDetailPackBean); + List mesPartPullDetailList = partPullDetailRao.findByHqlWhere(pullPartDetailPackBean); + if (CollectionUtils.isEmpty(mesPartPullDetailList)) { + return; + } + //拉动组详情中的零件号 + List partNoList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPartNo).collect(Collectors.toList()); + //深汕按照数量圆整 + if (mesPartPull.getRoundMethod() == MesExtEnumUtil.PART_PULL_ROUND_METHOD.ROUND_BY_QUANTITY.getValue()){ + int packRoundQty =(int)Double.parseDouble(mesPartPull.getPackRoundQty()); + String partNo = workOrderListNew.get(0).getPartNo(); + //打散bom + List bomList = getPlatBom(null, partNo, TimeTool.getNowTime(true), organizeCode); + //需要生成拉动单的零件 + List bomPullList = bomList.stream().filter(item -> partNoList.contains(item.getItemPartNo())).collect(Collectors.toList()); + mesBomRDao.detachList(bomPullList); + for (MesWorkOrder mesWorkOrder : workOrderListNew) { + Double qty = mesWorkOrder.getQty(); + bomPullList.forEach(item -> item.setItemQty(item.getItemQty() * qty)); + DoubleSummaryStatistics summaryStatistics = bomPullList.stream().collect(Collectors.summarizingDouble(MesBom::getItemQty)); + double max = summaryStatistics.getMax(); + int multiple = (int)Math.ceil(max / packRoundQty); //生成的拉动的数量 + for (int i = 1; i <= multiple; i++) { + insertPullOrderInfo( mesWorkOrder, bomPullList, mesPartPull, mesPartPullDetailList, organizeCode, i, packRoundQty); + } + workOrderRepository.updateByProperties("workOrderNo",mesWorkOrder.getWorkOrderNo(),"pullingStatus",MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.SUBMIT.getValue()); + } + +// /** +// * 满足一个拉动组就生成一个拉动单 +// * 分类 +// * 1.当前bom 子零件数量 * 工单需求数量 > packRoundQty multiple是多少,是否有余数 取模 +// * 2.当前bom 子零件数量 * 工单需求数量 = packRoundQty 直接整除,看看是否大于1 ,大于1需要拆分多个拉动单 +// * 3.当前bom 子零件数量 * 工单需求数量 < packRoundQty 需要增加一个工单来补充当前的数量,补不齐继续补充 +// */ +// Map partNoRemainder = new HashMap<>(); +// for (int i = 0; i < workOrderListNew.size(); i++) { +// MesWorkOrder mesWorkOrder = workOrderListNew.get(0); +// Double qty = mesWorkOrder.getQty(); +// bomPullList.forEach(item -> item.setItemQty(item.getItemQty() * qty)); +// for (int j = 0; j < bomPullList.size(); j++) { +// double m = bomPullList.get(j).getItemQty() % packRoundQty; +// double n = bomPullList.get(j).getItemQty() / packRoundQty; +// if (m == 0 && n != 0){ +// //子零件数量 * 工单需求数量 = packRoundQty +// //证明当前零件需要拉动的数量是圆整数量的倍数,需要拆分多个拉动单,或者一个拉动单就满足了 +// +// }else if (m != 0 && n == 0) { +// //子零件数量 * 工单需求数量 < packRoundQty +// //证明需要凑下一个工单的当前零件 +// } else if (m !=0 && n > 0) { +// //子零件数量 * 工单需求数量 > packRoundQty +// //够一个拉动单以上的数据,还有余数给 +// +// } +// } +// } + + + } + } + + private void insertPullOrderInfo(MesWorkOrder mesWorkOrder,List bomPullList,MesPartPull mesPartPull,List mesPartPullDetailList,String organizeCode,int i, int roundPackQty){ + //校验当前工单是否已经生成过拉动单,如果已经生成过则不在生成 +// DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); +// DdlPreparedPack.getStringEqualPack(mesWorkOrder.getWorkOrderNo(),"workOrderNo", ddlPackBean); +// int count = mesPullingOrderInfoRao.findByHqlWhereCount(ddlPackBean); +// if (count >0){ +// return; +// } + // 计算所有拉动单的数量,生成拉动单 + Map> pullDetailMap = mesPartPullDetailList.stream().filter(item->!StringUtils.isEmpty(item.getPullPartNo())).collect(Collectors.groupingBy(MesPartPullDetail::getPullPartNo)); + List pullDetailPartList = mesPartPullDetailList.stream().map(MesPartPullDetail::getPullPartNo).collect(Collectors.toList()); + String kittingOrderNoRuleCode = mesConfigService.getCfgValue(organizeCode, "KITTING_ORDER_NO_RULE_CODE"); + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(kittingOrderNoRuleCode); + genSerialNoModel.setDynamicRule(mesPartPull.getPullCode()); + List resultList = syncFuncService.syncSerialNo(genSerialNoModel.organizeCode(organizeCode), AuthUtil.getSessionUser().getUserName(), organizeCode, 1).getResultList(); + String serialNo = resultList.get(0); + MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo(); + pullingOrder.setOrganizeCode(organizeCode); + pullingOrder.setPullingOrderNo(serialNo); //拉动单号 + 8位年月日 + 5位流水号 + pullingOrder.setPullOrderType(mesPartPull.getPullOrderType()); + pullingOrder.setPullGroupFid(mesPartPull.getId()); + pullingOrder.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); + pullingOrder.setIsPrint(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + pullingOrder.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); + pullingOrder.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.PULL_ORDER_STATUS_10.getValue()); + pullingOrder.setWorkCenterCode(mesPartPull.getWorkCenterCode()); + pullingOrder.setPullCode(mesPartPull.getPullCode()); + pullingOrder.setPartNo(mesWorkOrder.getPartNo()); + pullingOrder.setPartName(mesWorkOrder.getPartName()); + pullingOrder.setCustPartNo(mesWorkOrder.getCustPartNo()); + pullingOrder.setCarModelCode(mesWorkOrder.getCarModelCode()); + pullingOrder.setOrderFlag(mesWorkOrder.getOrderFlag()); + + ConvertBean.serviceModelInitialize(pullingOrder, AuthUtil.getSessionUser().getUserName()); + mesPullingOrderInfoRao.insert(pullingOrder); + List filterBomList = bomPullList.stream().filter(item -> pullDetailPartList.contains(item.getItemPartNo())).collect(Collectors.toList()); + for (MesBom mesBom : filterBomList) { + MesPullingOrderPartInfo detail = new MesPullingOrderPartInfo(); + List mesPartPullDetailList1 = pullDetailMap.get(mesBom.getItemPartNo()); + for (MesPartPullDetail mesPartPullDetail : mesPartPullDetailList1) { + detail.setOrganizeCode(organizeCode); + detail.setPullCode(pullingOrder.getPullCode()); + detail.setPullingOrderNo(pullingOrder.getPullingOrderNo()); + detail.setWorkOrderNo(pullingOrder.getWorkOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + detail.setPartNo(mesBom.getItemPartNo()); + detail.setPartName(mesBom.getItemPartName()); + double remainingQty = mesBom.getItemQty() - i * roundPackQty; + if (remainingQty < -roundPackQty){ + continue; + } + detail.setPullQty(remainingQty > 0 ? roundPackQty : (mesBom.getItemQty() - (i-1) * roundPackQty)); + detail.setCustOrderNo(pullingOrder.getCustOrderNo()); + detail.setWorkOrderSeq(pullingOrder.getWorkOrderSeq()); + detail.setWaterSeq(pullingOrder.getProductSeq()); + detail.setWorkCellCode(mesPartPullDetail.getWorkCellCode()); +// detail.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1,未送料为0 + detail.setCustPartNo(pullingOrder.getCustPartNo()); + detail.setCarSeries(mesPartPullDetail.getCarSeries() == null ? "" : mesPartPullDetail.getCarSeries()); + detail.setOrderFlag(pullingOrder.getOrderFlag()); + ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName()); + pullingOrderPartInfoRao.insert(detail); + } + } + + } + + private List getPlatBom(MesBom mesBom,String partNo, String effectiveTime,String organizeCode) { + //MES汇报查询BOM是否携带结束查询条件 + MesConfig config = mesConfigService.getCfgValueByCode(organizeCode, MesExtConstWords.MES_REPORT_FIND_BOM_WITH_EFFENDTIME); + Boolean isWithEffEndTime = (null != config && !org.springframework.util.StringUtils.isEmpty(config.getCfgValue()) && config.getCfgValue().equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) ? true : false; + + if (mesBom == null) { + //首先根据虚结构的零件号查询出最新的一条bom信息作为bomCode + DdlPackBean bomCodePackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.PART_NO, bomCodePackBean); + DdlPreparedPack.getStringSmallerPack(effectiveTime, MesExtConstWords.EFF_START_TIME, bomCodePackBean); + if (isWithEffEndTime) DdlPreparedPack.getStringBiggerPack(effectiveTime, MesExtConstWords.EFF_END_TIME, bomCodePackBean); + DdlPreparedPack.getOrderBy(MesExtConstWords.EFF_START_TIME, CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), bomCodePackBean); + List bomList = bomRao.findByHqlTopWhere(bomCodePackBean, 1); + if (bomList == null || bomList.isEmpty()) { + return new ArrayList<>(); + } + mesBom = bomList.get(0); + } + List bomResultList = new ArrayList<>(); + DdlPackBean bomPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(mesBom.getBomCode(), "bomCode", bomPackBean); + DdlPreparedPack.getStringEqualPack(partNo, MesExtConstWords.PART_NO, bomPackBean); + DdlPreparedPack.getStringEqualPack(mesBom.getEffStartTime(), MesExtConstWords.EFF_START_TIME, bomPackBean); + List bomList = bomRao.findByHqlWhere(bomPackBean); + + for (MesBom bom : bomList) { + if (bom.getPartType() != null && bom.getPartType().equalsIgnoreCase("X")) { + bomResultList.addAll(getPlatBom(null,bom.getItemPartNo(), effectiveTime, organizeCode)); + } else { + bom.setBomCode(bom.getBomCode().toLowerCase()); + bomResultList.add(bom); + } + + } + + return bomResultList; } private void checkData(List mesWorkOrderList, String organizeCode) { @@ -970,6 +1359,8 @@ public class MesWorkOrderService extends BaseMesService implements @Override public void doProductReport(MesWorkOrder mesWorkOrder) { + //初始的工单状态 + Integer workOrderStatusInit = mesWorkOrder.getWorkOrderStatus(); MesWorkOrder mesWorkOrderDb = getMesWorkOrder(mesWorkOrder.getWorkOrderNo(),mesWorkOrder.getOrganizeCode()); mesWorkOrderDb.setDescription(mesWorkOrder.getDescription()); //查询物料信息 @@ -1033,6 +1424,14 @@ public class MesWorkOrderService extends BaseMesService implements mesWorkOrderDb.setRemark(mesWorkOrder.getRemark()); //更新工单 updateMesWorkOrder(mesWorkOrderDb,(MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrder.getReportType()) ? MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT : MesExtEnumUtil.WORK_ORDER_LOG_TYPE.REPORT_ADJUST,mesWorkOrder.getNum()); + + //2025/2/19 状态改变了需要校验是否生成拉动单,是否关闭拉动单 + if (!Objects.equals(mesWorkOrderDb.getWorkOrderStatus(), workOrderStatusInit)){ + doCloseKittingOrder(mesWorkOrderDb,mesWorkOrderDb.getModifyUser()); + List list = new ArrayList<>(); + list.add(mesWorkOrderDb); + doCreateKitting(list,mesWorkOrderDb.getOrganizeCode()); + } //试制单不报工 if(Objects.isNull(mesWorkOrderDb.getOrderFlag()) || !MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(mesWorkOrderDb.getOrderFlag())){ String sn = getStringList(mesWorkOrder.getOrganizeCode(), AuthUtilExt.getUserName()); @@ -1248,6 +1647,17 @@ public class MesWorkOrderService extends BaseMesService implements //关闭工单 baseRDao.updateByProperties(new String[]{MesExtConstWords.MODIFY_USER, MesExtConstWords.MODIFY_DATE_TIME, MesExtConstWords.WORK_ORDER_STATUS, MesExtConstWords.SYSTEM_SYNC_STATUS}, new Object[]{userName, TimeTool.getNowTime(true), MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()}, ddlPackBean); + + //关闭工单后校验是否生成拉动单,是否关闭拉动单 + List mesWorkOrderListNew = new ArrayList<>(); + for (MesWorkOrder mesWorkOrder : mesWorkOrderList) { + MesWorkOrder mesWorkOrderNew = new MesWorkOrder(); + BeanUtils.copyProperties(mesWorkOrder, mesWorkOrderNew); + mesWorkOrderNew.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()); + mesWorkOrderListNew.add(mesWorkOrderNew); + doCloseKittingOrder(mesWorkOrderNew,userName); + } + doCreateKitting(mesWorkOrderListNew,organizeCode); } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/resources/application.properties b/modules/i3plus-ext-mes-apiservice/src/main/resources/application.properties index d72832f..43a2258 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/resources/application.properties +++ b/modules/i3plus-ext-mes-apiservice/src/main/resources/application.properties @@ -1,7 +1,7 @@ #\u9879\u76EE\u540D\u79F0 spring.application.name=i3mes #\u4F7F\u7528\u914D\u7F6E -spring.profiles.active=docker,cus-docker +spring.profiles.active=6,cus-71 ######### \u81EA\u5B9A\u4E49\u53C2\u6570 ######### #\u9879\u76EE\u63CF\u8FF0\u4FE1\u606F\uFF08swagger\u4E2D\u663E\u5F0F\uFF09\uFF0C\u4E2D\u6587\u4F7F\u7528uncode\u8F6C desc.application.name=\u751F\u4EA7\u6267\u884C\u7CFB\u7EDF