yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/request/ErpPurchaseRequestSaveReqVO.java
@@ -31,7 +31,8 @@ @Schema(description = "伿 çï¼ç¾åæ¯", example = "10") private BigDecimal discountPercent; @Schema(description = "å®ééé¢", example = "1000.00") @Schema(description = "å®ééé¢", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000.00") @NotNull(message = "å®ééé¢ä¸è½ä¸ºç©º") private BigDecimal depositPrice; @Schema(description = "夿³¨", example = "夿³¨") @@ -90,4 +91,4 @@ } } } yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java
@@ -97,7 +97,8 @@ @PutMapping("/update-status") @Operation(summary = "æ´æ°éå®è®¢åçç¶æ") @PreAuthorize("@ss.hasPermission('erp:sale-order:update-status')") @PreAuthorize("@ss.hasPermission('erp:sale-order:update-status') " + "&& (#status != 10 || @ss.hasRole('super_admin'))") public CommonResult<Boolean> updateSaleOrderStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) { saleOrderService.updateSaleOrderStatus(id, status); yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
@@ -131,6 +131,10 @@ .setStatus(ErpPurchaseRequestStatusEnum.DRAFT.getStatus()) .setRequestUserId(userId) .setRequestDeptId(deptId)); // å ¼å®¹æ§å®¢æ·ç«¯æªä¼ å®éçæ åµï¼æ°æ®åºä¸ä¸å¡å±ç»ä¸æ 0 å¤ç if (purchaseRequest.getDepositPrice() == null) { purchaseRequest.setDepositPrice(BigDecimal.ZERO); } calculateTotalPrice(purchaseRequest, requestItems); purchaseRequestMapper.insert(purchaseRequest); @@ -159,6 +163,9 @@ // 4. æ´æ°ç³è¯·å ErpPurchaseRequestDO updateObj = BeanUtils.toBean(updateReqVO, ErpPurchaseRequestDO.class); if (updateObj.getDepositPrice() == null) { updateObj.setDepositPrice(BigDecimal.ZERO); } calculateTotalPrice(updateObj, requestItems); purchaseRequestMapper.updateById(updateObj); @@ -605,4 +612,4 @@ .setItems(items); } } } yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/listener/ProductionFinishedListener.java
@@ -3,6 +3,8 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO; import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderMapper; import cn.iocoder.yudao.module.mes.api.event.ProductionFinishedEvent; import cn.iocoder.yudao.module.mes.api.event.ProductionCanceledEvent; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.context.event.EventListener; @@ -37,4 +39,16 @@ log.info("[onProductionFinished] éå®è®¢å {} çäº§ç¶æå·²æ´æ°ä¸ºå®æ", event.getSaleOrderId()); } } @EventListener @Async public void onProductionCanceled(ProductionCanceledEvent event) { log.info("[onProductionCanceled] æ¶å°çäº§åæ¶äºä»¶ï¼éå®è®¢åID: {}", event.getSaleOrderId()); // ä½¿ç¨æ¾å¼ update wrapper æè½æå·²åå¨ç宿æ¶é´çæ£æ´æ°ä¸º NULL saleOrderMapper.update(null, new LambdaUpdateWrapper<ErpSaleOrderDO>() .eq(ErpSaleOrderDO::getId, event.getSaleOrderId()) .set(ErpSaleOrderDO::getProductionStatus, 0) .set(ErpSaleOrderDO::getProductionFinishTime, null)); log.info("[onProductionCanceled] éå®è®¢å {} çäº§ç¶æå·²æ¢å¤ä¸ºæªå®æ", event.getSaleOrderId()); } } yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/vo/HrmAttendanceRuleSaveReqVO.java
@@ -5,6 +5,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.AssertTrue; import java.math.BigDecimal; import java.time.LocalTime; @@ -54,6 +55,17 @@ @Schema(description = "åæ ç³»ï¼ä» æ¯æ WGS84") private String coordinateSystem; @AssertTrue(message = "å¯ç¨å®ä½æå¡æ¶ï¼å°ç¹åç§°ãç»çº¬åº¦å10~5000ç±³æå¡åå¾å¿ 须宿´é ç½®") public boolean isLocationConfigValid() { if (!Boolean.TRUE.equals(locationRequired)) { return true; } return locationName != null && !locationName.isBlank() && longitude != null && latitude != null && radiusMeters != null && radiusMeters >= 10 && radiusMeters <= 5000 && "WGS84".equalsIgnoreCase(coordinateSystem); } @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") private Integer status; yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceRecordServiceImpl.java
@@ -447,7 +447,7 @@ boolean required = Boolean.TRUE.equals(rule.getLocationRequired()); if (required && (StrUtil.isBlank(rule.getLocationName()) || rule.getLongitude() == null || rule.getLatitude() == null || rule.getRadiusMeters() == null || rule.getRadiusMeters() < 50 || rule.getRadiusMeters() > 5000 || rule.getRadiusMeters() < 10 || rule.getRadiusMeters() > 5000 || !"WGS84".equalsIgnoreCase(rule.getCoordinateSystem()))) { throw exception(ATTENDANCE_LOCATION_RULE_INVALID); } yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceRuleServiceImpl.java
@@ -134,7 +134,7 @@ || reqVO.getLatitude().compareTo(BigDecimal.valueOf(90)) > 0)) { throw exception(ATTENDANCE_LOCATION_COORDINATE_INVALID); } if (reqVO.getRadiusMeters() < 50 || reqVO.getRadiusMeters() > 5000) { if (reqVO.getRadiusMeters() < 10 || reqVO.getRadiusMeters() > 5000) { throw exception(ATTENDANCE_LOCATION_RULE_INVALID); } if (Boolean.TRUE.equals(reqVO.getLocationRequired()) yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/api/category/MdmItemCategoryApi.java
@@ -24,6 +24,14 @@ CommonResult<MdmItemCategoryRespDTO> getItemCategory(Long id); /** * æ ¹æ®ç¼ç è·åç©æåç±» * * @param code åç±»ç¼ç * @return ç©æåç±» */ CommonResult<MdmItemCategoryRespDTO> getItemCategoryByCode(String code); /** * è·åç©æåç±»å表 * * @param ids åç±»ç¼å·å表 @@ -47,4 +55,4 @@ */ CommonResult<MdmItemCategoryRespDTO> getItemCategoryByItemOrProduct(String itemOrProduct); } } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/api/category/MdmItemCategoryApiImpl.java
@@ -35,6 +35,12 @@ } @Override public CommonResult<MdmItemCategoryRespDTO> getItemCategoryByCode(String code) { MdmItemCategoryDO itemCategory = itemCategoryService.getItemCategoryByCode(code); return success(BeanUtils.toBean(itemCategory, MdmItemCategoryRespDTO.class)); } @Override public CommonResult<List<MdmItemCategoryRespDTO>> getItemCategoryList(Collection<Long> ids) { List<MdmItemCategoryDO> list = itemCategoryService.getItemCategoryList(ids); return success(BeanUtils.toBean(list, MdmItemCategoryRespDTO.class)); @@ -52,4 +58,4 @@ return success(BeanUtils.toBean(itemCategory, MdmItemCategoryRespDTO.class)); } } } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/category/MdmItemCategoryService.java
@@ -58,6 +58,14 @@ MdmItemCategoryDO getItemCategory(Long id); /** * æ ¹æ®ç¼ç è·å¾ç©æåç±» * * @param code åç±»ç¼ç * @return ç©æåç±» */ MdmItemCategoryDO getItemCategoryByCode(String code); /** * æ ¡éªç©æåç±»åå¨ * * @param id ç¼å· yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/category/MdmItemCategoryServiceImpl.java
@@ -115,6 +115,11 @@ } @Override public MdmItemCategoryDO getItemCategoryByCode(String code) { return itemCategoryMapper.selectByCode(code); } @Override public PageResult<MdmItemCategoryDO> getItemCategoryPage(MdmItemCategoryPageReqVO pageReqVO) { return itemCategoryMapper.selectPage(pageReqVO); } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java
@@ -5,10 +5,8 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportExcelVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportReqVO; import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportRespVO; @@ -28,12 +26,9 @@ import cn.iocoder.yudao.module.mdm.service.category.MdmItemCategoryService; import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; import cn.iocoder.yudao.module.mes.api.item.MesMdItemApi; import cn.iocoder.yudao.module.mes.api.item.MesMdItemTypeApi; import cn.iocoder.yudao.module.mes.api.item.dto.MesMdItemSyncReqDTO; import cn.iocoder.yudao.module.mes.api.item.dto.MesMdItemTypeRespDTO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -78,10 +73,6 @@ private MesMdItemApi mesMdItemApi; @Resource private MdmItemBatchConfigMapper itemBatchConfigMapper; @Resource private MesMdItemTypeApi mesMdItemTypeApi; @Override @Transactional(rollbackFor = Exception.class) @@ -152,8 +143,11 @@ // è§£æåç±» id -> codeï¼ä½¿ç¨ MDM æ¬å°åç±»æå¡ï¼ String itemTypeCode = null; if (reqVO.getCategoryId() != null) { CommonResult<MesMdItemTypeRespDTO> itemType = mesMdItemTypeApi.getItemType(reqVO.getCategoryId()); itemTypeCode = itemType.getData().getCode(); MdmItemCategoryDO category = itemCategoryService.getItemCategory(reqVO.getCategoryId()); if (category == null) { throw exception(MDM_ITEM_CATEGORY_NOT_EXISTS); } itemTypeCode = category.getCode(); } // ç»è£ 忥 DTO MesMdItemSyncReqDTO syncReqDTO = new MesMdItemSyncReqDTO(); @@ -545,4 +539,4 @@ } } } } yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/event/ProductionCanceledEvent.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package cn.iocoder.yudao.module.mes.api.event; import lombok.AllArgsConstructor; import lombok.Data; /** * éå®è®¢åå ³èçç产计ååæ¶äºä»¶ã */ @Data @AllArgsConstructor public class ProductionCanceledEvent { private Long saleOrderId; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/plan/vo/MesCalPlanSaveReqVO.java
@@ -14,8 +14,7 @@ @Schema(description = "计åç¼å·", example = "1024") private Long id; @Schema(description = "计åç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "PLAN001") @NotEmpty(message = "计åç¼ç ä¸è½ä¸ºç©º") @Schema(description = "计åç¼ç ï¼æ°å¢æ¶ä¸ºç©ºåç±ç³»ç»èªå¨çæï¼", example = "PLAN001") private String code; @Schema(description = "计ååç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024å¹´æç计å") yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/MesProRouteProductController.java
@@ -10,9 +10,15 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -42,6 +48,12 @@ private MesMdItemService itemService; @Resource private MesMdUnitMeasureService unitMeasureService; @Resource private MesWmWarehouseService warehouseService; @Resource private MesWmWarehouseLocationService warehouseLocationService; @Resource private MesWmWarehouseAreaService warehouseAreaService; @PostMapping("/create") @Operation(summary = "å建工èºè·¯çº¿äº§å") @@ -96,6 +108,12 @@ convertSet(list, MesProRouteProductDO::getItemId)); Map<Long, MesMdUnitMeasureDO> unitMap = unitMeasureService.getUnitMeasureMap( convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap( convertSet(list, MesProRouteProductDO::getWarehouseId)); Map<Long, MesWmWarehouseLocationDO> locationMap = warehouseLocationService.getWarehouseLocationMap( convertSet(list, MesProRouteProductDO::getLocationId)); Map<Long, MesWmWarehouseAreaDO> areaMap = warehouseAreaService.getWarehouseAreaMap( convertSet(list, MesProRouteProductDO::getAreaId)); // 2. æ¼æ¥ VO return BeanUtils.toBean(list, MesProRouteProductRespVO.class, vo -> { MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { @@ -104,6 +122,9 @@ MapUtils.findAndThen(unitMap, item.getUnitMeasureId(), unit -> vo.setUnitName(unit.getName())); }); MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName())); MapUtils.findAndThen(locationMap, vo.getLocationId(), location -> vo.setLocationName(location.getName())); MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> vo.setAreaName(area.getName())); }); } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/product/MesProRouteProductRespVO.java
@@ -19,6 +19,24 @@ @Schema(description = "产åç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long itemId; @Schema(description = "æ¥å·¥äº§åºä»åºç¼å·") private Long warehouseId; @Schema(description = "æ¥å·¥äº§åºä»åºåç§°") private String warehouseName; @Schema(description = "æ¥å·¥äº§åºåºåºç¼å·") private Long locationId; @Schema(description = "æ¥å·¥äº§åºåºåºåç§°") private String locationName; @Schema(description = "æ¥å·¥äº§åºåºä½ç¼å·") private Long areaId; @Schema(description = "æ¥å·¥äº§åºåºä½åç§°") private String areaName; @Schema(description = "产åç©æç¼ç ") private String itemCode; yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/product/MesProRouteProductSaveReqVO.java
@@ -21,6 +21,18 @@ @NotNull(message = "产åç©æç¼å·ä¸è½ä¸ºç©º") private Long itemId; @Schema(description = "æ¥å·¥äº§åºä»åºç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "æ¥å·¥äº§åºä»åºä¸è½ä¸ºç©º") private Long warehouseId; @Schema(description = "æ¥å·¥äº§åºåºåºç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "æ¥å·¥äº§åºåºåºä¸è½ä¸ºç©º") private Long locationId; @Schema(description = "æ¥å·¥äº§åºåºä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "æ¥å·¥äº§åºåºä½ä¸è½ä¸ºç©º") private Long areaId; @Schema(description = "ç产æ°é", example = "100") private Integer quantity; yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcSaveReqVO.java
@@ -97,7 +97,8 @@ // ========== æ£éª ========== @Schema(description = "æ£æµç»æ", example = "1") @Schema(description = "æ£æµç»æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "æ£æµç»æä¸è½ä¸ºç©º") private Integer checkResult; @Schema(description = "æ£æµæ¥æ") yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcSaveReqVO.java
@@ -78,7 +78,8 @@ @NotNull(message = "æ£æµæ¥æä¸è½ä¸ºç©º") private LocalDateTime inspectDate; @Schema(description = "æ£æµç»æ", example = "1") @Schema(description = "æ£æµç»æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "æ£æµç»æä¸è½ä¸ºç©º") private Integer checkResult; @Schema(description = "æ¥ææ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcSaveReqVO.java
@@ -74,7 +74,8 @@ // ========== æ£éª ========== @Schema(description = "æ£æµç»æ", example = "1") @Schema(description = "æ£æµç»æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "æ£æµç»æä¸è½ä¸ºç©º") private Integer checkResult; @Schema(description = "åºè´§æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcSaveReqVO.java
@@ -75,7 +75,8 @@ // ========== æ£éª ========== @Schema(description = "æ£æµç»æ", example = "1") @Schema(description = "æ£æµç»æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "æ£æµç»æä¸è½ä¸ºç©º") private Integer checkResult; @Schema(description = "æ£æµæ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/route/MesProRouteProductDO.java
@@ -40,6 +40,12 @@ * å ³è {@link cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO#getId()} */ private Long itemId; /** æ¥å·¥äº§åºä»åº */ private Long warehouseId; /** æ¥å·¥äº§åºåºåº */ private Long locationId; /** æ¥å·¥äº§åºåºä½ */ private Long areaId; /** * ç产æ°é */ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -289,6 +289,11 @@ ErrorCode PRO_ROUTE_PRODUCT_NOT_EXISTS = new ErrorCode(1_040_501_200, "å·¥èºè·¯çº¿äº§åä¸åå¨"); ErrorCode PRO_ROUTE_PRODUCT_ITEM_DUPLICATE = new ErrorCode(1_040_501_201, "æ¤äº§åå·²é ç½®äºå·¥èºè·¯çº¿"); ErrorCode PRO_ROUTE_PRODUCT_ITEM_TYPE_INVALID = new ErrorCode(1_040_501_202, "å·¥èºè·¯çº¿åªè½å ³è产åç±»åç©æ"); ErrorCode PRO_ROUTE_PRODUCT_WAREHOUSE_REQUIRED = new ErrorCode(1_040_501_203, "产åã{}ãæªé ç½®æ¥å·¥å ¥åºä»åºãåºåºååºä½"); ErrorCode PRO_ROUTE_PROCESS_OUTPUT_REQUIRED = new ErrorCode(1_040_501_204, "å·¥åºã{}ãæªé 置产åºäº§å"); ErrorCode PRO_ROUTE_PROCESS_OUTPUT_NOT_BOUND = new ErrorCode(1_040_501_205, "å·¥åºäº§åºäº§åã{}ãæªç»å®å°å½åå·¥èºè·¯çº¿"); ErrorCode PRO_ROUTE_MIDDLE_OUTPUT_INVALID = new ErrorCode(1_040_501_206, "ä¸é´å·¥åºã{}ãåªè½äº§åºåæåå类产å"); ErrorCode PRO_ROUTE_LAST_OUTPUT_INVALID = new ErrorCode(1_040_501_207, "æ«éå·¥åºã{}ãåªè½äº§åºæåå类产åï¼ä¸å¿ é¡»å å«å ¨é¨ç»å®æå"); // ========== MES ç产管ç-å·¥èºè·¯çº¿äº§åBOMï¼1-040-501-300ï¼ ========== ErrorCode PRO_ROUTE_PRODUCT_BOM_NOT_EXISTS = new ErrorCode(1_040_501_300, "å·¥èºè·¯çº¿äº§å BOM ä¸åå¨"); ErrorCode PRO_ROUTE_PRODUCT_BOM_DUPLICATE = new ErrorCode(1_040_501_301, "å½å BOM ç©æå¨æ¤å·¥åºå·²ç»é ç½®è¿"); yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java
@@ -28,6 +28,7 @@ WM_PACKAGE_CODE("WM_PACKAGE_CODE", "è£ ç®±åç¼ç "), WM_BATCH_CODE("WM_BATCH_CODE", "æ¹æ¬¡ç¼ç "), PRO_MPS_CODE("PRO_MPS_CODE", "ç产计åç¼ç "), CAL_PLAN_CODE("CAL_PLAN_CODE", "æç计åç¼ç "), PRO_MAINTENANCE_PLAN_CODE("PRO_MAINTENANCE_PLAN_CODE", "çµåä½ä¸è®¡åç¼ç "), PRO_TASK_CODE("PRO_TASK_CODE", "ç产任å¡ç¼ç "), QC_IQC_CODE("QC_IQC_CODE", "æ¥ææ£éªåç¼ç "), yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/plan/MesCalPlanServiceImpl.java
@@ -13,7 +13,9 @@ import cn.iocoder.yudao.module.mes.dal.mysql.cal.plan.MesCalPlanMapper; import cn.iocoder.yudao.module.mes.enums.cal.MesCalPlanStatusEnum; import cn.iocoder.yudao.module.mes.enums.cal.MesCalShiftTypeEnum; import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum; import cn.iocoder.yudao.module.mes.service.cal.team.MesCalTeamShiftService; import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -51,10 +53,17 @@ @Resource @Lazy private MesCalTeamShiftService teamShiftService; @Resource private MesMdAutoCodeRecordService autoCodeRecordService; @Override @Transactional(rollbackFor = Exception.class) public Long createPlan(MesCalPlanSaveReqVO createReqVO) { // å端é常ä¼é¢çæç¼ç ï¼æ¥å£ä¾§ä»æä¾å åºï¼é¿å ç§»å¨ç«¯ãå¯¼å ¥å¤çè°ç¨æ¹æ¼ä¼ åæµç¨ä¸æã if (StrUtil.isBlank(createReqVO.getCode())) { createReqVO.setCode(autoCodeRecordService.generateAutoCode( MesMdAutoCodeRuleCodeEnum.CAL_PLAN_CODE.getCode())); } // 1. æ ¡éªç¼ç å¯ä¸ validatePlanCodeUnique(null, createReqVO.getCode()); yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryServiceImpl.java
@@ -8,6 +8,8 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemCreateReqDTO; import cn.iocoder.yudao.module.mdm.api.category.MdmItemCategoryApi; import cn.iocoder.yudao.module.mdm.api.category.dto.MdmItemCategoryRespDTO; import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; import cn.iocoder.yudao.module.mdm.enums.MdmItemTypeEnum; @@ -104,6 +106,8 @@ // ========== 设å¤ç©æèå¨ä¾èµ ========== @Resource private MdmItemApi mdmItemApi; @Resource private MdmItemCategoryApi mdmItemCategoryApi; @Resource private MdmUnitMeasureApi mdmUnitMeasureApi; @Resource @@ -382,9 +386,15 @@ * @return MDM ç©æç¼å·ï¼= MES ç©æç¼å·ï¼ */ private Long createEquipmentMaterial(String code, String name, String specification, String remark) { // 1. è§£æâ设å¤âç±»åï¼MES ä¾§ï¼ä¸âå°âåä½ï¼MDM ä¾§ + MES ä¾§ï¼ï¼ç¼ºå¤±åæç¤ºä¸»æ°æ®æªåå§å // 1. å嫿ç¼ç è§£æ MDM åç±»ãMES ç±»åå两侧åä½ï¼ç¦æ¢ä¾èµä¸¤å¥è¡¨ä¸»é®æ°å¥½ä¸è´ã MesMdItemTypeDO itemType = mesMdItemTypeService.getItemTypeByCode(EQUIPMENT_ITEM_TYPE_CODE); if (itemType == null) { throw exception(DV_MACHINERY_EQUIP_MASTER_MISSING); } CommonResult<MdmItemCategoryRespDTO> categoryResult = mdmItemCategoryApi.getItemCategoryByCode(EQUIPMENT_ITEM_TYPE_CODE); MdmItemCategoryRespDTO mdmCategory = categoryResult.isSuccess() ? categoryResult.getData() : null; if (mdmCategory == null) { throw exception(DV_MACHINERY_EQUIP_MASTER_MISSING); } if (mesMdUnitMeasureService.getUnitMeasureByCode(EQUIPMENT_UNIT_CODE) == null) { @@ -396,13 +406,13 @@ throw exception(DV_MACHINERY_EQUIP_MASTER_MISSING); } // 2. å建 MDM ç©æï¼å类使ç¨â设å¤âåç±»ï¼å ¶ id ä¸ MES ç±»å id 对é½ï¼ç±åå§åèæ¬ä¿è¯ï¼ // 2. å建 MDM ç©æï¼åç±»å MDM èªèº«ä¸»é®ï¼å 许ä¸åç¯å¢ä¸ä¸¤å¥å类表ç主é®ä¸ä¸è´ã MdmItemCreateReqDTO createReqDTO = new MdmItemCreateReqDTO(); createReqDTO.setCode(code); createReqDTO.setName(name); createReqDTO.setSpecification(specification); createReqDTO.setRemark(remark); createReqDTO.setCategoryId(itemType.getId()); createReqDTO.setCategoryId(mdmCategory.getId()); createReqDTO.setUnitMeasureId(mdmUnit.getId()); createReqDTO.setItemType(MdmItemTypeEnum.EQUIPMENT.getType()); createReqDTO.setStatus(0); yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
@@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.pro.mps.vo.MesProMpsImportRespVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.mps.vo.MesProMpsPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.mps.vo.MesProMpsSaveReqVO; import cn.iocoder.yudao.module.mes.api.event.ProductionCanceledEvent; import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.mps.MesProMpsDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.mps.MesProMpsMergeItemDO; @@ -42,6 +43,7 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.context.ApplicationEventPublisher; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -95,6 +97,8 @@ private MesProRouteProcessService routeProcessService; @Resource private MesProWorkOrderProcessService workOrderProcessService; @Resource private ApplicationEventPublisher eventPublisher; @Override @Transactional(rollbackFor = Exception.class) @@ -308,6 +312,10 @@ mpsMapper.updateById(new MesProMpsDO() .setId(id) .setStatus(MesProMpsStatusEnum.CANCELED.getStatus())); // æ¥æºäºéå®è®¢åæ¶ï¼åæ¥æ¢å¤éå®è®¢åçäº§ç¶æï¼å è®¸éæ°å建ç产计å if (mps.getSaleOrderId() != null) { eventPublisher.publishEvent(new ProductionCanceledEvent(mps.getSaleOrderId())); } } @Override yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java
@@ -92,12 +92,11 @@ // 2. æ´æ° MesProRouteProcessDO updateObj = BeanUtils.toBean(updateReqVO, MesProRouteProcessDO.class); if (CollUtil.isNotEmpty(updateReqVO.getOutputItemIds())) { updateObj.setOutputItemId( // 空æ°ç»ä¹è¦æ¾å¼åå ¥ç©ºä¸²ï¼å¦å MyBatis-Plus é»è®¤å¿½ç¥ nullï¼ç¨æ·æ¸ 空产åºååæ§é ç½®ä»ä¼æ®çã updateObj.setOutputItemId(CollUtil.isEmpty(updateReqVO.getOutputItemIds()) ? "" : updateReqVO.getOutputItemIds().stream() .map(String::valueOf) .collect(Collectors.joining(","))); } .map(String::valueOf) .collect(Collectors.joining(","))); routeProcessMapper.updateById(updateObj); // 3. é建工åºé¾ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProductServiceImpl.java
@@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.enums.md.MesMdItemTypeEnum; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -43,6 +44,8 @@ private MesMdItemService itemService; @Resource private MesMdItemTypeService itemTypeService; @Resource private MesWmWarehouseAreaService warehouseAreaService; @Override public Long createRouteProduct(MesProRouteProductSaveReqVO createReqVO) { @@ -52,6 +55,8 @@ validateProductItem(createReqVO.getItemId()); // 1.2 æ ¡éªäº§åå¯ä¸æ§ï¼ä¸ä¸ªäº§ååªè½å ³è䏿¡å·¥èºè·¯çº¿ï¼ validateItemUnique(null, createReqVO.getItemId()); warehouseAreaService.validateWarehouseAreaExists(createReqVO.getWarehouseId(), createReqVO.getLocationId(), createReqVO.getAreaId()); // 2. æå ¥ MesProRouteProductDO routeProduct = BeanUtils.toBean(createReqVO, MesProRouteProductDO.class); @@ -69,6 +74,8 @@ validateProductItem(updateReqVO.getItemId()); // 1.3 æ ¡éªäº§åå¯ä¸æ§ validateItemUnique(updateReqVO.getId(), updateReqVO.getItemId()); warehouseAreaService.validateWarehouseAreaExists(updateReqVO.getWarehouseId(), updateReqVO.getLocationId(), updateReqVO.getAreaId()); // 2. æ´æ° MesProRouteProductDO updateObj = BeanUtils.toBean(updateReqVO, MesProRouteProductDO.class); yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java
@@ -16,8 +16,11 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductBomDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; import cn.iocoder.yudao.module.mes.dal.mysql.pro.route.MesProRouteMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -29,6 +32,10 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Set; import java.util.Comparator; import java.util.Arrays; import java.util.stream.Collectors; import java.util.concurrent.atomic.AtomicInteger; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -58,6 +65,10 @@ @Resource @Lazy private MesMdItemService itemService; @Resource private MesMdItemTypeService itemTypeService; @Resource private MesWmWarehouseAreaService warehouseAreaService; @Override public Long createRoute(MesProRouteSaveReqVO createReqVO) { @@ -147,13 +158,75 @@ // 3. ææäº§åå¿ é¡»é ç½®äº BOM æ¶è List<MesProRouteProductDO> productList = routeProductService.getRouteProductListByRouteId(routeId); for (MesProRouteProductDO product : productList) { MesMdItemDO item = itemService.validateItemExists(product.getItemId()); if (product.getWarehouseId() == null || product.getLocationId() == null || product.getAreaId() == null) { throw exception(PRO_ROUTE_PRODUCT_WAREHOUSE_REQUIRED, item.getName()); } warehouseAreaService.validateWarehouseAreaExists(product.getWarehouseId(), product.getLocationId(), product.getAreaId()); List<MesProRouteProductBomDO> bomList = routeProductBomService .getRouteProductBomList(routeId, null, product.getItemId()); if (CollUtil.isEmpty(bomList)) { MesMdItemDO item = itemService.validateItemExists(product.getItemId()); throw exception(PRO_ROUTE_ENABLE_PRODUCT_NO_BOM, item.getName()); } } validateProcessOutputs(processList, productList); } private void validateProcessOutputs(List<MesProRouteProcessDO> processList, List<MesProRouteProductDO> productList) { if (CollUtil.isEmpty(productList)) { throw exception(PRO_ROUTE_LAST_OUTPUT_INVALID, processList.get(processList.size() - 1).getProcessId()); } Set<Long> boundItemIds = productList.stream().map(MesProRouteProductDO::getItemId).collect(Collectors.toSet()); Set<Long> finishedItemIds = productList.stream() .map(MesProRouteProductDO::getItemId) .filter(itemId -> isItemUnderCategory(itemId, "FG")) .collect(Collectors.toSet()); MesProRouteProcessDO lastProcess = processList.stream() .max(Comparator.comparing(MesProRouteProcessDO::getSort)).orElseThrow(); for (MesProRouteProcessDO process : processList) { Set<Long> outputIds = parseOutputItemIds(process.getOutputItemId()); if (CollUtil.isEmpty(outputIds)) { throw exception(PRO_ROUTE_PROCESS_OUTPUT_REQUIRED, process.getProcessId()); } for (Long outputId : outputIds) { if (!boundItemIds.contains(outputId)) { MesMdItemDO item = itemService.validateItemExists(outputId); throw exception(PRO_ROUTE_PROCESS_OUTPUT_NOT_BOUND, item.getName()); } } if (process.getId().equals(lastProcess.getId())) { if (finishedItemIds.isEmpty() || !outputIds.equals(finishedItemIds)) { throw exception(PRO_ROUTE_LAST_OUTPUT_INVALID, process.getProcessId()); } } else if (outputIds.stream().anyMatch(itemId -> !isItemUnderCategory(itemId, "SF"))) { throw exception(PRO_ROUTE_MIDDLE_OUTPUT_INVALID, process.getProcessId()); } } } private Set<Long> parseOutputItemIds(String value) { if (StrUtil.isBlank(value)) { return Collections.emptySet(); } return Arrays.stream(value.split(",")).map(String::trim).filter(StrUtil::isNotBlank) .map(Long::valueOf).collect(Collectors.toSet()); } private boolean isItemUnderCategory(Long itemId, String rootCode) { MesMdItemDO item = itemService.validateItemExists(itemId); MesMdItemTypeDO type = itemTypeService.getItemType(item.getItemTypeId()); while (type != null) { if (rootCode.equals(type.getCode())) { return true; } if (type.getParentId() == null || MesMdItemTypeDO.PARENT_ID_ROOT.equals(type.getParentId())) { return false; } type = itemTypeService.getItemType(type.getParentId()); } return false; } @Override yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
@@ -9,11 +9,13 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceMapper; import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductProduceStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; @@ -23,6 +25,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService; import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService; import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; import cn.iocoder.yudao.module.mes.service.wm.productreceipt.MesWmProductReceiptService; import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; @@ -52,6 +55,8 @@ @Resource private MesWmProductProduceMapper productProduceMapper; @Resource private MesProFeedbackMapper feedbackMapper; @Resource private MesWmProductProduceLineService productProduceLineService; @@ -61,6 +66,8 @@ private MesProWorkOrderService workOrderService; @Resource private MesProWorkOrderProcessService workOrderProcessService; @Resource private MesProRouteProductService routeProductService; @Resource private MesWmProductReceiptService productReceiptService; @Resource @@ -86,7 +93,7 @@ } // 2. å建åºåäºå¡ createTransactionList(id, lines); createTransactionList(produce, lines); // 3. æ´æ°å ¥åºåç¶æ productProduceMapper.updateById(new MesWmProductProduceDO() @@ -100,7 +107,11 @@ } } private void createTransactionList(Long produceId, List<MesWmProductProduceLineDO> lines) { private void createTransactionList(MesWmProductProduceDO produce, List<MesWmProductProduceLineDO> lines) { MesProFeedbackDO feedback = produce.getFeedbackId() != null ? feedbackMapper.selectById(produce.getFeedbackId()) : null; String bizCode = feedback != null && cn.hutool.core.util.StrUtil.isNotBlank(feedback.getCode()) ? feedback.getCode() : "PRODUCE-" + produce.getId(); for (MesWmProductProduceLineDO line : lines) { // 1. æ ¡éªæ¯è¡æç»æ°éä¹åçäºè¡æ°é List<MesWmProductProduceDetailDO> details = productProduceDetailService.getProductProduceDetailListByLineId( @@ -117,8 +128,8 @@ .setQuantity(detail.getQuantity()) .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) .setBizType(MesBizTypeConstants.WM_PRODUCT_PRODUCE).setBizId(produceId) .setBizCode("").setBizLineId(line.getId())); .setBizType(MesBizTypeConstants.WM_PRODUCT_PRODUCE).setBizId(produce.getId()) .setBizCode(bizCode).setBizLineId(line.getId())); } } } @@ -127,6 +138,11 @@ @Transactional(rollbackFor = Exception.class) public MesWmProductProduceDO generateProductProduce(MesProFeedbackDO feedback, boolean checkFlag, MesProFeedbackApproveReqVO approveReqVO) { // ä¸ä¸ªæ¥å·¥åªè½çæä¸å¼ ç产产åºåï¼å®¡æ¹æ¥å£éè¯æ¶ç´æ¥è¿åæ¢æåæ® MesWmProductProduceDO existingProduce = productProduceMapper.selectByFeedbackId(feedback.getId()); if (existingProduce != null) { return existingProduce; } // 0. æ¥è¯¢å ³èçå·¥åï¼ç¨äºè·å clientId çä¿¡æ¯ï¼ MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(feedback.getWorkOrderId()); @@ -166,10 +182,8 @@ Long batchId = batch != null ? batch.getId() : null; String batchCode = batch != null ? batch.getCode() : null; // 1.5 è·åèæçº¿è¾¹åº MesWmWarehouseDO virtualWarehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE); MesWmWarehouseLocationDO virtualLocation = locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION); MesWmWarehouseAreaDO virtualArea = areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA); // 1.5 ä¼å 使ç¨å·¥èºè·¯çº¿äº§åç»å®çæ¥å·¥ä»åºï¼å岿°æ®æªé ç½®æ¶åéèæçº¿è¾¹åºã WarehouseTarget outputTarget = resolveOutputTarget(feedback.getItemId()); // 3. æ ¹æ®æ¯å¦éè¦æ£éªåæ¯å¤ç if (checkFlag) { @@ -189,7 +203,7 @@ productProduceLineService.createProductProduceLine(unqualifiedLine); MesWmProductProduceDetailDO unqualifiedDetail = buildProduceDetail(produce, feedback, batchId, batchCode, unqualifiedLine.getId(), unqualifiedQty, virtualWarehouse.getId(), virtualLocation.getId(), virtualArea.getId()); outputTarget.warehouseId(), outputTarget.locationId(), outputTarget.areaId()); productProduceDetailService.createProductProduceDetail(unqualifiedDetail); } // 3.2.2 åæ ¼åè¡ + æç» @@ -199,7 +213,7 @@ productProduceLineService.createProductProduceLine(qualifiedLine); MesWmProductProduceDetailDO qualifiedDetail = buildProduceDetail(produce, feedback, batchId, batchCode, qualifiedLine.getId(), qualifiedQty, virtualWarehouse.getId(), virtualLocation.getId(), virtualArea.getId()); outputTarget.warehouseId(), outputTarget.locationId(), outputTarget.areaId()); productProduceDetailService.createProductProduceDetail(qualifiedDetail); } } @@ -259,13 +273,9 @@ if (produce == null) { throw exception(WM_PRODUCT_PRODUCE_NOT_EXISTS); } // 1.2 è·åèæçº¿è¾¹åº MesWmWarehouseDO virtualWarehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE); MesWmWarehouseLocationDO virtualLocation = locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION); MesWmWarehouseAreaDO virtualArea = areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA); // 2. éè¿ sourceLineId ç´æ¥å®ä½å¾ æ£éªè¡ MesWmProductProduceLineDO pendingLine = productProduceLineService.validateProductProduceLineExists(sourceLineId); WarehouseTarget outputTarget = resolveOutputTarget(pendingLine.getItemId()); // 3A. æ åµä¸ï¼åå¨ä¸åæ ¼åæ°éï¼éè¦æåè¡ if (unqualifiedQty != null && unqualifiedQty.compareTo(BigDecimal.ZERO) > 0) { @@ -282,7 +292,7 @@ .produceId(produce.getId()).lineId(unqualifiedLine.getId()) .itemId(pendingLine.getItemId()).quantity(unqualifiedQty) .batchId(pendingLine.getBatchId()).batchCode(pendingLine.getBatchCode()) .warehouseId(virtualWarehouse.getId()).locationId(virtualLocation.getId()).areaId(virtualArea.getId()) .warehouseId(outputTarget.warehouseId()).locationId(outputTarget.locationId()).areaId(outputTarget.areaId()) .build()); // 3A.2 åæ ¼åï¼å¤ç¨åå¾ æ£è¡ï¼æ´æ°æ°éåç¶æ + æç» pendingLine.setQuantity(ObjectUtil.defaultIfNull(qualifiedQty, BigDecimal.ZERO)); @@ -293,7 +303,7 @@ .produceId(produce.getId()).lineId(pendingLine.getId()) .itemId(pendingLine.getItemId()).quantity(qualifiedQty) .batchId(pendingLine.getBatchId()).batchCode(pendingLine.getBatchCode()) .warehouseId(virtualWarehouse.getId()).locationId(virtualLocation.getId()).areaId(virtualArea.getId()) .warehouseId(outputTarget.warehouseId()).locationId(outputTarget.locationId()).areaId(outputTarget.areaId()) .build()); } } else { @@ -304,7 +314,7 @@ .produceId(produce.getId()).lineId(pendingLine.getId()) .itemId(pendingLine.getItemId()).quantity(pendingLine.getQuantity()) .batchId(pendingLine.getBatchId()).batchCode(pendingLine.getBatchCode()) .warehouseId(virtualWarehouse.getId()).locationId(virtualLocation.getId()).areaId(virtualArea.getId()) .warehouseId(outputTarget.warehouseId()).locationId(outputTarget.locationId()).areaId(outputTarget.areaId()) .build()); } @@ -312,4 +322,23 @@ finishProductProduce(produce.getId()); } private WarehouseTarget resolveOutputTarget(Long itemId) { MesProRouteProductDO routeProduct = itemId != null ? routeProductService.getRouteProductByItemId(itemId) : null; if (routeProduct != null && routeProduct.getWarehouseId() != null && routeProduct.getLocationId() != null && routeProduct.getAreaId() != null) { areaService.validateWarehouseAreaExists(routeProduct.getWarehouseId(), routeProduct.getLocationId(), routeProduct.getAreaId()); return new WarehouseTarget(routeProduct.getWarehouseId(), routeProduct.getLocationId(), routeProduct.getAreaId()); } MesWmWarehouseDO warehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE); MesWmWarehouseLocationDO location = locationService.getWarehouseLocationByCode( MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION); MesWmWarehouseAreaDO area = areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA); return new WarehouseTarget(warehouse.getId(), location.getId(), area.getId()); } private record WarehouseTarget(Long warehouseId, Long locationId, Long areaId) { } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java
@@ -81,6 +81,8 @@ private MesWmWarehouseLocationService locationService; @Resource private MesWmWarehouseAreaService areaService; @Resource private cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceDetailService productProduceDetailService; @Override public Long createProductReceipt(MesWmProductReceiptSaveReqVO createReqVO) { @@ -143,8 +145,13 @@ MesMdItemDO item = mdItemService.getItem(produceLine.getItemId()); Long mdmItemId = item != null && item.getMdmItemId() != null ? item.getMdmItemId() : produceLine.getItemId(); List<cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDetailDO> details = productProduceDetailService.getProductProduceDetailListByLineId(produceLine.getId()); Long warehouseId = CollUtil.isNotEmpty(details) ? details.get(0).getWarehouseId() : virtualWarehouse.getId(); Long locationId = CollUtil.isNotEmpty(details) ? details.get(0).getLocationId() : virtualLocation.getId(); Long areaId = CollUtil.isNotEmpty(details) ? details.get(0).getAreaId() : virtualArea.getId(); MesWmMaterialStockDO stock = materialStockService.getMaterialStockByCompositeKey( mdmItemId, virtualWarehouse.getId(), virtualLocation.getId(), virtualArea.getId(), mdmItemId, warehouseId, locationId, areaId, produceLine.getBatchId(), null); productReceiptLineMapper.insert(MesWmProductReceiptLineDO.builder() .receiptId(receipt.getId()) yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java
@@ -22,6 +22,9 @@ @Schema(description = "ç¨æ·è´¦å·ï¼æ¨¡ç³å¹é ", example = "yudao") private String username; @Schema(description = "ç¨æ·æµç§°ï¼æ¨¡ç³å¹é ", example = "管çå") private String nickname; @Schema(description = "ææºå·ç ï¼æ¨¡ç³å¹é ", example = "yudao") private String mobile; yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java
@@ -28,6 +28,7 @@ default PageResult<AdminUserDO> selectPage(UserPageReqVO reqVO, Collection<Long> deptIds, Collection<Long> userIds) { return selectPage(reqVO, new LambdaQueryWrapperX<AdminUserDO>() .likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername()) .likeIfPresent(AdminUserDO::getNickname, reqVO.getNickname()) .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile()) .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus()) .betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime())