From eec479e2f3139286449005dcb05c014e4a60d255 Mon Sep 17 00:00:00 2001 From: cuilei <ray_tsu1@163.com> Date: 星期一, 18 八月 2025 16:59:25 +0800 Subject: [PATCH] 报工接口、产线线边库物料查询接口 --- src/main/java/org/jeecg/modules/lsw/enums/MaterialCategoryEnum.java | 12 + src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java | 198 +++++++++++++++++++++++----- db/双林新火炬MES数据库设计.pdma.json | 24 +++ src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java | 3 src/main/java/org/jeecg/modules/sap/request/OrderReportRequest.java | 2 src/main/java/org/jeecg/modules/pms/vo/ProcessBillMaterialsDetailVo.java | 33 ++++ src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java | 15 ++ src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java | 47 ++++++ src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java | 30 ++++ src/main/java/org/jeecg/modules/mes/entity/MesMaterialLoading.java | 5 src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInbound.java | 3 src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java | 4 src/main/java/org/jeecg/modules/sap/request/OrderLoadRequest.java | 2 src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java | 6 src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java | 3 src/main/java/org/jeecg/modules/mes/entity/MesWorkReporting.java | 3 16 files changed, 342 insertions(+), 48 deletions(-) diff --git "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" index 18fd831..1431e02 100644 --- "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" +++ "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" @@ -2,9 +2,9 @@ "name": "鍙屾灄鏂扮伀鐐琈ES鏁版嵁搴撹璁�", "describe": "鎻忚堪鍙岃柂鏂扮伀鐐琈ES鏁版嵁搴撹璁¤鎯�", "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": "", diff --git a/src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java b/src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java index 6ec4ff1..e6b7a92 100644 --- a/src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java +++ b/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; + } } diff --git a/src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java b/src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java index 25b8af6..222c87a 100644 --- a/src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java +++ b/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 * diff --git a/src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInbound.java b/src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInbound.java index 92f6e24..8827025 100644 --- a/src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInbound.java +++ b/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 = "鎺ユ敹浜�") diff --git a/src/main/java/org/jeecg/modules/lsw/enums/MaterialCategoryEnum.java b/src/main/java/org/jeecg/modules/lsw/enums/MaterialCategoryEnum.java index 4d49942..6037d5d 100644 --- a/src/main/java/org/jeecg/modules/lsw/enums/MaterialCategoryEnum.java +++ b/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; + } } diff --git a/src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java b/src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java index c021299..2057d3b 100644 --- a/src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java +++ b/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()); diff --git a/src/main/java/org/jeecg/modules/mes/entity/MesMaterialLoading.java b/src/main/java/org/jeecg/modules/mes/entity/MesMaterialLoading.java index 94e5eeb..32bd01b 100644 --- a/src/main/java/org/jeecg/modules/mes/entity/MesMaterialLoading.java +++ b/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; diff --git a/src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java b/src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java index 252384d..a153d3a 100644 --- a/src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java +++ b/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 = "鍙戝竷浜�") diff --git a/src/main/java/org/jeecg/modules/mes/entity/MesWorkReporting.java b/src/main/java/org/jeecg/modules/mes/entity/MesWorkReporting.java index d95a708..d281e7e 100644 --- a/src/main/java/org/jeecg/modules/mes/entity/MesWorkReporting.java +++ b/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 = "鎶ュ伐浜�") diff --git a/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java b/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java index 2b407ff..0a788fb 100644 --- a/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java +++ b/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>() diff --git a/src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java b/src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java index 3dde504..271c5aa 100644 --- a/src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java +++ b/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 鎵e噺鍐呮硶鍏帮紙瀵瑰簲鏈哄姞鍐呮硶鍏扮嚎杈瑰簱锛夈�佸娉曞叞锛堝搴旀満鍔犲娉曞叞绾胯竟搴擄級銆佸皬鍐呭湀锛堝搴旇閰嶇嚎杈瑰簱锛夊簱瀛橈紝璋冪敤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 鎵e噺瀵瑰簲绾胯竟搴擄紙澶栨硶鍏版瘺鍧�佸唴娉曞叞姣涘澂锛夊簱瀛樺悗锛岃皟鐢⊿AP鎶曟枡鎺ュ彛 - //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銆佺墿鏂欑紪鐮� 鏌ヨ涓婃枡璁板綍锛屾寜鐓ф椂闂翠粠鏃╁埌鏅氭帓搴忥紝浼樺厛鎵e噺鏃╃殑涓婃枡璁板綍锛堝厛杩涘厛鍑猴級 + //鍏堟煡璇㈢墿鏂� 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("鏈煡璇㈠埌鐩稿簲鐗╂枡鐨勪笂鏂欒褰曪紒"); + } + //璁$畻鐗╂枡鎵e噺鏁伴噺 + 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銆佽皟鐢⊿AP鎶曟枡鎺ュ彛锛堟秷鑰楃殑鐗╂枡锛� 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銆佽皟鐢⊿AP宸ュ簭鎶ュ伐锛堟牴鎹敓浜ц鍗昳d鏌ヨ瀵瑰簲鐨勭墿鏂欏伐搴忥紙鍗婃垚鍝佹槸澶氫釜宸ュ簭锛屾垚鍝佸彧鏈変竴涓伐搴忥級锛屾寜鐓у伐搴忓彿浠庡皬鍒板ぇ渚濇鎸ㄤ釜鎶ュ伐锛涚洰鍓嶈�冭檻寮傛鎵ц锛� 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; } } diff --git a/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java b/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java index 8f4cfb3..6c63fa7 100644 --- a/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java +++ b/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); } diff --git a/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java b/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java index ec90412..dc6a157 100644 --- a/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java +++ b/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鍜岀墿鏂欑紪鐮佹煡璇㈣鍗旴OM + 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; + } } diff --git a/src/main/java/org/jeecg/modules/pms/vo/ProcessBillMaterialsDetailVo.java b/src/main/java/org/jeecg/modules/pms/vo/ProcessBillMaterialsDetailVo.java new file mode 100644 index 0000000..58a60db --- /dev/null +++ b/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; + +} diff --git a/src/main/java/org/jeecg/modules/sap/request/OrderLoadRequest.java b/src/main/java/org/jeecg/modules/sap/request/OrderLoadRequest.java index af72a18..b85318d 100644 --- a/src/main/java/org/jeecg/modules/sap/request/OrderLoadRequest.java +++ b/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; diff --git a/src/main/java/org/jeecg/modules/sap/request/OrderReportRequest.java b/src/main/java/org/jeecg/modules/sap/request/OrderReportRequest.java index 54281b5..1545d4f 100644 --- a/src/main/java/org/jeecg/modules/sap/request/OrderReportRequest.java +++ b/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; -- Gitblit v1.9.3