Commit 55f86d4e9ae0b0828b7498c3a6dc472ce4c91baa

Authored by YunaiV
1 parent 09442e65

feat(mes): add request and response VO for MES item receipt and detail, includin…

…g service and controller implementations
Showing 24 changed files with 2037 additions and 0 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
  5 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  7 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  8 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  9 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  10 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  11 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO;
  12 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptRespVO;
  13 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptSaveReqVO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO;
  15 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO;
  16 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO;
  17 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO;
  18 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
  19 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
  20 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
  21 +import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
  22 +import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService;
  23 +import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService;
  24 +import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptService;
  25 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
  26 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
  27 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
  28 +import io.swagger.v3.oas.annotations.Operation;
  29 +import io.swagger.v3.oas.annotations.Parameter;
  30 +import io.swagger.v3.oas.annotations.tags.Tag;
  31 +import jakarta.annotation.Resource;
  32 +import jakarta.servlet.http.HttpServletResponse;
  33 +import jakarta.validation.Valid;
  34 +import org.springframework.security.access.prepost.PreAuthorize;
  35 +import org.springframework.validation.annotation.Validated;
  36 +import org.springframework.web.bind.annotation.*;
  37 +
  38 +import java.io.IOException;
  39 +import java.util.Collections;
  40 +import java.util.List;
  41 +import java.util.Map;
  42 +
  43 +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
  44 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  45 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  46 +
  47 +@Tag(name = "管理后台 - MES 采购入库单")
  48 +@RestController
  49 +@RequestMapping("/mes/wm/item-receipt")
  50 +@Validated
  51 +public class MesWmItemReceiptController {
  52 +
  53 + @Resource
  54 + private MesWmItemReceiptService itemReceiptService;
  55 +
  56 + @Resource
  57 + private MesMdVendorService vendorService;
  58 +
  59 + @Resource
  60 + private MesWmWarehouseService warehouseService;
  61 +
  62 + @Resource
  63 + private MesWmWarehouseLocationService locationService;
  64 +
  65 + @Resource
  66 + private MesWmWarehouseAreaService areaService;
  67 +
  68 + @Resource
  69 + private MesQcIqcService iqcService;
  70 +
  71 + @Resource
  72 + private MesWmArrivalNoticeService arrivalNoticeService;
  73 +
  74 + @PostMapping("/create")
  75 + @Operation(summary = "创建采购入库单")
  76 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:create')")
  77 + public CommonResult<Long> createItemReceipt(@Valid @RequestBody MesWmItemReceiptSaveReqVO createReqVO) {
  78 + return success(itemReceiptService.createItemReceipt(createReqVO));
  79 + }
  80 +
  81 + @PutMapping("/update")
  82 + @Operation(summary = "修改采购入库单")
  83 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:update')")
  84 + public CommonResult<Boolean> updateItemReceipt(@Valid @RequestBody MesWmItemReceiptSaveReqVO updateReqVO) {
  85 + itemReceiptService.updateItemReceipt(updateReqVO);
  86 + return success(true);
  87 + }
  88 +
  89 + @DeleteMapping("/delete")
  90 + @Operation(summary = "删除采购入库单")
  91 + @Parameter(name = "id", description = "编号", required = true)
  92 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:delete')")
  93 + public CommonResult<Boolean> deleteItemReceipt(@RequestParam("id") Long id) {
  94 + itemReceiptService.deleteItemReceipt(id);
  95 + return success(true);
  96 + }
  97 +
  98 + @GetMapping("/get")
  99 + @Operation(summary = "获得采购入库单")
  100 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  101 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:query')")
  102 + public CommonResult<MesWmItemReceiptRespVO> getItemReceipt(@RequestParam("id") Long id) {
  103 + MesWmItemReceiptDO receipt = itemReceiptService.getItemReceipt(id);
  104 + if (receipt == null) {
  105 + return success(null);
  106 + }
  107 + return success(buildRespVOList(Collections.singletonList(receipt)).get(0));
  108 + }
  109 +
  110 + @GetMapping("/page")
  111 + @Operation(summary = "获得采购入库单分页")
  112 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:query')")
  113 + public CommonResult<PageResult<MesWmItemReceiptRespVO>> getItemReceiptPage(
  114 + @Valid MesWmItemReceiptPageReqVO pageReqVO) {
  115 + PageResult<MesWmItemReceiptDO> pageResult = itemReceiptService.getItemReceiptPage(pageReqVO);
  116 + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
  117 + }
  118 +
  119 + @GetMapping("/export-excel")
  120 + @Operation(summary = "导出采购入库单 Excel")
  121 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:export')")
  122 + @ApiAccessLog(operateType = EXPORT)
  123 + public void exportItemReceiptExcel(@Valid MesWmItemReceiptPageReqVO pageReqVO,
  124 + HttpServletResponse response) throws IOException {
  125 + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
  126 + PageResult<MesWmItemReceiptDO> pageResult = itemReceiptService.getItemReceiptPage(pageReqVO);
  127 + ExcelUtils.write(response, "采购入库单.xls", "数据", MesWmItemReceiptRespVO.class,
  128 + buildRespVOList(pageResult.getList()));
  129 + }
  130 +
  131 + @PutMapping("/submit")
  132 + @Operation(summary = "提交采购入库单")
  133 + @Parameter(name = "id", description = "编号", required = true)
  134 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:update')")
  135 + public CommonResult<Boolean> submitItemReceipt(@RequestParam("id") Long id) {
  136 + itemReceiptService.submitItemReceipt(id);
  137 + return success(true);
  138 + }
  139 +
  140 + @PutMapping("/approve")
  141 + @Operation(summary = "审批采购入库单")
  142 + @Parameter(name = "id", description = "编号", required = true)
  143 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:update')")
  144 + public CommonResult<Boolean> approveItemReceipt(@RequestParam("id") Long id) {
  145 + itemReceiptService.approveItemReceipt(id);
  146 + return success(true);
  147 + }
  148 +
  149 + @PutMapping("/execute")
  150 + @Operation(summary = "执行入库")
  151 + @Parameter(name = "id", description = "编号", required = true)
  152 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:execute')")
  153 + public CommonResult<Boolean> executeItemReceipt(@RequestParam("id") Long id) {
  154 + itemReceiptService.executeItemReceipt(id);
  155 + return success(true);
  156 + }
  157 +
  158 + // ==================== 拼接 VO ====================
  159 +
  160 + private List<MesWmItemReceiptRespVO> buildRespVOList(List<MesWmItemReceiptDO> list) {
  161 + if (CollUtil.isEmpty(list)) {
  162 + return Collections.emptyList();
  163 + }
  164 + // 1. 获得关联数据
  165 + Map<Long, MesMdVendorDO> vendorMap = vendorService.getVendorMap(
  166 + convertSet(list, MesWmItemReceiptDO::getVendorId));
  167 + Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
  168 + convertSet(list, MesWmItemReceiptDO::getWarehouseId));
  169 + Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
  170 + convertSet(list, MesWmItemReceiptDO::getLocationId));
  171 + Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap(
  172 + convertSet(list, MesWmItemReceiptDO::getAreaId));
  173 + Map<Long, MesQcIqcDO> iqcMap = iqcService.getIqcMap(
  174 + convertSet(list, MesWmItemReceiptDO::getIqcId));
  175 + Map<Long, MesWmArrivalNoticeDO> noticeMap = arrivalNoticeService.getArrivalNoticeMap(
  176 + convertSet(list, MesWmItemReceiptDO::getNoticeId));
  177 + // 2. 构建结果
  178 + return BeanUtils.toBean(list, MesWmItemReceiptRespVO.class, vo -> {
  179 + MapUtils.findAndThen(vendorMap, vo.getVendorId(),
  180 + vendor -> vo.setVendorName(vendor.getName()));
  181 + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(),
  182 + warehouse -> vo.setWarehouseName(warehouse.getName()));
  183 + MapUtils.findAndThen(locationMap, vo.getLocationId(),
  184 + location -> vo.setLocationName(location.getName()));
  185 + MapUtils.findAndThen(areaMap, vo.getAreaId(),
  186 + area -> vo.setAreaName(area.getName()));
  187 + MapUtils.findAndThen(iqcMap, vo.getIqcId(),
  188 + iqc -> vo.setIqcCode(iqc.getCode()));
  189 + MapUtils.findAndThen(noticeMap, vo.getNoticeId(),
  190 + notice -> vo.setNoticeCode(notice.getCode()));
  191 + });
  192 + }
  193 +
  194 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptDetailController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  7 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailPageReqVO;
  9 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailRespVO;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailSaveReqVO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
  15 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
  16 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
  17 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  18 +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
  19 +import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptDetailService;
  20 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
  21 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
  22 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
  23 +import io.swagger.v3.oas.annotations.Operation;
  24 +import io.swagger.v3.oas.annotations.Parameter;
  25 +import io.swagger.v3.oas.annotations.tags.Tag;
  26 +import jakarta.annotation.Resource;
  27 +import jakarta.validation.Valid;
  28 +import org.springframework.security.access.prepost.PreAuthorize;
  29 +import org.springframework.validation.annotation.Validated;
  30 +import org.springframework.web.bind.annotation.*;
  31 +
  32 +import java.util.Collections;
  33 +import java.util.List;
  34 +import java.util.Map;
  35 +
  36 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  37 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  38 +
  39 +@Tag(name = "管理后台 - MES 采购入库明细")
  40 +@RestController
  41 +@RequestMapping("/mes/wm/item-receipt-detail")
  42 +@Validated
  43 +public class MesWmItemReceiptDetailController {
  44 +
  45 + @Resource
  46 + private MesWmItemReceiptDetailService itemReceiptDetailService;
  47 +
  48 + @Resource
  49 + private MesMdItemService itemService;
  50 +
  51 + @Resource
  52 + private MesMdUnitMeasureService unitMeasureService;
  53 +
  54 + @Resource
  55 + private MesWmWarehouseService warehouseService;
  56 +
  57 + @Resource
  58 + private MesWmWarehouseLocationService locationService;
  59 +
  60 + @Resource
  61 + private MesWmWarehouseAreaService areaService;
  62 +
  63 + @PostMapping("/create")
  64 + @Operation(summary = "创建采购入库明细")
  65 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:create')")
  66 + public CommonResult<Long> createItemReceiptDetail(@Valid @RequestBody MesWmItemReceiptDetailSaveReqVO createReqVO) {
  67 + return success(itemReceiptDetailService.createItemReceiptDetail(createReqVO));
  68 + }
  69 +
  70 + @PutMapping("/update")
  71 + @Operation(summary = "修改采购入库明细")
  72 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:update')")
  73 + public CommonResult<Boolean> updateItemReceiptDetail(@Valid @RequestBody MesWmItemReceiptDetailSaveReqVO updateReqVO) {
  74 + itemReceiptDetailService.updateItemReceiptDetail(updateReqVO);
  75 + return success(true);
  76 + }
  77 +
  78 + @DeleteMapping("/delete")
  79 + @Operation(summary = "删除采购入库明细")
  80 + @Parameter(name = "id", description = "编号", required = true)
  81 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:delete')")
  82 + public CommonResult<Boolean> deleteItemReceiptDetail(@RequestParam("id") Long id) {
  83 + itemReceiptDetailService.deleteItemReceiptDetail(id);
  84 + return success(true);
  85 + }
  86 +
  87 + @GetMapping("/get")
  88 + @Operation(summary = "获得采购入库明细")
  89 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  90 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:query')")
  91 + public CommonResult<MesWmItemReceiptDetailRespVO> getItemReceiptDetail(@RequestParam("id") Long id) {
  92 + MesWmItemReceiptDetailDO detail = itemReceiptDetailService.getItemReceiptDetail(id);
  93 + if (detail == null) {
  94 + return success(null);
  95 + }
  96 + return success(buildRespVOList(Collections.singletonList(detail)).get(0));
  97 + }
  98 +
  99 + @GetMapping("/page")
  100 + @Operation(summary = "获得采购入库明细分页")
  101 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:query')")
  102 + public CommonResult<PageResult<MesWmItemReceiptDetailRespVO>> getItemReceiptDetailPage(
  103 + @Valid MesWmItemReceiptDetailPageReqVO pageReqVO) {
  104 + PageResult<MesWmItemReceiptDetailDO> pageResult = itemReceiptDetailService.getItemReceiptDetailPage(pageReqVO);
  105 + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
  106 + }
  107 +
  108 + // ==================== 拼接 VO ====================
  109 +
  110 + private List<MesWmItemReceiptDetailRespVO> buildRespVOList(List<MesWmItemReceiptDetailDO> list) {
  111 + if (CollUtil.isEmpty(list)) {
  112 + return Collections.emptyList();
  113 + }
  114 + // 1. 获得关联数据
  115 + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
  116 + convertSet(list, MesWmItemReceiptDetailDO::getItemId));
  117 + Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
  118 + convertSet(list, MesWmItemReceiptDetailDO::getWarehouseId));
  119 + Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
  120 + convertSet(list, MesWmItemReceiptDetailDO::getLocationId));
  121 + Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap(
  122 + convertSet(list, MesWmItemReceiptDetailDO::getAreaId));
  123 + // 2. 构建结果
  124 + return BeanUtils.toBean(list, MesWmItemReceiptDetailRespVO.class, vo -> {
  125 + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
  126 + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
  127 + // TODO @AI:批量查询,避免 N+1 查询
  128 + if (item.getUnitMeasureId() != null) {
  129 + MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasure(item.getUnitMeasureId());
  130 + if (unitMeasure != null) {
  131 + vo.setUnitMeasureName(unitMeasure.getName());
  132 + }
  133 + }
  134 + });
  135 + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(),
  136 + warehouse -> vo.setWarehouseName(warehouse.getName()));
  137 + MapUtils.findAndThen(locationMap, vo.getLocationId(),
  138 + location -> vo.setLocationName(location.getName()));
  139 + MapUtils.findAndThen(areaMap, vo.getAreaId(),
  140 + area -> vo.setAreaName(area.getName()));
  141 + });
  142 + }
  143 +
  144 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  7 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLinePageReqVO;
  9 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLineRespVO;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLineSaveReqVO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO;
  15 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
  16 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
  17 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
  18 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  19 +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
  20 +import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService;
  21 +import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptLineService;
  22 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
  23 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
  24 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
  25 +import io.swagger.v3.oas.annotations.Operation;
  26 +import io.swagger.v3.oas.annotations.Parameter;
  27 +import io.swagger.v3.oas.annotations.tags.Tag;
  28 +import jakarta.annotation.Resource;
  29 +import jakarta.validation.Valid;
  30 +import org.springframework.security.access.prepost.PreAuthorize;
  31 +import org.springframework.validation.annotation.Validated;
  32 +import org.springframework.web.bind.annotation.*;
  33 +
  34 +import java.util.Collections;
  35 +import java.util.List;
  36 +import java.util.Map;
  37 +
  38 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  39 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  40 +
  41 +@Tag(name = "管理后台 - MES 采购入库单行")
  42 +@RestController
  43 +@RequestMapping("/mes/wm/item-receipt-line")
  44 +@Validated
  45 +public class MesWmItemReceiptLineController {
  46 +
  47 + @Resource
  48 + private MesWmItemReceiptLineService itemReceiptLineService;
  49 +
  50 + @Resource
  51 + private MesMdItemService itemService;
  52 +
  53 + @Resource
  54 + private MesMdUnitMeasureService unitMeasureService;
  55 +
  56 + @Resource
  57 + private MesWmWarehouseService warehouseService;
  58 +
  59 + @Resource
  60 + private MesWmWarehouseLocationService locationService;
  61 +
  62 + @Resource
  63 + private MesWmWarehouseAreaService areaService;
  64 +
  65 + @Resource
  66 + private MesQcIqcService iqcService;
  67 +
  68 + @PostMapping("/create")
  69 + @Operation(summary = "创建采购入库单行")
  70 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:create')")
  71 + public CommonResult<Long> createItemReceiptLine(@Valid @RequestBody MesWmItemReceiptLineSaveReqVO createReqVO) {
  72 + return success(itemReceiptLineService.createItemReceiptLine(createReqVO));
  73 + }
  74 +
  75 + @PutMapping("/update")
  76 + @Operation(summary = "修改采购入库单行")
  77 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:update')")
  78 + public CommonResult<Boolean> updateItemReceiptLine(@Valid @RequestBody MesWmItemReceiptLineSaveReqVO updateReqVO) {
  79 + itemReceiptLineService.updateItemReceiptLine(updateReqVO);
  80 + return success(true);
  81 + }
  82 +
  83 + @DeleteMapping("/delete")
  84 + @Operation(summary = "删除采购入库单行")
  85 + @Parameter(name = "id", description = "编号", required = true)
  86 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:delete')")
  87 + public CommonResult<Boolean> deleteItemReceiptLine(@RequestParam("id") Long id) {
  88 + itemReceiptLineService.deleteItemReceiptLine(id);
  89 + return success(true);
  90 + }
  91 +
  92 + @GetMapping("/get")
  93 + @Operation(summary = "获得采购入库单行")
  94 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  95 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:query')")
  96 + public CommonResult<MesWmItemReceiptLineRespVO> getItemReceiptLine(@RequestParam("id") Long id) {
  97 + MesWmItemReceiptLineDO line = itemReceiptLineService.getItemReceiptLine(id);
  98 + if (line == null) {
  99 + return success(null);
  100 + }
  101 + return success(buildRespVOList(Collections.singletonList(line)).get(0));
  102 + }
  103 +
  104 + @GetMapping("/page")
  105 + @Operation(summary = "获得采购入库单行分页")
  106 + @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:query')")
  107 + public CommonResult<PageResult<MesWmItemReceiptLineRespVO>> getItemReceiptLinePage(
  108 + @Valid MesWmItemReceiptLinePageReqVO pageReqVO) {
  109 + PageResult<MesWmItemReceiptLineDO> pageResult = itemReceiptLineService.getItemReceiptLinePage(pageReqVO);
  110 + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
  111 + }
  112 +
  113 + // ==================== 拼接 VO ====================
  114 +
  115 + private List<MesWmItemReceiptLineRespVO> buildRespVOList(List<MesWmItemReceiptLineDO> list) {
  116 + if (CollUtil.isEmpty(list)) {
  117 + return Collections.emptyList();
  118 + }
  119 + // 1. 获得关联数据
  120 + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
  121 + convertSet(list, MesWmItemReceiptLineDO::getItemId));
  122 + Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
  123 + convertSet(list, MesWmItemReceiptLineDO::getWarehouseId));
  124 + Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
  125 + convertSet(list, MesWmItemReceiptLineDO::getLocationId));
  126 + Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap(
  127 + convertSet(list, MesWmItemReceiptLineDO::getAreaId));
  128 + Map<Long, MesQcIqcDO> iqcMap = iqcService.getIqcMap(
  129 + convertSet(list, MesWmItemReceiptLineDO::getIqcId));
  130 + // 2. 构建结果
  131 + return BeanUtils.toBean(list, MesWmItemReceiptLineRespVO.class, vo -> {
  132 + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
  133 + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
  134 + // TODO @AI:批量查询,避免 N+1 查询
  135 + if (item.getUnitMeasureId() != null) {
  136 + MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasure(item.getUnitMeasureId());
  137 + if (unitMeasure != null) {
  138 + vo.setUnitMeasureName(unitMeasure.getName());
  139 + }
  140 + }
  141 + });
  142 + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(),
  143 + warehouse -> vo.setWarehouseName(warehouse.getName()));
  144 + MapUtils.findAndThen(locationMap, vo.getLocationId(),
  145 + location -> vo.setLocationName(location.getName()));
  146 + MapUtils.findAndThen(areaMap, vo.getAreaId(),
  147 + area -> vo.setAreaName(area.getName()));
  148 + MapUtils.findAndThen(iqcMap, vo.getIqcId(),
  149 + iqc -> vo.setIqcCode(iqc.getCode()));
  150 + });
  151 + }
  152 +
  153 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +@Schema(description = "管理后台 - MES 采购入库单分页 Request VO")
  10 +@Data
  11 +@EqualsAndHashCode(callSuper = true)
  12 +@ToString(callSuper = true)
  13 +public class MesWmItemReceiptPageReqVO extends PageParam {
  14 +
  15 + @Schema(description = "入库单编码", example = "IR2026020001")
  16 + private String code;
  17 +
  18 + @Schema(description = "入库单名称", example = "钢板入库单")
  19 + private String name;
  20 +
  21 + @Schema(description = "采购订单编号", example = "PO20260101")
  22 + private String purchaseOrderCode;
  23 +
  24 + @Schema(description = "供应商编号", example = "1")
  25 + private Long vendorId;
  26 +
  27 + @Schema(description = "状态", example = "0")
  28 + private Integer status;
  29 +
  30 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo;
  2 +
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
  6 +import lombok.Data;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +@Schema(description = "管理后台 - MES 采购入库单 Response VO")
  11 +@Data
  12 +@ExcelIgnoreUnannotated
  13 +public class MesWmItemReceiptRespVO {
  14 +
  15 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  16 + @ExcelProperty("编号")
  17 + private Long id;
  18 +
  19 + @Schema(description = "入库单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "IR2026020001")
  20 + @ExcelProperty("入库单编码")
  21 + private String code;
  22 +
  23 + @Schema(description = "入库单名称", example = "钢板入库单")
  24 + @ExcelProperty("入库单名称")
  25 + private String name;
  26 +
  27 + @Schema(description = "来料检验单编号", example = "1")
  28 + private Long iqcId;
  29 +
  30 + @Schema(description = "来料检验单编码", example = "IQC20260201")
  31 + @ExcelProperty("来料检验单")
  32 + private String iqcCode;
  33 +
  34 + @Schema(description = "到货通知单编号", example = "1")
  35 + private Long noticeId;
  36 +
  37 + @Schema(description = "到货通知单编码", example = "AN2026020001")
  38 + @ExcelProperty("到货通知单")
  39 + private String noticeCode;
  40 +
  41 + @Schema(description = "采购订单编号", example = "PO20260101")
  42 + @ExcelProperty("采购订单编号")
  43 + private String purchaseOrderCode;
  44 +
  45 + @Schema(description = "供应商编号", example = "1")
  46 + private Long vendorId;
  47 +
  48 + @Schema(description = "供应商名称", example = "某供应商")
  49 + @ExcelProperty("供应商")
  50 + private String vendorName;
  51 +
  52 + @Schema(description = "仓库编号", example = "1")
  53 + private Long warehouseId;
  54 +
  55 + @Schema(description = "仓库名称", example = "原料仓")
  56 + @ExcelProperty("仓库")
  57 + private String warehouseName;
  58 +
  59 + @Schema(description = "库区编号", example = "1")
  60 + private Long locationId;
  61 +
  62 + @Schema(description = "库区名称", example = "A 区")
  63 + @ExcelProperty("库区")
  64 + private String locationName;
  65 +
  66 + @Schema(description = "库位编号", example = "1")
  67 + private Long areaId;
  68 +
  69 + @Schema(description = "库位名称", example = "A-01")
  70 + @ExcelProperty("库位")
  71 + private String areaName;
  72 +
  73 + @Schema(description = "入库日期")
  74 + @ExcelProperty("入库日期")
  75 + private LocalDateTime receiptDate;
  76 +
  77 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
  78 + @ExcelProperty("状态")
  79 + private Integer status;
  80 +
  81 + @Schema(description = "备注", example = "备注")
  82 + @ExcelProperty("备注")
  83 + private String remark;
  84 +
  85 + @Schema(description = "预留字段1")
  86 + private String attribute1;
  87 +
  88 + @Schema(description = "预留字段2")
  89 + private String attribute2;
  90 +
  91 + @Schema(description = "预留字段3")
  92 + private Integer attribute3;
  93 +
  94 + @Schema(description = "预留字段4")
  95 + private Integer attribute4;
  96 +
  97 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  98 + @ExcelProperty("创建时间")
  99 + private LocalDateTime createTime;
  100 +
  101 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import lombok.Data;
  6 +
  7 +import java.time.LocalDateTime;
  8 +
  9 +@Schema(description = "管理后台 - MES 采购入库单新增/修改 Request VO")
  10 +@Data
  11 +public class MesWmItemReceiptSaveReqVO {
  12 +
  13 + @Schema(description = "编号", example = "1024")
  14 + private Long id;
  15 +
  16 + @Schema(description = "入库单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "IR2026020001")
  17 + @NotEmpty(message = "入库单编码不能为空")
  18 + private String code;
  19 +
  20 + @Schema(description = "入库单名称", example = "钢板入库单")
  21 + private String name;
  22 +
  23 + @Schema(description = "来料检验单编号", example = "1")
  24 + private Long iqcId;
  25 +
  26 + @Schema(description = "到货通知单编号", example = "1")
  27 + private Long noticeId;
  28 +
  29 + @Schema(description = "采购订单编号", example = "PO20260101")
  30 + private String purchaseOrderCode;
  31 +
  32 + @Schema(description = "供应商编号", example = "1")
  33 + private Long vendorId;
  34 +
  35 + @Schema(description = "仓库编号", example = "1")
  36 + private Long warehouseId;
  37 +
  38 + @Schema(description = "库区编号", example = "1")
  39 + private Long locationId;
  40 +
  41 + @Schema(description = "库位编号", example = "1")
  42 + private Long areaId;
  43 +
  44 + @Schema(description = "入库日期")
  45 + private LocalDateTime receiptDate;
  46 +
  47 + @Schema(description = "备注", example = "备注")
  48 + private String remark;
  49 +
  50 + @Schema(description = "预留字段1")
  51 + private String attribute1;
  52 +
  53 + @Schema(description = "预留字段2")
  54 + private String attribute2;
  55 +
  56 + @Schema(description = "预留字段3")
  57 + private Integer attribute3;
  58 +
  59 + @Schema(description = "预留字段4")
  60 + private Integer attribute4;
  61 +
  62 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +@Schema(description = "管理后台 - MES 采购入库明细分页 Request VO")
  10 +@Data
  11 +@EqualsAndHashCode(callSuper = true)
  12 +@ToString(callSuper = true)
  13 +public class MesWmItemReceiptDetailPageReqVO extends PageParam {
  14 +
  15 + @Schema(description = "入库单编号", example = "1")
  16 + private Long receiptId;
  17 +
  18 + @Schema(description = "入库单行编号", example = "1")
  19 + private Long lineId;
  20 +
  21 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import java.math.BigDecimal;
  7 +import java.time.LocalDateTime;
  8 +
  9 +@Schema(description = "管理后台 - MES 采购入库明细 Response VO")
  10 +@Data
  11 +public class MesWmItemReceiptDetailRespVO {
  12 +
  13 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  14 + private Long id;
  15 +
  16 + @Schema(description = "入库单行编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  17 + private Long lineId;
  18 +
  19 + @Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  20 + private Long receiptId;
  21 +
  22 + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  23 + private Long itemId;
  24 +
  25 + @Schema(description = "物料编码", example = "M001")
  26 + private String itemCode;
  27 +
  28 + @Schema(description = "物料名称", example = "钢板")
  29 + private String itemName;
  30 +
  31 + @Schema(description = "规格型号", example = "10mm*100mm")
  32 + private String specification;
  33 +
  34 + @Schema(description = "计量单位名称", example = "千克")
  35 + private String unitMeasureName;
  36 +
  37 + @Schema(description = "上架数量", example = "300.00")
  38 + private BigDecimal quantity;
  39 +
  40 + @Schema(description = "批次编号", example = "1")
  41 + private Long batchId;
  42 +
  43 + @Schema(description = "仓库编号", example = "1")
  44 + private Long warehouseId;
  45 +
  46 + @Schema(description = "仓库名称", example = "原料仓")
  47 + private String warehouseName;
  48 +
  49 + @Schema(description = "库区编号", example = "1")
  50 + private Long locationId;
  51 +
  52 + @Schema(description = "库区名称", example = "A 区")
  53 + private String locationName;
  54 +
  55 + @Schema(description = "库位编号", example = "1")
  56 + private Long areaId;
  57 +
  58 + @Schema(description = "库位名称", example = "A-01")
  59 + private String areaName;
  60 +
  61 + @Schema(description = "备注", example = "备注")
  62 + private String remark;
  63 +
  64 + @Schema(description = "预留字段1")
  65 + private String attribute1;
  66 +
  67 + @Schema(description = "预留字段2")
  68 + private String attribute2;
  69 +
  70 + @Schema(description = "预留字段3")
  71 + private Integer attribute3;
  72 +
  73 + @Schema(description = "预留字段4")
  74 + private Integer attribute4;
  75 +
  76 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  77 + private LocalDateTime createTime;
  78 +
  79 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotNull;
  5 +import lombok.Data;
  6 +
  7 +import java.math.BigDecimal;
  8 +
  9 +@Schema(description = "管理后台 - MES 采购入库明细新增/修改 Request VO")
  10 +@Data
  11 +public class MesWmItemReceiptDetailSaveReqVO {
  12 +
  13 + @Schema(description = "编号", example = "1024")
  14 + private Long id;
  15 +
  16 + @Schema(description = "入库单行编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  17 + @NotNull(message = "入库单行编号不能为空")
  18 + private Long lineId;
  19 +
  20 + @Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  21 + @NotNull(message = "入库单编号不能为空")
  22 + private Long receiptId;
  23 +
  24 + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  25 + @NotNull(message = "物料编号不能为空")
  26 + private Long itemId;
  27 +
  28 + @Schema(description = "上架数量", example = "300.00")
  29 + private BigDecimal quantity;
  30 +
  31 + @Schema(description = "批次编号", example = "1")
  32 + private Long batchId;
  33 +
  34 + @Schema(description = "仓库编号", example = "1")
  35 + private Long warehouseId;
  36 +
  37 + @Schema(description = "库区编号", example = "1")
  38 + private Long locationId;
  39 +
  40 + @Schema(description = "库位编号", example = "1")
  41 + private Long areaId;
  42 +
  43 + @Schema(description = "备注", example = "备注")
  44 + private String remark;
  45 +
  46 + @Schema(description = "预留字段1")
  47 + private String attribute1;
  48 +
  49 + @Schema(description = "预留字段2")
  50 + private String attribute2;
  51 +
  52 + @Schema(description = "预留字段3")
  53 + private Integer attribute3;
  54 +
  55 + @Schema(description = "预留字段4")
  56 + private Integer attribute4;
  57 +
  58 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLinePageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +@Schema(description = "管理后台 - MES 采购入库单行分页 Request VO")
  10 +@Data
  11 +@EqualsAndHashCode(callSuper = true)
  12 +@ToString(callSuper = true)
  13 +public class MesWmItemReceiptLinePageReqVO extends PageParam {
  14 +
  15 + @Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  16 + private Long receiptId;
  17 +
  18 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import java.math.BigDecimal;
  7 +import java.time.LocalDateTime;
  8 +
  9 +@Schema(description = "管理后台 - MES 采购入库单行 Response VO")
  10 +@Data
  11 +public class MesWmItemReceiptLineRespVO {
  12 +
  13 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  14 + private Long id;
  15 +
  16 + @Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  17 + private Long receiptId;
  18 +
  19 + @Schema(description = "到货通知单行编号", example = "1")
  20 + private Long noticeLineId;
  21 +
  22 + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  23 + private Long itemId;
  24 +
  25 + @Schema(description = "物料编码", example = "M001")
  26 + private String itemCode;
  27 +
  28 + @Schema(description = "物料名称", example = "钢板")
  29 + private String itemName;
  30 +
  31 + @Schema(description = "规格型号", example = "10mm*100mm")
  32 + private String specification;
  33 +
  34 + @Schema(description = "计量单位名称", example = "千克")
  35 + private String unitMeasureName;
  36 +
  37 + @Schema(description = "入库数量", example = "500.00")
  38 + private BigDecimal receivedQuantity;
  39 +
  40 + @Schema(description = "批次编号", example = "1")
  41 + private Long batchId;
  42 +
  43 + @Schema(description = "仓库编号", example = "1")
  44 + private Long warehouseId;
  45 +
  46 + @Schema(description = "仓库名称", example = "原料仓")
  47 + private String warehouseName;
  48 +
  49 + @Schema(description = "库区编号", example = "1")
  50 + private Long locationId;
  51 +
  52 + @Schema(description = "库区名称", example = "A 区")
  53 + private String locationName;
  54 +
  55 + @Schema(description = "库位编号", example = "1")
  56 + private Long areaId;
  57 +
  58 + @Schema(description = "库位名称", example = "A-01")
  59 + private String areaName;
  60 +
  61 + @Schema(description = "生产日期")
  62 + private LocalDateTime productionDate;
  63 +
  64 + @Schema(description = "有效期")
  65 + private LocalDateTime expireDate;
  66 +
  67 + @Schema(description = "生产批号", example = "PB20260110")
  68 + private String productionBatchNumber;
  69 +
  70 + @Schema(description = "是否需要来料检验", example = "true")
  71 + private Boolean iqcCheckFlag;
  72 +
  73 + @Schema(description = "来料检验单编号", example = "1")
  74 + private Long iqcId;
  75 +
  76 + @Schema(description = "来料检验单编码", example = "IQC20260201")
  77 + private String iqcCode;
  78 +
  79 + @Schema(description = "备注", example = "备注")
  80 + private String remark;
  81 +
  82 + @Schema(description = "预留字段1")
  83 + private String attribute1;
  84 +
  85 + @Schema(description = "预留字段2")
  86 + private String attribute2;
  87 +
  88 + @Schema(description = "预留字段3")
  89 + private Integer attribute3;
  90 +
  91 + @Schema(description = "预留字段4")
  92 + private Integer attribute4;
  93 +
  94 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  95 + private LocalDateTime createTime;
  96 +
  97 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotNull;
  5 +import lombok.Data;
  6 +
  7 +import java.math.BigDecimal;
  8 +import java.time.LocalDateTime;
  9 +
  10 +@Schema(description = "管理后台 - MES 采购入库单行新增/修改 Request VO")
  11 +@Data
  12 +public class MesWmItemReceiptLineSaveReqVO {
  13 +
  14 + @Schema(description = "编号", example = "1024")
  15 + private Long id;
  16 +
  17 + @Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  18 + @NotNull(message = "入库单编号不能为空")
  19 + private Long receiptId;
  20 +
  21 + @Schema(description = "到货通知单行编号", example = "1")
  22 + private Long noticeLineId;
  23 +
  24 + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  25 + @NotNull(message = "物料编号不能为空")
  26 + private Long itemId;
  27 +
  28 + @Schema(description = "入库数量", example = "500.00")
  29 + private BigDecimal receivedQuantity;
  30 +
  31 + @Schema(description = "批次编号", example = "1")
  32 + private Long batchId;
  33 +
  34 + @Schema(description = "仓库编号", example = "1")
  35 + private Long warehouseId;
  36 +
  37 + @Schema(description = "库区编号", example = "1")
  38 + private Long locationId;
  39 +
  40 + @Schema(description = "库位编号", example = "1")
  41 + private Long areaId;
  42 +
  43 + @Schema(description = "生产日期")
  44 + private LocalDateTime productionDate;
  45 +
  46 + @Schema(description = "有效期")
  47 + private LocalDateTime expireDate;
  48 +
  49 + @Schema(description = "生产批号", example = "PB20260110")
  50 + private String productionBatchNumber;
  51 +
  52 + @Schema(description = "是否需要来料检验", example = "true")
  53 + private Boolean iqcCheckFlag;
  54 +
  55 + @Schema(description = "来料检验单编号", example = "1")
  56 + private Long iqcId;
  57 +
  58 + @Schema(description = "备注", example = "备注")
  59 + private String remark;
  60 +
  61 + @Schema(description = "预留字段1")
  62 + private String attribute1;
  63 +
  64 + @Schema(description = "预留字段2")
  65 + private String attribute2;
  66 +
  67 + @Schema(description = "预留字段3")
  68 + private Integer attribute3;
  69 +
  70 + @Schema(description = "预留字段4")
  71 + private Integer attribute4;
  72 +
  73 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO;
  5 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
  8 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
  9 +import com.baomidou.mybatisplus.annotation.KeySequence;
  10 +import com.baomidou.mybatisplus.annotation.TableId;
  11 +import com.baomidou.mybatisplus.annotation.TableName;
  12 +import lombok.*;
  13 +
  14 +import java.time.LocalDateTime;
  15 +
  16 +/**
  17 + * MES 采购入库单 DO
  18 + */
  19 +@TableName("mes_wm_item_receipt")
  20 +@KeySequence("mes_wm_item_receipt_seq")
  21 +@Data
  22 +@EqualsAndHashCode(callSuper = true)
  23 +@ToString(callSuper = true)
  24 +@Builder
  25 +@NoArgsConstructor
  26 +@AllArgsConstructor
  27 +public class MesWmItemReceiptDO extends BaseDO {
  28 +
  29 + /**
  30 + * 编号
  31 + */
  32 + @TableId
  33 + private Long id;
  34 + /**
  35 + * 入库单编码
  36 + */
  37 + private String code;
  38 + /**
  39 + * 入库单名称
  40 + */
  41 + private String name;
  42 + // TODO @AI:关联字段;
  43 + /**
  44 + * 来料检验单编号
  45 + *
  46 + * 关联 mes_qc_iqc.id
  47 + */
  48 + private Long iqcId;
  49 + /**
  50 + * 到货通知单编号
  51 + *
  52 + * 关联 {@link MesWmArrivalNoticeDO#getId()}
  53 + */
  54 + private Long noticeId;
  55 + /**
  56 + * 采购订单编号
  57 + */
  58 + private String purchaseOrderCode;
  59 + /**
  60 + * 供应商编号
  61 + *
  62 + * 关联 {@link MesMdVendorDO#getId()}
  63 + */
  64 + private Long vendorId;
  65 + /**
  66 + * 仓库编号
  67 + *
  68 + * 关联 {@link MesWmWarehouseDO#getId()}
  69 + */
  70 + private Long warehouseId;
  71 + /**
  72 + * 库区编号
  73 + *
  74 + * 关联 {@link MesWmWarehouseLocationDO#getId()}
  75 + */
  76 + private Long locationId;
  77 + /**
  78 + * 库位编号
  79 + *
  80 + * 关联 {@link MesWmWarehouseAreaDO#getId()}
  81 + */
  82 + private Long areaId;
  83 + /**
  84 + * 入库日期
  85 + */
  86 + private LocalDateTime receiptDate;
  87 + // TODO @AI:枚举类;需要 @关联
  88 + // TODO @AI:字典类;需要 @关联
  89 + /**
  90 + * 状态
  91 + *
  92 + * 0=草稿 1=已提交 2=已审批 3=已完成
  93 + */
  94 + private Integer status;
  95 + /**
  96 + * 备注
  97 + */
  98 + private String remark;
  99 + /**
  100 + * 预留字段1
  101 + */
  102 + private String attribute1;
  103 + /**
  104 + * 预留字段2
  105 + */
  106 + private String attribute2;
  107 + /**
  108 + * 预留字段3
  109 + */
  110 + private Integer attribute3;
  111 + /**
  112 + * 预留字段4
  113 + */
  114 + private Integer attribute4;
  115 +
  116 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDetailDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  5 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
  8 +import com.baomidou.mybatisplus.annotation.KeySequence;
  9 +import com.baomidou.mybatisplus.annotation.TableId;
  10 +import com.baomidou.mybatisplus.annotation.TableName;
  11 +import lombok.*;
  12 +
  13 +import java.math.BigDecimal;
  14 +
  15 +/**
  16 + * MES 采购入库明细 DO
  17 + */
  18 +@TableName("mes_wm_item_receipt_detail")
  19 +@KeySequence("mes_wm_item_receipt_detail_seq")
  20 +@Data
  21 +@EqualsAndHashCode(callSuper = true)
  22 +@ToString(callSuper = true)
  23 +@Builder
  24 +@NoArgsConstructor
  25 +@AllArgsConstructor
  26 +public class MesWmItemReceiptDetailDO extends BaseDO {
  27 +
  28 + /**
  29 + * 编号
  30 + */
  31 + @TableId
  32 + private Long id;
  33 + /**
  34 + * 入库单行编号
  35 + *
  36 + * 关联 {@link MesWmItemReceiptLineDO#getId()}
  37 + */
  38 + private Long lineId;
  39 + /**
  40 + * 入库单编号
  41 + *
  42 + * 关联 {@link MesWmItemReceiptDO#getId()}
  43 + */
  44 + private Long receiptId;
  45 + /**
  46 + * 物料编号
  47 + *
  48 + * 关联 {@link MesMdItemDO#getId()}
  49 + */
  50 + private Long itemId;
  51 + /**
  52 + * 上架数量
  53 + */
  54 + private BigDecimal quantity;
  55 + /**
  56 + * 批次编号
  57 + *
  58 + * TODO @芋艿:待 mes_wm_batch 模块迁移后关联
  59 + */
  60 + private Long batchId;
  61 + /**
  62 + * 仓库编号
  63 + *
  64 + * 关联 {@link MesWmWarehouseDO#getId()}
  65 + */
  66 + private Long warehouseId;
  67 + /**
  68 + * 库区编号
  69 + *
  70 + * 关联 {@link MesWmWarehouseLocationDO#getId()}
  71 + */
  72 + private Long locationId;
  73 + /**
  74 + * 库位编号
  75 + *
  76 + * 关联 {@link MesWmWarehouseAreaDO#getId()}
  77 + */
  78 + private Long areaId;
  79 + /**
  80 + * 备注
  81 + */
  82 + private String remark;
  83 + /**
  84 + * 预留字段1
  85 + */
  86 + private String attribute1;
  87 + /**
  88 + * 预留字段2
  89 + */
  90 + private String attribute2;
  91 + /**
  92 + * 预留字段3
  93 + */
  94 + private Integer attribute3;
  95 + /**
  96 + * 预留字段4
  97 + */
  98 + private Integer attribute4;
  99 +
  100 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptLineDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  5 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
  8 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
  9 +import com.baomidou.mybatisplus.annotation.KeySequence;
  10 +import com.baomidou.mybatisplus.annotation.TableId;
  11 +import com.baomidou.mybatisplus.annotation.TableName;
  12 +import lombok.*;
  13 +
  14 +import java.math.BigDecimal;
  15 +import java.time.LocalDateTime;
  16 +
  17 +/**
  18 + * MES 采购入库单行 DO
  19 + */
  20 +@TableName("mes_wm_item_receipt_line")
  21 +@KeySequence("mes_wm_item_receipt_line_seq")
  22 +@Data
  23 +@EqualsAndHashCode(callSuper = true)
  24 +@ToString(callSuper = true)
  25 +@Builder
  26 +@NoArgsConstructor
  27 +@AllArgsConstructor
  28 +public class MesWmItemReceiptLineDO extends BaseDO {
  29 +
  30 + /**
  31 + * 编号
  32 + */
  33 + @TableId
  34 + private Long id;
  35 + /**
  36 + * 入库单编号
  37 + *
  38 + * 关联 {@link MesWmItemReceiptDO#getId()}
  39 + */
  40 + private Long receiptId;
  41 + /**
  42 + * 到货通知单行编号
  43 + *
  44 + * 关联 {@link MesWmArrivalNoticeLineDO#getId()}
  45 + */
  46 + private Long noticeLineId;
  47 + /**
  48 + * 物料编号
  49 + *
  50 + * 关联 {@link MesMdItemDO#getId()}
  51 + */
  52 + private Long itemId;
  53 + /**
  54 + * 入库数量
  55 + */
  56 + private BigDecimal receivedQuantity;
  57 + /**
  58 + * 批次编号
  59 + *
  60 + * TODO @芋艿:待 mes_wm_batch 模块迁移后关联
  61 + */
  62 + private Long batchId;
  63 + /**
  64 + * 仓库编号
  65 + *
  66 + * 关联 {@link MesWmWarehouseDO#getId()}
  67 + */
  68 + private Long warehouseId;
  69 + /**
  70 + * 库区编号
  71 + *
  72 + * 关联 {@link MesWmWarehouseLocationDO#getId()}
  73 + */
  74 + private Long locationId;
  75 + /**
  76 + * 库位编号
  77 + *
  78 + * 关联 {@link MesWmWarehouseAreaDO#getId()}
  79 + */
  80 + private Long areaId;
  81 + /**
  82 + * 生产日期
  83 + */
  84 + private LocalDateTime productionDate;
  85 + /**
  86 + * 有效期
  87 + */
  88 + private LocalDateTime expireDate;
  89 + /**
  90 + * 生产批号
  91 + */
  92 + private String productionBatchNumber;
  93 + /**
  94 + * 是否需要来料检验
  95 + */
  96 + private Boolean iqcCheckFlag;
  97 + // TODO @AI:关联下 iqcId 字段
  98 + /**
  99 + * 来料检验单编号
  100 + *
  101 + * 关联 mes_qc_iqc.id
  102 + */
  103 + private Long iqcId;
  104 + /**
  105 + * 备注
  106 + */
  107 + private String remark;
  108 + /**
  109 + * 预留字段1
  110 + */
  111 + private String attribute1;
  112 + /**
  113 + * 预留字段2
  114 + */
  115 + private String attribute2;
  116 + /**
  117 + * 预留字段3
  118 + */
  119 + private Integer attribute3;
  120 + /**
  121 + * 预留字段4
  122 + */
  123 + private Integer attribute4;
  124 +
  125 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemreceipt/MesWmItemReceiptDetailMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailPageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * MES 采购入库明细 Mapper
  14 + */
  15 +@Mapper
  16 +public interface MesWmItemReceiptDetailMapper extends BaseMapperX<MesWmItemReceiptDetailDO> {
  17 +
  18 + default PageResult<MesWmItemReceiptDetailDO> selectPage(MesWmItemReceiptDetailPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmItemReceiptDetailDO>()
  20 + .eqIfPresent(MesWmItemReceiptDetailDO::getReceiptId, reqVO.getReceiptId())
  21 + .eqIfPresent(MesWmItemReceiptDetailDO::getLineId, reqVO.getLineId())
  22 + .orderByDesc(MesWmItemReceiptDetailDO::getId));
  23 + }
  24 +
  25 + default List<MesWmItemReceiptDetailDO> selectListByReceiptId(Long receiptId) {
  26 + return selectList(MesWmItemReceiptDetailDO::getReceiptId, receiptId);
  27 + }
  28 +
  29 + default List<MesWmItemReceiptDetailDO> selectListByLineId(Long lineId) {
  30 + return selectList(MesWmItemReceiptDetailDO::getLineId, lineId);
  31 + }
  32 +
  33 + default void deleteByReceiptId(Long receiptId) {
  34 + delete(MesWmItemReceiptDetailDO::getReceiptId, receiptId);
  35 + }
  36 +
  37 + default void deleteByLineId(Long lineId) {
  38 + delete(MesWmItemReceiptDetailDO::getLineId, lineId);
  39 + }
  40 +
  41 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemreceipt/MesWmItemReceiptLineMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLinePageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * MES 采购入库单行 Mapper
  14 + */
  15 +@Mapper
  16 +public interface MesWmItemReceiptLineMapper extends BaseMapperX<MesWmItemReceiptLineDO> {
  17 +
  18 + default PageResult<MesWmItemReceiptLineDO> selectPage(MesWmItemReceiptLinePageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmItemReceiptLineDO>()
  20 + .eqIfPresent(MesWmItemReceiptLineDO::getReceiptId, reqVO.getReceiptId())
  21 + .orderByDesc(MesWmItemReceiptLineDO::getId));
  22 + }
  23 +
  24 + default List<MesWmItemReceiptLineDO> selectListByReceiptId(Long receiptId) {
  25 + return selectList(MesWmItemReceiptLineDO::getReceiptId, receiptId);
  26 + }
  27 +
  28 + default void deleteByReceiptId(Long receiptId) {
  29 + delete(MesWmItemReceiptLineDO::getReceiptId, receiptId);
  30 + }
  31 +
  32 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemreceipt/MesWmItemReceiptMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +/**
  11 + * MES 采购入库单 Mapper
  12 + */
  13 +@Mapper
  14 +public interface MesWmItemReceiptMapper extends BaseMapperX<MesWmItemReceiptDO> {
  15 +
  16 + default PageResult<MesWmItemReceiptDO> selectPage(MesWmItemReceiptPageReqVO reqVO) {
  17 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmItemReceiptDO>()
  18 + .likeIfPresent(MesWmItemReceiptDO::getCode, reqVO.getCode())
  19 + .likeIfPresent(MesWmItemReceiptDO::getName, reqVO.getName())
  20 + .likeIfPresent(MesWmItemReceiptDO::getPurchaseOrderCode, reqVO.getPurchaseOrderCode())
  21 + .eqIfPresent(MesWmItemReceiptDO::getVendorId, reqVO.getVendorId())
  22 + .eqIfPresent(MesWmItemReceiptDO::getStatus, reqVO.getStatus())
  23 + .orderByDesc(MesWmItemReceiptDO::getId));
  24 + }
  25 +
  26 + default MesWmItemReceiptDO selectByCode(String code) {
  27 + return selectOne(MesWmItemReceiptDO::getCode, code);
  28 + }
  29 +
  30 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailPageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO;
  7 +import jakarta.validation.Valid;
  8 +
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * MES 采购入库明细 Service 接口
  13 + */
  14 +public interface MesWmItemReceiptDetailService {
  15 +
  16 + /**
  17 + * 创建采购入库明细
  18 + *
  19 + * @param createReqVO 创建信息
  20 + * @return 编号
  21 + */
  22 + Long createItemReceiptDetail(@Valid MesWmItemReceiptDetailSaveReqVO createReqVO);
  23 +
  24 + /**
  25 + * 修改采购入库明细
  26 + *
  27 + * @param updateReqVO 修改信息
  28 + */
  29 + void updateItemReceiptDetail(@Valid MesWmItemReceiptDetailSaveReqVO updateReqVO);
  30 +
  31 + /**
  32 + * 删除采购入库明细
  33 + *
  34 + * @param id 编号
  35 + */
  36 + void deleteItemReceiptDetail(Long id);
  37 +
  38 + /**
  39 + * 获得采购入库明细
  40 + *
  41 + * @param id 编号
  42 + * @return 采购入库明细
  43 + */
  44 + MesWmItemReceiptDetailDO getItemReceiptDetail(Long id);
  45 +
  46 + /**
  47 + * 获得采购入库明细分页
  48 + *
  49 + * @param pageReqVO 分页参数
  50 + * @return 采购入库明细分页
  51 + */
  52 + PageResult<MesWmItemReceiptDetailDO> getItemReceiptDetailPage(MesWmItemReceiptDetailPageReqVO pageReqVO);
  53 +
  54 + /**
  55 + * 按入库单行编号获得明细列表
  56 + *
  57 + * @param lineId 行编号
  58 + * @return 明细列表
  59 + */
  60 + List<MesWmItemReceiptDetailDO> getItemReceiptDetailListByLineId(Long lineId);
  61 +
  62 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailPageReqVO;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailSaveReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO;
  8 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptDetailMapper;
  9 +import jakarta.annotation.Resource;
  10 +import org.springframework.stereotype.Service;
  11 +import org.springframework.validation.annotation.Validated;
  12 +
  13 +import java.util.List;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  16 +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_ITEM_RECEIPT_DETAIL_NOT_EXISTS;
  17 +
  18 +/**
  19 + * MES 采购入库明细 Service 实现类
  20 + */
  21 +@Service
  22 +@Validated
  23 +public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetailService {
  24 +
  25 + @Resource
  26 + private MesWmItemReceiptDetailMapper itemReceiptDetailMapper;
  27 +
  28 + @Override
  29 + public Long createItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO createReqVO) {
  30 + // TODO @AI:校验关联字段;
  31 + MesWmItemReceiptDetailDO detail = BeanUtils.toBean(createReqVO, MesWmItemReceiptDetailDO.class);
  32 + itemReceiptDetailMapper.insert(detail);
  33 + return detail.getId();
  34 + }
  35 +
  36 + @Override
  37 + public void updateItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO updateReqVO) {
  38 + // 校验存在
  39 + validateItemReceiptDetailExists(updateReqVO.getId());
  40 + // TODO @AI:校验关联字段;
  41 +
  42 + // 更新
  43 + MesWmItemReceiptDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptDetailDO.class);
  44 + itemReceiptDetailMapper.updateById(updateObj);
  45 + }
  46 +
  47 + @Override
  48 + public void deleteItemReceiptDetail(Long id) {
  49 + // 校验存在
  50 + validateItemReceiptDetailExists(id);
  51 + // 删除
  52 + itemReceiptDetailMapper.deleteById(id);
  53 + }
  54 +
  55 + @Override
  56 + public MesWmItemReceiptDetailDO getItemReceiptDetail(Long id) {
  57 + return itemReceiptDetailMapper.selectById(id);
  58 + }
  59 +
  60 + @Override
  61 + public PageResult<MesWmItemReceiptDetailDO> getItemReceiptDetailPage(MesWmItemReceiptDetailPageReqVO pageReqVO) {
  62 + return itemReceiptDetailMapper.selectPage(pageReqVO);
  63 + }
  64 +
  65 + @Override
  66 + public List<MesWmItemReceiptDetailDO> getItemReceiptDetailListByLineId(Long lineId) {
  67 + return itemReceiptDetailMapper.selectListByLineId(lineId);
  68 + }
  69 +
  70 + private void validateItemReceiptDetailExists(Long id) {
  71 + if (itemReceiptDetailMapper.selectById(id) == null) {
  72 + throw exception(WM_ITEM_RECEIPT_DETAIL_NOT_EXISTS);
  73 + }
  74 + }
  75 +
  76 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLinePageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLineSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO;
  7 +import jakarta.validation.Valid;
  8 +
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * MES 采购入库单行 Service 接口
  13 + */
  14 +public interface MesWmItemReceiptLineService {
  15 +
  16 + /**
  17 + * 创建采购入库单行
  18 + *
  19 + * @param createReqVO 创建信息
  20 + * @return 编号
  21 + */
  22 + Long createItemReceiptLine(@Valid MesWmItemReceiptLineSaveReqVO createReqVO);
  23 +
  24 + /**
  25 + * 修改采购入库单行
  26 + *
  27 + * @param updateReqVO 修改信息
  28 + */
  29 + void updateItemReceiptLine(@Valid MesWmItemReceiptLineSaveReqVO updateReqVO);
  30 +
  31 + /**
  32 + * 删除采购入库单行(级联删除明细)
  33 + *
  34 + * @param id 编号
  35 + */
  36 + void deleteItemReceiptLine(Long id);
  37 +
  38 + /**
  39 + * 获得采购入库单行
  40 + *
  41 + * @param id 编号
  42 + * @return 采购入库单行
  43 + */
  44 + MesWmItemReceiptLineDO getItemReceiptLine(Long id);
  45 +
  46 + /**
  47 + * 获得采购入库单行分页
  48 + *
  49 + * @param pageReqVO 分页参数
  50 + * @return 采购入库单行分页
  51 + */
  52 + PageResult<MesWmItemReceiptLineDO> getItemReceiptLinePage(MesWmItemReceiptLinePageReqVO pageReqVO);
  53 +
  54 + /**
  55 + * 按入库单编号获得行列表
  56 + *
  57 + * @param receiptId 入库单编号
  58 + * @return 行列表
  59 + */
  60 + List<MesWmItemReceiptLineDO> getItemReceiptLineListByReceiptId(Long receiptId);
  61 +
  62 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLinePageReqVO;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLineSaveReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO;
  8 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptDetailMapper;
  9 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptLineMapper;
  10 +import jakarta.annotation.Resource;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.transaction.annotation.Transactional;
  13 +import org.springframework.validation.annotation.Validated;
  14 +
  15 +import java.util.List;
  16 +
  17 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  18 +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_ITEM_RECEIPT_LINE_NOT_EXISTS;
  19 +
  20 +/**
  21 + * MES 采购入库单行 Service 实现类
  22 + */
  23 +@Service
  24 +@Validated
  25 +public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineService {
  26 +
  27 + @Resource
  28 + private MesWmItemReceiptLineMapper itemReceiptLineMapper;
  29 +
  30 + @Resource
  31 + private MesWmItemReceiptDetailMapper itemReceiptDetailMapper;
  32 +
  33 + @Override
  34 + public Long createItemReceiptLine(MesWmItemReceiptLineSaveReqVO createReqVO) {
  35 + // TODO @AI:校验关联字段;
  36 +
  37 + // 新增
  38 + MesWmItemReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmItemReceiptLineDO.class);
  39 + itemReceiptLineMapper.insert(line);
  40 + return line.getId();
  41 + }
  42 +
  43 + @Override
  44 + public void updateItemReceiptLine(MesWmItemReceiptLineSaveReqVO updateReqVO) {
  45 + // 校验存在
  46 + validateItemReceiptLineExists(updateReqVO.getId());
  47 + // TODO @AI:校验关联字段;
  48 +
  49 + // 更新
  50 + MesWmItemReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptLineDO.class);
  51 + itemReceiptLineMapper.updateById(updateObj);
  52 + }
  53 +
  54 + @Override
  55 + @Transactional(rollbackFor = Exception.class)
  56 + public void deleteItemReceiptLine(Long id) {
  57 + // 校验存在
  58 + validateItemReceiptLineExists(id);
  59 +
  60 + // 级联删除明细
  61 + itemReceiptDetailMapper.deleteByLineId(id);
  62 + // 删除
  63 + itemReceiptLineMapper.deleteById(id);
  64 + }
  65 +
  66 + @Override
  67 + public MesWmItemReceiptLineDO getItemReceiptLine(Long id) {
  68 + return itemReceiptLineMapper.selectById(id);
  69 + }
  70 +
  71 + @Override
  72 + public PageResult<MesWmItemReceiptLineDO> getItemReceiptLinePage(MesWmItemReceiptLinePageReqVO pageReqVO) {
  73 + return itemReceiptLineMapper.selectPage(pageReqVO);
  74 + }
  75 +
  76 + @Override
  77 + public List<MesWmItemReceiptLineDO> getItemReceiptLineListByReceiptId(Long receiptId) {
  78 + return itemReceiptLineMapper.selectListByReceiptId(receiptId);
  79 + }
  80 +
  81 + private void validateItemReceiptLineExists(Long id) {
  82 + if (itemReceiptLineMapper.selectById(id) == null) {
  83 + throw exception(WM_ITEM_RECEIPT_LINE_NOT_EXISTS);
  84 + }
  85 + }
  86 +
  87 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO;
  7 +import jakarta.validation.Valid;
  8 +
  9 +/**
  10 + * MES 采购入库单 Service 接口
  11 + */
  12 +public interface MesWmItemReceiptService {
  13 +
  14 + /**
  15 + * 创建采购入库单
  16 + *
  17 + * @param createReqVO 创建信息
  18 + * @return 编号
  19 + */
  20 + Long createItemReceipt(@Valid MesWmItemReceiptSaveReqVO createReqVO);
  21 +
  22 + /**
  23 + * 修改采购入库单
  24 + *
  25 + * @param updateReqVO 修改信息
  26 + */
  27 + void updateItemReceipt(@Valid MesWmItemReceiptSaveReqVO updateReqVO);
  28 +
  29 + /**
  30 + * 删除采购入库单(级联删除行+明细)
  31 + *
  32 + * @param id 编号
  33 + */
  34 + void deleteItemReceipt(Long id);
  35 +
  36 + /**
  37 + * 获得采购入库单
  38 + *
  39 + * @param id 编号
  40 + * @return 采购入库单
  41 + */
  42 + MesWmItemReceiptDO getItemReceipt(Long id);
  43 +
  44 + /**
  45 + * 获得采购入库单分页
  46 + *
  47 + * @param pageReqVO 分页参数
  48 + * @return 采购入库单分页
  49 + */
  50 + PageResult<MesWmItemReceiptDO> getItemReceiptPage(MesWmItemReceiptPageReqVO pageReqVO);
  51 +
  52 + // TODO @AI:0-》1、1-》2 尽量写状态;不要写这种;
  53 + /**
  54 + * 提交采购入库单(0→1)
  55 + *
  56 + * @param id 编号
  57 + */
  58 + void submitItemReceipt(Long id);
  59 +
  60 + // TODO @AI:0-》1、1-》2 尽量写状态;不要写这种;
  61 + /**
  62 + * 审批采购入库单(1→2)
  63 + *
  64 + * @param id 编号
  65 + */
  66 + void approveItemReceipt(Long id);
  67 +
  68 + // TODO @AI:0-》1、1-》2 尽量写状态;不要写这种;
  69 + /**
  70 + * 执行入库(2→3),更新库存台账
  71 + *
  72 + * @param id 编号
  73 + */
  74 + void executeItemReceipt(Long id);
  75 +
  76 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.itemreceipt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptSaveReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO;
  8 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO;
  9 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO;
  10 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptDetailMapper;
  11 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptLineMapper;
  12 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptMapper;
  13 +import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService;
  14 +import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
  15 +import jakarta.annotation.Resource;
  16 +import org.springframework.context.annotation.Lazy;
  17 +import org.springframework.stereotype.Service;
  18 +import org.springframework.transaction.annotation.Transactional;
  19 +import org.springframework.validation.annotation.Validated;
  20 +
  21 +import java.math.BigDecimal;
  22 +import java.util.List;
  23 +
  24 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  25 +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
  26 +
  27 +/**
  28 + * MES 采购入库单 Service 实现类
  29 + */
  30 +@Service
  31 +@Validated
  32 +public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService {
  33 +
  34 + @Resource
  35 + private MesWmItemReceiptMapper itemReceiptMapper;
  36 +
  37 + @Resource
  38 + private MesWmItemReceiptLineMapper itemReceiptLineMapper;
  39 +
  40 + @Resource
  41 + private MesWmItemReceiptDetailMapper itemReceiptDetailMapper;
  42 +
  43 + @Resource
  44 + @Lazy
  45 + private MesWmArrivalNoticeService arrivalNoticeService;
  46 +
  47 + @Resource
  48 + private MesWmMaterialStockService materialStockService;
  49 +
  50 + @Override
  51 + public Long createItemReceipt(MesWmItemReceiptSaveReqVO createReqVO) {
  52 + // 校验编码唯一
  53 + validateCodeUnique(null, createReqVO.getCode());
  54 + // TODO @AI:校验关联字段;
  55 +
  56 + // 插入
  57 + MesWmItemReceiptDO receipt = BeanUtils.toBean(createReqVO, MesWmItemReceiptDO.class);
  58 + receipt.setStatus(0); // 草稿 TODO @AI:使用枚举类
  59 + itemReceiptMapper.insert(receipt);
  60 + return receipt.getId();
  61 + }
  62 +
  63 + @Override
  64 + public void updateItemReceipt(MesWmItemReceiptSaveReqVO updateReqVO) {
  65 + // 校验存在
  66 + MesWmItemReceiptDO receipt = validateItemReceiptExists(updateReqVO.getId());
  67 + // TODO @AI:校验关联字段;
  68 + // 校验状态:只有草稿才允许修改
  69 + // TODO @AI:校验状态,看看抽个方法,尽量几个方法复用
  70 + if (receipt.getStatus() != 0) {
  71 + throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE);
  72 + }
  73 + // 校验编码唯一
  74 + validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
  75 +
  76 + // 更新
  77 + MesWmItemReceiptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptDO.class);
  78 + itemReceiptMapper.updateById(updateObj);
  79 + }
  80 +
  81 + @Override
  82 + @Transactional(rollbackFor = Exception.class)
  83 + public void deleteItemReceipt(Long id) {
  84 + // 校验存在
  85 + MesWmItemReceiptDO receipt = validateItemReceiptExists(id);
  86 + // 校验状态:只有草稿才允许删除
  87 + // TODO @AI:校验状态,看看抽个方法,尽量几个方法复用
  88 + if (receipt.getStatus() != 0) {
  89 + throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE);
  90 + }
  91 +
  92 + // 级联删除明细和行
  93 + itemReceiptDetailMapper.deleteByReceiptId(id);
  94 + itemReceiptLineMapper.deleteByReceiptId(id);
  95 + // 删除
  96 + itemReceiptMapper.deleteById(id);
  97 + }
  98 +
  99 + @Override
  100 + public MesWmItemReceiptDO getItemReceipt(Long id) {
  101 + return itemReceiptMapper.selectById(id);
  102 + }
  103 +
  104 + @Override
  105 + public PageResult<MesWmItemReceiptDO> getItemReceiptPage(MesWmItemReceiptPageReqVO pageReqVO) {
  106 + return itemReceiptMapper.selectPage(pageReqVO);
  107 + }
  108 +
  109 + @Override
  110 + public void submitItemReceipt(Long id) {
  111 + // 校验存在
  112 + MesWmItemReceiptDO receipt = validateItemReceiptExists(id);
  113 + // TODO @AI:校验状态,看看抽个方法,尽量几个方法复用
  114 + if (receipt.getStatus() != 0) {
  115 + throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE);
  116 + }
  117 + // 校验至少有一条行
  118 + // TODO @AI:对方抽个计算数量的方法啊;
  119 + List<MesWmItemReceiptLineDO> lines = itemReceiptLineMapper.selectListByReceiptId(id);
  120 + if (lines.isEmpty()) {
  121 + throw exception(WM_ITEM_RECEIPT_NO_LINE);
  122 + }
  123 +
  124 + // 提交
  125 + itemReceiptMapper.updateById(new MesWmItemReceiptDO().setId(id).setStatus(1));
  126 + }
  127 +
  128 + @Override
  129 + public void approveItemReceipt(Long id) {
  130 + // 校验存在
  131 + MesWmItemReceiptDO receipt = validateItemReceiptExists(id);
  132 + // TODO @AI:抽一些校验的存在+状态方法
  133 + if (receipt.getStatus() != 1) {
  134 + throw exception(WM_ITEM_RECEIPT_STATUS_ERROR);
  135 + }
  136 + // 校验每行的 SUM(detail.quantity) = line.receivedQuantity
  137 + // TODO @AI:抽个计算的 count 方法,然后在行和明细都用;不然代码里到处都是计算的逻辑;
  138 + List<MesWmItemReceiptLineDO> lines = itemReceiptLineMapper.selectListByReceiptId(id);
  139 + for (MesWmItemReceiptLineDO line : lines) {
  140 + List<MesWmItemReceiptDetailDO> details = itemReceiptDetailMapper.selectListByLineId(line.getId());
  141 + BigDecimal totalDetailQty = details.stream()
  142 + .map(MesWmItemReceiptDetailDO::getQuantity)
  143 + .reduce(BigDecimal.ZERO, BigDecimal::add);
  144 + if (line.getReceivedQuantity() != null && totalDetailQty.compareTo(line.getReceivedQuantity()) != 0) {
  145 + throw exception(WM_ITEM_RECEIPT_DETAIL_QUANTITY_MISMATCH);
  146 + }
  147 + }
  148 +
  149 + // 审批
  150 + itemReceiptMapper.updateById(new MesWmItemReceiptDO().setId(id).setStatus(2));
  151 + }
  152 +
  153 + @Override
  154 + @Transactional(rollbackFor = Exception.class)
  155 + public void executeItemReceipt(Long id) {
  156 + // 校验存在
  157 + MesWmItemReceiptDO receipt = validateItemReceiptExists(id);
  158 + // TODO @AI:抽一些校验的存在+状态方法
  159 + if (receipt.getStatus() != 2) {
  160 + throw exception(WM_ITEM_RECEIPT_STATUS_ERROR);
  161 + }
  162 +
  163 + // 遍历所有明细,更新库存台账
  164 + // TODO @AI:select 方法,对方搞个;
  165 + List<MesWmItemReceiptDetailDO> details = itemReceiptDetailMapper.selectListByReceiptId(id);
  166 + for (MesWmItemReceiptDetailDO detail : details) {
  167 + materialStockService.increaseStock(
  168 + detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(),
  169 + detail.getBatchId(), detail.getQuantity(), receipt.getVendorId(), null, null);
  170 + }
  171 +
  172 + // 更新入库单状态
  173 + // TODO @AI:枚举类;
  174 + itemReceiptMapper.updateById(new MesWmItemReceiptDO().setId(id).setStatus(3));
  175 + // 更新关联的到货通知单状态
  176 + if (receipt.getNoticeId() != null) {
  177 + arrivalNoticeService.finishArrivalNotice(receipt.getNoticeId());
  178 + }
  179 + }
  180 +
  181 + private MesWmItemReceiptDO validateItemReceiptExists(Long id) {
  182 + MesWmItemReceiptDO receipt = itemReceiptMapper.selectById(id);
  183 + if (receipt == null) {
  184 + throw exception(WM_ITEM_RECEIPT_NOT_EXISTS);
  185 + }
  186 + return receipt;
  187 + }
  188 +
  189 + private void validateCodeUnique(Long id, String code) {
  190 + MesWmItemReceiptDO receipt = itemReceiptMapper.selectByCode(code);
  191 + if (receipt == null) {
  192 + return;
  193 + }
  194 + // TODO @AI:ObjUtil notEquals
  195 + if (id == null || !id.equals(receipt.getId())) {
  196 + throw exception(WM_ITEM_RECEIPT_CODE_DUPLICATE);
  197 + }
  198 + }
  199 +
  200 +}
... ...