Commit 724c527ab0d475b235af2f0ade6aebadbdd72e47

Authored by YunaiV
1 parent f5e61242

✨ feat(mes): 添加产品收货单及行相关功能和数据结构

新增产品收货单及行的相关数据对象、请求和响应 VO,以及对应的服务和控制器接口。实现了产品收货单的创建、更新、删除和查询功能,支持与物料、仓库等模块的关联,提升了系统的可扩展性和可维护性。
Showing 28 changed files with 1987 additions and 0 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/MesWmProductRecptController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt;
  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.productrecpt.vo.MesWmProductRecptPageReqVO;
  12 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptRespVO;
  13 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptSaveReqVO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  15 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  16 +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
  17 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDO;
  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.pro.workorder.MesProWorkOrderService;
  21 +import cn.iocoder.yudao.module.mes.service.wm.productrecpt.MesWmProductRecptService;
  22 +import io.swagger.v3.oas.annotations.Operation;
  23 +import io.swagger.v3.oas.annotations.Parameter;
  24 +import io.swagger.v3.oas.annotations.tags.Tag;
  25 +import jakarta.annotation.Resource;
  26 +import jakarta.servlet.http.HttpServletResponse;
  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.io.IOException;
  33 +import java.util.Collections;
  34 +import java.util.List;
  35 +import java.util.Map;
  36 +
  37 +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
  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/product-recpt")
  44 +@Validated
  45 +public class MesWmProductRecptController {
  46 +
  47 + @Resource
  48 + private MesWmProductRecptService productRecptService;
  49 +
  50 + @Resource
  51 + private MesProWorkOrderService workOrderService;
  52 +
  53 + @Resource
  54 + private MesMdItemService itemService;
  55 +
  56 + @Resource
  57 + private MesMdUnitMeasureService unitMeasureService;
  58 +
  59 + @PostMapping("/create")
  60 + @Operation(summary = "创建产品收货单")
  61 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:create')")
  62 + public CommonResult<Long> createProductRecpt(@Valid @RequestBody MesWmProductRecptSaveReqVO createReqVO) {
  63 + return success(productRecptService.createProductRecpt(createReqVO));
  64 + }
  65 +
  66 + @PutMapping("/update")
  67 + @Operation(summary = "修改产品收货单")
  68 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')")
  69 + public CommonResult<Boolean> updateProductRecpt(@Valid @RequestBody MesWmProductRecptSaveReqVO updateReqVO) {
  70 + productRecptService.updateProductRecpt(updateReqVO);
  71 + return success(true);
  72 + }
  73 +
  74 + @DeleteMapping("/delete")
  75 + @Operation(summary = "删除产品收货单")
  76 + @Parameter(name = "id", description = "编号", required = true)
  77 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:delete')")
  78 + public CommonResult<Boolean> deleteProductRecpt(@RequestParam("id") Long id) {
  79 + productRecptService.deleteProductRecpt(id);
  80 + return success(true);
  81 + }
  82 +
  83 + @GetMapping("/get")
  84 + @Operation(summary = "获得产品收货单")
  85 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  86 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')")
  87 + public CommonResult<MesWmProductRecptRespVO> getProductRecpt(@RequestParam("id") Long id) {
  88 + MesWmProductRecptDO recpt = productRecptService.getProductRecpt(id);
  89 + if (recpt == null) {
  90 + return success(null);
  91 + }
  92 + return success(buildRespVOList(Collections.singletonList(recpt)).get(0));
  93 + }
  94 +
  95 + @GetMapping("/page")
  96 + @Operation(summary = "获得产品收货单分页")
  97 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')")
  98 + public CommonResult<PageResult<MesWmProductRecptRespVO>> getProductRecptPage(
  99 + @Valid MesWmProductRecptPageReqVO pageReqVO) {
  100 + PageResult<MesWmProductRecptDO> pageResult = productRecptService.getProductRecptPage(pageReqVO);
  101 + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
  102 + }
  103 +
  104 + @GetMapping("/export-excel")
  105 + @Operation(summary = "导出产品收货单 Excel")
  106 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:export')")
  107 + @ApiAccessLog(operateType = EXPORT)
  108 + public void exportProductRecptExcel(@Valid MesWmProductRecptPageReqVO pageReqVO,
  109 + HttpServletResponse response) throws IOException {
  110 + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
  111 + PageResult<MesWmProductRecptDO> pageResult = productRecptService.getProductRecptPage(pageReqVO);
  112 + ExcelUtils.write(response, "产品收货单.xls", "数据", MesWmProductRecptRespVO.class,
  113 + buildRespVOList(pageResult.getList()));
  114 + }
  115 +
  116 + @PutMapping("/submit")
  117 + @Operation(summary = "提交产品收货单")
  118 + @Parameter(name = "id", description = "编号", required = true)
  119 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')")
  120 + public CommonResult<Boolean> submitProductRecpt(@RequestParam("id") Long id) {
  121 + productRecptService.submitProductRecpt(id);
  122 + return success(true);
  123 + }
  124 +
  125 + @PutMapping("/stock")
  126 + @Operation(summary = "执行上架")
  127 + @Parameter(name = "id", description = "编号", required = true)
  128 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')")
  129 + public CommonResult<Boolean> stockProductRecpt(@RequestParam("id") Long id) {
  130 + productRecptService.stockProductRecpt(id);
  131 + return success(true);
  132 + }
  133 +
  134 + @PutMapping("/execute")
  135 + @Operation(summary = "执行入库")
  136 + @Parameter(name = "id", description = "编号", required = true)
  137 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:execute')")
  138 + public CommonResult<Boolean> executeProductRecpt(@RequestParam("id") Long id) {
  139 + productRecptService.executeProductRecpt(id);
  140 + return success(true);
  141 + }
  142 +
  143 + @PutMapping("/cancel")
  144 + @Operation(summary = "取消产品收货单")
  145 + @Parameter(name = "id", description = "编号", required = true)
  146 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')")
  147 + public CommonResult<Boolean> cancelProductRecpt(@RequestParam("id") Long id) {
  148 + productRecptService.cancelProductRecpt(id);
  149 + return success(true);
  150 + }
  151 +
  152 + // ==================== 拼接 VO ====================
  153 +
  154 + private List<MesWmProductRecptRespVO> buildRespVOList(List<MesWmProductRecptDO> list) {
  155 + if (CollUtil.isEmpty(list)) {
  156 + return Collections.emptyList();
  157 + }
  158 + // 1. 获得关联数据
  159 + Map<Long, MesProWorkOrderDO> workOrderMap = workOrderService.getWorkOrderMap(
  160 + convertSet(list, MesWmProductRecptDO::getWorkOrderId));
  161 + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
  162 + convertSet(list, MesWmProductRecptDO::getItemId));
  163 + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
  164 + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
  165 + // 2. 构建结果
  166 + return BeanUtils.toBean(list, MesWmProductRecptRespVO.class, vo -> {
  167 + MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(),
  168 + workOrder -> vo.setWorkOrderCode(workOrder.getCode()));
  169 + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
  170 + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
  171 + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
  172 + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName()));
  173 + });
  174 + });
  175 + }
  176 +
  177 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/MesWmProductRecptDetailController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  6 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  7 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.detail.MesWmProductRecptDetailRespVO;
  8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.detail.MesWmProductRecptDetailSaveReqVO;
  9 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  10 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDetailDO;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
  15 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  16 +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
  17 +import cn.iocoder.yudao.module.mes.service.wm.productrecpt.MesWmProductRecptDetailService;
  18 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
  19 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
  20 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
  21 +import io.swagger.v3.oas.annotations.Operation;
  22 +import io.swagger.v3.oas.annotations.Parameter;
  23 +import io.swagger.v3.oas.annotations.tags.Tag;
  24 +import jakarta.annotation.Resource;
  25 +import jakarta.validation.Valid;
  26 +import org.springframework.security.access.prepost.PreAuthorize;
  27 +import org.springframework.validation.annotation.Validated;
  28 +import org.springframework.web.bind.annotation.*;
  29 +
  30 +import java.util.Collections;
  31 +import java.util.List;
  32 +import java.util.Map;
  33 +
  34 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  35 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  36 +
  37 +@Tag(name = "管理后台 - MES 产品收货单明细")
  38 +@RestController
  39 +@RequestMapping("/mes/wm/product-recpt-detail")
  40 +@Validated
  41 +public class MesWmProductRecptDetailController {
  42 +
  43 + @Resource
  44 + private MesWmProductRecptDetailService productRecptDetailService;
  45 +
  46 + @Resource
  47 + private MesMdItemService itemService;
  48 +
  49 + @Resource
  50 + private MesMdUnitMeasureService unitMeasureService;
  51 +
  52 + @Resource
  53 + private MesWmWarehouseService warehouseService;
  54 +
  55 + @Resource
  56 + private MesWmWarehouseLocationService locationService;
  57 +
  58 + @Resource
  59 + private MesWmWarehouseAreaService areaService;
  60 +
  61 + @PostMapping("/create")
  62 + @Operation(summary = "创建产品收货单明细")
  63 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:create')")
  64 + public CommonResult<Long> createProductRecptDetail(@Valid @RequestBody MesWmProductRecptDetailSaveReqVO createReqVO) {
  65 + return success(productRecptDetailService.createProductRecptDetail(createReqVO));
  66 + }
  67 +
  68 + @PutMapping("/update")
  69 + @Operation(summary = "修改产品收货单明细")
  70 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')")
  71 + public CommonResult<Boolean> updateProductRecptDetail(@Valid @RequestBody MesWmProductRecptDetailSaveReqVO updateReqVO) {
  72 + productRecptDetailService.updateProductRecptDetail(updateReqVO);
  73 + return success(true);
  74 + }
  75 +
  76 + @DeleteMapping("/delete")
  77 + @Operation(summary = "删除产品收货单明细")
  78 + @Parameter(name = "id", description = "编号", required = true)
  79 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:delete')")
  80 + public CommonResult<Boolean> deleteProductRecptDetail(@RequestParam("id") Long id) {
  81 + productRecptDetailService.deleteProductRecptDetail(id);
  82 + return success(true);
  83 + }
  84 +
  85 + @GetMapping("/get")
  86 + @Operation(summary = "获得产品收货单明细")
  87 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  88 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')")
  89 + public CommonResult<MesWmProductRecptDetailRespVO> getProductRecptDetail(@RequestParam("id") Long id) {
  90 + MesWmProductRecptDetailDO detail = productRecptDetailService.getProductRecptDetail(id);
  91 + if (detail == null) {
  92 + return success(null);
  93 + }
  94 + return success(buildRespVOList(Collections.singletonList(detail)).get(0));
  95 + }
  96 +
  97 + @GetMapping("/list-by-line")
  98 + @Operation(summary = "获得产品收货单明细列表(按行编号)")
  99 + @Parameter(name = "lineId", description = "行编号", required = true, example = "1024")
  100 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')")
  101 + public CommonResult<List<MesWmProductRecptDetailRespVO>> getProductRecptDetailListByLineId(
  102 + @RequestParam("lineId") Long lineId) {
  103 + List<MesWmProductRecptDetailDO> list = productRecptDetailService.getProductRecptDetailListByLineId(lineId);
  104 + return success(buildRespVOList(list));
  105 + }
  106 +
  107 + // ==================== 拼接 VO ====================
  108 +
  109 + private List<MesWmProductRecptDetailRespVO> buildRespVOList(List<MesWmProductRecptDetailDO> list) {
  110 + if (CollUtil.isEmpty(list)) {
  111 + return Collections.emptyList();
  112 + }
  113 + // 1. 获得关联数据
  114 + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
  115 + convertSet(list, MesWmProductRecptDetailDO::getItemId));
  116 + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
  117 + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
  118 + Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
  119 + convertSet(list, MesWmProductRecptDetailDO::getWarehouseId));
  120 + Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
  121 + convertSet(list, MesWmProductRecptDetailDO::getLocationId));
  122 + Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap(
  123 + convertSet(list, MesWmProductRecptDetailDO::getAreaId));
  124 + // 2. 构建结果
  125 + return BeanUtils.toBean(list, MesWmProductRecptDetailRespVO.class, vo -> {
  126 + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
  127 + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
  128 + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
  129 + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName()));
  130 + });
  131 + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(),
  132 + warehouse -> vo.setWarehouseName(warehouse.getName()));
  133 + MapUtils.findAndThen(locationMap, vo.getLocationId(),
  134 + location -> vo.setLocationName(location.getName()));
  135 + MapUtils.findAndThen(areaMap, vo.getAreaId(),
  136 + area -> vo.setAreaName(area.getName()));
  137 + });
  138 + }
  139 +
  140 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/MesWmProductRecptLineController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt;
  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.productrecpt.vo.line.MesWmProductRecptLinePageReqVO;
  9 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLineRespVO;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLineSaveReqVO;
  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.productrecpt.MesWmProductRecptLineDO;
  14 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  15 +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
  16 +import cn.iocoder.yudao.module.mes.service.wm.productrecpt.MesWmProductRecptLineService;
  17 +import io.swagger.v3.oas.annotations.Operation;
  18 +import io.swagger.v3.oas.annotations.Parameter;
  19 +import io.swagger.v3.oas.annotations.tags.Tag;
  20 +import jakarta.annotation.Resource;
  21 +import jakarta.validation.Valid;
  22 +import org.springframework.security.access.prepost.PreAuthorize;
  23 +import org.springframework.validation.annotation.Validated;
  24 +import org.springframework.web.bind.annotation.*;
  25 +
  26 +import java.util.Collections;
  27 +import java.util.List;
  28 +import java.util.Map;
  29 +
  30 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  31 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  32 +
  33 +@Tag(name = "管理后台 - MES 产品收货单行")
  34 +@RestController
  35 +@RequestMapping("/mes/wm/product-recpt-line")
  36 +@Validated
  37 +public class MesWmProductRecptLineController {
  38 +
  39 + @Resource
  40 + private MesWmProductRecptLineService productRecptLineService;
  41 +
  42 + @Resource
  43 + private MesMdItemService itemService;
  44 +
  45 + @Resource
  46 + private MesMdUnitMeasureService unitMeasureService;
  47 +
  48 + @PostMapping("/create")
  49 + @Operation(summary = "创建产品收货单行")
  50 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:create')")
  51 + public CommonResult<Long> createProductRecptLine(@Valid @RequestBody MesWmProductRecptLineSaveReqVO createReqVO) {
  52 + return success(productRecptLineService.createProductRecptLine(createReqVO));
  53 + }
  54 +
  55 + @PutMapping("/update")
  56 + @Operation(summary = "修改产品收货单行")
  57 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:update')")
  58 + public CommonResult<Boolean> updateProductRecptLine(@Valid @RequestBody MesWmProductRecptLineSaveReqVO updateReqVO) {
  59 + productRecptLineService.updateProductRecptLine(updateReqVO);
  60 + return success(true);
  61 + }
  62 +
  63 + @DeleteMapping("/delete")
  64 + @Operation(summary = "删除产品收货单行")
  65 + @Parameter(name = "id", description = "编号", required = true)
  66 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:delete')")
  67 + public CommonResult<Boolean> deleteProductRecptLine(@RequestParam("id") Long id) {
  68 + productRecptLineService.deleteProductRecptLine(id);
  69 + return success(true);
  70 + }
  71 +
  72 + @GetMapping("/get")
  73 + @Operation(summary = "获得产品收货单行")
  74 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  75 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')")
  76 + public CommonResult<MesWmProductRecptLineRespVO> getProductRecptLine(@RequestParam("id") Long id) {
  77 + MesWmProductRecptLineDO line = productRecptLineService.getProductRecptLine(id);
  78 + if (line == null) {
  79 + return success(null);
  80 + }
  81 + return success(buildRespVOList(Collections.singletonList(line)).get(0));
  82 + }
  83 +
  84 + @GetMapping("/page")
  85 + @Operation(summary = "获得产品收货单行分页")
  86 + @PreAuthorize("@ss.hasPermission('mes:wm-product-recpt:query')")
  87 + public CommonResult<PageResult<MesWmProductRecptLineRespVO>> getProductRecptLinePage(
  88 + @Valid MesWmProductRecptLinePageReqVO pageReqVO) {
  89 + PageResult<MesWmProductRecptLineDO> pageResult = productRecptLineService.getProductRecptLinePage(pageReqVO);
  90 + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
  91 + }
  92 +
  93 + // ==================== 拼接 VO ====================
  94 +
  95 + private List<MesWmProductRecptLineRespVO> buildRespVOList(List<MesWmProductRecptLineDO> list) {
  96 + if (CollUtil.isEmpty(list)) {
  97 + return Collections.emptyList();
  98 + }
  99 + // 1. 获得关联数据
  100 + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
  101 + convertSet(list, MesWmProductRecptLineDO::getItemId));
  102 + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
  103 + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
  104 + // 2. 构建结果
  105 + return BeanUtils.toBean(list, MesWmProductRecptLineRespVO.class, vo -> {
  106 + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
  107 + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
  108 + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
  109 + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName()));
  110 + });
  111 + });
  112 + }
  113 +
  114 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/MesWmProductRecptPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.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 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@Schema(description = "管理后台 - MES 产品收货单分页 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class MesWmProductRecptPageReqVO extends PageParam {
  19 +
  20 + @Schema(description = "收货单编码", example = "PR202603010001")
  21 + private String code;
  22 +
  23 + @Schema(description = "收货单名称", example = "产品收货单-工单001")
  24 + private String name;
  25 +
  26 + @Schema(description = "生产工单编号", example = "1")
  27 + private Long workOrderId;
  28 +
  29 + @Schema(description = "产品物料编号", example = "1")
  30 + private Long itemId;
  31 +
  32 + @Schema(description = "状态", example = "0")
  33 + private Integer status;
  34 +
  35 + @Schema(description = "收货日期")
  36 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  37 + private LocalDateTime[] receiptDate;
  38 +
  39 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/MesWmProductRecptRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.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 MesWmProductRecptRespVO {
  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 = "PR202603010001")
  20 + @ExcelProperty("收货单编码")
  21 + private String code;
  22 +
  23 + @Schema(description = "收货单名称", example = "产品收货单-工单001")
  24 + @ExcelProperty("收货单名称")
  25 + private String name;
  26 +
  27 + @Schema(description = "生产工单编号", example = "1")
  28 + private Long workOrderId;
  29 +
  30 + @Schema(description = "生产工单编码", example = "WO202603010001")
  31 + @ExcelProperty("生产工单")
  32 + private String workOrderCode;
  33 +
  34 + @Schema(description = "产品物料编号", example = "1")
  35 + private Long itemId;
  36 +
  37 + @Schema(description = "产品物料编码", example = "P001")
  38 + @ExcelProperty("产品物料编码")
  39 + private String itemCode;
  40 +
  41 + @Schema(description = "产品物料名称", example = "成品A")
  42 + @ExcelProperty("产品物料名称")
  43 + private String itemName;
  44 +
  45 + @Schema(description = "规格型号", example = "标准型")
  46 + @ExcelProperty("规格型号")
  47 + private String specification;
  48 +
  49 + @Schema(description = "计量单位名称", example = "件")
  50 + @ExcelProperty("计量单位")
  51 + private String unitMeasureName;
  52 +
  53 + @Schema(description = "收货日期")
  54 + @ExcelProperty("收货日期")
  55 + private LocalDateTime receiptDate;
  56 +
  57 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
  58 + @ExcelProperty("状态")
  59 + private Integer status;
  60 +
  61 + @Schema(description = "备注", example = "备注")
  62 + @ExcelProperty("备注")
  63 + private String remark;
  64 +
  65 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  66 + @ExcelProperty("创建时间")
  67 + private LocalDateTime createTime;
  68 +
  69 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/MesWmProductRecptSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +@Schema(description = "管理后台 - MES 产品收货单新增/修改 Request VO")
  11 +@Data
  12 +public class MesWmProductRecptSaveReqVO {
  13 +
  14 + @Schema(description = "编号", example = "1024")
  15 + private Long id;
  16 +
  17 + @Schema(description = "收货单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "PR202603010001")
  18 + @NotEmpty(message = "收货单编码不能为空")
  19 + private String code;
  20 +
  21 + @Schema(description = "收货单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "产品收货单-工单001")
  22 + @NotEmpty(message = "收货单名称不能为空")
  23 + private String name;
  24 +
  25 + @Schema(description = "生产工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  26 + // TODO @AI:workOrderId 必须要非必传
  27 + @NotNull(message = "生产工单不能为空")
  28 + private Long workOrderId;
  29 +
  30 + @Schema(description = "产品物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  31 + @NotNull(message = "产品物料不能为空")
  32 + // TODO @AI:workOrderId 必须要非必传
  33 + private Long itemId;
  34 +
  35 + @Schema(description = "收货日期", requiredMode = Schema.RequiredMode.REQUIRED)
  36 + @NotNull(message = "收货日期不能为空")
  37 + private LocalDateTime receiptDate;
  38 +
  39 + @Schema(description = "备注", example = "备注")
  40 + private String remark;
  41 +
  42 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/detail/MesWmProductRecptDetailRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.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 MesWmProductRecptDetailRespVO {
  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 recptId;
  21 +
  22 + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  23 + private Long itemId;
  24 +
  25 + @Schema(description = "物料编码", example = "P001")
  26 + private String itemCode;
  27 +
  28 + @Schema(description = "物料名称", example = "成品A")
  29 + private String itemName;
  30 +
  31 + @Schema(description = "规格型号", example = "标准型")
  32 + private String specification;
  33 +
  34 + @Schema(description = "计量单位名称", example = "件")
  35 + private String unitMeasureName;
  36 +
  37 + @Schema(description = "上架数量", example = "100.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 = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  65 + private LocalDateTime createTime;
  66 +
  67 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/detail/MesWmProductRecptDetailSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.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 MesWmProductRecptDetailSaveReqVO {
  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 recptId;
  23 +
  24 + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  25 + @NotNull(message = "物料编号不能为空")
  26 + private Long itemId;
  27 +
  28 + @Schema(description = "上架数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
  29 + @NotNull(message = "上架数量不能为空")
  30 + private BigDecimal quantity;
  31 +
  32 + @Schema(description = "批次编号", example = "1")
  33 + private Long batchId;
  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 = "备注", example = "备注")
  45 + private String remark;
  46 +
  47 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/line/MesWmProductRecptLinePageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.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 MesWmProductRecptLinePageReqVO extends PageParam {
  14 +
  15 + @Schema(description = "收货单编号", example = "1")
  16 + private Long recptId;
  17 +
  18 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/line/MesWmProductRecptLineRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.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 MesWmProductRecptLineRespVO {
  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 recptId;
  18 +
  19 + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  20 + private Long itemId;
  21 +
  22 + @Schema(description = "物料编码", example = "P001")
  23 + private String itemCode;
  24 +
  25 + @Schema(description = "物料名称", example = "成品A")
  26 + private String itemName;
  27 +
  28 + @Schema(description = "规格型号", example = "标准型")
  29 + private String specification;
  30 +
  31 + @Schema(description = "计量单位名称", example = "件")
  32 + private String unitMeasureName;
  33 +
  34 + @Schema(description = "收货数量", example = "100.00")
  35 + private BigDecimal quantity;
  36 +
  37 + @Schema(description = "批次编号", example = "1")
  38 + private Long batchId;
  39 +
  40 + @Schema(description = "批次号", example = "BATCH20260301001")
  41 + private String batchCode;
  42 +
  43 + @Schema(description = "备注", example = "备注")
  44 + private String remark;
  45 +
  46 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  47 + private LocalDateTime createTime;
  48 +
  49 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productrecpt/vo/line/MesWmProductRecptLineSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.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 +
  9 +@Schema(description = "管理后台 - MES 产品收货单行新增/修改 Request VO")
  10 +@Data
  11 +public class MesWmProductRecptLineSaveReqVO {
  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 recptId;
  19 +
  20 + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  21 + @NotNull(message = "物料编号不能为空")
  22 + private Long itemId;
  23 +
  24 + @Schema(description = "收货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
  25 + @NotNull(message = "收货数量不能为空")
  26 + private BigDecimal quantity;
  27 +
  28 + @Schema(description = "批次编号", example = "1")
  29 + private Long batchId;
  30 +
  31 + @Schema(description = "批次号", example = "BATCH20260301001")
  32 + private String batchCode;
  33 +
  34 + @Schema(description = "备注", example = "备注")
  35 + private String remark;
  36 +
  37 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productrecpt/MesWmProductRecptDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt;
  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.pro.workorder.MesProWorkOrderDO;
  6 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductRecptStatusEnum;
  7 +import com.baomidou.mybatisplus.annotation.KeySequence;
  8 +import com.baomidou.mybatisplus.annotation.TableId;
  9 +import com.baomidou.mybatisplus.annotation.TableName;
  10 +import lombok.*;
  11 +
  12 +import java.time.LocalDateTime;
  13 +
  14 +/**
  15 + * MES 产品收货(入库)单 DO
  16 + */
  17 +@TableName("mes_wm_product_recpt")
  18 +@KeySequence("mes_wm_product_recpt_seq")
  19 +@Data
  20 +@EqualsAndHashCode(callSuper = true)
  21 +@ToString(callSuper = true)
  22 +@Builder
  23 +@NoArgsConstructor
  24 +@AllArgsConstructor
  25 +public class MesWmProductRecptDO extends BaseDO {
  26 +
  27 + /**
  28 + * 编号
  29 + */
  30 + @TableId
  31 + private Long id;
  32 + /**
  33 + * 收货单编码
  34 + */
  35 + private String code;
  36 + /**
  37 + * 收货单名称
  38 + */
  39 + private String name;
  40 + /**
  41 + * 生产工单编号
  42 + *
  43 + * 关联 {@link MesProWorkOrderDO#getId()}
  44 + */
  45 + private Long workOrderId;
  46 + /**
  47 + * 产品物料编号
  48 + *
  49 + * 关联 {@link MesMdItemDO#getId()}
  50 + */
  51 + private Long itemId;
  52 + /**
  53 + * 收货日期
  54 + */
  55 + private LocalDateTime receiptDate;
  56 + /**
  57 + * 状态
  58 + *
  59 + * 枚举 {@link MesWmProductRecptStatusEnum}
  60 + */
  61 + private Integer status;
  62 + /**
  63 + * 备注
  64 + */
  65 + private String remark;
  66 +
  67 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productrecpt/MesWmProductRecptDetailDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt;
  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_product_recpt_detail")
  19 +@KeySequence("mes_wm_product_recpt_detail_seq")
  20 +@Data
  21 +@EqualsAndHashCode(callSuper = true)
  22 +@ToString(callSuper = true)
  23 +@Builder
  24 +@NoArgsConstructor
  25 +@AllArgsConstructor
  26 +public class MesWmProductRecptDetailDO extends BaseDO {
  27 +
  28 + /**
  29 + * 编号
  30 + */
  31 + @TableId
  32 + private Long id;
  33 + /**
  34 + * 收货单行编号
  35 + *
  36 + * 关联 {@link MesWmProductRecptLineDO#getId()}
  37 + */
  38 + private Long lineId;
  39 + /**
  40 + * 收货单编号
  41 + *
  42 + * 关联 {@link MesWmProductRecptDO#getId()}
  43 + */
  44 + private Long recptId;
  45 + /**
  46 + * 物料编号
  47 + *
  48 + * 关联 {@link MesMdItemDO#getId()}
  49 + */
  50 + private Long itemId;
  51 + /**
  52 + * 上架数量
  53 + */
  54 + private BigDecimal quantity;
  55 + /**
  56 + * 批次编号
  57 + *
  58 + * TODO DONE @芋艿:保留。待 mes_wm_batch 模块迁移后补充 @link 关联
  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 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productrecpt/MesWmProductRecptLineDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt;
  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 com.baomidou.mybatisplus.annotation.KeySequence;
  6 +import com.baomidou.mybatisplus.annotation.TableId;
  7 +import com.baomidou.mybatisplus.annotation.TableName;
  8 +import lombok.*;
  9 +
  10 +import java.math.BigDecimal;
  11 +
  12 +/**
  13 + * MES 产品收货(入库)单行 DO
  14 + */
  15 +@TableName("mes_wm_product_recpt_line")
  16 +@KeySequence("mes_wm_product_recpt_line_seq")
  17 +@Data
  18 +@EqualsAndHashCode(callSuper = true)
  19 +@ToString(callSuper = true)
  20 +@Builder
  21 +@NoArgsConstructor
  22 +@AllArgsConstructor
  23 +public class MesWmProductRecptLineDO extends BaseDO {
  24 +
  25 + /**
  26 + * 编号
  27 + */
  28 + @TableId
  29 + private Long id;
  30 + /**
  31 + * 收货单编号
  32 + *
  33 + * 关联 {@link MesWmProductRecptDO#getId()}
  34 + */
  35 + private Long recptId;
  36 + /**
  37 + * 物料编号
  38 + *
  39 + * 关联 {@link MesMdItemDO#getId()}
  40 + */
  41 + private Long itemId;
  42 + /**
  43 + * 收货数量
  44 + */
  45 + private BigDecimal quantity;
  46 + /**
  47 + * 批次编号
  48 + *
  49 + * TODO DONE @芋艿:保留。待 mes_wm_batch 模块迁移后补充 @link 关联
  50 + */
  51 + private Long batchId;
  52 + /**
  53 + * 批次号
  54 + */
  55 + private String batchCode;
  56 + /**
  57 + * 备注
  58 + */
  59 + private String remark;
  60 +
  61 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productrecpt/MesWmProductRecptDetailMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDetailDO;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * MES 产品收货单明细 Mapper
  11 + */
  12 +@Mapper
  13 +public interface MesWmProductRecptDetailMapper extends BaseMapperX<MesWmProductRecptDetailDO> {
  14 +
  15 + default List<MesWmProductRecptDetailDO> selectListByRecptId(Long recptId) {
  16 + return selectList(MesWmProductRecptDetailDO::getRecptId, recptId);
  17 + }
  18 +
  19 + default List<MesWmProductRecptDetailDO> selectListByLineId(Long lineId) {
  20 + return selectList(MesWmProductRecptDetailDO::getLineId, lineId);
  21 + }
  22 +
  23 + default void deleteByRecptId(Long recptId) {
  24 + delete(MesWmProductRecptDetailDO::getRecptId, recptId);
  25 + }
  26 +
  27 + default void deleteByLineId(Long lineId) {
  28 + delete(MesWmProductRecptDetailDO::getLineId, lineId);
  29 + }
  30 +
  31 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productrecpt/MesWmProductRecptLineMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt;
  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.productrecpt.vo.line.MesWmProductRecptLinePageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptLineDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * MES 产品收货单行 Mapper
  14 + */
  15 +@Mapper
  16 +public interface MesWmProductRecptLineMapper extends BaseMapperX<MesWmProductRecptLineDO> {
  17 +
  18 + default PageResult<MesWmProductRecptLineDO> selectPage(MesWmProductRecptLinePageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmProductRecptLineDO>()
  20 + .eqIfPresent(MesWmProductRecptLineDO::getRecptId, reqVO.getRecptId())
  21 + .orderByDesc(MesWmProductRecptLineDO::getId));
  22 + }
  23 +
  24 + default List<MesWmProductRecptLineDO> selectListByRecptId(Long recptId) {
  25 + return selectList(MesWmProductRecptLineDO::getRecptId, recptId);
  26 + }
  27 +
  28 + default void deleteByRecptId(Long recptId) {
  29 + delete(MesWmProductRecptLineDO::getRecptId, recptId);
  30 + }
  31 +
  32 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productrecpt/MesWmProductRecptMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt;
  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.productrecpt.vo.MesWmProductRecptPageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +/**
  11 + * MES 产品收货单 Mapper
  12 + */
  13 +@Mapper
  14 +public interface MesWmProductRecptMapper extends BaseMapperX<MesWmProductRecptDO> {
  15 +
  16 + default PageResult<MesWmProductRecptDO> selectPage(MesWmProductRecptPageReqVO reqVO) {
  17 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmProductRecptDO>()
  18 + .likeIfPresent(MesWmProductRecptDO::getCode, reqVO.getCode())
  19 + .likeIfPresent(MesWmProductRecptDO::getName, reqVO.getName())
  20 + .eqIfPresent(MesWmProductRecptDO::getWorkOrderId, reqVO.getWorkOrderId())
  21 + .eqIfPresent(MesWmProductRecptDO::getItemId, reqVO.getItemId())
  22 + .eqIfPresent(MesWmProductRecptDO::getStatus, reqVO.getStatus())
  23 + .betweenIfPresent(MesWmProductRecptDO::getReceiptDate, reqVO.getReceiptDate())
  24 + .orderByDesc(MesWmProductRecptDO::getId));
  25 + }
  26 +
  27 + default MesWmProductRecptDO selectByCode(String code) {
  28 + return selectOne(MesWmProductRecptDO::getCode, code);
  29 + }
  30 +
  31 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
... ... @@ -402,4 +402,15 @@ public interface ErrorCodeConstants {
402 402 ErrorCode WM_RETURN_VENDOR_LINE_NOT_EXISTS = new ErrorCode(1_040_711_100, "供应商退货单行不存在");
403 403 ErrorCode WM_RETURN_VENDOR_DETAIL_NOT_EXISTS = new ErrorCode(1_040_711_200, "供应商退货单明细不存在");
404 404  
  405 + // ========== MES 仓库管理-产品收货单(1-040-712-000) ==========
  406 + ErrorCode WM_PRODUCT_RECPT_NOT_EXISTS = new ErrorCode(1_040_712_000, "产品收货单不存在");
  407 + ErrorCode WM_PRODUCT_RECPT_CODE_DUPLICATE = new ErrorCode(1_040_712_001, "产品收货单编码已存在");
  408 + ErrorCode WM_PRODUCT_RECPT_STATUS_NOT_PREPARE = new ErrorCode(1_040_712_002, "只有草稿或待上架状态才允许此操作");
  409 + ErrorCode WM_PRODUCT_RECPT_NO_LINE = new ErrorCode(1_040_712_003, "至少需要一条行项目");
  410 + ErrorCode WM_PRODUCT_RECPT_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_712_004, "明细上架总数与行收货数量不匹配");
  411 + ErrorCode WM_PRODUCT_RECPT_STATUS_ERROR = new ErrorCode(1_040_712_005, "收货单状态不正确");
  412 + ErrorCode WM_PRODUCT_RECPT_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_712_006, "已完成或已取消的收货单不允许取消");
  413 + ErrorCode WM_PRODUCT_RECPT_LINE_NOT_EXISTS = new ErrorCode(1_040_712_100, "产品收货单行不存在");
  414 + ErrorCode WM_PRODUCT_RECPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_712_200, "产品收货明细不存在");
  415 +
405 416 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductRecptStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.enums.wm;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.ArrayValuable;
  4 +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants;
  5 +import lombok.AllArgsConstructor;
  6 +import lombok.Getter;
  7 +
  8 +import java.util.Arrays;
  9 +
  10 +/**
  11 + * MES 产品收货单状态枚举
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Getter
  16 +@AllArgsConstructor
  17 +public enum MesWmProductRecptStatusEnum implements ArrayValuable<Integer> {
  18 +
  19 + // TODO @AI:对应的方法;参考别的 MesWmProductionIssueStatusEnum
  20 + /**
  21 + * 草稿
  22 + */
  23 + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"),
  24 + /**
  25 + * 待上架
  26 + */
  27 + APPROVING(MesOrderStatusConstants.APPROVING, "待上架"),
  28 + /**
  29 + * 待执行入库
  30 + */
  31 + APPROVED(MesOrderStatusConstants.APPROVED, "待执行入库"),
  32 + /**
  33 + * 已完成
  34 + */
  35 + FINISHED(MesOrderStatusConstants.FINISHED, "已完成"),
  36 + /**
  37 + * 已取消
  38 + */
  39 + CANCELED(MesOrderStatusConstants.CANCELLED, "已取消");
  40 +
  41 + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmProductRecptStatusEnum::getStatus).toArray(Integer[]::new);
  42 +
  43 + /**
  44 + * 状态值
  45 + */
  46 + private final Integer status;
  47 + /**
  48 + * 状态名
  49 + */
  50 + private final String name;
  51 +
  52 + @Override
  53 + public Integer[] array() {
  54 + return ARRAYS;
  55 + }
  56 +
  57 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptDetailService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.productrecpt;
  2 +
  3 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.detail.MesWmProductRecptDetailSaveReqVO;
  4 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDetailDO;
  5 +import jakarta.validation.Valid;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * MES 产品收货单明细 Service 接口
  11 + */
  12 +public interface MesWmProductRecptDetailService {
  13 +
  14 + /**
  15 + * 创建产品收货单明细
  16 + *
  17 + * @param createReqVO 创建信息
  18 + * @return 编号
  19 + */
  20 + Long createProductRecptDetail(@Valid MesWmProductRecptDetailSaveReqVO createReqVO);
  21 +
  22 + /**
  23 + * 修改产品收货单明细
  24 + *
  25 + * @param updateReqVO 修改信息
  26 + */
  27 + void updateProductRecptDetail(@Valid MesWmProductRecptDetailSaveReqVO updateReqVO);
  28 +
  29 + /**
  30 + * 删除产品收货单明细
  31 + *
  32 + * @param id 编号
  33 + */
  34 + void deleteProductRecptDetail(Long id);
  35 +
  36 + /**
  37 + * 获得产品收货单明细
  38 + *
  39 + * @param id 编号
  40 + * @return 产品收货单明细
  41 + */
  42 + MesWmProductRecptDetailDO getProductRecptDetail(Long id);
  43 +
  44 + /**
  45 + * 按收货单编号获得明细列表
  46 + *
  47 + * @param recptId 收货单编号
  48 + * @return 明细列表
  49 + */
  50 + List<MesWmProductRecptDetailDO> getProductRecptDetailListByRecptId(Long recptId);
  51 +
  52 + /**
  53 + * 按收货单行编号获得明细列表
  54 + *
  55 + * @param lineId 行编号
  56 + * @return 明细列表
  57 + */
  58 + List<MesWmProductRecptDetailDO> getProductRecptDetailListByLineId(Long lineId);
  59 +
  60 + /**
  61 + * 按收货单行编号批量删除明细
  62 + *
  63 + * @param lineId 行编号
  64 + */
  65 + void deleteProductRecptDetailByLineId(Long lineId);
  66 +
  67 + /**
  68 + * 按收货单编号批量删除明细
  69 + *
  70 + * @param recptId 收货单编号
  71 + */
  72 + void deleteProductRecptDetailByRecptId(Long recptId);
  73 +
  74 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptDetailServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.productrecpt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.detail.MesWmProductRecptDetailSaveReqVO;
  5 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDetailDO;
  6 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt.MesWmProductRecptDetailMapper;
  7 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
  8 +import jakarta.annotation.Resource;
  9 +import org.springframework.context.annotation.Lazy;
  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.*;
  17 +
  18 +/**
  19 + * MES 产品收货单明细 Service 实现类
  20 + */
  21 +@Service
  22 +@Validated
  23 +public class MesWmProductRecptDetailServiceImpl implements MesWmProductRecptDetailService {
  24 +
  25 + @Resource
  26 + private MesWmProductRecptDetailMapper productRecptDetailMapper;
  27 +
  28 + @Resource
  29 + @Lazy
  30 + private MesWmProductRecptService productRecptService;
  31 +
  32 + @Resource
  33 + private MesWmWarehouseAreaService warehouseAreaService;
  34 +
  35 + @Override
  36 + public Long createProductRecptDetail(MesWmProductRecptDetailSaveReqVO createReqVO) {
  37 + // 校验父单据存在且为可编辑状态
  38 + productRecptService.validateProductRecptEditable(createReqVO.getRecptId());
  39 + // 校验库区关系
  40 + warehouseAreaService.validateWarehouseAreaExists(
  41 + createReqVO.getWarehouseId(), createReqVO.getLocationId(), createReqVO.getAreaId());
  42 +
  43 + MesWmProductRecptDetailDO detail = BeanUtils.toBean(createReqVO, MesWmProductRecptDetailDO.class);
  44 + productRecptDetailMapper.insert(detail);
  45 + return detail.getId();
  46 + }
  47 +
  48 + @Override
  49 + public void updateProductRecptDetail(MesWmProductRecptDetailSaveReqVO updateReqVO) {
  50 + // 校验存在
  51 + MesWmProductRecptDetailDO detail = validateProductRecptDetailExists(updateReqVO.getId());
  52 + // 校验父单据存在且为可编辑状态
  53 + productRecptService.validateProductRecptEditable(detail.getRecptId());
  54 + // 校验库区关系
  55 + warehouseAreaService.validateWarehouseAreaExists(
  56 + updateReqVO.getWarehouseId(), updateReqVO.getLocationId(), updateReqVO.getAreaId());
  57 +
  58 + // 更新
  59 + MesWmProductRecptDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductRecptDetailDO.class);
  60 + productRecptDetailMapper.updateById(updateObj);
  61 + }
  62 +
  63 + @Override
  64 + public void deleteProductRecptDetail(Long id) {
  65 + // 校验存在
  66 + validateProductRecptDetailExists(id);
  67 + // 删除
  68 + productRecptDetailMapper.deleteById(id);
  69 + }
  70 +
  71 + @Override
  72 + public MesWmProductRecptDetailDO getProductRecptDetail(Long id) {
  73 + return productRecptDetailMapper.selectById(id);
  74 + }
  75 +
  76 + @Override
  77 + public List<MesWmProductRecptDetailDO> getProductRecptDetailListByRecptId(Long recptId) {
  78 + return productRecptDetailMapper.selectListByRecptId(recptId);
  79 + }
  80 +
  81 + @Override
  82 + public List<MesWmProductRecptDetailDO> getProductRecptDetailListByLineId(Long lineId) {
  83 + return productRecptDetailMapper.selectListByLineId(lineId);
  84 + }
  85 +
  86 + @Override
  87 + public void deleteProductRecptDetailByLineId(Long lineId) {
  88 + productRecptDetailMapper.deleteByLineId(lineId);
  89 + }
  90 +
  91 + @Override
  92 + public void deleteProductRecptDetailByRecptId(Long recptId) {
  93 + productRecptDetailMapper.deleteByRecptId(recptId);
  94 + }
  95 +
  96 + private MesWmProductRecptDetailDO validateProductRecptDetailExists(Long id) {
  97 + MesWmProductRecptDetailDO detail = productRecptDetailMapper.selectById(id);
  98 + if (detail == null) {
  99 + throw exception(WM_PRODUCT_RECPT_DETAIL_NOT_EXISTS);
  100 + }
  101 + return detail;
  102 + }
  103 +
  104 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptLineService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.productrecpt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLinePageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLineSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptLineDO;
  7 +import jakarta.validation.Valid;
  8 +
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * MES 产品收货单行 Service 接口
  13 + */
  14 +public interface MesWmProductRecptLineService {
  15 +
  16 + /**
  17 + * 创建产品收货单行
  18 + *
  19 + * @param createReqVO 创建信息
  20 + * @return 编号
  21 + */
  22 + Long createProductRecptLine(@Valid MesWmProductRecptLineSaveReqVO createReqVO);
  23 +
  24 + /**
  25 + * 修改产品收货单行
  26 + *
  27 + * @param updateReqVO 修改信息
  28 + */
  29 + void updateProductRecptLine(@Valid MesWmProductRecptLineSaveReqVO updateReqVO);
  30 +
  31 + /**
  32 + * 删除产品收货单行(级联删除明细)
  33 + *
  34 + * @param id 编号
  35 + */
  36 + void deleteProductRecptLine(Long id);
  37 +
  38 + /**
  39 + * 获得产品收货单行
  40 + *
  41 + * @param id 编号
  42 + * @return 产品收货单行
  43 + */
  44 + MesWmProductRecptLineDO getProductRecptLine(Long id);
  45 +
  46 + /**
  47 + * 获得产品收货单行分页
  48 + *
  49 + * @param pageReqVO 分页参数
  50 + * @return 产品收货单行分页
  51 + */
  52 + PageResult<MesWmProductRecptLineDO> getProductRecptLinePage(MesWmProductRecptLinePageReqVO pageReqVO);
  53 +
  54 + /**
  55 + * 按收货单编号获得行列表
  56 + *
  57 + * @param recptId 收货单编号
  58 + * @return 行列表
  59 + */
  60 + List<MesWmProductRecptLineDO> getProductRecptLineListByRecptId(Long recptId);
  61 +
  62 + /**
  63 + * 按收货单编号批量删除行
  64 + *
  65 + * @param recptId 收货单编号
  66 + */
  67 + void deleteProductRecptLineByRecptId(Long recptId);
  68 +
  69 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptLineServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.productrecpt;
  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.productrecpt.vo.line.MesWmProductRecptLinePageReqVO;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.line.MesWmProductRecptLineSaveReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptLineDO;
  8 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt.MesWmProductRecptLineMapper;
  9 +import jakarta.annotation.Resource;
  10 +import org.springframework.context.annotation.Lazy;
  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_PRODUCT_RECPT_LINE_NOT_EXISTS;
  19 +
  20 +/**
  21 + * MES 产品收货单行 Service 实现类
  22 + */
  23 +@Service
  24 +@Validated
  25 +public class MesWmProductRecptLineServiceImpl implements MesWmProductRecptLineService {
  26 +
  27 + @Resource
  28 + private MesWmProductRecptLineMapper productRecptLineMapper;
  29 +
  30 + @Resource
  31 + @Lazy
  32 + private MesWmProductRecptService productRecptService;
  33 +
  34 + @Resource
  35 + private MesWmProductRecptDetailService productRecptDetailService;
  36 +
  37 + @Override
  38 + public Long createProductRecptLine(MesWmProductRecptLineSaveReqVO createReqVO) {
  39 + // 校验父单据存在且为可编辑状态
  40 + productRecptService.validateProductRecptEditable(createReqVO.getRecptId());
  41 +
  42 + // 新增
  43 + MesWmProductRecptLineDO line = BeanUtils.toBean(createReqVO, MesWmProductRecptLineDO.class);
  44 + productRecptLineMapper.insert(line);
  45 + return line.getId();
  46 + }
  47 +
  48 + @Override
  49 + public void updateProductRecptLine(MesWmProductRecptLineSaveReqVO updateReqVO) {
  50 + // 校验存在
  51 + MesWmProductRecptLineDO line = validateProductRecptLineExists(updateReqVO.getId());
  52 + // 校验父单据存在且为可编辑状态
  53 + productRecptService.validateProductRecptEditable(line.getRecptId());
  54 +
  55 + // 更新
  56 + MesWmProductRecptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductRecptLineDO.class);
  57 + productRecptLineMapper.updateById(updateObj);
  58 + }
  59 +
  60 + @Override
  61 + @Transactional(rollbackFor = Exception.class)
  62 + public void deleteProductRecptLine(Long id) {
  63 + // 校验存在
  64 + validateProductRecptLineExists(id);
  65 +
  66 + // 级联删除明细
  67 + productRecptDetailService.deleteProductRecptDetailByLineId(id);
  68 + // 删除
  69 + productRecptLineMapper.deleteById(id);
  70 + }
  71 +
  72 + @Override
  73 + public MesWmProductRecptLineDO getProductRecptLine(Long id) {
  74 + return productRecptLineMapper.selectById(id);
  75 + }
  76 +
  77 + @Override
  78 + public PageResult<MesWmProductRecptLineDO> getProductRecptLinePage(MesWmProductRecptLinePageReqVO pageReqVO) {
  79 + return productRecptLineMapper.selectPage(pageReqVO);
  80 + }
  81 +
  82 + @Override
  83 + public List<MesWmProductRecptLineDO> getProductRecptLineListByRecptId(Long recptId) {
  84 + return productRecptLineMapper.selectListByRecptId(recptId);
  85 + }
  86 +
  87 + @Override
  88 + public void deleteProductRecptLineByRecptId(Long recptId) {
  89 + productRecptLineMapper.deleteByRecptId(recptId);
  90 + }
  91 +
  92 + private MesWmProductRecptLineDO validateProductRecptLineExists(Long id) {
  93 + MesWmProductRecptLineDO line = productRecptLineMapper.selectById(id);
  94 + if (line == null) {
  95 + throw exception(WM_PRODUCT_RECPT_LINE_NOT_EXISTS);
  96 + }
  97 + return line;
  98 + }
  99 +
  100 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.productrecpt;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptPageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDO;
  7 +import jakarta.validation.Valid;
  8 +
  9 +/**
  10 + * MES 产品收货单 Service 接口
  11 + */
  12 +public interface MesWmProductRecptService {
  13 +
  14 + /**
  15 + * 创建产品收货单
  16 + *
  17 + * @param createReqVO 创建信息
  18 + * @return 编号
  19 + */
  20 + Long createProductRecpt(@Valid MesWmProductRecptSaveReqVO createReqVO);
  21 +
  22 + /**
  23 + * 修改产品收货单
  24 + *
  25 + * @param updateReqVO 修改信息
  26 + */
  27 + void updateProductRecpt(@Valid MesWmProductRecptSaveReqVO updateReqVO);
  28 +
  29 + /**
  30 + * 删除产品收货单(级联删除行+明细)
  31 + *
  32 + * @param id 编号
  33 + */
  34 + void deleteProductRecpt(Long id);
  35 +
  36 + /**
  37 + * 获得产品收货单
  38 + *
  39 + * @param id 编号
  40 + * @return 产品收货单
  41 + */
  42 + MesWmProductRecptDO getProductRecpt(Long id);
  43 +
  44 + /**
  45 + * 获得产品收货单分页
  46 + *
  47 + * @param pageReqVO 分页参数
  48 + * @return 产品收货单分页
  49 + */
  50 + PageResult<MesWmProductRecptDO> getProductRecptPage(MesWmProductRecptPageReqVO pageReqVO);
  51 +
  52 + /**
  53 + * 提交产品收货单(草稿 → 待上架)
  54 + *
  55 + * @param id 编号
  56 + */
  57 + void submitProductRecpt(Long id);
  58 +
  59 + /**
  60 + * 执行上架(待上架 → 待入库)
  61 + *
  62 + * @param id 编号
  63 + */
  64 + void stockProductRecpt(Long id);
  65 +
  66 + /**
  67 + * 执行入库(待入库 → 已完成),更新库存台账
  68 + *
  69 + * @param id 编号
  70 + */
  71 + void executeProductRecpt(Long id);
  72 +
  73 + /**
  74 + * 取消产品收货单(任意非已完成/已取消状态 → 已取消)
  75 + *
  76 + * @param id 编号
  77 + */
  78 + void cancelProductRecpt(Long id);
  79 +
  80 + /**
  81 + * 校验产品收货单存在且处于可编辑状态(草稿或待上架)
  82 + *
  83 + * @param id 编号
  84 + * @return 产品收货单
  85 + */
  86 + MesWmProductRecptDO validateProductRecptEditable(Long id);
  87 +
  88 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productrecpt/MesWmProductRecptServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.productrecpt;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  7 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  8 +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
  9 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptPageReqVO;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.wm.productrecpt.vo.MesWmProductRecptSaveReqVO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDO;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptDetailDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productrecpt.MesWmProductRecptLineDO;
  14 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productrecpt.MesWmProductRecptMapper;
  15 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductRecptStatusEnum;
  16 +import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
  17 +import jakarta.annotation.Resource;
  18 +import org.springframework.stereotype.Service;
  19 +import org.springframework.transaction.annotation.Transactional;
  20 +import org.springframework.validation.annotation.Validated;
  21 +
  22 +import java.math.BigDecimal;
  23 +import java.util.List;
  24 +
  25 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  26 +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
  27 +
  28 +/**
  29 + * MES 产品收货单 Service 实现类
  30 + */
  31 +@Service
  32 +@Validated
  33 +public class MesWmProductRecptServiceImpl implements MesWmProductRecptService {
  34 +
  35 + @Resource
  36 + private MesWmProductRecptMapper productRecptMapper;
  37 +
  38 + @Resource
  39 + private MesWmProductRecptLineService productRecptLineService;
  40 +
  41 + @Resource
  42 + private MesWmProductRecptDetailService productRecptDetailService;
  43 +
  44 + @Resource
  45 + private MesWmMaterialStockService materialStockService;
  46 +
  47 + @Override
  48 + public Long createProductRecpt(MesWmProductRecptSaveReqVO createReqVO) {
  49 + // 校验编码唯一
  50 + validateCodeUnique(null, createReqVO.getCode());
  51 +
  52 + // 插入
  53 + MesWmProductRecptDO recpt = BeanUtils.toBean(createReqVO, MesWmProductRecptDO.class);
  54 + recpt.setStatus(MesWmProductRecptStatusEnum.PREPARE.getStatus());
  55 + productRecptMapper.insert(recpt);
  56 + return recpt.getId();
  57 + }
  58 +
  59 + @Override
  60 + public void updateProductRecpt(MesWmProductRecptSaveReqVO updateReqVO) {
  61 + // 校验存在 + 草稿状态
  62 + validateProductRecptExistsAndDraft(updateReqVO.getId());
  63 + // 校验编码唯一
  64 + validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
  65 +
  66 + // 更新
  67 + MesWmProductRecptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductRecptDO.class);
  68 + productRecptMapper.updateById(updateObj);
  69 + }
  70 +
  71 + @Override
  72 + @Transactional(rollbackFor = Exception.class)
  73 + public void deleteProductRecpt(Long id) {
  74 + // 校验存在 + 草稿状态
  75 + validateProductRecptExistsAndDraft(id);
  76 +
  77 + // 级联删除明细和行
  78 + productRecptDetailService.deleteProductRecptDetailByRecptId(id);
  79 + productRecptLineService.deleteProductRecptLineByRecptId(id);
  80 + // 删除
  81 + productRecptMapper.deleteById(id);
  82 + }
  83 +
  84 + @Override
  85 + public MesWmProductRecptDO getProductRecpt(Long id) {
  86 + return productRecptMapper.selectById(id);
  87 + }
  88 +
  89 + @Override
  90 + public PageResult<MesWmProductRecptDO> getProductRecptPage(MesWmProductRecptPageReqVO pageReqVO) {
  91 + return productRecptMapper.selectPage(pageReqVO);
  92 + }
  93 +
  94 + @Override
  95 + @Transactional(rollbackFor = Exception.class)
  96 + public void submitProductRecpt(Long id) {
  97 + // 校验存在 + 草稿状态
  98 + validateProductRecptExistsAndDraft(id);
  99 + // 校验至少有一条行
  100 + List<MesWmProductRecptLineDO> lines = productRecptLineService.getProductRecptLineListByRecptId(id);
  101 + if (CollUtil.isEmpty(lines)) {
  102 + throw exception(WM_PRODUCT_RECPT_NO_LINE);
  103 + }
  104 +
  105 + // 提交(草稿 → 待上架)
  106 + productRecptMapper.updateById(new MesWmProductRecptDO()
  107 + .setId(id).setStatus(MesWmProductRecptStatusEnum.APPROVING.getStatus()));
  108 + }
  109 +
  110 + @Override
  111 + @Transactional(rollbackFor = Exception.class)
  112 + public void stockProductRecpt(Long id) {
  113 + // 校验存在
  114 + MesWmProductRecptDO recpt = validateProductRecptExists(id);
  115 + if (ObjUtil.notEqual(MesWmProductRecptStatusEnum.APPROVING.getStatus(), recpt.getStatus())) {
  116 + throw exception(WM_PRODUCT_RECPT_STATUS_ERROR);
  117 + }
  118 + // 校验每行明细数量之和是否等于行收货数量
  119 + List<MesWmProductRecptLineDO> lines = productRecptLineService.getProductRecptLineListByRecptId(id);
  120 + for (MesWmProductRecptLineDO line : lines) {
  121 + List<MesWmProductRecptDetailDO> details = productRecptDetailService.getProductRecptDetailListByLineId(line.getId());
  122 + BigDecimal totalDetailQty = CollectionUtils.getSumValue(details,
  123 + MesWmProductRecptDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO);
  124 + if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) {
  125 + throw exception(WM_PRODUCT_RECPT_DETAIL_QUANTITY_MISMATCH);
  126 + }
  127 + }
  128 +
  129 + // 执行上架(待上架 → 待入库)
  130 + productRecptMapper.updateById(new MesWmProductRecptDO()
  131 + .setId(id).setStatus(MesWmProductRecptStatusEnum.APPROVED.getStatus()));
  132 + }
  133 +
  134 + @Override
  135 + @Transactional(rollbackFor = Exception.class)
  136 + public void executeProductRecpt(Long id) {
  137 + // 校验存在
  138 + MesWmProductRecptDO recpt = validateProductRecptExists(id);
  139 + if (ObjUtil.notEqual(MesWmProductRecptStatusEnum.APPROVED.getStatus(), recpt.getStatus())) {
  140 + throw exception(WM_PRODUCT_RECPT_STATUS_ERROR);
  141 + }
  142 +
  143 + // 遍历所有明细,更新库存台账
  144 + List<MesWmProductRecptDetailDO> details = productRecptDetailService.getProductRecptDetailListByRecptId(id);
  145 + for (MesWmProductRecptDetailDO detail : details) {
  146 + materialStockService.increaseStock(
  147 + detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(),
  148 + detail.getBatchId(), detail.getQuantity(), null, null, null);
  149 + }
  150 +
  151 + // 更新收货单状态
  152 + productRecptMapper.updateById(new MesWmProductRecptDO()
  153 + .setId(id).setStatus(MesWmProductRecptStatusEnum.FINISHED.getStatus()));
  154 + }
  155 +
  156 + @Override
  157 + @Transactional(rollbackFor = Exception.class)
  158 + public void cancelProductRecpt(Long id) {
  159 + // 校验存在
  160 + MesWmProductRecptDO recpt = validateProductRecptExists(id);
  161 + // 已完成和已取消不允许取消
  162 + if (ObjectUtils.equalsAny(recpt.getStatus(),
  163 + MesWmProductRecptStatusEnum.FINISHED.getStatus(),
  164 + MesWmProductRecptStatusEnum.CANCELED.getStatus())) {
  165 + throw exception(WM_PRODUCT_RECPT_CANCEL_NOT_ALLOWED);
  166 + }
  167 + // 取消
  168 + productRecptMapper.updateById(new MesWmProductRecptDO()
  169 + .setId(id).setStatus(MesWmProductRecptStatusEnum.CANCELED.getStatus()));
  170 + }
  171 +
  172 + @Override
  173 + public MesWmProductRecptDO validateProductRecptEditable(Long id) {
  174 + MesWmProductRecptDO recpt = validateProductRecptExists(id);
  175 + if (ObjUtil.notEqual(recpt.getStatus(), MesWmProductRecptStatusEnum.PREPARE.getStatus())
  176 + && ObjUtil.notEqual(recpt.getStatus(), MesWmProductRecptStatusEnum.APPROVING.getStatus())) {
  177 + throw exception(WM_PRODUCT_RECPT_STATUS_NOT_PREPARE);
  178 + }
  179 + return recpt;
  180 + }
  181 +
  182 + private MesWmProductRecptDO validateProductRecptExists(Long id) {
  183 + MesWmProductRecptDO recpt = productRecptMapper.selectById(id);
  184 + if (recpt == null) {
  185 + throw exception(WM_PRODUCT_RECPT_NOT_EXISTS);
  186 + }
  187 + return recpt;
  188 + }
  189 +
  190 + /**
  191 + * 校验产品收货单存在且为草稿状态
  192 + */
  193 + private MesWmProductRecptDO validateProductRecptExistsAndDraft(Long id) {
  194 + MesWmProductRecptDO recpt = validateProductRecptExists(id);
  195 + if (ObjUtil.notEqual(MesWmProductRecptStatusEnum.PREPARE.getStatus(), recpt.getStatus())) {
  196 + throw exception(WM_PRODUCT_RECPT_STATUS_NOT_PREPARE);
  197 + }
  198 + return recpt;
  199 + }
  200 +
  201 + private void validateCodeUnique(Long id, String code) {
  202 + MesWmProductRecptDO recpt = productRecptMapper.selectByCode(code);
  203 + if (recpt == null) {
  204 + return;
  205 + }
  206 + if (ObjUtil.notEqual(id, recpt.getId())) {
  207 + throw exception(WM_PRODUCT_RECPT_CODE_DUPLICATE);
  208 + }
  209 + }
  210 +
  211 +}
... ...
yudao-ui/yudao-ui-admin-vue3/src/api/mes/wm/productrecpt/detail/index.ts 0 → 100644
  1 +import request from '@/config/axios'
  2 +
  3 +// MES 产品收货单明细 VO
  4 +export interface WmProductRecptDetailVO {
  5 + id: number
  6 + lineId: number
  7 + recptId: number
  8 + itemId: number
  9 + itemCode: string
  10 + itemName: string
  11 + specification: string
  12 + unitMeasureName: string
  13 + quantity: number
  14 + batchId: number
  15 + warehouseId: number
  16 + warehouseName: string
  17 + locationId: number
  18 + locationName: string
  19 + areaId: number
  20 + areaName: string
  21 + remark: string
  22 + createTime: string
  23 +}
  24 +
  25 +// MES 产品收货单明细 API
  26 +export const WmProductRecptDetailApi = {
  27 + // 查询产品收货单明细详情
  28 + getProductRecptDetail: async (id: number) => {
  29 + return await request.get({ url: '/mes/wm/product-recpt-detail/get?id=' + id })
  30 + },
  31 +
  32 + // 查询产品收货单明细列表(按行编号)
  33 + getProductRecptDetailListByLineId: async (lineId: number) => {
  34 + return await request.get({ url: '/mes/wm/product-recpt-detail/list-by-line?lineId=' + lineId })
  35 + },
  36 +
  37 + // 新增产品收货单明细
  38 + createProductRecptDetail: async (data: WmProductRecptDetailVO) => {
  39 + return await request.post({ url: '/mes/wm/product-recpt-detail/create', data })
  40 + },
  41 +
  42 + // 修改产品收货单明细
  43 + updateProductRecptDetail: async (data: WmProductRecptDetailVO) => {
  44 + return await request.put({ url: '/mes/wm/product-recpt-detail/update', data })
  45 + },
  46 +
  47 + // 删除产品收货单明细
  48 + deleteProductRecptDetail: async (id: number) => {
  49 + return await request.delete({ url: '/mes/wm/product-recpt-detail/delete?id=' + id })
  50 + }
  51 +}
... ...
yudao-ui/yudao-ui-admin-vue3/src/api/mes/wm/productrecpt/index.ts 0 → 100644
  1 +import request from '@/config/axios'
  2 +
  3 +// MES 产品收货单 VO
  4 +export interface WmProductRecptVO {
  5 + id: number
  6 + code: string
  7 + name: string
  8 + workOrderId: number
  9 + workOrderCode: string
  10 + itemId: number
  11 + itemCode: string
  12 + itemName: string
  13 + specification: string
  14 + unitMeasureName: string
  15 + receiptDate: string
  16 + status: number
  17 + remark: string
  18 + createTime: string
  19 +}
  20 +
  21 +// MES 产品收货单 API
  22 +export const WmProductRecptApi = {
  23 + // 查询产品收货单分页
  24 + getProductRecptPage: async (params: any) => {
  25 + return await request.get({ url: '/mes/wm/product-recpt/page', params })
  26 + },
  27 +
  28 + // 查询产品收货单详情
  29 + getProductRecpt: async (id: number) => {
  30 + return await request.get({ url: '/mes/wm/product-recpt/get?id=' + id })
  31 + },
  32 +
  33 + // 新增产品收货单
  34 + createProductRecpt: async (data: WmProductRecptVO) => {
  35 + return await request.post({ url: '/mes/wm/product-recpt/create', data })
  36 + },
  37 +
  38 + // 修改产品收货单
  39 + updateProductRecpt: async (data: WmProductRecptVO) => {
  40 + return await request.put({ url: '/mes/wm/product-recpt/update', data })
  41 + },
  42 +
  43 + // 删除产品收货单
  44 + deleteProductRecpt: async (id: number) => {
  45 + return await request.delete({ url: '/mes/wm/product-recpt/delete?id=' + id })
  46 + },
  47 +
  48 + // 提交产品收货单
  49 + submitProductRecpt: async (id: number) => {
  50 + return await request.put({ url: '/mes/wm/product-recpt/submit?id=' + id })
  51 + },
  52 +
  53 + // 执行上架
  54 + stockProductRecpt: async (id: number) => {
  55 + return await request.put({ url: '/mes/wm/product-recpt/stock?id=' + id })
  56 + },
  57 +
  58 + // 执行入库
  59 + executeProductRecpt: async (id: number) => {
  60 + return await request.put({ url: '/mes/wm/product-recpt/execute?id=' + id })
  61 + },
  62 +
  63 + // 取消产品收货单
  64 + cancelProductRecpt: async (id: number) => {
  65 + return await request.put({ url: '/mes/wm/product-recpt/cancel?id=' + id })
  66 + },
  67 +
  68 + // 导出产品收货单 Excel
  69 + exportProductRecpt: async (params: any) => {
  70 + return await request.download({ url: '/mes/wm/product-recpt/export-excel', params })
  71 + }
  72 +}
... ...
yudao-ui/yudao-ui-admin-vue3/src/api/mes/wm/productrecpt/line/index.ts 0 → 100644
  1 +import request from '@/config/axios'
  2 +
  3 +// MES 产品收货单行 VO
  4 +export interface WmProductRecptLineVO {
  5 + id: number
  6 + recptId: number
  7 + itemId: number
  8 + itemCode: string
  9 + itemName: string
  10 + specification: string
  11 + unitMeasureName: string
  12 + receivedQuantity: number
  13 + batchId: number
  14 + batchCode: string
  15 + remark: string
  16 + createTime: string
  17 +}
  18 +
  19 +// MES 产品收货单行 API
  20 +export const WmProductRecptLineApi = {
  21 + // 查询产品收货单行分页
  22 + getProductRecptLinePage: async (params: any) => {
  23 + return await request.get({ url: '/mes/wm/product-recpt-line/page', params })
  24 + },
  25 +
  26 + // 查询产品收货单行详情
  27 + getProductRecptLine: async (id: number) => {
  28 + return await request.get({ url: '/mes/wm/product-recpt-line/get?id=' + id })
  29 + },
  30 +
  31 + // 新增产品收货单行
  32 + createProductRecptLine: async (data: WmProductRecptLineVO) => {
  33 + return await request.post({ url: '/mes/wm/product-recpt-line/create', data })
  34 + },
  35 +
  36 + // 修改产品收货单行
  37 + updateProductRecptLine: async (data: WmProductRecptLineVO) => {
  38 + return await request.put({ url: '/mes/wm/product-recpt-line/update', data })
  39 + },
  40 +
  41 + // 删除产品收货单行
  42 + deleteProductRecptLine: async (id: number) => {
  43 + return await request.delete({ url: '/mes/wm/product-recpt-line/delete?id=' + id })
  44 + }
  45 +}
... ...