From f9de4d95fe6574a996394e1c04524ba290320113 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 28 Feb 2026 09:56:21 +0800 Subject: [PATCH] ✨ feat(mes): 添加供应商退货单及相关明细功能 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorController.java | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorDetailController.java | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorLineController.java | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDetailDO.java | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorLineDO.java | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorDetailMapper.java | 27 +++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorLineMapper.java | 32 ++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorMapper.java | 26 ++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java | 2 ++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 18 ++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailService.java | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineService.java | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 17 files changed, 1396 insertions(+), 0 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorDetailController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorLineController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDetailDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorLineDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorDetailMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorLineMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorController.java new file mode 100644 index 0000000..5a3c679 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorController.java @@ -0,0 +1,164 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO; +import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; +import cn.iocoder.yudao.module.mes.service.wm.returnvendor.MesWmReturnVendorService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 供应商退货单") +@RestController +@RequestMapping("/mes/wm/return-vendor") +@Validated +public class MesWmReturnVendorController { + + @Resource + private MesWmReturnVendorService returnVendorService; + @Resource + private MesMdVendorService vendorService; + + @PostMapping("/create") + @Operation(summary = "创建供应商退货单") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:create')") + public CommonResult createReturnVendor(@Valid @RequestBody MesWmReturnVendorSaveReqVO createReqVO) { + return success(returnVendorService.createReturnVendor(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改供应商退货单") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") + public CommonResult updateReturnVendor(@Valid @RequestBody MesWmReturnVendorSaveReqVO updateReqVO) { + returnVendorService.updateReturnVendor(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除供应商退货单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:delete')") + public CommonResult deleteReturnVendor(@RequestParam("id") Long id) { + returnVendorService.deleteReturnVendor(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得供应商退货单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:query')") + public CommonResult getReturnVendor(@RequestParam("id") Long id) { + MesWmReturnVendorDO returnVendor = returnVendorService.getReturnVendor(id); + if (returnVendor == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(returnVendor)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得供应商退货单分页") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:query')") + public CommonResult> getReturnVendorPage( + @Valid MesWmReturnVendorPageReqVO pageReqVO) { + PageResult pageResult = returnVendorService.getReturnVendorPage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出供应商退货单 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportReturnVendorExcel(@Valid MesWmReturnVendorPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + PageResult pageResult = returnVendorService.getReturnVendorPage(pageReqVO); + ExcelUtils.write(response, "供应商退货单.xls", "数据", MesWmReturnVendorRespVO.class, + buildRespVOList(pageResult.getList())); + } + + @PutMapping("/submit") + @Operation(summary = "提交供应商退货单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") + public CommonResult submitReturnVendor(@RequestParam("id") Long id) { + returnVendorService.submitReturnVendor(id); + return success(true); + } + + @PutMapping("/stock") + @Operation(summary = "执行拣货") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") + public CommonResult stockReturnVendor(@RequestParam("id") Long id) { + returnVendorService.stockReturnVendor(id); + return success(true); + } + + @PutMapping("/finish") + @Operation(summary = "完成供应商退货单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:execute')") + public CommonResult finishReturnVendor(@RequestParam("id") Long id) { + returnVendorService.finishReturnVendor(id); + return success(true); + } + + @PutMapping("/cancel") + @Operation(summary = "取消供应商退货单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") + public CommonResult cancelReturnVendor(@RequestParam("id") Long id) { + returnVendorService.cancelReturnVendor(id); + return success(true); + } + + @GetMapping("/check-quantity") + @Operation(summary = "校验供应商退货单数量", description = "校验每行明细数量之和是否等于行退货数量") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:query')") + public CommonResult checkReturnVendorQuantity(@RequestParam("id") Long id) { + return success(returnVendorService.checkReturnVendorQuantity(id)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map vendorMap = vendorService.getVendorMap( + convertSet(list, MesWmReturnVendorDO::getVendorId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmReturnVendorRespVO.class, vo -> + MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor -> + vo.setVendorName(vendor.getName()).setVendorNickname(vendor.getNickname()))); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorDetailController.java new file mode 100644 index 0000000..5da9016 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorDetailController.java @@ -0,0 +1,142 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail.MesWmReturnVendorDetailRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail.MesWmReturnVendorDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.wm.returnvendor.MesWmReturnVendorDetailService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 供应商退货明细") +@RestController +@RequestMapping("/mes/wm/return-vendor-detail") +@Validated +public class MesWmReturnVendorDetailController { + + @Resource + private MesWmReturnVendorDetailService returnVendorDetailService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @Resource + private MesWmWarehouseService warehouseService; + + @Resource + private MesWmWarehouseLocationService locationService; + + @Resource + private MesWmWarehouseAreaService areaService; + + @PostMapping("/create") + @Operation(summary = "创建供应商退货明细") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:create')") + public CommonResult createReturnVendorDetail(@Valid @RequestBody MesWmReturnVendorDetailSaveReqVO createReqVO) { + return success(returnVendorDetailService.createReturnVendorDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改供应商退货明细") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") + public CommonResult updateReturnVendorDetail(@Valid @RequestBody MesWmReturnVendorDetailSaveReqVO updateReqVO) { + returnVendorDetailService.updateReturnVendorDetail(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除供应商退货明细") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:delete')") + public CommonResult deleteReturnVendorDetail(@RequestParam("id") Long id) { + returnVendorDetailService.deleteReturnVendorDetail(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得供应商退货明细") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:query')") + public CommonResult getReturnVendorDetail(@RequestParam("id") Long id) { + MesWmReturnVendorDetailDO detail = returnVendorDetailService.getReturnVendorDetail(id); + if (detail == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(detail)).get(0)); + } + + @GetMapping("/list-by-line") + @Operation(summary = "获得供应商退货明细列表(按行编号)") + @Parameter(name = "lineId", description = "行编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:query')") + public CommonResult> getReturnVendorDetailListByLineId( + @RequestParam("lineId") Long lineId) { + List list = returnVendorDetailService.getReturnVendorDetailListByLineId(lineId); + return success(buildRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map itemMap = itemService.getItemMap( + convertSet(list, MesWmReturnVendorDetailDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + Map warehouseMap = warehouseService.getWarehouseMap( + convertSet(list, MesWmReturnVendorDetailDO::getWarehouseId)); + Map locationMap = locationService.getWarehouseLocationMap( + convertSet(list, MesWmReturnVendorDetailDO::getLocationId)); + Map areaMap = areaService.getWarehouseAreaMap( + convertSet(list, MesWmReturnVendorDetailDO::getAreaId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmReturnVendorDetailRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()); + vo.setItemName(item.getName()); + vo.setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + }); + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), + warehouse -> vo.setWarehouseName(warehouse.getName())); + MapUtils.findAndThen(locationMap, vo.getLocationId(), + location -> vo.setLocationName(location.getName())); + MapUtils.findAndThen(areaMap, vo.getAreaId(), + area -> vo.setAreaName(area.getName())); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorLineController.java new file mode 100644 index 0000000..24ad3f5 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorLineController.java @@ -0,0 +1,126 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.wm.returnvendor.MesWmReturnVendorLineService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 供应商退货单行") +@RestController +@RequestMapping("/mes/wm/return-vendor-line") +@Validated +public class MesWmReturnVendorLineController { + + @Resource + private MesWmReturnVendorLineService returnVendorLineService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @PostMapping("/create") + @Operation(summary = "创建供应商退货单行") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:create')") + public CommonResult createReturnVendorLine(@Valid @RequestBody MesWmReturnVendorLineSaveReqVO createReqVO) { + return success(returnVendorLineService.createReturnVendorLine(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改供应商退货单行") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") + public CommonResult updateReturnVendorLine(@Valid @RequestBody MesWmReturnVendorLineSaveReqVO updateReqVO) { + returnVendorLineService.updateReturnVendorLine(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除供应商退货单行") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:delete')") + public CommonResult deleteReturnVendorLine(@RequestParam("id") Long id) { + returnVendorLineService.deleteReturnVendorLine(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得供应商退货单行") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:query')") + public CommonResult getReturnVendorLine(@RequestParam("id") Long id) { + MesWmReturnVendorLineDO line = returnVendorLineService.getReturnVendorLine(id); + if (line == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(line)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得供应商退货单行分页") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:query')") + public CommonResult> getReturnVendorLinePage( + @Valid MesWmReturnVendorLinePageReqVO pageReqVO) { + PageResult pageResult = returnVendorLineService.getReturnVendorLinePage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/list-by-return-vendor") + @Operation(summary = "获得供应商退货单行列表(按退货单编号)") + @Parameter(name = "returnVendorId", description = "退货单编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:query')") + public CommonResult> getReturnVendorLineListByReturnVendorId( + @RequestParam("returnVendorId") Long returnVendorId) { + List list = returnVendorLineService.getReturnVendorLineListByReturnVendorId(returnVendorId); + return success(buildRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map itemMap = itemService.getItemMap( + convertSet(list, MesWmReturnVendorLineDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmReturnVendorLineRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()); + vo.setItemName(item.getName()); + vo.setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + }); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java new file mode 100644 index 0000000..d4706f6 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDO.java @@ -0,0 +1,81 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnVendorStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * MES 供应商退货单 DO + */ +@TableName("mes_wm_return_vendor") +@KeySequence("mes_wm_return_vendor_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmReturnVendorDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 退货单编号 + */ + private String code; + /** + * 退货单名称 + */ + private String name; + // TODO @AI:还是类似 purchase_order_code 全称 + /** + * 采购订单编号 + */ + private String poCode; + /** + * 供应商 ID + * + * 关联 {@link MesMdVendorDO#getId()} + */ + private Long vendorId; + /** + * 批次号 + */ + private String batchCode; + /** + * 退货日期 + */ + private LocalDateTime returnDate; + /** + * 退货原因 + */ + private String returnReason; + /** + * 物流单号 + */ + private String transportCode; + /** + * 物流联系电话 + */ + private String transportTelephone; + /** + * 状态 + * + * 枚举 {@link MesWmReturnVendorStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDetailDO.java new file mode 100644 index 0000000..3bdf42f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorDetailDO.java @@ -0,0 +1,94 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 供应商退货明细 DO + */ +@TableName("mes_wm_return_vendor_detail") +@KeySequence("mes_wm_return_vendor_detail_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmReturnVendorDetailDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + // TODO @AI:使用 returnId,是不是更简洁一点; + /** + * 退货单 ID + * + * 关联 {@link MesWmReturnVendorDO#getId()} + */ + private Long returnVendorId; + /** + * 行 ID + * + * 关联 {@link MesWmReturnVendorLineDO#getId()} + */ + private Long lineId; + /** + * 库存记录 ID + * + * 关联 {@link MesWmMaterialStockDO#getId()} + */ + private Long materialStockId; + /** + * 物料 ID + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 退货数量 + */ + private BigDecimal quantity; + /** + * 批次 ID + */ + private Long batchId; + /** + * 批次号 + */ + private String batchCode; + /** + * 仓库 ID + * + * 关联 {@link MesWmWarehouseDO#getId()} + */ + private Long warehouseId; + /** + * 库区 ID + * + * 关联 {@link MesWmWarehouseLocationDO#getId()} + */ + private Long locationId; + /** + * 库位 ID + * + * 关联 {@link MesWmWarehouseAreaDO#getId()} + */ + private Long areaId; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorLineDO.java new file mode 100644 index 0000000..e5a7b7f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnvendor/MesWmReturnVendorLineDO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 供应商退货单行 DO + */ +@TableName("mes_wm_return_vendor_line") +@KeySequence("mes_wm_return_vendor_line_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmReturnVendorLineDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + // TODO @AI:使用 returnId,是不是更简洁一点; + /** + * 退货单 ID + * + * 关联 {@link MesWmReturnVendorDO#getId()} + */ + private Long returnVendorId; + /** + * 物料 ID + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 退货数量 + */ + private BigDecimal quantity; + /** + * 批次 ID + */ + private Long batchId; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorDetailMapper.java new file mode 100644 index 0000000..966c647 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorDetailMapper.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 供应商退货明细 Mapper + */ +@Mapper +public interface MesWmReturnVendorDetailMapper extends BaseMapperX { + + default List selectListByLineId(Long lineId) { + return selectList(MesWmReturnVendorDetailDO::getLineId, lineId); + } + + default List selectListByReturnVendorId(Long returnVendorId) { + return selectList(MesWmReturnVendorDetailDO::getReturnVendorId, returnVendorId); + } + + default void deleteByReturnVendorId(Long returnVendorId) { + delete(MesWmReturnVendorDetailDO::getReturnVendorId, returnVendorId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorLineMapper.java new file mode 100644 index 0000000..4906fb0 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorLineMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLinePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 供应商退货单行 Mapper + */ +@Mapper +public interface MesWmReturnVendorLineMapper extends BaseMapperX { + + default PageResult selectPage(MesWmReturnVendorLinePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesWmReturnVendorLineDO::getReturnVendorId, reqVO.getReturnVendorId()) + .orderByDesc(MesWmReturnVendorLineDO::getId)); + } + + default List selectListByReturnVendorId(Long returnVendorId) { + return selectList(MesWmReturnVendorLineDO::getReturnVendorId, returnVendorId); + } + + default void deleteByReturnVendorId(Long returnVendorId) { + delete(MesWmReturnVendorLineDO::getReturnVendorId, returnVendorId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorMapper.java new file mode 100644 index 0000000..f3f80dd --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnvendor/MesWmReturnVendorMapper.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 供应商退货单 Mapper + */ +@Mapper +public interface MesWmReturnVendorMapper extends BaseMapperX { + + default PageResult selectPage(MesWmReturnVendorPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmReturnVendorDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmReturnVendorDO::getName, reqVO.getName()) + .eqIfPresent(MesWmReturnVendorDO::getVendorId, reqVO.getVendorId()) + .eqIfPresent(MesWmReturnVendorDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(MesWmReturnVendorDO::getReturnDate, reqVO.getReturnDate()) + .orderByDesc(MesWmReturnVendorDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java index 0f458c5..1273dd2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java @@ -48,5 +48,7 @@ public interface DictTypeConstants { String MES_WM_ITEM_RECEIPT_STATUS = "mes_wm_item_receipt_status"; // MES 采购入库单状态 String MES_WM_PRODUCT_PRODUCE_STATUS = "mes_product_produce_status"; // MES 生产入库单状态 String MES_WM_QUALITY_STATUS = "mes_wm_quality_status"; // MES 质量状态(待检/合格/不合格) + String MES_WM_RETURN_ISSUE_STATUS = "mes_return_issue_status"; // MES 生产退料单状态 + String MES_WM_RETURN_ISSUE_TYPE = "mes_return_issue_type"; // MES 生产退料类型 } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index d08c65e..e2ea721 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -378,4 +378,22 @@ public interface ErrorCodeConstants { ErrorCode WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS = new ErrorCode(1_040_709_100, "生产入库单行不存在"); ErrorCode WM_PRODUCT_PRODUCE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_709_200, "生产入库单明细不存在"); + // ========== MES 仓库管理-生产退料单(1-040-710-000) ========== + ErrorCode WM_RETURN_ISSUE_NOT_EXISTS = new ErrorCode(1_040_710_000, "生产退料单不存在"); + ErrorCode WM_RETURN_ISSUE_STATUS_INVALID = new ErrorCode(1_040_710_001, "生产退料单状态不正确,无法执行该操作"); + ErrorCode WM_RETURN_ISSUE_NO_LINE = new ErrorCode(1_040_710_002, "生产退料单至少需要一条行数据"); + ErrorCode WM_RETURN_ISSUE_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_710_003, "退料单行数量与明细数量不一致"); + ErrorCode WM_RETURN_ISSUE_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_710_004, "生产退料单已完成或已取消,无法取消"); + ErrorCode WM_RETURN_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_710_100, "生产退料单行不存在"); + ErrorCode WM_RETURN_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_710_200, "生产退料单明细不存在"); + + // ========== MES 仓库管理-供应商退货单(1-040-711-000) ========== + ErrorCode WM_RETURN_VENDOR_NOT_EXISTS = new ErrorCode(1_040_711_000, "供应商退货单不存在"); + ErrorCode WM_RETURN_VENDOR_STATUS_INVALID = new ErrorCode(1_040_711_001, "供应商退货单状态不正确,无法执行该操作"); + ErrorCode WM_RETURN_VENDOR_NO_LINE = new ErrorCode(1_040_711_002, "供应商退货单至少需要一条行数据"); + ErrorCode WM_RETURN_VENDOR_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_711_003, "供应商退货单行数量与明细数量不一致"); + ErrorCode WM_RETURN_VENDOR_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_711_004, "供应商退货单已完成或已取消,无法取消"); + ErrorCode WM_RETURN_VENDOR_LINE_NOT_EXISTS = new ErrorCode(1_040_711_100, "供应商退货单行不存在"); + ErrorCode WM_RETURN_VENDOR_DETAIL_NOT_EXISTS = new ErrorCode(1_040_711_200, "供应商退货单明细不存在"); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailService.java new file mode 100644 index 0000000..94f2853 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailService.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnvendor; + +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail.MesWmReturnVendorDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 供应商退货明细 Service 接口 + */ +public interface MesWmReturnVendorDetailService { + + /** + * 创建供应商退货明细 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createReturnVendorDetail(@Valid MesWmReturnVendorDetailSaveReqVO createReqVO); + + /** + * 更新供应商退货明细 + * + * @param updateReqVO 更新信息 + */ + void updateReturnVendorDetail(@Valid MesWmReturnVendorDetailSaveReqVO updateReqVO); + + /** + * 删除供应商退货明细 + * + * @param id 编号 + */ + void deleteReturnVendorDetail(Long id); + + /** + * 获得供应商退货明细 + * + * @param id 编号 + * @return 供应商退货明细 + */ + MesWmReturnVendorDetailDO getReturnVendorDetail(Long id); + + /** + * 根据行ID获取明细列表 + * + * @param lineId 行ID + * @return 明细列表 + */ + List getReturnVendorDetailListByLineId(Long lineId); + + /** + * 根据退货单ID获取明细列表 + * + * @param returnVendorId 退货单ID + * @return 明细列表 + */ + List getReturnVendorDetailListByReturnVendorId(Long returnVendorId); + + /** + * 根据退货单ID删除明细 + * + * @param returnVendorId 退货单ID + */ + void deleteReturnVendorDetailByReturnVendorId(Long returnVendorId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java new file mode 100644 index 0000000..240d601 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java @@ -0,0 +1,90 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnvendor; + +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail.MesWmReturnVendorDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorDetailMapper; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_VENDOR_DETAIL_NOT_EXISTS; + +/** + * MES 供应商退货明细 Service 实现类 + */ +@Service +@Validated +public class MesWmReturnVendorDetailServiceImpl implements MesWmReturnVendorDetailService { + + @Resource + private MesWmReturnVendorDetailMapper returnVendorDetailMapper; + + @Resource + @Lazy + private MesWmReturnVendorLineService returnVendorLineService; + + @Override + public Long createReturnVendorDetail(MesWmReturnVendorDetailSaveReqVO createReqVO) { + // 校验父数据存在 + returnVendorLineService.validateReturnVendorLineExists(createReqVO.getLineId()); + // TODO @AI:item 存在 + + // 插入 + MesWmReturnVendorDetailDO detail = BeanUtils.toBean(createReqVO, MesWmReturnVendorDetailDO.class); + returnVendorDetailMapper.insert(detail); + return detail.getId(); + } + + @Override + public void updateReturnVendorDetail(MesWmReturnVendorDetailSaveReqVO updateReqVO) { + // 校验存在 + validateReturnVendorDetailExists(updateReqVO.getId()); + // 校验父数据存在 + returnVendorLineService.validateReturnVendorLineExists(updateReqVO.getLineId()); + // TODO @AI:item 存在 + + // 更新 + MesWmReturnVendorDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorDetailDO.class); + returnVendorDetailMapper.updateById(updateObj); + } + + @Override + public void deleteReturnVendorDetail(Long id) { + // 校验存在 + validateReturnVendorDetailExists(id); + // 删除 + returnVendorDetailMapper.deleteById(id); + } + + @Override + public MesWmReturnVendorDetailDO getReturnVendorDetail(Long id) { + return returnVendorDetailMapper.selectById(id); + } + + @Override + public List getReturnVendorDetailListByLineId(Long lineId) { + return returnVendorDetailMapper.selectListByLineId(lineId); + } + + @Override + public List getReturnVendorDetailListByReturnVendorId(Long returnVendorId) { + return returnVendorDetailMapper.selectListByReturnVendorId(returnVendorId); + } + + @Override + public void deleteReturnVendorDetailByReturnVendorId(Long returnVendorId) { + returnVendorDetailMapper.deleteByReturnVendorId(returnVendorId); + } + + private void validateReturnVendorDetailExists(Long id) { + if (returnVendorDetailMapper.selectById(id) == null) { + throw exception(WM_RETURN_VENDOR_DETAIL_NOT_EXISTS); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineService.java new file mode 100644 index 0000000..a0868d5 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineService.java @@ -0,0 +1,77 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnvendor; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 供应商退货单行 Service 接口 + */ +public interface MesWmReturnVendorLineService { + + /** + * 创建供应商退货单行 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createReturnVendorLine(@Valid MesWmReturnVendorLineSaveReqVO createReqVO); + + /** + * 更新供应商退货单行 + * + * @param updateReqVO 更新信息 + */ + void updateReturnVendorLine(@Valid MesWmReturnVendorLineSaveReqVO updateReqVO); + + /** + * 删除供应商退货单行 + * + * @param id 编号 + */ + void deleteReturnVendorLine(Long id); + + /** + * 获得供应商退货单行 + * + * @param id 编号 + * @return 供应商退货单行 + */ + MesWmReturnVendorLineDO getReturnVendorLine(Long id); + + /** + * 获得供应商退货单行分页 + * + * @param pageReqVO 分页查询 + * @return 供应商退货单行分页 + */ + PageResult getReturnVendorLinePage(MesWmReturnVendorLinePageReqVO pageReqVO); + + /** + * 根据退货单ID获取行列表 + * + * @param returnVendorId 退货单ID + * @return 行列表 + */ + List getReturnVendorLineListByReturnVendorId(Long returnVendorId); + + /** + * 根据退货单ID删除行 + * + * @param returnVendorId 退货单ID + */ + void deleteReturnVendorLineByReturnVendorId(Long returnVendorId); + + /** + * 校验供应商退货单行是否存在 + * + * @param id 编号 + * @return 供应商退货单行 + */ + MesWmReturnVendorLineDO validateReturnVendorLineExists(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java new file mode 100644 index 0000000..f507db7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java @@ -0,0 +1,100 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnvendor; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_VENDOR_LINE_NOT_EXISTS; + +/** + * MES 供应商退货单行 Service 实现类 + */ +@Service +@Validated +public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineService { + + @Resource + private MesWmReturnVendorLineMapper returnVendorLineMapper; + + @Resource + @Lazy + private MesWmReturnVendorService returnVendorService; + @Resource + private MesMdItemService itemService; + + @Override + public Long createReturnVendorLine(MesWmReturnVendorLineSaveReqVO createReqVO) { + // 校验父数据存在 + returnVendorService.validateReturnVendorExists(createReqVO.getReturnVendorId()); + // 校验物料存在 + itemService.validateItemExists(createReqVO.getItemId()); + + // 插入 + MesWmReturnVendorLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnVendorLineDO.class); + returnVendorLineMapper.insert(line); + return line.getId(); + } + + @Override + public void updateReturnVendorLine(MesWmReturnVendorLineSaveReqVO updateReqVO) { + // 校验存在 + validateReturnVendorLineExists(updateReqVO.getId()); + // 校验父数据存在 + returnVendorService.validateReturnVendorExists(updateReqVO.getReturnVendorId()); + // 校验物料存在 + itemService.validateItemExists(updateReqVO.getItemId()); + + // 更新 + MesWmReturnVendorLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorLineDO.class); + returnVendorLineMapper.updateById(updateObj); + } + + @Override + public void deleteReturnVendorLine(Long id) { + // 校验存在 + validateReturnVendorLineExists(id); + // 删除 + returnVendorLineMapper.deleteById(id); + } + + @Override + public MesWmReturnVendorLineDO getReturnVendorLine(Long id) { + return returnVendorLineMapper.selectById(id); + } + + @Override + public PageResult getReturnVendorLinePage(MesWmReturnVendorLinePageReqVO pageReqVO) { + return returnVendorLineMapper.selectPage(pageReqVO); + } + + @Override + public List getReturnVendorLineListByReturnVendorId(Long returnVendorId) { + return returnVendorLineMapper.selectListByReturnVendorId(returnVendorId); + } + + @Override + public void deleteReturnVendorLineByReturnVendorId(Long returnVendorId) { + returnVendorLineMapper.deleteByReturnVendorId(returnVendorId); + } + + @Override + public MesWmReturnVendorLineDO validateReturnVendorLineExists(Long id) { + MesWmReturnVendorLineDO line = returnVendorLineMapper.selectById(id); + if (line == null) { + throw exception(WM_RETURN_VENDOR_LINE_NOT_EXISTS); + } + return line; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java new file mode 100644 index 0000000..3c6f32f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorService.java @@ -0,0 +1,96 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnvendor; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO; +import jakarta.validation.Valid; + +/** + * MES 供应商退货单 Service 接口 + */ +public interface MesWmReturnVendorService { + + /** + * 创建供应商退货单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createReturnVendor(@Valid MesWmReturnVendorSaveReqVO createReqVO); + + /** + * 修改供应商退货单 + * + * @param updateReqVO 修改信息 + */ + void updateReturnVendor(@Valid MesWmReturnVendorSaveReqVO updateReqVO); + + /** + * 删除供应商退货单 + * + * @param id 编号 + */ + void deleteReturnVendor(Long id); + + /** + * 获得供应商退货单 + * + * @param id 编号 + * @return 供应商退货单 + */ + MesWmReturnVendorDO getReturnVendor(Long id); + + /** + * 获得供应商退货单分页 + * + * @param pageReqVO 分页参数 + * @return 供应商退货单分页 + */ + PageResult getReturnVendorPage(MesWmReturnVendorPageReqVO pageReqVO); + + /** + * 校验供应商退货单是否存在 + * + * @param id 编号 + * @return 供应商退货单 + */ + MesWmReturnVendorDO validateReturnVendorExists(Long id); + + /** + * 提交供应商退货单(草稿 -> 待拣货) + * + * @param id 编号 + */ + void submitReturnVendor(Long id); + + /** + * 执行拣货(待拣货 -> 待执行退货) + * + * @param id 编号 + */ + void stockReturnVendor(Long id); + + /** + * 执行退货/出库(待执行退货 -> 已完成),更新库存台账 + * + * @param id 编号 + */ + void finishReturnVendor(Long id); + + /** + * 取消供应商退货单(任意非已完成/已取消状态 -> 已取消) + * + * @param id 编号 + */ + void cancelReturnVendor(Long id); + + /** + * 校验供应商退货单的数量:每行明细数量之和是否等于行退货数量 + * + * @param id 编号 + * @return 是否全部一致 + */ + Boolean checkReturnVendorQuantity(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java new file mode 100644 index 0000000..3bae858 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java @@ -0,0 +1,198 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnvendor; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorMapper; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnVendorStatusEnum; +import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 供应商退货单 Service 实现类 + */ +@Service +@Validated +public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { + + @Resource + private MesWmReturnVendorMapper returnVendorMapper; + + @Resource + private MesWmReturnVendorLineService returnVendorLineService; + @Resource + private MesWmReturnVendorDetailService returnVendorDetailService; + @Resource + private MesMdVendorService vendorService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createReturnVendor(MesWmReturnVendorSaveReqVO createReqVO) { + // 1. 校验关联数据 + vendorService.validateVendorExists(createReqVO.getVendorId()); + + // 2. 插入主表 + MesWmReturnVendorDO returnVendor = BeanUtils.toBean(createReqVO, MesWmReturnVendorDO.class); + returnVendor.setStatus(MesWmReturnVendorStatusEnum.PREPARE.getStatus()); + returnVendorMapper.insert(returnVendor); + return returnVendor.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateReturnVendor(MesWmReturnVendorSaveReqVO updateReqVO) { + // 1.1 校验存在 + 准备中状态 + validateReturnVendorExistsAndPrepare(updateReqVO.getId()); + // 1.2 校验关联数据 + vendorService.validateVendorExists(updateReqVO.getVendorId()); + + // 2. 更新主表 + MesWmReturnVendorDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorDO.class); + returnVendorMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteReturnVendor(Long id) { + // 1. 校验存在 + 准备中状态 + validateReturnVendorExistsAndPrepare(id); + + // 2.1 级联删除明细 + returnVendorDetailService.deleteReturnVendorDetailByReturnVendorId(id); + // 2.2 级联删除行 + returnVendorLineService.deleteReturnVendorLineByReturnVendorId(id); + // 2.3 删除主表 + returnVendorMapper.deleteById(id); + } + + @Override + public MesWmReturnVendorDO getReturnVendor(Long id) { + return returnVendorMapper.selectById(id); + } + + @Override + public PageResult getReturnVendorPage(MesWmReturnVendorPageReqVO pageReqVO) { + return returnVendorMapper.selectPage(pageReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submitReturnVendor(Long id) { + // 校验存在 + 草稿状态 + validateReturnVendorExistsAndPrepare(id); + // 校验至少有一条行 + List lines = returnVendorLineService.getReturnVendorLineListByReturnVendorId(id); + if (CollUtil.isEmpty(lines)) { + throw exception(WM_RETURN_VENDOR_NO_LINE); + } + + // 提交(草稿 -> 待拣货) + returnVendorMapper.updateById(new MesWmReturnVendorDO() + .setId(id).setStatus(MesWmReturnVendorStatusEnum.APPROVING.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void stockReturnVendor(Long id) { + // 校验存在 + MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id); + if (ObjUtil.notEqual(MesWmReturnVendorStatusEnum.APPROVING.getStatus(), returnVendor.getStatus())) { + throw exception(WM_RETURN_VENDOR_STATUS_INVALID); + } + // 执行拣货(待拣货 -> 待执行退货) + returnVendorMapper.updateById(new MesWmReturnVendorDO() + .setId(id).setStatus(MesWmReturnVendorStatusEnum.APPROVED.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void finishReturnVendor(Long id) { + // 校验存在 + MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id); + if (ObjUtil.notEqual(MesWmReturnVendorStatusEnum.APPROVED.getStatus(), returnVendor.getStatus())) { + throw exception(WM_RETURN_VENDOR_STATUS_INVALID); + } + + // 遍历所有明细,更新库存台账(扣减库存) + // TODO @芋艿:【后续在弄】这里可能有点问题;缺少库存更新;后面在弄; + List details = returnVendorDetailService.getReturnVendorDetailListByReturnVendorId(id); + for (MesWmReturnVendorDetailDO detail : details) { + // materialStockService.decreaseStock( + // detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(), + // detail.getBatchId(), detail.getQuantity(), null, null, null); + } + + // 更新退货单状态 + returnVendorMapper.updateById(new MesWmReturnVendorDO() + .setId(id).setStatus(MesWmReturnVendorStatusEnum.FINISHED.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelReturnVendor(Long id) { + // 校验存在 + MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id); + // 已完成和已取消不允许取消 + if (ObjectUtils.equalsAny(returnVendor.getStatus(), + MesWmReturnVendorStatusEnum.FINISHED.getStatus(), + MesWmReturnVendorStatusEnum.CANCELED.getStatus())) { + throw exception(WM_RETURN_VENDOR_CANCEL_NOT_ALLOWED); + } + + // 取消 + returnVendorMapper.updateById(new MesWmReturnVendorDO() + .setId(id).setStatus(MesWmReturnVendorStatusEnum.CANCELED.getStatus())); + } + + @Override + public Boolean checkReturnVendorQuantity(Long id) { + List lines = returnVendorLineService.getReturnVendorLineListByReturnVendorId(id); + for (MesWmReturnVendorLineDO line : lines) { + List details = returnVendorDetailService.getReturnVendorDetailListByLineId(line.getId()); + BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, + MesWmReturnVendorDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); + if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) { + return false; + } + } + return true; + } + + @Override + public MesWmReturnVendorDO validateReturnVendorExists(Long id) { + MesWmReturnVendorDO returnVendor = returnVendorMapper.selectById(id); + if (returnVendor == null) { + throw exception(WM_RETURN_VENDOR_NOT_EXISTS); + } + return returnVendor; + } + + /** + * 校验供应商退货单存在且为准备中状态 + */ + private MesWmReturnVendorDO validateReturnVendorExistsAndPrepare(Long id) { + MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id); + if (ObjUtil.notEqual(MesWmReturnVendorStatusEnum.PREPARE.getStatus(), returnVendor.getStatus())) { + throw exception(WM_RETURN_VENDOR_STATUS_INVALID); + } + return returnVendor; + } + +} -- libgit2 0.21.4