Commit 4d4287dd4c93f6b6c4844ec400efc06ba978e6c4

Authored by YunaiV
1 parent f99f8548

✨ feat(mes): 添加销售退货单及行相关功能和数据结构

新增销售退货单及行的相关数据结构、请求和响应对象,包含销售退货单的基本信息、行信息以及相关的 API 接口,支持销售退货单的创建、更新、查询和删除操作,提升了系统的功能性和可维护性。
Showing 26 changed files with 1946 additions and 0 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales;
  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.returnsales.vo.MesWmReturnSalesPageReqVO;
  12 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesRespVO;
  13 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesSaveReqVO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO;
  15 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO;
  16 +import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService;
  17 +import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService;
  18 +import io.swagger.v3.oas.annotations.Operation;
  19 +import io.swagger.v3.oas.annotations.Parameter;
  20 +import io.swagger.v3.oas.annotations.tags.Tag;
  21 +import jakarta.annotation.Resource;
  22 +import jakarta.servlet.http.HttpServletResponse;
  23 +import jakarta.validation.Valid;
  24 +import org.springframework.security.access.prepost.PreAuthorize;
  25 +import org.springframework.validation.annotation.Validated;
  26 +import org.springframework.web.bind.annotation.*;
  27 +
  28 +import java.io.IOException;
  29 +import java.util.Collections;
  30 +import java.util.List;
  31 +import java.util.Map;
  32 +
  33 +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
  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 +/**
  38 + * 管理后台 - MES 销售退货单 Controller
  39 + *
  40 + * @author 芋道源码
  41 + */
  42 +@Tag(name = "管理后台 - MES 销售退货单")
  43 +@RestController
  44 +@RequestMapping("/mes/wm/return-sales")
  45 +@Validated
  46 +public class MesWmReturnSalesController {
  47 +
  48 + @Resource
  49 + private MesWmReturnSalesService returnSalesService;
  50 + @Resource
  51 + private MesMdClientService clientService;
  52 +
  53 + @PostMapping("/create")
  54 + @Operation(summary = "创建销售退货单")
  55 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:create')")
  56 + public CommonResult<Long> createReturnSales(@Valid @RequestBody MesWmReturnSalesSaveReqVO createReqVO) {
  57 + return success(returnSalesService.createReturnSales(createReqVO));
  58 + }
  59 +
  60 + @PutMapping("/update")
  61 + @Operation(summary = "修改销售退货单")
  62 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:update')")
  63 + public CommonResult<Boolean> updateReturnSales(@Valid @RequestBody MesWmReturnSalesSaveReqVO updateReqVO) {
  64 + returnSalesService.updateReturnSales(updateReqVO);
  65 + return success(true);
  66 + }
  67 +
  68 + @DeleteMapping("/delete")
  69 + @Operation(summary = "删除销售退货单")
  70 + @Parameter(name = "id", description = "编号", required = true)
  71 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:delete')")
  72 + public CommonResult<Boolean> deleteReturnSales(@RequestParam("id") Long id) {
  73 + returnSalesService.deleteReturnSales(id);
  74 + return success(true);
  75 + }
  76 +
  77 + @GetMapping("/get")
  78 + @Operation(summary = "获得销售退货单")
  79 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  80 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')")
  81 + public CommonResult<MesWmReturnSalesRespVO> getReturnSales(@RequestParam("id") Long id) {
  82 + MesWmReturnSalesDO returnSales = returnSalesService.getReturnSales(id);
  83 + if (returnSales == null) {
  84 + return success(null);
  85 + }
  86 + return success(buildRespVOList(Collections.singletonList(returnSales)).get(0));
  87 + }
  88 +
  89 + @GetMapping("/page")
  90 + @Operation(summary = "获得销售退货单分页")
  91 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')")
  92 + public CommonResult<PageResult<MesWmReturnSalesRespVO>> getReturnSalesPage(
  93 + @Valid MesWmReturnSalesPageReqVO pageReqVO) {
  94 + PageResult<MesWmReturnSalesDO> pageResult = returnSalesService.getReturnSalesPage(pageReqVO);
  95 + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
  96 + }
  97 +
  98 + @GetMapping("/export-excel")
  99 + @Operation(summary = "导出销售退货单 Excel")
  100 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:export')")
  101 + @ApiAccessLog(operateType = EXPORT)
  102 + public void exportReturnSalesExcel(@Valid MesWmReturnSalesPageReqVO pageReqVO,
  103 + HttpServletResponse response) throws IOException {
  104 + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
  105 + PageResult<MesWmReturnSalesDO> pageResult = returnSalesService.getReturnSalesPage(pageReqVO);
  106 + ExcelUtils.write(response, "销售退货单.xls", "数据", MesWmReturnSalesRespVO.class,
  107 + buildRespVOList(pageResult.getList()));
  108 + }
  109 +
  110 + @PutMapping("/submit")
  111 + @Operation(summary = "提交销售退货单")
  112 + @Parameter(name = "id", description = "编号", required = true)
  113 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:submit')")
  114 + public CommonResult<Boolean> submitReturnSales(@RequestParam("id") Long id) {
  115 + returnSalesService.submitReturnSales(id);
  116 + return success(true);
  117 + }
  118 +
  119 + @PutMapping("/execute")
  120 + @Operation(summary = "执行退货")
  121 + @Parameter(name = "id", description = "编号", required = true)
  122 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:execute')")
  123 + public CommonResult<Boolean> executeReturnSales(@RequestParam("id") Long id) {
  124 + returnSalesService.executeReturnSales(id);
  125 + return success(true);
  126 + }
  127 +
  128 + @PutMapping("/stock")
  129 + @Operation(summary = "执行上架")
  130 + @Parameter(name = "id", description = "编号", required = true)
  131 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:stock')")
  132 + public CommonResult<Boolean> stockReturnSales(@RequestParam("id") Long id) {
  133 + returnSalesService.stockReturnSales(id);
  134 + return success(true);
  135 + }
  136 +
  137 + @PutMapping("/cancel")
  138 + @Operation(summary = "取消销售退货单")
  139 + @Parameter(name = "id", description = "编号", required = true)
  140 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:cancel')")
  141 + public CommonResult<Boolean> cancelReturnSales(@RequestParam("id") Long id) {
  142 + returnSalesService.cancelReturnSales(id);
  143 + return success(true);
  144 + }
  145 +
  146 + @GetMapping("/check-quantity")
  147 + @Operation(summary = "校验销售退货单数量", description = "校验每行明细数量之和是否等于行退货数量")
  148 + @Parameter(name = "id", description = "编号", required = true)
  149 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')")
  150 + public CommonResult<Boolean> checkReturnSalesQuantity(@RequestParam("id") Long id) {
  151 + return success(returnSalesService.checkReturnSalesQuantity(id));
  152 + }
  153 +
  154 + // ==================== 拼接 VO ====================
  155 +
  156 + private List<MesWmReturnSalesRespVO> buildRespVOList(List<MesWmReturnSalesDO> list) {
  157 + if (CollUtil.isEmpty(list)) {
  158 + return Collections.emptyList();
  159 + }
  160 + // 1. 获得关联数据
  161 + Map<Long, MesMdClientDO> clientMap = clientService.getClientMap(
  162 + convertSet(list, MesWmReturnSalesDO::getClientId));
  163 + // 2. 构建结果
  164 + return BeanUtils.toBean(list, MesWmReturnSalesRespVO.class, vo ->
  165 + MapUtils.findAndThen(clientMap, vo.getClientId(), client ->
  166 + vo.setClientCode(client.getCode()).setClientName(client.getName()).setClientNickname(client.getNickname())));
  167 + }
  168 +
  169 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales;
  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.returnsales.vo.detail.MesWmReturnSalesDetailRespVO;
  8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail.MesWmReturnSalesDetailSaveReqVO;
  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.returnsales.MesWmReturnSalesDetailDO;
  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.returnsales.MesWmReturnSalesDetailService;
  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 +/**
  38 + * 管理后台 - MES 销售退货相关
  39 + *
  40 + * @author 芋道源码
  41 + */
  42 +@Tag(name = "管理后台 - MES 销售退货明细")
  43 +@RestController
  44 +@RequestMapping("/mes/wm/return-sales-detail")
  45 +@Validated
  46 +public class MesWmReturnSalesDetailController {
  47 +
  48 + @Resource
  49 + private MesWmReturnSalesDetailService returnSalesDetailService;
  50 +
  51 + @Resource
  52 + private MesMdItemService itemService;
  53 +
  54 + @Resource
  55 + private MesMdUnitMeasureService unitMeasureService;
  56 +
  57 + @Resource
  58 + private MesWmWarehouseService warehouseService;
  59 +
  60 + @Resource
  61 + private MesWmWarehouseLocationService locationService;
  62 +
  63 + @Resource
  64 + private MesWmWarehouseAreaService areaService;
  65 +
  66 + @PostMapping("/create")
  67 + @Operation(summary = "创建销售退货明细")
  68 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:create')")
  69 + public CommonResult<Long> createReturnSalesDetail(@Valid @RequestBody MesWmReturnSalesDetailSaveReqVO createReqVO) {
  70 + return success(returnSalesDetailService.createReturnSalesDetail(createReqVO));
  71 + }
  72 +
  73 + @PutMapping("/update")
  74 + @Operation(summary = "修改销售退货明细")
  75 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:update')")
  76 + public CommonResult<Boolean> updateReturnSalesDetail(@Valid @RequestBody MesWmReturnSalesDetailSaveReqVO updateReqVO) {
  77 + returnSalesDetailService.updateReturnSalesDetail(updateReqVO);
  78 + return success(true);
  79 + }
  80 +
  81 + @DeleteMapping("/delete")
  82 + @Operation(summary = "删除销售退货明细")
  83 + @Parameter(name = "id", description = "编号", required = true)
  84 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:delete')")
  85 + public CommonResult<Boolean> deleteReturnSalesDetail(@RequestParam("id") Long id) {
  86 + returnSalesDetailService.deleteReturnSalesDetail(id);
  87 + return success(true);
  88 + }
  89 +
  90 + @GetMapping("/get")
  91 + @Operation(summary = "获得销售退货明细")
  92 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  93 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')")
  94 + public CommonResult<MesWmReturnSalesDetailRespVO> getReturnSalesDetail(@RequestParam("id") Long id) {
  95 + MesWmReturnSalesDetailDO detail = returnSalesDetailService.getReturnSalesDetail(id);
  96 + if (detail == null) {
  97 + return success(null);
  98 + }
  99 + return success(buildRespVOList(Collections.singletonList(detail)).get(0));
  100 + }
  101 +
  102 + @GetMapping("/list-by-line")
  103 + @Operation(summary = "获得销售退货明细列表(按行编号)")
  104 + @Parameter(name = "lineId", description = "行编号", required = true, example = "1024")
  105 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')")
  106 + public CommonResult<List<MesWmReturnSalesDetailRespVO>> getReturnSalesDetailListByLineId(
  107 + @RequestParam("lineId") Long lineId) {
  108 + List<MesWmReturnSalesDetailDO> list = returnSalesDetailService.getReturnSalesDetailListByLineId(lineId);
  109 + return success(buildRespVOList(list));
  110 + }
  111 +
  112 + // ==================== 拼接 VO ====================
  113 +
  114 + private List<MesWmReturnSalesDetailRespVO> buildRespVOList(List<MesWmReturnSalesDetailDO> list) {
  115 + if (CollUtil.isEmpty(list)) {
  116 + return Collections.emptyList();
  117 + }
  118 + // 1. 获得关联数据
  119 + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
  120 + convertSet(list, MesWmReturnSalesDetailDO::getItemId));
  121 + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
  122 + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
  123 + Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
  124 + convertSet(list, MesWmReturnSalesDetailDO::getWarehouseId));
  125 + Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
  126 + convertSet(list, MesWmReturnSalesDetailDO::getLocationId));
  127 + Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap(
  128 + convertSet(list, MesWmReturnSalesDetailDO::getAreaId));
  129 + // 2. 构建结果
  130 + return BeanUtils.toBean(list, MesWmReturnSalesDetailRespVO.class, vo -> {
  131 + // TODO @AI:set 的时候,链式调用;
  132 + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
  133 + vo.setItemCode(item.getCode());
  134 + vo.setItemName(item.getName());
  135 + vo.setItemSpecification(item.getSpecification());
  136 + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
  137 + unitMeasure -> vo.setItemUnit(unitMeasure.getName()));
  138 + });
  139 + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> {
  140 + // TODO @AI:set 的时候,链式调用;
  141 + vo.setWarehouseCode(warehouse.getCode());
  142 + vo.setWarehouseName(warehouse.getName());
  143 + });
  144 + MapUtils.findAndThen(locationMap, vo.getLocationId(), location -> {
  145 + // TODO @AI:set 的时候,链式调用;
  146 + vo.setLocationCode(location.getCode());
  147 + vo.setLocationName(location.getName());
  148 + });
  149 + MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> {
  150 + // TODO @AI:set 的时候,链式调用;
  151 + vo.setAreaCode(area.getCode());
  152 + vo.setAreaName(area.getName());
  153 + });
  154 + });
  155 + }
  156 +
  157 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales;
  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.returnsales.vo.line.MesWmReturnSalesLinePageReqVO;
  9 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineRespVO;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO;
  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.returnsales.MesWmReturnSalesLineDO;
  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.returnsales.MesWmReturnSalesLineService;
  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 +/**
  34 + * 管理后台 - MES 销售退货相关
  35 + *
  36 + * @author 芋道源码
  37 + */
  38 +@Tag(name = "管理后台 - MES 销售退货单行")
  39 +@RestController
  40 +@RequestMapping("/mes/wm/return-sales-line")
  41 +@Validated
  42 +public class MesWmReturnSalesLineController {
  43 +
  44 + @Resource
  45 + private MesWmReturnSalesLineService returnSalesLineService;
  46 +
  47 + @Resource
  48 + private MesMdItemService itemService;
  49 +
  50 + @Resource
  51 + private MesMdUnitMeasureService unitMeasureService;
  52 +
  53 + @PostMapping("/create")
  54 + @Operation(summary = "创建销售退货单行")
  55 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:create')")
  56 + public CommonResult<Long> createReturnSalesLine(@Valid @RequestBody MesWmReturnSalesLineSaveReqVO createReqVO) {
  57 + return success(returnSalesLineService.createReturnSalesLine(createReqVO));
  58 + }
  59 +
  60 + @PutMapping("/update")
  61 + @Operation(summary = "修改销售退货单行")
  62 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:update')")
  63 + public CommonResult<Boolean> updateReturnSalesLine(@Valid @RequestBody MesWmReturnSalesLineSaveReqVO updateReqVO) {
  64 + returnSalesLineService.updateReturnSalesLine(updateReqVO);
  65 + return success(true);
  66 + }
  67 +
  68 + @DeleteMapping("/delete")
  69 + @Operation(summary = "删除销售退货单行")
  70 + @Parameter(name = "id", description = "编号", required = true)
  71 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:delete')")
  72 + public CommonResult<Boolean> deleteReturnSalesLine(@RequestParam("id") Long id) {
  73 + returnSalesLineService.deleteReturnSalesLine(id);
  74 + return success(true);
  75 + }
  76 +
  77 + @GetMapping("/get")
  78 + @Operation(summary = "获得销售退货单行")
  79 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  80 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')")
  81 + public CommonResult<MesWmReturnSalesLineRespVO> getReturnSalesLine(@RequestParam("id") Long id) {
  82 + MesWmReturnSalesLineDO line = returnSalesLineService.getReturnSalesLine(id);
  83 + if (line == null) {
  84 + return success(null);
  85 + }
  86 + return success(buildRespVOList(Collections.singletonList(line)).get(0));
  87 + }
  88 +
  89 + @GetMapping("/page")
  90 + @Operation(summary = "获得销售退货单行分页")
  91 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')")
  92 + public CommonResult<PageResult<MesWmReturnSalesLineRespVO>> getReturnSalesLinePage(
  93 + @Valid MesWmReturnSalesLinePageReqVO pageReqVO) {
  94 + PageResult<MesWmReturnSalesLineDO> pageResult = returnSalesLineService.getReturnSalesLinePage(pageReqVO);
  95 + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
  96 + }
  97 +
  98 + @GetMapping("/list-by-return-sales")
  99 + @Operation(summary = "获得销售退货单行列表(按退货单编号)")
  100 + @Parameter(name = "returnId", description = "退货单编号", required = true, example = "1024")
  101 + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')")
  102 + public CommonResult<List<MesWmReturnSalesLineRespVO>> getReturnSalesLineListByReturnId(
  103 + @RequestParam("returnId") Long returnId) {
  104 + List<MesWmReturnSalesLineDO> list = returnSalesLineService.getReturnSalesLineListByReturnId(returnId);
  105 + return success(buildRespVOList(list));
  106 + }
  107 +
  108 + // ==================== 拼接 VO ====================
  109 +
  110 + private List<MesWmReturnSalesLineRespVO> buildRespVOList(List<MesWmReturnSalesLineDO> list) {
  111 + if (CollUtil.isEmpty(list)) {
  112 + return Collections.emptyList();
  113 + }
  114 + // 1. 获得关联数据
  115 + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
  116 + convertSet(list, MesWmReturnSalesLineDO::getItemId));
  117 + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
  118 + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
  119 + // 2. 构建结果
  120 + return BeanUtils.toBean(list, MesWmReturnSalesLineRespVO.class, vo -> {
  121 + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
  122 + // TODO @AI:set 的时候,链式调用;
  123 + vo.setItemCode(item.getCode());
  124 + vo.setItemName(item.getName());
  125 + vo.setItemSpecification(item.getSpecification());
  126 + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
  127 + unitMeasure -> vo.setItemUnit(unitMeasure.getName()));
  128 + });
  129 + });
  130 + }
  131 +
  132 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.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 org.springframework.format.annotation.DateTimeFormat;
  8 +
  9 +import java.time.LocalDateTime;
  10 +
  11 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  12 +
  13 +/**
  14 + * 管理后台 - MES 销售退货相关
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +@Schema(description = "管理后台 - MES 销售退货单分页 Request VO")
  19 +@Data
  20 +@EqualsAndHashCode(callSuper = true)
  21 +public class MesWmReturnSalesPageReqVO extends PageParam {
  22 +
  23 + @Schema(description = "退货单编号", example = "RS202603010001")
  24 + private String code;
  25 +
  26 + @Schema(description = "退货单名称", example = "销售退货")
  27 + private String name;
  28 +
  29 + @Schema(description = "销售订单编号", example = "SO202603010001")
  30 + private String salesOrderCode;
  31 +
  32 + @Schema(description = "客户 ID", example = "1")
  33 + private Long clientId;
  34 +
  35 + @Schema(description = "状态", example = "0")
  36 + private Integer status;
  37 +
  38 + @Schema(description = "退货日期")
  39 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  40 + private LocalDateTime[] returnDate;
  41 +
  42 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import java.time.LocalDateTime;
  7 +
  8 +/**
  9 + * 管理后台 - MES 销售退货相关
  10 + *
  11 + * @author 芋道源码
  12 + */
  13 +@Schema(description = "管理后台 - MES 销售退货单 Response VO")
  14 +@Data
  15 +public class MesWmReturnSalesRespVO {
  16 +
  17 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  18 + private Long id;
  19 +
  20 + @Schema(description = "退货单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "RS202603010001")
  21 + private String code;
  22 +
  23 + @Schema(description = "退货单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "销售退货")
  24 + private String name;
  25 +
  26 + @Schema(description = "销售订单编号", example = "SO202603010001")
  27 + private String salesOrderCode;
  28 +
  29 + @Schema(description = "客户 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  30 + private Long clientId;
  31 +
  32 + @Schema(description = "客户编码", example = "C001")
  33 + private String clientCode;
  34 +
  35 + @Schema(description = "客户名称", example = "XX客户")
  36 + private String clientName;
  37 +
  38 + @Schema(description = "客户简称", example = "XX")
  39 + private String clientNickname;
  40 +
  41 + @Schema(description = "退货日期")
  42 + private LocalDateTime returnDate;
  43 +
  44 + @Schema(description = "退货原因", example = "质量问题")
  45 + private String returnReason;
  46 +
  47 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
  48 + private Integer status;
  49 +
  50 + @Schema(description = "备注", example = "备注")
  51 + private String remark;
  52 +
  53 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  54 + private LocalDateTime createTime;
  55 +
  56 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotBlank;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +/**
  11 + * 管理后台 - MES 销售退货单新增/修改 Request VO
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Schema(description = "管理后台 - MES 销售退货单新增/修改 Request VO")
  16 +@Data
  17 +public class MesWmReturnSalesSaveReqVO {
  18 +
  19 + @Schema(description = "编号", example = "1024")
  20 + private Long id;
  21 +
  22 + @Schema(description = "退货单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "RS202603010001")
  23 + @NotBlank(message = "退货单编号不能为空")
  24 + private String code;
  25 +
  26 + @Schema(description = "退货单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "销售退货")
  27 + @NotBlank(message = "退货单名称不能为空")
  28 + private String name;
  29 +
  30 + @Schema(description = "销售订单编号", example = "SO202603010001")
  31 + private String salesOrderCode;
  32 +
  33 + @Schema(description = "客户 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  34 + @NotNull(message = "客户 ID 不能为空")
  35 + private Long clientId;
  36 +
  37 + @Schema(description = "退货日期", requiredMode = Schema.RequiredMode.REQUIRED)
  38 + @NotNull(message = "退货日期不能为空")
  39 + private LocalDateTime returnDate;
  40 +
  41 + @Schema(description = "退货原因", example = "质量问题")
  42 + private String returnReason;
  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/returnsales/vo/detail/MesWmReturnSalesDetailPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +
  8 +/**
  9 + * 管理后台 - MES 销售退货相关
  10 + *
  11 + * @author 芋道源码
  12 + */
  13 +@Schema(description = "管理后台 - MES 销售退货明细分页 Request VO")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +public class MesWmReturnSalesDetailPageReqVO extends PageParam {
  17 +
  18 + @Schema(description = "退货单ID", example = "1")
  19 + private Long returnId;
  20 +
  21 + @Schema(description = "行ID", example = "1")
  22 + private Long lineId;
  23 +
  24 + @Schema(description = "物料ID", example = "1")
  25 + private Long itemId;
  26 +
  27 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.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 +/**
  10 + * 管理后台 - MES 销售退货相关
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Schema(description = "管理后台 - MES 销售退货明细 Response VO")
  15 +@Data
  16 +public class MesWmReturnSalesDetailRespVO {
  17 +
  18 + @Schema(description = "明细ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  19 + private Long id;
  20 +
  21 + @Schema(description = "退货单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  22 + private Long returnId;
  23 +
  24 + @Schema(description = "行ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  25 + private Long lineId;
  26 +
  27 + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  28 + private Long itemId;
  29 +
  30 + @Schema(description = "物料编码", example = "M001")
  31 + private String itemCode;
  32 +
  33 + @Schema(description = "物料名称", example = "物料A")
  34 + private String itemName;
  35 +
  36 + @Schema(description = "物料规格", example = "100*200")
  37 + private String itemSpecification;
  38 +
  39 + @Schema(description = "计量单位", example = "个")
  40 + private String itemUnit;
  41 +
  42 + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
  43 + private BigDecimal quantity;
  44 +
  45 + @Schema(description = "批次ID", example = "1")
  46 + private Long batchId;
  47 +
  48 + @Schema(description = "批次号", example = "B001")
  49 + private String batchCode;
  50 +
  51 + @Schema(description = "仓库ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  52 + private Long warehouseId;
  53 +
  54 + @Schema(description = "仓库编码", example = "WH001")
  55 + private String warehouseCode;
  56 +
  57 + @Schema(description = "仓库名称", example = "仓库A")
  58 + private String warehouseName;
  59 +
  60 + @Schema(description = "库区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  61 + private Long locationId;
  62 +
  63 + @Schema(description = "库区编码", example = "LOC001")
  64 + private String locationCode;
  65 +
  66 + @Schema(description = "库区名称", example = "库区A")
  67 + private String locationName;
  68 +
  69 + @Schema(description = "库位ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  70 + private Long areaId;
  71 +
  72 + @Schema(description = "库位编码", example = "AREA001")
  73 + private String areaCode;
  74 +
  75 + @Schema(description = "库位名称", example = "库位A")
  76 + private String areaName;
  77 +
  78 + @Schema(description = "备注", example = "备注")
  79 + private String remark;
  80 +
  81 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  82 + private LocalDateTime createTime;
  83 +
  84 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.DecimalMin;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
  7 +
  8 +import java.math.BigDecimal;
  9 +
  10 +/**
  11 + * 管理后台 - MES 销售退货相关
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Schema(description = "管理后台 - MES 销售退货明细新增/修改 Request VO")
  16 +@Data
  17 +public class MesWmReturnSalesDetailSaveReqVO {
  18 +
  19 + @Schema(description = "明细ID", example = "1")
  20 + private Long id;
  21 +
  22 + @Schema(description = "退货单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  23 + @NotNull(message = "退货单ID不能为空")
  24 + private Long returnId;
  25 +
  26 + @Schema(description = "行ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  27 + @NotNull(message = "行ID不能为空")
  28 + private Long lineId;
  29 +
  30 + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  31 + @NotNull(message = "物料ID不能为空")
  32 + private Long itemId;
  33 +
  34 + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
  35 + @NotNull(message = "数量不能为空")
  36 + @DecimalMin(value = "0", inclusive = false, message = "数量必须大于 0")
  37 + private BigDecimal quantity;
  38 +
  39 + @Schema(description = "批次ID", example = "1")
  40 + private Long batchId;
  41 +
  42 + @Schema(description = "仓库ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  43 + @NotNull(message = "仓库ID不能为空")
  44 + private Long warehouseId;
  45 +
  46 + @Schema(description = "库区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  47 + @NotNull(message = "库区ID不能为空")
  48 + private Long locationId;
  49 +
  50 + @Schema(description = "库位ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  51 + @NotNull(message = "库位ID不能为空")
  52 + private Long areaId;
  53 +
  54 + @Schema(description = "备注", example = "备注")
  55 + private String remark;
  56 +
  57 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLinePageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.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 +
  8 +/**
  9 + * 管理后台 - MES 销售退货相关
  10 + *
  11 + * @author 芋道源码
  12 + */
  13 +@Schema(description = "管理后台 - MES 销售退货单行分页 Request VO")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +public class MesWmReturnSalesLinePageReqVO extends PageParam {
  17 +
  18 + @Schema(description = "退货单ID", example = "1")
  19 + private Long returnId;
  20 +
  21 + @Schema(description = "物料ID", example = "1")
  22 + private Long itemId;
  23 +
  24 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.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 +/**
  10 + * 管理后台 - MES 销售退货相关
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Schema(description = "管理后台 - MES 销售退货单行 Response VO")
  15 +@Data
  16 +public class MesWmReturnSalesLineRespVO {
  17 +
  18 + @Schema(description = "行ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  19 + private Long id;
  20 +
  21 + @Schema(description = "退货单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  22 + private Long returnId;
  23 +
  24 + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  25 + private Long itemId;
  26 +
  27 + @Schema(description = "物料编码", example = "M001")
  28 + private String itemCode;
  29 +
  30 + @Schema(description = "物料名称", example = "物料A")
  31 + private String itemName;
  32 +
  33 + @Schema(description = "物料规格", example = "100*200")
  34 + private String itemSpecification;
  35 +
  36 + @Schema(description = "计量单位", example = "个")
  37 + private String itemUnit;
  38 +
  39 + @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
  40 + private BigDecimal quantityReturned;
  41 +
  42 + @Schema(description = "批次ID", example = "1")
  43 + private Long batchId;
  44 +
  45 + @Schema(description = "批次号", example = "B001")
  46 + private String batchCode;
  47 +
  48 + @Schema(description = "质量状态", example = "合格")
  49 + private String qualityStatus;
  50 +
  51 + @Schema(description = "备注", example = "备注")
  52 + private String remark;
  53 +
  54 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  55 + private LocalDateTime createTime;
  56 +
  57 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.DecimalMin;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
  7 +
  8 +import java.math.BigDecimal;
  9 +
  10 +/**
  11 + * 管理后台 - MES 销售退货相关
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Schema(description = "管理后台 - MES 销售退货单行新增/修改 Request VO")
  16 +@Data
  17 +public class MesWmReturnSalesLineSaveReqVO {
  18 +
  19 + @Schema(description = "行ID", example = "1")
  20 + private Long id;
  21 +
  22 + @Schema(description = "退货单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  23 + @NotNull(message = "退货单ID不能为空")
  24 + private Long returnId;
  25 +
  26 + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  27 + @NotNull(message = "物料ID不能为空")
  28 + private Long itemId;
  29 +
  30 + @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
  31 + @NotNull(message = "退货数量不能为空")
  32 + @DecimalMin(value = "0", inclusive = false, message = "退货数量必须大于 0")
  33 + private BigDecimal quantityReturned;
  34 +
  35 + @Schema(description = "批次ID", example = "1")
  36 + private Long batchId;
  37 +
  38 + @Schema(description = "质量状态", example = "合格")
  39 + private String qualityStatus;
  40 +
  41 + @Schema(description = "备注", example = "备注")
  42 + private String remark;
  43 +
  44 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO;
  5 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum;
  6 +import com.baomidou.mybatisplus.annotation.KeySequence;
  7 +import com.baomidou.mybatisplus.annotation.TableId;
  8 +import com.baomidou.mybatisplus.annotation.TableName;
  9 +import lombok.*;
  10 +
  11 +import java.time.LocalDateTime;
  12 +
  13 +/**
  14 + *
  15 + * @author 芋道源码
  16 + * MES 销售退货单 DO
  17 + */
  18 +@TableName("mes_wm_return_sales")
  19 +@KeySequence("mes_wm_return_sales_seq")
  20 +@Data
  21 +@EqualsAndHashCode(callSuper = true)
  22 +@ToString(callSuper = true)
  23 +@Builder
  24 +@NoArgsConstructor
  25 +@AllArgsConstructor
  26 +public class MesWmReturnSalesDO extends BaseDO {
  27 +
  28 + /**
  29 + * 编号
  30 + */
  31 + @TableId
  32 + private Long id;
  33 + /**
  34 + * 退货单编号
  35 + */
  36 + private String code;
  37 + /**
  38 + * 退货单名称
  39 + */
  40 + private String name;
  41 + /**
  42 + * 销售订单编号
  43 + */
  44 + private String salesOrderCode;
  45 + // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面,以及 service 校验
  46 + /**
  47 + * 客户 ID
  48 + *
  49 + * 关联 {@link MesMdClientDO#getId()}
  50 + */
  51 + private Long clientId;
  52 + // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面
  53 + /**
  54 + * 退货日期
  55 + */
  56 + private LocalDateTime returnDate;
  57 + // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面
  58 + /**
  59 + * 退货原因
  60 + */
  61 + private String returnReason;
  62 + /**
  63 + * 状态
  64 + *
  65 + * 枚举 {@link MesWmReturnSalesStatusEnum}
  66 + */
  67 + private Integer status;
  68 + /**
  69 + * 备注
  70 + */
  71 + private String remark;
  72 +
  73 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales;
  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 + *
  17 + * @author 芋道源码
  18 + * MES 销售退货明细 DO
  19 + */
  20 +@TableName("mes_wm_return_sales_detail")
  21 +@KeySequence("mes_wm_return_sales_detail_seq")
  22 +@Data
  23 +@EqualsAndHashCode(callSuper = true)
  24 +@ToString(callSuper = true)
  25 +@Builder
  26 +@NoArgsConstructor
  27 +@AllArgsConstructor
  28 +public class MesWmReturnSalesDetailDO extends BaseDO {
  29 +
  30 + /**
  31 + * 编号
  32 + */
  33 + @TableId
  34 + private Long id;
  35 + // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在
  36 + /**
  37 + * 退货单 ID
  38 + *
  39 + * 关联 {@link MesWmReturnSalesDO#getId()}
  40 + */
  41 + private Long returnId;
  42 + /**
  43 + * 行 ID
  44 + *
  45 + * 关联 {@link MesWmReturnSalesLineDO#getId()}
  46 + */
  47 + private Long lineId;
  48 + // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在
  49 + /**
  50 + * 物料 ID
  51 + *
  52 + * 关联 {@link MesMdItemDO#getId()}
  53 + */
  54 + private Long itemId;
  55 + // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;
  56 + /**
  57 + * 数量
  58 + */
  59 + private BigDecimal quantity;
  60 + /**
  61 + * 批次 ID
  62 + */
  63 + private Long batchId;
  64 + // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在
  65 + /**
  66 + * 仓库 ID
  67 + *
  68 + * 关联 {@link MesWmWarehouseDO#getId()}
  69 + */
  70 + private Long warehouseId;
  71 + /**
  72 + * 库区 ID
  73 + *
  74 + * 关联 {@link MesWmWarehouseLocationDO#getId()}
  75 + */
  76 + private Long locationId;
  77 + /**
  78 + * 库位 ID
  79 + *
  80 + * 关联 {@link MesWmWarehouseAreaDO#getId()}
  81 + */
  82 + private Long areaId;
  83 + /**
  84 + * 备注
  85 + */
  86 + private String remark;
  87 +
  88 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales;
  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 + *
  14 + * @author 芋道源码
  15 + * MES 销售退货单行 DO
  16 + */
  17 +@TableName("mes_wm_return_sales_line")
  18 +@KeySequence("mes_wm_return_sales_line_seq")
  19 +@Data
  20 +@EqualsAndHashCode(callSuper = true)
  21 +@ToString(callSuper = true)
  22 +@Builder
  23 +@NoArgsConstructor
  24 +@AllArgsConstructor
  25 +public class MesWmReturnSalesLineDO extends BaseDO {
  26 +
  27 + /**
  28 + * 编号
  29 + */
  30 + @TableId
  31 + private Long id;
  32 + /**
  33 + * 退货单 ID
  34 + *
  35 + * 关联 {@link MesWmReturnSalesDO#getId()}
  36 + */
  37 + private Long returnId;
  38 + /**
  39 + * 物料 ID
  40 + *
  41 + * 关联 {@link MesMdItemDO#getId()}
  42 + */
  43 + private Long itemId;
  44 + // TODO @AI:这个改成 quantity;简化(听我的)
  45 + /**
  46 + * 退货数量
  47 + */
  48 + private BigDecimal quantityReturned;
  49 + /**
  50 + * 批次 ID
  51 + */
  52 + private Long batchId;
  53 + // TODO @AI:需要 @下对应的枚举类,方便理解;
  54 + /**
  55 + * 质量状态
  56 + */
  57 + private String qualityStatus;
  58 + /**
  59 + * 备注
  60 + */
  61 + private String remark;
  62 +
  63 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesDetailMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales;
  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.returnsales.vo.detail.MesWmReturnSalesDetailPageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + *
  14 + * @author 芋道源码
  15 + * MES 销售退货明细 Mapper
  16 + */
  17 +@Mapper
  18 +public interface MesWmReturnSalesDetailMapper extends BaseMapperX<MesWmReturnSalesDetailDO> {
  19 +
  20 + default PageResult<MesWmReturnSalesDetailDO> selectPage(MesWmReturnSalesDetailPageReqVO reqVO) {
  21 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmReturnSalesDetailDO>()
  22 + .eqIfPresent(MesWmReturnSalesDetailDO::getReturnId, reqVO.getReturnId())
  23 + .eqIfPresent(MesWmReturnSalesDetailDO::getLineId, reqVO.getLineId())
  24 + .eqIfPresent(MesWmReturnSalesDetailDO::getItemId, reqVO.getItemId())
  25 + .orderByDesc(MesWmReturnSalesDetailDO::getId));
  26 + }
  27 +
  28 + default List<MesWmReturnSalesDetailDO> selectListByReturnId(Long returnId) {
  29 + return selectList(new LambdaQueryWrapperX<MesWmReturnSalesDetailDO>()
  30 + .eq(MesWmReturnSalesDetailDO::getReturnId, returnId));
  31 + }
  32 +
  33 + default List<MesWmReturnSalesDetailDO> selectListByLineId(Long lineId) {
  34 + return selectList(new LambdaQueryWrapperX<MesWmReturnSalesDetailDO>()
  35 + .eq(MesWmReturnSalesDetailDO::getLineId, lineId));
  36 + }
  37 +
  38 + default void deleteByReturnId(Long returnId) {
  39 + delete(new LambdaQueryWrapperX<MesWmReturnSalesDetailDO>()
  40 + .eq(MesWmReturnSalesDetailDO::getReturnId, returnId));
  41 + }
  42 +
  43 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesLineMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales;
  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.returnsales.vo.line.MesWmReturnSalesLinePageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + *
  14 + * @author 芋道源码
  15 + * MES 销售退货单行 Mapper
  16 + */
  17 +@Mapper
  18 +public interface MesWmReturnSalesLineMapper extends BaseMapperX<MesWmReturnSalesLineDO> {
  19 +
  20 + default PageResult<MesWmReturnSalesLineDO> selectPage(MesWmReturnSalesLinePageReqVO reqVO) {
  21 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmReturnSalesLineDO>()
  22 + .eqIfPresent(MesWmReturnSalesLineDO::getReturnId, reqVO.getReturnId())
  23 + .eqIfPresent(MesWmReturnSalesLineDO::getItemId, reqVO.getItemId())
  24 + .orderByDesc(MesWmReturnSalesLineDO::getId));
  25 + }
  26 +
  27 + default List<MesWmReturnSalesLineDO> selectListByReturnId(Long returnId) {
  28 + return selectList(new LambdaQueryWrapperX<MesWmReturnSalesLineDO>()
  29 + .eq(MesWmReturnSalesLineDO::getReturnId, returnId));
  30 + }
  31 +
  32 + default void deleteByReturnId(Long returnId) {
  33 + delete(new LambdaQueryWrapperX<MesWmReturnSalesLineDO>()
  34 + .eq(MesWmReturnSalesLineDO::getReturnId, returnId));
  35 + }
  36 +
  37 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales;
  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.returnsales.vo.MesWmReturnSalesPageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +/**
  11 + *
  12 + * @author 芋道源码
  13 + * MES 销售退货单 Mapper
  14 + */
  15 +@Mapper
  16 +public interface MesWmReturnSalesMapper extends BaseMapperX<MesWmReturnSalesDO> {
  17 +
  18 + default PageResult<MesWmReturnSalesDO> selectPage(MesWmReturnSalesPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmReturnSalesDO>()
  20 + .likeIfPresent(MesWmReturnSalesDO::getCode, reqVO.getCode())
  21 + .likeIfPresent(MesWmReturnSalesDO::getName, reqVO.getName())
  22 + .likeIfPresent(MesWmReturnSalesDO::getSalesOrderCode, reqVO.getSalesOrderCode())
  23 + .eqIfPresent(MesWmReturnSalesDO::getClientId, reqVO.getClientId())
  24 + .eqIfPresent(MesWmReturnSalesDO::getStatus, reqVO.getStatus())
  25 + .betweenIfPresent(MesWmReturnSalesDO::getReturnDate, reqVO.getReturnDate())
  26 + .orderByDesc(MesWmReturnSalesDO::getId));
  27 + }
  28 +
  29 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -413,4 +413,16 @@ public interface ErrorCodeConstants { @@ -413,4 +413,16 @@ public interface ErrorCodeConstants {
413 ErrorCode WM_PRODUCT_RECPT_LINE_NOT_EXISTS = new ErrorCode(1_040_712_100, "产品收货单行不存在"); 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, "产品收货明细不存在"); 414 ErrorCode WM_PRODUCT_RECPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_712_200, "产品收货明细不存在");
415 415
  416 + // ========== MES 仓库管理-销售退货单(1-040-713-000) ==========
  417 + ErrorCode WM_RETURN_SALES_NOT_EXISTS = new ErrorCode(1_040_713_000, "销售退货单不存在");
  418 + ErrorCode WM_RETURN_SALES_CODE_DUPLICATE = new ErrorCode(1_040_713_001, "销售退货单编码已存在");
  419 + ErrorCode WM_RETURN_SALES_STATUS_NOT_PREPARE = new ErrorCode(1_040_713_002, "只有草稿状态才允许此操作");
  420 + ErrorCode WM_RETURN_SALES_STATUS_NOT_APPROVING = new ErrorCode(1_040_713_003, "只有待执行状态才允许执行退货");
  421 + ErrorCode WM_RETURN_SALES_STATUS_NOT_APPROVED = new ErrorCode(1_040_713_004, "只有待上架状态才允许执行上架");
  422 + ErrorCode WM_RETURN_SALES_NO_LINE = new ErrorCode(1_040_713_005, "销售退货单至少需要一条行数据");
  423 + ErrorCode WM_RETURN_SALES_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_713_006, "销售退货单行数量与明细数量不一致");
  424 + ErrorCode WM_RETURN_SALES_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_713_007, "销售退货单已完成或已取消,无法取消");
  425 + ErrorCode WM_RETURN_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_713_100, "销售退货单行不存在");
  426 + ErrorCode WM_RETURN_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_713_200, "销售退货单明细不存在");
  427 +
416 } 428 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.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 MesWmReturnSalesStatusEnum implements ArrayValuable<Integer> {
  18 +
  19 + // TODO @AI:参考 {@link MesWmProductReceiptStatusEnum},增加注释,说明每个状态对应的业务含义,以及对应的方法(如果有的话)。方便开发人员理解。
  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(MesWmReturnSalesStatusEnum::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/returnsales/MesWmReturnSalesDetailService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.returnsales;
  2 +
  3 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail.MesWmReturnSalesDetailSaveReqVO;
  4 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO;
  5 +import jakarta.validation.Valid;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + *
  11 + * @author 芋道源码
  12 + * MES 销售退货明细 Service 接口
  13 + */
  14 +public interface MesWmReturnSalesDetailService {
  15 +
  16 + /**
  17 + * 创建销售退货明细
  18 + *
  19 + * @param createReqVO 创建信息
  20 + * @return 编号
  21 + */
  22 + Long createReturnSalesDetail(@Valid MesWmReturnSalesDetailSaveReqVO createReqVO);
  23 +
  24 + /**
  25 + * 更新销售退货明细
  26 + *
  27 + * @param updateReqVO 更新信息
  28 + */
  29 + void updateReturnSalesDetail(@Valid MesWmReturnSalesDetailSaveReqVO updateReqVO);
  30 +
  31 + /**
  32 + * 删除销售退货明细
  33 + *
  34 + * @param id 编号
  35 + */
  36 + void deleteReturnSalesDetail(Long id);
  37 +
  38 + /**
  39 + * 获得销售退货明细
  40 + *
  41 + * @param id 编号
  42 + * @return 销售退货明细
  43 + */
  44 + MesWmReturnSalesDetailDO getReturnSalesDetail(Long id);
  45 +
  46 + /**
  47 + * 根据行ID获取明细列表
  48 + *
  49 + * @param lineId 行ID
  50 + * @return 明细列表
  51 + */
  52 + List<MesWmReturnSalesDetailDO> getReturnSalesDetailListByLineId(Long lineId);
  53 +
  54 + /**
  55 + * 根据退货单ID获取明细列表
  56 + *
  57 + * @param returnId 退货单ID
  58 + * @return 明细列表
  59 + */
  60 + List<MesWmReturnSalesDetailDO> getReturnSalesDetailListByReturnId(Long returnId);
  61 +
  62 + /**
  63 + * 根据退货单ID删除明细
  64 + *
  65 + * @param returnId 退货单ID
  66 + */
  67 + void deleteReturnSalesDetailByReturnId(Long returnId);
  68 +
  69 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesDetailServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.returnsales;
  2 +
  3 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail.MesWmReturnSalesDetailSaveReqVO;
  5 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO;
  6 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesDetailMapper;
  7 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  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.WM_RETURN_SALES_DETAIL_NOT_EXISTS;
  17 +
  18 +/**
  19 + *
  20 + * @author 芋道源码
  21 + * MES 销售退货明细 Service 实现类
  22 + */
  23 +@Service
  24 +@Validated
  25 +public class MesWmReturnSalesDetailServiceImpl implements MesWmReturnSalesDetailService {
  26 +
  27 + @Resource
  28 + private MesWmReturnSalesDetailMapper returnSalesDetailMapper;
  29 +
  30 + @Resource
  31 + @Lazy
  32 + private MesWmReturnSalesLineService returnSalesLineService;
  33 +
  34 + @Resource
  35 + private MesMdItemService itemService;
  36 +
  37 + @Override
  38 + public Long createReturnSalesDetail(MesWmReturnSalesDetailSaveReqVO createReqVO) {
  39 + // 校验父数据存在
  40 + returnSalesLineService.validateReturnSalesLineExists(createReqVO.getLineId());
  41 + // 校验物料存在
  42 + itemService.validateItemExists(createReqVO.getItemId());
  43 +
  44 + // 插入
  45 + MesWmReturnSalesDetailDO detail = BeanUtils.toBean(createReqVO, MesWmReturnSalesDetailDO.class);
  46 + returnSalesDetailMapper.insert(detail);
  47 + return detail.getId();
  48 + }
  49 +
  50 + @Override
  51 + public void updateReturnSalesDetail(MesWmReturnSalesDetailSaveReqVO updateReqVO) {
  52 + // 校验存在
  53 + validateReturnSalesDetailExists(updateReqVO.getId());
  54 + // 校验父数据存在
  55 + returnSalesLineService.validateReturnSalesLineExists(updateReqVO.getLineId());
  56 + // 校验物料存在
  57 + itemService.validateItemExists(updateReqVO.getItemId());
  58 +
  59 + // 更新
  60 + MesWmReturnSalesDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesDetailDO.class);
  61 + returnSalesDetailMapper.updateById(updateObj);
  62 + }
  63 +
  64 + @Override
  65 + public void deleteReturnSalesDetail(Long id) {
  66 + // 校验存在
  67 + validateReturnSalesDetailExists(id);
  68 + // 删除
  69 + returnSalesDetailMapper.deleteById(id);
  70 + }
  71 +
  72 + @Override
  73 + public MesWmReturnSalesDetailDO getReturnSalesDetail(Long id) {
  74 + return returnSalesDetailMapper.selectById(id);
  75 + }
  76 +
  77 + @Override
  78 + public List<MesWmReturnSalesDetailDO> getReturnSalesDetailListByLineId(Long lineId) {
  79 + return returnSalesDetailMapper.selectListByLineId(lineId);
  80 + }
  81 +
  82 + @Override
  83 + public List<MesWmReturnSalesDetailDO> getReturnSalesDetailListByReturnId(Long returnId) {
  84 + return returnSalesDetailMapper.selectListByReturnId(returnId);
  85 + }
  86 +
  87 + @Override
  88 + public void deleteReturnSalesDetailByReturnId(Long returnId) {
  89 + returnSalesDetailMapper.deleteByReturnId(returnId);
  90 + }
  91 +
  92 + private void validateReturnSalesDetailExists(Long id) {
  93 + if (returnSalesDetailMapper.selectById(id) == null) {
  94 + throw exception(WM_RETURN_SALES_DETAIL_NOT_EXISTS);
  95 + }
  96 + }
  97 +
  98 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.returnsales;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLinePageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
  7 +import jakarta.validation.Valid;
  8 +
  9 +import java.util.List;
  10 +
  11 +/**
  12 + *
  13 + * @author 芋道源码
  14 + * MES 销售退货单行 Service 接口
  15 + */
  16 +public interface MesWmReturnSalesLineService {
  17 +
  18 + /**
  19 + * 创建销售退货单行
  20 + *
  21 + * @param createReqVO 创建信息
  22 + * @return 编号
  23 + */
  24 + Long createReturnSalesLine(@Valid MesWmReturnSalesLineSaveReqVO createReqVO);
  25 +
  26 + /**
  27 + * 更新销售退货单行
  28 + *
  29 + * @param updateReqVO 更新信息
  30 + */
  31 + void updateReturnSalesLine(@Valid MesWmReturnSalesLineSaveReqVO updateReqVO);
  32 +
  33 + /**
  34 + * 删除销售退货单行
  35 + *
  36 + * @param id 编号
  37 + */
  38 + void deleteReturnSalesLine(Long id);
  39 +
  40 + /**
  41 + * 获得销售退货单行
  42 + *
  43 + * @param id 编号
  44 + * @return 销售退货单行
  45 + */
  46 + MesWmReturnSalesLineDO getReturnSalesLine(Long id);
  47 +
  48 + /**
  49 + * 获得销售退货单行分页
  50 + *
  51 + * @param pageReqVO 分页查询
  52 + * @return 销售退货单行分页
  53 + */
  54 + PageResult<MesWmReturnSalesLineDO> getReturnSalesLinePage(MesWmReturnSalesLinePageReqVO pageReqVO);
  55 +
  56 + /**
  57 + * 根据退货单ID获取行列表
  58 + *
  59 + * @param returnId 退货单ID
  60 + * @return 行列表
  61 + */
  62 + List<MesWmReturnSalesLineDO> getReturnSalesLineListByReturnId(Long returnId);
  63 +
  64 + /**
  65 + * 根据退货单ID删除行
  66 + *
  67 + * @param returnId 退货单ID
  68 + */
  69 + void deleteReturnSalesLineByReturnId(Long returnId);
  70 +
  71 + /**
  72 + * 校验销售退货单行是否存在
  73 + *
  74 + * @param id 编号
  75 + * @return 销售退货单行
  76 + */
  77 + MesWmReturnSalesLineDO validateReturnSalesLineExists(Long id);
  78 +
  79 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.returnsales;
  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.returnsales.vo.line.MesWmReturnSalesLinePageReqVO;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
  8 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper;
  9 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  10 +import jakarta.annotation.Resource;
  11 +import org.springframework.context.annotation.Lazy;
  12 +import org.springframework.stereotype.Service;
  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_RETURN_SALES_LINE_NOT_EXISTS;
  19 +
  20 +/**
  21 + *
  22 + * @author 芋道源码
  23 + * MES 销售退货单行 Service 实现类
  24 + */
  25 +@Service
  26 +@Validated
  27 +public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineService {
  28 +
  29 + @Resource
  30 + private MesWmReturnSalesLineMapper returnSalesLineMapper;
  31 +
  32 + @Resource
  33 + @Lazy
  34 + private MesWmReturnSalesService returnSalesService;
  35 + @Resource
  36 + private MesMdItemService itemService;
  37 +
  38 + @Override
  39 + public Long createReturnSalesLine(MesWmReturnSalesLineSaveReqVO createReqVO) {
  40 + // 校验父数据存在
  41 + returnSalesService.validateReturnSalesExists(createReqVO.getReturnId());
  42 + // 校验物料存在
  43 + itemService.validateItemExists(createReqVO.getItemId());
  44 + // TODO @AI:请选择批次;假设物料开启了批次号
  45 +
  46 + // 插入
  47 + MesWmReturnSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnSalesLineDO.class);
  48 + returnSalesLineMapper.insert(line);
  49 + return line.getId();
  50 + }
  51 +
  52 + @Override
  53 + public void updateReturnSalesLine(MesWmReturnSalesLineSaveReqVO updateReqVO) {
  54 + // 校验存在
  55 + validateReturnSalesLineExists(updateReqVO.getId());
  56 + // 校验父数据存在
  57 + returnSalesService.validateReturnSalesExists(updateReqVO.getReturnId());
  58 + // 校验物料存在
  59 + itemService.validateItemExists(updateReqVO.getItemId());
  60 + // TODO @AI:请选择批次;假设物料开启了批次号
  61 +
  62 + // 更新
  63 + MesWmReturnSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesLineDO.class);
  64 + returnSalesLineMapper.updateById(updateObj);
  65 + }
  66 +
  67 + @Override
  68 + public void deleteReturnSalesLine(Long id) {
  69 + // 校验存在
  70 + validateReturnSalesLineExists(id);
  71 + // 删除
  72 + returnSalesLineMapper.deleteById(id);
  73 + }
  74 +
  75 + @Override
  76 + public MesWmReturnSalesLineDO getReturnSalesLine(Long id) {
  77 + return returnSalesLineMapper.selectById(id);
  78 + }
  79 +
  80 + @Override
  81 + public PageResult<MesWmReturnSalesLineDO> getReturnSalesLinePage(MesWmReturnSalesLinePageReqVO pageReqVO) {
  82 + return returnSalesLineMapper.selectPage(pageReqVO);
  83 + }
  84 +
  85 + @Override
  86 + public List<MesWmReturnSalesLineDO> getReturnSalesLineListByReturnId(Long returnId) {
  87 + return returnSalesLineMapper.selectListByReturnId(returnId);
  88 + }
  89 +
  90 + @Override
  91 + public void deleteReturnSalesLineByReturnId(Long returnId) {
  92 + returnSalesLineMapper.deleteByReturnId(returnId);
  93 + }
  94 +
  95 + @Override
  96 + public MesWmReturnSalesLineDO validateReturnSalesLineExists(Long id) {
  97 + MesWmReturnSalesLineDO line = returnSalesLineMapper.selectById(id);
  98 + if (line == null) {
  99 + throw exception(WM_RETURN_SALES_LINE_NOT_EXISTS);
  100 + }
  101 + return line;
  102 + }
  103 +
  104 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.returnsales;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesPageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO;
  7 +import jakarta.validation.Valid;
  8 +
  9 +/**
  10 + *
  11 + * @author 芋道源码
  12 + * MES 销售退货单 Service 接口
  13 + */
  14 +public interface MesWmReturnSalesService {
  15 +
  16 + /**
  17 + * 创建销售退货单
  18 + *
  19 + * @param createReqVO 创建信息
  20 + * @return 编号
  21 + */
  22 + Long createReturnSales(@Valid MesWmReturnSalesSaveReqVO createReqVO);
  23 +
  24 + /**
  25 + * 修改销售退货单
  26 + *
  27 + * @param updateReqVO 修改信息
  28 + */
  29 + void updateReturnSales(@Valid MesWmReturnSalesSaveReqVO updateReqVO);
  30 +
  31 + /**
  32 + * 删除销售退货单
  33 + *
  34 + * @param id 编号
  35 + */
  36 + void deleteReturnSales(Long id);
  37 +
  38 + /**
  39 + * 获得销售退货单
  40 + *
  41 + * @param id 编号
  42 + * @return 销售退货单
  43 + */
  44 + MesWmReturnSalesDO getReturnSales(Long id);
  45 +
  46 + /**
  47 + * 获得销售退货单分页
  48 + *
  49 + * @param pageReqVO 分页参数
  50 + * @return 销售退货单分页
  51 + */
  52 + PageResult<MesWmReturnSalesDO> getReturnSalesPage(MesWmReturnSalesPageReqVO pageReqVO);
  53 +
  54 + /**
  55 + * 校验销售退货单是否存在
  56 + *
  57 + * @param id 编号
  58 + * @return 销售退货单
  59 + */
  60 + MesWmReturnSalesDO validateReturnSalesExists(Long id);
  61 +
  62 + /**
  63 + * 提交销售退货单(草稿 -> 待执行)
  64 + *
  65 + * @param id 编号
  66 + */
  67 + void submitReturnSales(Long id);
  68 +
  69 + /**
  70 + * 执行退货(待执行 -> 待上架)
  71 + *
  72 + * @param id 编号
  73 + */
  74 + void executeReturnSales(Long id);
  75 +
  76 + /**
  77 + * 执行上架(待上架 -> 已完成),更新库存台账
  78 + *
  79 + * @param id 编号
  80 + */
  81 + void stockReturnSales(Long id);
  82 +
  83 + /**
  84 + * 取消销售退货单(任意非已完成/已取消状态 -> 已取消)
  85 + *
  86 + * @param id 编号
  87 + */
  88 + void cancelReturnSales(Long id);
  89 +
  90 + /**
  91 + * 校验销售退货单的数量:每行明细数量之和是否等于行退货数量
  92 + *
  93 + * @param id 编号
  94 + * @return 是否全部一致
  95 + */
  96 + Boolean checkReturnSalesQuantity(Long id);
  97 +
  98 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.returnsales;
  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.returnsales.vo.MesWmReturnSalesPageReqVO;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesSaveReqVO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
  14 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesMapper;
  15 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum;
  16 +import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService;
  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 + *
  30 + * @author 芋道源码
  31 + * MES 销售退货单 Service 实现类
  32 + */
  33 +@Service
  34 +@Validated
  35 +public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService {
  36 +
  37 + @Resource
  38 + private MesWmReturnSalesMapper returnSalesMapper;
  39 +
  40 + @Resource
  41 + private MesWmReturnSalesLineService returnSalesLineService;
  42 + @Resource
  43 + private MesWmReturnSalesDetailService returnSalesDetailService;
  44 + @Resource
  45 + private MesMdClientService clientService;
  46 +
  47 + @Override
  48 + @Transactional(rollbackFor = Exception.class)
  49 + public Long createReturnSales(MesWmReturnSalesSaveReqVO createReqVO) {
  50 + // 1. 校验关联数据
  51 + clientService.validateClientExists(createReqVO.getClientId());
  52 +
  53 + // 2. 插入主表
  54 + MesWmReturnSalesDO returnSales = BeanUtils.toBean(createReqVO, MesWmReturnSalesDO.class);
  55 + returnSales.setStatus(MesWmReturnSalesStatusEnum.PREPARE.getStatus());
  56 + returnSalesMapper.insert(returnSales);
  57 + return returnSales.getId();
  58 + }
  59 +
  60 + @Override
  61 + @Transactional(rollbackFor = Exception.class)
  62 + public void updateReturnSales(MesWmReturnSalesSaveReqVO updateReqVO) {
  63 + // 1.1 校验存在 + 准备中状态
  64 + validateReturnSalesExistsAndPrepare(updateReqVO.getId());
  65 + // 1.2 校验关联数据
  66 + clientService.validateClientExists(updateReqVO.getClientId());
  67 +
  68 + // 2. 更新主表
  69 + MesWmReturnSalesDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesDO.class);
  70 + returnSalesMapper.updateById(updateObj);
  71 + }
  72 +
  73 + @Override
  74 + @Transactional(rollbackFor = Exception.class)
  75 + public void deleteReturnSales(Long id) {
  76 + // 1. 校验存在 + 准备中状态
  77 + validateReturnSalesExistsAndPrepare(id);
  78 +
  79 + // 2.1 级联删除明细
  80 + returnSalesDetailService.deleteReturnSalesDetailByReturnId(id);
  81 + // 2.2 级联删除行
  82 + returnSalesLineService.deleteReturnSalesLineByReturnId(id);
  83 + // 2.3 删除主表
  84 + returnSalesMapper.deleteById(id);
  85 + }
  86 +
  87 + @Override
  88 + public MesWmReturnSalesDO getReturnSales(Long id) {
  89 + return returnSalesMapper.selectById(id);
  90 + }
  91 +
  92 + @Override
  93 + public PageResult<MesWmReturnSalesDO> getReturnSalesPage(MesWmReturnSalesPageReqVO pageReqVO) {
  94 + return returnSalesMapper.selectPage(pageReqVO);
  95 + }
  96 +
  97 + @Override
  98 + @Transactional(rollbackFor = Exception.class)
  99 + public void submitReturnSales(Long id) {
  100 + // 校验存在 + 草稿状态
  101 + validateReturnSalesExistsAndPrepare(id);
  102 + // 校验至少有一条行
  103 + List<MesWmReturnSalesLineDO> lines = returnSalesLineService.getReturnSalesLineListByReturnId(id);
  104 + if (CollUtil.isEmpty(lines)) {
  105 + throw exception(WM_RETURN_SALES_NO_LINE);
  106 + }
  107 +
  108 + // 提交(草稿 -> 待执行)
  109 + returnSalesMapper.updateById(new MesWmReturnSalesDO()
  110 + .setId(id).setStatus(MesWmReturnSalesStatusEnum.APPROVING.getStatus()));
  111 + }
  112 +
  113 + @Override
  114 + @Transactional(rollbackFor = Exception.class)
  115 + public void executeReturnSales(Long id) {
  116 + // 校验存在
  117 + MesWmReturnSalesDO returnSales = validateReturnSalesExists(id);
  118 + if (ObjUtil.notEqual(MesWmReturnSalesStatusEnum.APPROVING.getStatus(), returnSales.getStatus())) {
  119 + throw exception(WM_RETURN_SALES_STATUS_NOT_APPROVING);
  120 + }
  121 + // 执行退货(待执行 -> 待上架)
  122 + returnSalesMapper.updateById(new MesWmReturnSalesDO()
  123 + .setId(id).setStatus(MesWmReturnSalesStatusEnum.APPROVED.getStatus()));
  124 + }
  125 +
  126 + @Override
  127 + @Transactional(rollbackFor = Exception.class)
  128 + public void stockReturnSales(Long id) {
  129 + // 校验存在
  130 + MesWmReturnSalesDO returnSales = validateReturnSalesExists(id);
  131 + if (ObjUtil.notEqual(MesWmReturnSalesStatusEnum.APPROVED.getStatus(), returnSales.getStatus())) {
  132 + throw exception(WM_RETURN_SALES_STATUS_NOT_APPROVED);
  133 + }
  134 +
  135 + // 遍历所有明细,更新库存台账(增加库存)
  136 + // TODO @芋艿:【后续在弄】这里需要库存更新;后面在弄
  137 + List<MesWmReturnSalesDetailDO> details = returnSalesDetailService.getReturnSalesDetailListByReturnId(id);
  138 + for (MesWmReturnSalesDetailDO detail : details) {
  139 + // materialStockService.increaseStock(
  140 + // detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(),
  141 + // detail.getBatchId(), detail.getQuantity(), null, null, null);
  142 + }
  143 +
  144 + // 更新退货单状态
  145 + returnSalesMapper.updateById(new MesWmReturnSalesDO()
  146 + .setId(id).setStatus(MesWmReturnSalesStatusEnum.FINISHED.getStatus()));
  147 + }
  148 +
  149 + @Override
  150 + @Transactional(rollbackFor = Exception.class)
  151 + public void cancelReturnSales(Long id) {
  152 + // 校验存在
  153 + MesWmReturnSalesDO returnSales = validateReturnSalesExists(id);
  154 + // 已完成和已取消不允许取消
  155 + if (ObjectUtils.equalsAny(returnSales.getStatus(),
  156 + MesWmReturnSalesStatusEnum.FINISHED.getStatus(),
  157 + MesWmReturnSalesStatusEnum.CANCELED.getStatus())) {
  158 + throw exception(WM_RETURN_SALES_CANCEL_NOT_ALLOWED);
  159 + }
  160 +
  161 + // 取消
  162 + returnSalesMapper.updateById(new MesWmReturnSalesDO()
  163 + .setId(id).setStatus(MesWmReturnSalesStatusEnum.CANCELED.getStatus()));
  164 + }
  165 +
  166 + @Override
  167 + public Boolean checkReturnSalesQuantity(Long id) {
  168 + List<MesWmReturnSalesLineDO> lines = returnSalesLineService.getReturnSalesLineListByReturnId(id);
  169 + for (MesWmReturnSalesLineDO line : lines) {
  170 + List<MesWmReturnSalesDetailDO> details = returnSalesDetailService.getReturnSalesDetailListByLineId(line.getId());
  171 + BigDecimal totalDetailQty = CollectionUtils.getSumValue(details,
  172 + MesWmReturnSalesDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO);
  173 + if (line.getQuantityReturned() != null && totalDetailQty.compareTo(line.getQuantityReturned()) != 0) {
  174 + return false;
  175 + }
  176 + }
  177 + return true;
  178 + }
  179 +
  180 + @Override
  181 + public MesWmReturnSalesDO validateReturnSalesExists(Long id) {
  182 + MesWmReturnSalesDO returnSales = returnSalesMapper.selectById(id);
  183 + if (returnSales == null) {
  184 + throw exception(WM_RETURN_SALES_NOT_EXISTS);
  185 + }
  186 + return returnSales;
  187 + }
  188 +
  189 + /**
  190 + * 校验销售退货单存在且为准备中状态
  191 + */
  192 + private MesWmReturnSalesDO validateReturnSalesExistsAndPrepare(Long id) {
  193 + MesWmReturnSalesDO returnSales = validateReturnSalesExists(id);
  194 + if (ObjUtil.notEqual(MesWmReturnSalesStatusEnum.PREPARE.getStatus(), returnSales.getStatus())) {
  195 + throw exception(WM_RETURN_SALES_STATUS_NOT_PREPARE);
  196 + }
  197 + return returnSales;
  198 + }
  199 +
  200 +}