db/Ë«ÁÖлð¾æMESÊý¾Ý¿âÉè¼Æ.pdma.json
@@ -2,9 +2,9 @@ "name": "åææ°ç«ç¬MESæ°æ®åºè®¾è®¡", "describe": "æè¿°åèªæ°ç«ç¬MESæ°æ®åºè®¾è®¡è¯¦æ ", "avatar": "", "version": "4.9.2", "version": "4.9.4", "createdTime": "2025-3-10 16:38:19", "updatedTime": "2025-8-15 14:58:22", "updatedTime": "2025-8-18 15:02:20", "dbConns": [], "profile": { "default": { @@ -632,7 +632,7 @@ "#DDE5FF" ], "DDLToggleCase": "L", "menuWidth": "364px" "menuWidth": "296px" }, "entities": [ { @@ -11555,6 +11555,24 @@ "id": "125E1F1A-A084-4244-8D44-57D5838EE133" }, { "defKey": "finished_pallets", "defName": "å·²çäº§ææ°", "comment": "å½åçæ¬¡å·²çäº§çææ°éï¼æ¯æ¬¡æ¥å·¥æ´æ°", "type": "", "len": "", "scale": "", "primaryKey": false, "notNull": false, "autoIncrement": false, "defaultValue": "", "hideInGraph": false, "refDict": "", "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811", "extProps": {}, "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E", "id": "A2AFA492-7799-4E1C-B2AB-A6004630C951" }, { "defKey": "publisher", "defName": "åå¸äºº", "comment": "", src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java
@@ -17,5 +17,18 @@ /** * çå¤ç */ HEATTREATMENT HEATTREATMENT; /** * @param name æä¸¾çåç§° * @return 对åºç ProductionTypeEnum æä¸¾ç±»åï¼å¦ææªæ¾å°åè¿å null */ public static ProductionTypeEnum fromName(String name) { for (ProductionTypeEnum typeEnum : ProductionTypeEnum.values()) { if (typeEnum.name().equals(name)) { return typeEnum; } } return null; } } src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java
@@ -1,5 +1,7 @@ package org.jeecg.modules.lsw.controller; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -15,10 +17,14 @@ import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.base.entity.Factory; import org.jeecg.modules.base.entity.LineSideWarehouse; import org.jeecg.modules.base.enums.ProductionTypeEnum; import org.jeecg.modules.base.service.IFactoryService; import org.jeecg.modules.base.service.ILineSideWarehouseService; import org.jeecg.modules.lsw.entity.LswMaterial; import org.jeecg.modules.lsw.entity.LswMaterialInventory; import org.jeecg.modules.lsw.enums.MaterialCategoryEnum; import org.jeecg.modules.lsw.service.ILswMaterialInventoryService; import org.jeecg.modules.lsw.service.ILswMaterialService; import org.jeecg.modules.lsw.vo.LswMaterialPage; @@ -53,6 +59,8 @@ private ILswMaterialInventoryService lswMaterialInventoryService; @Autowired private ILineSideWarehouseService lineSideWarehouseService; @Autowired private IFactoryService factoryService; /** * å页å表æ¥è¯¢ @@ -160,6 +168,45 @@ return Result.OK(lswMaterialInventoryList); } @AutoLog(value = "线边åºç©æä¿¡æ¯-éè¿äº§çº¿ç±»åæ¥è¯¢çº¿è¾¹åºç©æ") @ApiOperation(value = "线边åºç©æä¿¡æ¯-éè¿äº§çº¿ç±»åæ¥è¯¢çº¿è¾¹åºç©æ", notes = "线边åºç©æä¿¡æ¯-éè¿äº§çº¿ç±»åæ¥è¯¢çº¿è¾¹åºç©æ") @GetMapping(value = "/queryLswMaterialByProductionType") public Result<List<LswMaterial>> queryLswMaterialByProductionType(@RequestParam("factoryId") String factoryId) { Factory factory = factoryService.getById(factoryId); ProductionTypeEnum productionType = ProductionTypeEnum.fromName(factory.getProductionType()); List<LswMaterial> lswMaterialList = CollectionUtil.newArrayList(); if (productionType == null) { throw new JeecgBootException("äº§çº¿ç±»åæªè®¾ç½®ï¼æ æ³æ¥è¯¢ç¸åºç©æä¿¡æ¯ï¼"); } switch (productionType) { case ASSEMBLE: //è£ é çº¿ï¼æ¥è¯¢æåç©æ lswMaterialList = lswMaterialService.list(new LambdaQueryWrapper<LswMaterial>() .eq(LswMaterial::getMaterialCategory, MaterialCategoryEnum.FINISHED_PRODUCT.name()) .eq(LswMaterial::getDelFlag, CommonConstant.DEL_FLAG_0) .eq(LswMaterial::getMaterialStatus, CommonConstant.STATUS_1) .orderByAsc(LswMaterial::getMaterialNumber)); break; case INNERFLANGE: //å æ³å °æºå çº¿ï¼æ¥è¯¢å æ³å °ç©æ lswMaterialList = lswMaterialService.list(new LambdaQueryWrapper<LswMaterial>() .eq(LswMaterial::getMaterialCategory, MaterialCategoryEnum.INNER_FLANGE.name()) .eq(LswMaterial::getDelFlag, CommonConstant.DEL_FLAG_0) .eq(LswMaterial::getMaterialStatus, CommonConstant.STATUS_1) .orderByAsc(LswMaterial::getMaterialNumber)); break; case OUTERFLANGE: //夿³å °æºå çº¿ï¼æ¥è¯¢å¤æ³å °ç©æ lswMaterialList = lswMaterialService.list(new LambdaQueryWrapper<LswMaterial>() .eq(LswMaterial::getMaterialCategory, MaterialCategoryEnum.OUTER_FLANGE.name()) .eq(LswMaterial::getDelFlag, CommonConstant.DEL_FLAG_0) .eq(LswMaterial::getMaterialStatus, CommonConstant.STATUS_1) .orderByAsc(LswMaterial::getMaterialNumber)); break; } return Result.OK(lswMaterialList); } /** * 导åºexcel * src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInbound.java
@@ -15,6 +15,7 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; /** @@ -81,7 +82,7 @@ /**å ¥åºæ°é*/ @Excel(name = "å ¥åºæ°é", width = 15) @ApiModelProperty(value = "å ¥åºæ°é") private Double quantity; private BigDecimal quantity; /**æ¥æ¶äºº*/ @Excel(name = "æ¥æ¶äºº", width = 15) @ApiModelProperty(value = "æ¥æ¶äºº") src/main/java/org/jeecg/modules/lsw/enums/MaterialCategoryEnum.java
@@ -5,6 +5,14 @@ OUTER_FLANGE, //夿³å ° INNER_FLANGE, //å æ³å ° COMPONENTS, //é ä»¶ BLANK, //æ¯å¯ ; BLANK; //æ¯å¯ public static MaterialCategoryEnum fromName(String name) { for (MaterialCategoryEnum category : MaterialCategoryEnum.values()) { if (category.name().equals(name)) { return category; } } return null; } } src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java
@@ -204,10 +204,12 @@ @GetMapping(value = "/execute") public Result<?> execute(@RequestParam("id") String id) { MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(id); if (!ProductionWorkOrderStatus.PUBLISHED.name().equals(workOrder.getWorkOrderStatus())) { if (!ProductionWorkOrderStatus.PUBLISHED.name().equals(workOrder.getWorkOrderStatus()) && !CommonConstant.DEFAULT_1.equals(workOrder.getCompletenessCheckFlag()) && !CommonConstant.DEFAULT_1.equals(workOrder.getEquipmentInspectionFlag()) && !CommonConstant.DEFAULT_1.equals(workOrder.getProcessInspectionFlag())) { return Result.error("å½åå·¥åç¶æä¸è½æ§è¡ï¼"); } //todo é½å¥æ§æ£æ¥ãå·¥èºç¹æ£ã设å¤ç¹æ£ çæ ¡éªé»è¾ MesProductionWorkOrder executeOrder = new MesProductionWorkOrder() .setId(id) .setWorkOrderStatus(ProductionWorkOrderStatus.EXECUTING.name()); src/main/java/org/jeecg/modules/mes/entity/MesMaterialLoading.java
@@ -12,6 +12,7 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; /** @@ -85,11 +86,11 @@ /**æ°é*/ @Excel(name = "æ°é", width = 15) @ApiModelProperty(value = "æ°é") private Double quantity; private BigDecimal quantity; /**å©ä½æ°é*/ @Excel(name = "å©ä½æ°é", width = 15) @ApiModelProperty(value = "å©ä½æ°é") private Double remainingQuantity; private BigDecimal remainingQuantity; @TableField(exist = false) @ApiModelProperty(value = "å·¥åå·") private String workOrderCode; src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java
@@ -116,6 +116,10 @@ @Excel(name = "å®é æ¥å·¥æ°é", width = 15) @ApiModelProperty(value = "å®é æ¥å·¥æ°é") private BigDecimal actualQuantity; /**å·²çäº§ææ°ï¼å½åçæ¬¡å·²çäº§çææ°éï¼æ¯æ¬¡æ¥å·¥æ¶æ´æ°ï¼*/ @Excel(name = "å·²çäº§ææ°", width = 15) @ApiModelProperty(value = "å·²çäº§ææ°") private Integer finishedPallets = 0; /**åå¸äºº*/ @Excel(name = "åå¸äºº", width = 15) @ApiModelProperty(value = "åå¸äºº") src/main/java/org/jeecg/modules/mes/entity/MesWorkReporting.java
@@ -12,6 +12,7 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; /** @@ -79,7 +80,7 @@ /**æ°é*/ @Excel(name = "æ°é", width = 15) @ApiModelProperty(value = "æ°é") private Double quantity; private BigDecimal quantity; /**æ¥å·¥äºº*/ @Excel(name = "æ¥å·¥äºº", width = 15) @ApiModelProperty(value = "æ¥å·¥äºº") src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java
@@ -77,6 +77,9 @@ .eq(ShiftGroup::getFactoryId, request.getFactoryId()) .eq(ShiftGroup::getDelFlag, CommonConstant.DEL_FLAG_0)) .stream().collect(Collectors.toMap(ShiftGroup::getShiftId, v1 -> v1, (v1, v2) -> v1)); if (shiftGroupMap.isEmpty()) { throw new JeecgBootException("è¯¥äº§çº¿ä¸æªè®¾ç½®çç»ï¼æ æ³æäº§ï¼"); } Factory factory = factoryService.getById(request.getFactoryId()); Map<String, Shift> shiftNameMap = new HashMap<>(); List<Shift> shifts = shiftService.list(new LambdaQueryWrapper<Shift>() src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java
@@ -1,35 +1,54 @@ package org.jeecg.modules.mes.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.modules.base.entity.Factory; import org.jeecg.modules.base.entity.LineSideWarehouse; import org.jeecg.modules.base.entity.Shift; import org.jeecg.modules.base.entity.ShiftGroup; import org.jeecg.modules.base.service.IFactoryService; import org.jeecg.modules.base.service.ILineSideWarehouseService; import org.jeecg.modules.base.service.IShiftGroupService; import org.jeecg.modules.base.service.IShiftService; import org.jeecg.modules.lsw.entity.LswMaterial; import org.jeecg.modules.lsw.entity.LswMaterialInbound; import org.jeecg.modules.lsw.enums.MaterialCategory; import org.jeecg.modules.lsw.enums.MaterialCategoryEnum; import org.jeecg.modules.lsw.service.ILswMaterialInboundService; import org.jeecg.modules.lsw.service.ILswMaterialService; import org.jeecg.modules.mes.entity.MesMaterialLoading; import org.jeecg.modules.mes.entity.MesProductionOrder; import org.jeecg.modules.mes.entity.MesProductionWorkOrder; import org.jeecg.modules.mes.entity.MesWorkReporting; import org.jeecg.modules.mes.mapper.MesWorkReportingMapper; import org.jeecg.modules.mes.service.IMesMaterialLoadingService; import org.jeecg.modules.mes.service.IMesProductionOrderService; import org.jeecg.modules.mes.service.IMesProductionWorkOrderService; import org.jeecg.modules.mes.service.IMesWorkReportingService; import org.jeecg.modules.mes.utils.CommonUtils; import org.jeecg.modules.pms.entity.PmsMaterialProcess; import org.jeecg.modules.pms.service.IPmsMaterialProcessService; import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsService; import org.jeecg.modules.pms.vo.ProcessBillMaterialsDetailVo; import org.jeecg.modules.sap.request.OrderLoadRequest; import org.jeecg.modules.sap.request.OrderReportRequest; import org.jeecg.modules.sap.service.OrderLoadService; import org.jeecg.modules.sap.service.OrderReportService; import org.jeecg.modules.system.service.ISysBusinessCodeRuleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Optional; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoField; import java.util.*; import java.util.stream.Collectors; /** * @Description: 工忥工 @@ -37,11 +56,14 @@ * @Date: 2025-07-04 * @Version: V1.0 */ @Slf4j @Service public class MesWorkReportingServiceImpl extends ServiceImpl<MesWorkReportingMapper, MesWorkReporting> implements IMesWorkReportingService { @Autowired private IMesProductionWorkOrderService mesProductionWorkOrderService; @Autowired private IMesProductionOrderService mesProductionOrderService; @Autowired private ILswMaterialService lswMaterialService; @Autowired @@ -49,11 +71,23 @@ @Autowired private IShiftService shiftService; @Autowired private IShiftGroupService shiftGroupService; @Autowired private ILineSideWarehouseService lineSideWarehouseService; @Autowired private ILswMaterialInboundService lswMaterialInboundService; @Autowired private IMesMaterialLoadingService mesMaterialLoadingService; @Autowired private IPmsProcessBillMaterialsService pmsProcessBillMaterialsService; @Autowired private IPmsMaterialProcessService pmsMaterialProcessService; @Autowired private ISysBusinessCodeRuleService sysBusinessCodeRuleService; @Autowired private OrderReportService orderReportService; @Autowired private OrderLoadService orderLoadService; @Override public List<MesWorkReporting> queryWorkReportingByWorkOrderId(String workOrderId) { @@ -66,6 +100,7 @@ } @Override @Transactional(rollbackFor = Exception.class) public void addReporting(MesWorkReporting mesWorkReporting) { MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(mesWorkReporting.getWorkOrderId()); if (workOrder == null) { @@ -78,13 +113,11 @@ if (material == null) { throw new JeecgBootException("ç©æä¸åå¨ï¼"); } MaterialCategory materialCategory = MaterialCategory.fromName(material.getMaterialCategory()); MaterialCategoryEnum materialCategory = MaterialCategoryEnum.fromName(material.getMaterialCategory()); if (materialCategory == null) { throw new JeecgBootException("æªç¥çç©æç±»åï¼"); } //çäº§æ¹æ¬¡å· String batchNumber = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingBatchNumber"); mesWorkReporting.setBatchNumber(batchNumber); LineSideWarehouse lineSideWarehouse = lineSideWarehouseService.list(new LambdaQueryWrapper<LineSideWarehouse>() .eq(LineSideWarehouse::getFactoryId, mesWorkReporting.getFactoryId()) .eq(LineSideWarehouse::getDelFlag, CommonConstant.DEL_FLAG_0)) @@ -92,44 +125,137 @@ if (lineSideWarehouse == null) { throw new JeecgBootException("线边ä»åºä¸åå¨ï¼"); } mesWorkReporting.setWarehouseId(lineSideWarehouse.getId()); mesWorkReporting.setReporter(Objects.requireNonNull(CommonUtils.getCurrentUser()).getUsername()); mesWorkReporting.setReportTime(new Date()); String date = DateUtil.format(new Date(), "yyMMdd"); //çäº§æ¹æ¬¡å· LocalDate today = LocalDate.now(); String yearLastTwo = today.format(DateTimeFormatter.ofPattern("yy")); String dayOfYearStr = today.format(DateTimeFormatter.ofPattern("DDD")); ShiftGroup shiftGroup = shiftGroupService.getById(workOrder.getGroupId()); int currentPallets = workOrder.getFinishedPallets() + 1; String batchNumber = yearLastTwo + dayOfYearStr + shiftGroup.getGroupCode() + currentPallets; mesWorkReporting.setBatchNumber(batchNumber) .setWarehouseId(lineSideWarehouse.getId()) .setReporter(Objects.requireNonNull(CommonUtils.getCurrentUser()).getUsername()) .setReportTime(new Date()); String date = today.format(DateTimeFormatter.ofPattern("yyMMdd")); Factory factory = factoryService.getById(mesWorkReporting.getFactoryId()); workOrder.setFactoryCode(factory.getFactoryCode()); switch (materialCategory) { case FINISHED: //æåæ¥å·¥é»è¾ case FINISHED_PRODUCT: //æåæ¥å·¥ productReport(mesWorkReporting, workOrder, lineSideWarehouse); //æ¼æ¥æåæ¥å·¥æå· String palletNumber4 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber4"); String finishedPalletNumber = material.getMaterialNumber() + date + palletNumber4; mesWorkReporting.setPalletNumber(finishedPalletNumber); //todo æ£åå æ³å °ï¼å¯¹åºæºå å æ³å °çº¿è¾¹åºï¼ã夿³å °ï¼å¯¹åºæºå 夿³å °çº¿è¾¹åºï¼ãå°å åï¼å¯¹åºè£ é 线边åºï¼åºåï¼è°ç¨SAPæææ¥å£ //todo è°ç¨SAPå·¥åºæ¥å·¥ //todo æå°æåææ ç¾ãæ£éªæ è¯å¡ãç§»åºåãå®å·¥æ£éªå·¥åï¼å¤æçäº§è®¢åæ¯å¦éè¦å ³éï¼åæ ¼æ°é = è®¢åæ°éï¼ //todo æå°æåææ ç¾ãæ£éªæ è¯å¡ãç§»åºåãå®å·¥æ£éªå·¥å break; case HALF: case RAW: //åæåæ¥å·¥é»è¾ Factory factory = factoryService.getById(mesWorkReporting.getFactoryId()); case INNER_FLANGE: case OUTER_FLANGE: //åæå(å æ³å °ã夿³å °)æ¥å·¥ productReport(mesWorkReporting, workOrder, lineSideWarehouse); //æ¼æ¥åæåæ¥å·¥æå· Shift shift = shiftService.getById(workOrder.getShiftId()); String palletNumber6 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber6"); //æ¼æ¥åæåæ¥å·¥æå· String halfPalletNumber = factory.getFactoryCode() + material.getMaterialNumber() + date + shift.getShiftCode() + palletNumber6; mesWorkReporting.setPalletNumber(halfPalletNumber); //todo æ£å对åºçº¿è¾¹åºï¼å¤æ³å °æ¯å¯ãå æ³å °æ¯å¯ï¼åºååï¼è°ç¨SAPæææ¥å£ //todo è°ç¨SAPå·¥åºæ¥å·¥ break; case PARTS: break; } //æ°å¢æ¥å·¥è®°å½ save(mesWorkReporting); //线边åºå ¥åºé»è¾ LswMaterialInbound lswMaterialInbound = new LswMaterialInbound() .setFactoryId(mesWorkReporting.getFactoryId()) .setMaterialNumber(material.getMaterialNumber()) .setMaterialName(material.getMaterialName()) .setBatchNumber(batchNumber) .setQuantity(mesWorkReporting.getQuantity()) .setWarehouseId(lineSideWarehouse.getId()); lswMaterialInboundService.save(lswMaterialInbound); //æ´æ°æäº§å·¥å MesProductionWorkOrder productionWorkUpdateOrder = new MesProductionWorkOrder() .setId(workOrder.getId()) .setActualQuantity(workOrder.getActualQuantity().add(mesWorkReporting.getQuantity())) .setFinishedPallets(workOrder.getFinishedPallets() + 1); mesProductionWorkOrderService.updateById(productionWorkUpdateOrder); } //åæå(å æ³å °ã夿³å °)ãæåæ¥å·¥ private void productReport(MesWorkReporting mesWorkReporting, MesProductionWorkOrder workOrder, LineSideWarehouse lineSideWarehouse) { //1ãå ¥åº åæå/æå å°å¯¹åºçº¿è¾¹åº LswMaterialInbound materialInbound = new LswMaterialInbound() .setFactoryId(workOrder.getFactoryId()) .setWarehouseId(lineSideWarehouse.getId()) .setMaterialNumber(workOrder.getMaterialNumber()) .setMaterialName(workOrder.getMaterialName()) .setBatchNumber(mesWorkReporting.getBatchNumber()) .setQuantity(mesWorkReporting.getQuantity()); lswMaterialInboundService.save(materialInbound); //2ãæ£åä½¿ç¨æ¯å¯åºåï¼æ´æ°ä¸æè®°å½ï¼æåæåç©æåºåï¼å æ³å °ã夿³å °ãå°å åãé ä»¶çï¼ï¼æç § æäº§å·¥åidãç©æç¼ç æ¥è¯¢ä¸æè®°å½ï¼æç §æ¶é´ä»æ©å°ææåºï¼ä¼å æ£åæ©çä¸æè®°å½ï¼å è¿å åºï¼ //å æ¥è¯¢ç©æ BOM Map<String, ProcessBillMaterialsDetailVo> processBillMaterialsDetailMap = pmsProcessBillMaterialsService .queryMaterialsDetailByOrderIdAndMaterialNumber(mesWorkReporting.getOrderId(), workOrder.getMaterialNumber()).stream() .collect(Collectors.toMap(ProcessBillMaterialsDetailVo::getMaterialNumber, v1 -> v1, (v1, v2) -> v1)); //æ¥è¯¢ä¸æè®°å½ Map<String, List<MesMaterialLoading>> materialLoadingRecordMap = mesMaterialLoadingService.list(new LambdaQueryWrapper<MesMaterialLoading>() .eq(MesMaterialLoading::getWorkOrderId, workOrder.getId()) .in(MesMaterialLoading::getMaterialNumber, processBillMaterialsDetailMap.keySet()) .gt(MesMaterialLoading::getRemainingQuantity, BigDecimal.ZERO)).stream() .sorted(Comparator.comparing(MesMaterialLoading::getCreateTime)) .collect(Collectors.groupingBy(MesMaterialLoading::getMaterialNumber)); List<MesMaterialLoading> materialLoadingRecordUpdateList = CollectionUtil.newArrayList(); for (String materialNumber : processBillMaterialsDetailMap.keySet()) { List<MesMaterialLoading> materialLoadingRecordList = materialLoadingRecordMap.get(materialNumber); if (materialLoadingRecordList.isEmpty()) { throw new JeecgBootException("æªæ¥è¯¢å°ç¸åºç©æçä¸æè®°å½ï¼"); } //计ç®ç©ææ£åæ°é ProcessBillMaterialsDetailVo processBillMaterialsDetailVo = processBillMaterialsDetailMap.get(materialNumber); BigDecimal quantity = processBillMaterialsDetailVo.getPerQuantity().multiply(mesWorkReporting.getQuantity()); List<MesMaterialLoading> updateList = deductQuantity(materialLoadingRecordList, quantity); materialLoadingRecordUpdateList.addAll(updateList); } //æ´æ°ä¸æè®°å½ mesMaterialLoadingService.updateBatchById(materialLoadingRecordUpdateList); MesProductionOrder productionOrder = mesProductionOrderService.getById(mesWorkReporting.getOrderId()); //3ãè°ç¨SAPæææ¥å£ï¼æ¶èçç©æï¼ OrderLoadService for (String materialNumber : processBillMaterialsDetailMap.keySet()) { ProcessBillMaterialsDetailVo processBillMaterialsDetailVo = processBillMaterialsDetailMap.get(materialNumber); OrderLoadRequest loadRequest = new OrderLoadRequest() .setOrderCode(productionOrder.getOrderCode()) .setFactoryCode(workOrder.getFactoryCode()) .setMaterialNumber(materialNumber) .setWarehouseCode(lineSideWarehouse.getWarehouseCode()) .setQuantity(processBillMaterialsDetailVo.getPerQuantity().multiply(mesWorkReporting.getQuantity())) .setBatchNumber(mesWorkReporting.getBatchNumber()) .setProductionUnit(processBillMaterialsDetailVo.getProductionUnit()); try { orderLoadService.productionOrderLoad(loadRequest); } catch (Exception e) { log.error("SAPçäº§è®¢åææå¼å¸¸ï¼", e); } } //4ãè°ç¨SAPå·¥åºæ¥å·¥ï¼æ ¹æ®ç产订åidæ¥è¯¢å¯¹åºçç©æå·¥åºï¼åæåæ¯å¤ä¸ªå·¥åºï¼æååªæä¸ä¸ªå·¥åºï¼ï¼æç §å·¥åºå·ä»å°å°å¤§ä¾æ¬¡æ¨ä¸ªæ¥å·¥ï¼ç®åèè弿¥æ§è¡ï¼ OrderReportService List<PmsMaterialProcess> processList = pmsMaterialProcessService.list(new LambdaQueryWrapper<PmsMaterialProcess>() .eq(PmsMaterialProcess::getOrderId, mesWorkReporting.getOrderId()) .orderByAsc(PmsMaterialProcess::getProcessCode)); for (PmsMaterialProcess process : processList) { OrderReportRequest reportRequest = new OrderReportRequest() .setOrderCode(productionOrder.getOrderCode()) .setFactoryCode(workOrder.getFactoryCode()) .setProcessCode(process.getProcessCode()) .setQualifiedQuantity(mesWorkReporting.getQuantity()) .setWarehouseCode(lineSideWarehouse.getWarehouseCode()) .setBatchNumber(mesWorkReporting.getBatchNumber()); try { orderReportService.productionOrderReport(reportRequest); } catch (Exception e) { log.error("SAPå·¥åºæ¥å·¥å¼å¸¸ï¼", e); } } } private List<MesMaterialLoading> deductQuantity(List<MesMaterialLoading> materialLoadingRecordList, BigDecimal quantity) { for (MesMaterialLoading mesMaterialLoading : materialLoadingRecordList) { if (mesMaterialLoading.getRemainingQuantity().compareTo(quantity) >= 0) { mesMaterialLoading.setRemainingQuantity(mesMaterialLoading.getRemainingQuantity().subtract(quantity)); break; } else { quantity = quantity.subtract(mesMaterialLoading.getRemainingQuantity()); mesMaterialLoading.setRemainingQuantity(BigDecimal.ZERO); } } return materialLoadingRecordList; } } src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.jeecg.modules.mes.entity.MesProductionOrder; import org.jeecg.modules.pms.entity.PmsProcessBillMaterials; import org.jeecg.modules.pms.vo.ProcessBillMaterialsDetailVo; import org.jeecg.modules.sap.dto.OrderBomDTO; import java.util.List; @@ -39,4 +40,6 @@ * @return */ IPage<PmsProcessBillMaterials> queryPageList(Page<PmsProcessBillMaterials> page, PmsProcessBillMaterials query); List<ProcessBillMaterialsDetailVo> queryMaterialsDetailByOrderIdAndMaterialNumber(String orderId, String materialNumber); } src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java
@@ -7,16 +7,21 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.modules.mes.entity.MesProductionOrder; import org.jeecg.modules.pms.entity.PmsProcessBillMaterials; import org.jeecg.modules.pms.entity.PmsProcessBillMaterialsDetail; import org.jeecg.modules.pms.mapper.PmsProcessBillMaterialsMapper; import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsDetailService; import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsService; import org.jeecg.modules.pms.vo.ProcessBillMaterialsDetailVo; import org.jeecg.modules.sap.dto.OrderBomDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.RoundingMode; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -98,4 +103,29 @@ } return this.getBaseMapper().queryPageList(page, queryWrapper); } @Override public List<ProcessBillMaterialsDetailVo> queryMaterialsDetailByOrderIdAndMaterialNumber(String orderId, String materialNumber) { //æ ¹æ®ç产订åidåç©æç¼ç æ¥è¯¢è®¢åBOM PmsProcessBillMaterials processBillMaterials = list(new LambdaQueryWrapper<PmsProcessBillMaterials>() .eq(PmsProcessBillMaterials::getOrderId, orderId) .eq(PmsProcessBillMaterials::getMaterialNumber, materialNumber)) .stream().findFirst().orElse(null); if (processBillMaterials == null) { throw new JeecgBootException("æªæ¾å°ä¸è¯¥ç©æå ³èç订åBOMï¼"); } //æ¥è¯¢è®¢åBOMæç» List<PmsProcessBillMaterialsDetail> processBillMaterialsDetails = processBillMaterialsDetailService.queryByMaterialId(processBillMaterials.getId()); List<ProcessBillMaterialsDetailVo> billMaterialsDetailList = CollectionUtil.newArrayList(); for (PmsProcessBillMaterialsDetail processBillMaterialsDetail : processBillMaterialsDetails) { ProcessBillMaterialsDetailVo processBillMaterialsDetailVo = new ProcessBillMaterialsDetailVo() .setMaterialNumber(processBillMaterialsDetail.getMaterialNumber()) .setMaterialName(processBillMaterialsDetail.getMaterialName()) .setProductionUnit(processBillMaterialsDetail.getProductionUnit()) .setPerQuantity(processBillMaterialsDetail.getUsageQuantity() .divide(processBillMaterials.getProductionQuantity(), 2, RoundingMode.HALF_UP)); billMaterialsDetailList.add(processBillMaterialsDetailVo); } return billMaterialsDetailList; } } src/main/java/org/jeecg/modules/pms/vo/ProcessBillMaterialsDetailVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,33 @@ package org.jeecg.modules.pms.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.math.BigDecimal; /** * @Description: ç©ææ¸ å * @Author: jeecg-boot * @Date: 2025-07-01 * @Version: V1.0 */ @Data @Accessors(chain = true) public class ProcessBillMaterialsDetailVo implements Serializable { private static final long serialVersionUID = 1L; /**ç©æç¼ç */ @ApiModelProperty(value = "ç©æç¼ç ") private String materialNumber; /**ç©æåç§°*/ @ApiModelProperty(value = "ç©æåç§°") private String materialName; /**åºæ¬åä½*/ @ApiModelProperty(value = "åºæ¬åä½") private String productionUnit; /**éæ±ç¨é*/ @ApiModelProperty(value = "åä½ç¨éï¼å å·¥1ä»¶çç¨éï¼") private BigDecimal perQuantity; } src/main/java/org/jeecg/modules/sap/request/OrderLoadRequest.java
@@ -1,6 +1,7 @@ package org.jeecg.modules.sap.request; import lombok.Data; import lombok.experimental.Accessors; import java.math.BigDecimal; @@ -8,6 +9,7 @@ * ææè¯·æ±åæ° */ @Data @Accessors(chain = true) public class OrderLoadRequest { /** MATNR ç©æå· */ private String materialNumber; src/main/java/org/jeecg/modules/sap/request/OrderReportRequest.java
@@ -1,6 +1,7 @@ package org.jeecg.modules.sap.request; import lombok.Data; import lombok.experimental.Accessors; import java.math.BigDecimal; @@ -9,6 +10,7 @@ * 请æ±ç±» */ @Data @Accessors(chain = true) public class OrderReportRequest { /** I_WERKS å·¥å */ private String factoryCode;