diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesController.java new file mode 100644 index 0000000..5bb7973 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesController.java @@ -0,0 +1,169 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales; + +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.returnsales.vo.MesWmReturnSalesPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO; +import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; +import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService; +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; + +/** + * 管理后台 - MES 销售退货单 Controller + * + * @author 芋道源码 + */ +@Tag(name = "管理后台 - MES 销售退货单") +@RestController +@RequestMapping("/mes/wm/return-sales") +@Validated +public class MesWmReturnSalesController { + + @Resource + private MesWmReturnSalesService returnSalesService; + @Resource + private MesMdClientService clientService; + + @PostMapping("/create") + @Operation(summary = "创建销售退货单") + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:create')") + public CommonResult createReturnSales(@Valid @RequestBody MesWmReturnSalesSaveReqVO createReqVO) { + return success(returnSalesService.createReturnSales(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改销售退货单") + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:update')") + public CommonResult updateReturnSales(@Valid @RequestBody MesWmReturnSalesSaveReqVO updateReqVO) { + returnSalesService.updateReturnSales(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除销售退货单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:delete')") + public CommonResult deleteReturnSales(@RequestParam("id") Long id) { + returnSalesService.deleteReturnSales(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得销售退货单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')") + public CommonResult getReturnSales(@RequestParam("id") Long id) { + MesWmReturnSalesDO returnSales = returnSalesService.getReturnSales(id); + if (returnSales == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(returnSales)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得销售退货单分页") + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')") + public CommonResult> getReturnSalesPage( + @Valid MesWmReturnSalesPageReqVO pageReqVO) { + PageResult pageResult = returnSalesService.getReturnSalesPage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出销售退货单 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportReturnSalesExcel(@Valid MesWmReturnSalesPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + PageResult pageResult = returnSalesService.getReturnSalesPage(pageReqVO); + ExcelUtils.write(response, "销售退货单.xls", "数据", MesWmReturnSalesRespVO.class, + buildRespVOList(pageResult.getList())); + } + + @PutMapping("/submit") + @Operation(summary = "提交销售退货单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:submit')") + public CommonResult submitReturnSales(@RequestParam("id") Long id) { + returnSalesService.submitReturnSales(id); + return success(true); + } + + @PutMapping("/execute") + @Operation(summary = "执行退货") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:execute')") + public CommonResult executeReturnSales(@RequestParam("id") Long id) { + returnSalesService.executeReturnSales(id); + return success(true); + } + + @PutMapping("/stock") + @Operation(summary = "执行上架") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:stock')") + public CommonResult stockReturnSales(@RequestParam("id") Long id) { + returnSalesService.stockReturnSales(id); + return success(true); + } + + @PutMapping("/cancel") + @Operation(summary = "取消销售退货单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:cancel')") + public CommonResult cancelReturnSales(@RequestParam("id") Long id) { + returnSalesService.cancelReturnSales(id); + return success(true); + } + + @GetMapping("/check-quantity") + @Operation(summary = "校验销售退货单数量", description = "校验每行明细数量之和是否等于行退货数量") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')") + public CommonResult checkReturnSalesQuantity(@RequestParam("id") Long id) { + return success(returnSalesService.checkReturnSalesQuantity(id)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map clientMap = clientService.getClientMap( + convertSet(list, MesWmReturnSalesDO::getClientId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmReturnSalesRespVO.class, vo -> + MapUtils.findAndThen(clientMap, vo.getClientId(), client -> + vo.setClientCode(client.getCode()).setClientName(client.getName()).setClientNickname(client.getNickname()))); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java new file mode 100644 index 0000000..27b3d13 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java @@ -0,0 +1,157 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales; + +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.returnsales.vo.detail.MesWmReturnSalesDetailRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail.MesWmReturnSalesDetailSaveReqVO; +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.returnsales.MesWmReturnSalesDetailDO; +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.returnsales.MesWmReturnSalesDetailService; +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; + +/** + * 管理后台 - MES 销售退货相关 + * + * @author 芋道源码 + */ +@Tag(name = "管理后台 - MES 销售退货明细") +@RestController +@RequestMapping("/mes/wm/return-sales-detail") +@Validated +public class MesWmReturnSalesDetailController { + + @Resource + private MesWmReturnSalesDetailService returnSalesDetailService; + + @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-sales:create')") + public CommonResult createReturnSalesDetail(@Valid @RequestBody MesWmReturnSalesDetailSaveReqVO createReqVO) { + return success(returnSalesDetailService.createReturnSalesDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改销售退货明细") + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:update')") + public CommonResult updateReturnSalesDetail(@Valid @RequestBody MesWmReturnSalesDetailSaveReqVO updateReqVO) { + returnSalesDetailService.updateReturnSalesDetail(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除销售退货明细") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:delete')") + public CommonResult deleteReturnSalesDetail(@RequestParam("id") Long id) { + returnSalesDetailService.deleteReturnSalesDetail(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得销售退货明细") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')") + public CommonResult getReturnSalesDetail(@RequestParam("id") Long id) { + MesWmReturnSalesDetailDO detail = returnSalesDetailService.getReturnSalesDetail(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-sales:query')") + public CommonResult> getReturnSalesDetailListByLineId( + @RequestParam("lineId") Long lineId) { + List list = returnSalesDetailService.getReturnSalesDetailListByLineId(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, MesWmReturnSalesDetailDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + Map warehouseMap = warehouseService.getWarehouseMap( + convertSet(list, MesWmReturnSalesDetailDO::getWarehouseId)); + Map locationMap = locationService.getWarehouseLocationMap( + convertSet(list, MesWmReturnSalesDetailDO::getLocationId)); + Map areaMap = areaService.getWarehouseAreaMap( + convertSet(list, MesWmReturnSalesDetailDO::getAreaId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmReturnSalesDetailRespVO.class, vo -> { + // TODO @AI:set 的时候,链式调用; + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()); + vo.setItemName(item.getName()); + vo.setItemSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setItemUnit(unitMeasure.getName())); + }); + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> { + // TODO @AI:set 的时候,链式调用; + vo.setWarehouseCode(warehouse.getCode()); + vo.setWarehouseName(warehouse.getName()); + }); + MapUtils.findAndThen(locationMap, vo.getLocationId(), location -> { + // TODO @AI:set 的时候,链式调用; + vo.setLocationCode(location.getCode()); + vo.setLocationName(location.getName()); + }); + MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> { + // TODO @AI:set 的时候,链式调用; + vo.setAreaCode(area.getCode()); + vo.setAreaName(area.getName()); + }); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java new file mode 100644 index 0000000..2c3d970 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java @@ -0,0 +1,132 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales; + +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.returnsales.vo.line.MesWmReturnSalesLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO; +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.returnsales.MesWmReturnSalesLineDO; +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.returnsales.MesWmReturnSalesLineService; +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; + +/** + * 管理后台 - MES 销售退货相关 + * + * @author 芋道源码 + */ +@Tag(name = "管理后台 - MES 销售退货单行") +@RestController +@RequestMapping("/mes/wm/return-sales-line") +@Validated +public class MesWmReturnSalesLineController { + + @Resource + private MesWmReturnSalesLineService returnSalesLineService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @PostMapping("/create") + @Operation(summary = "创建销售退货单行") + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:create')") + public CommonResult createReturnSalesLine(@Valid @RequestBody MesWmReturnSalesLineSaveReqVO createReqVO) { + return success(returnSalesLineService.createReturnSalesLine(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改销售退货单行") + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:update')") + public CommonResult updateReturnSalesLine(@Valid @RequestBody MesWmReturnSalesLineSaveReqVO updateReqVO) { + returnSalesLineService.updateReturnSalesLine(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除销售退货单行") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:delete')") + public CommonResult deleteReturnSalesLine(@RequestParam("id") Long id) { + returnSalesLineService.deleteReturnSalesLine(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得销售退货单行") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')") + public CommonResult getReturnSalesLine(@RequestParam("id") Long id) { + MesWmReturnSalesLineDO line = returnSalesLineService.getReturnSalesLine(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-sales:query')") + public CommonResult> getReturnSalesLinePage( + @Valid MesWmReturnSalesLinePageReqVO pageReqVO) { + PageResult pageResult = returnSalesLineService.getReturnSalesLinePage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/list-by-return-sales") + @Operation(summary = "获得销售退货单行列表(按退货单编号)") + @Parameter(name = "returnId", description = "退货单编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-return-sales:query')") + public CommonResult> getReturnSalesLineListByReturnId( + @RequestParam("returnId") Long returnId) { + List list = returnSalesLineService.getReturnSalesLineListByReturnId(returnId); + return success(buildRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map itemMap = itemService.getItemMap( + convertSet(list, MesWmReturnSalesLineDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmReturnSalesLineRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + // TODO @AI:set 的时候,链式调用; + vo.setItemCode(item.getCode()); + vo.setItemName(item.getName()); + vo.setItemSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setItemUnit(unitMeasure.getName())); + }); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesPageReqVO.java new file mode 100644 index 0000000..17ef39a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesPageReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 管理后台 - MES 销售退货相关 + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - MES 销售退货单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class MesWmReturnSalesPageReqVO extends PageParam { + + @Schema(description = "退货单编号", example = "RS202603010001") + private String code; + + @Schema(description = "退货单名称", example = "销售退货") + private String name; + + @Schema(description = "销售订单编号", example = "SO202603010001") + private String salesOrderCode; + + @Schema(description = "客户 ID", example = "1") + private Long clientId; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "退货日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] returnDate; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesRespVO.java new file mode 100644 index 0000000..c2f11b0 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesRespVO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 管理后台 - MES 销售退货相关 + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - MES 销售退货单 Response VO") +@Data +public class MesWmReturnSalesRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "退货单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "RS202603010001") + private String code; + + @Schema(description = "退货单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "销售退货") + private String name; + + @Schema(description = "销售订单编号", example = "SO202603010001") + private String salesOrderCode; + + @Schema(description = "客户 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long clientId; + + @Schema(description = "客户编码", example = "C001") + private String clientCode; + + @Schema(description = "客户名称", example = "XX客户") + private String clientName; + + @Schema(description = "客户简称", example = "XX") + private String clientNickname; + + @Schema(description = "退货日期") + private LocalDateTime returnDate; + + @Schema(description = "退货原因", example = "质量问题") + private String returnReason; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Integer status; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesSaveReqVO.java new file mode 100644 index 0000000..2b3fbce --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/MesWmReturnSalesSaveReqVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 管理后台 - MES 销售退货单新增/修改 Request VO + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - MES 销售退货单新增/修改 Request VO") +@Data +public class MesWmReturnSalesSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "退货单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "RS202603010001") + @NotBlank(message = "退货单编号不能为空") + private String code; + + @Schema(description = "退货单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "销售退货") + @NotBlank(message = "退货单名称不能为空") + private String name; + + @Schema(description = "销售订单编号", example = "SO202603010001") + private String salesOrderCode; + + @Schema(description = "客户 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "客户 ID 不能为空") + private Long clientId; + + @Schema(description = "退货日期", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "退货日期不能为空") + private LocalDateTime returnDate; + + @Schema(description = "退货原因", example = "质量问题") + private String returnReason; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailPageReqVO.java new file mode 100644 index 0000000..1db1faa --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailPageReqVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 管理后台 - MES 销售退货相关 + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - MES 销售退货明细分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class MesWmReturnSalesDetailPageReqVO extends PageParam { + + @Schema(description = "退货单ID", example = "1") + private Long returnId; + + @Schema(description = "行ID", example = "1") + private Long lineId; + + @Schema(description = "物料ID", example = "1") + private Long itemId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailRespVO.java new file mode 100644 index 0000000..8f9693b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailRespVO.java @@ -0,0 +1,84 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 管理后台 - MES 销售退货相关 + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - MES 销售退货明细 Response VO") +@Data +public class MesWmReturnSalesDetailRespVO { + + @Schema(description = "明细ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "退货单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long returnId; + + @Schema(description = "行ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long lineId; + + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long itemId; + + @Schema(description = "物料编码", example = "M001") + private String itemCode; + + @Schema(description = "物料名称", example = "物料A") + private String itemName; + + @Schema(description = "物料规格", example = "100*200") + private String itemSpecification; + + @Schema(description = "计量单位", example = "个") + private String itemUnit; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + private BigDecimal quantity; + + @Schema(description = "批次ID", example = "1") + private Long batchId; + + @Schema(description = "批次号", example = "B001") + private String batchCode; + + @Schema(description = "仓库ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long warehouseId; + + @Schema(description = "仓库编码", example = "WH001") + private String warehouseCode; + + @Schema(description = "仓库名称", example = "仓库A") + private String warehouseName; + + @Schema(description = "库区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long locationId; + + @Schema(description = "库区编码", example = "LOC001") + private String locationCode; + + @Schema(description = "库区名称", example = "库区A") + private String locationName; + + @Schema(description = "库位ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long areaId; + + @Schema(description = "库位编码", example = "AREA001") + private String areaCode; + + @Schema(description = "库位名称", example = "库位A") + private String areaName; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailSaveReqVO.java new file mode 100644 index 0000000..7991a82 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/detail/MesWmReturnSalesDetailSaveReqVO.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 管理后台 - MES 销售退货相关 + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - MES 销售退货明细新增/修改 Request VO") +@Data +public class MesWmReturnSalesDetailSaveReqVO { + + @Schema(description = "明细ID", example = "1") + private Long id; + + @Schema(description = "退货单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "退货单ID不能为空") + private Long returnId; + + @Schema(description = "行ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "行ID不能为空") + private Long lineId; + + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "物料ID不能为空") + private Long itemId; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + @NotNull(message = "数量不能为空") + @DecimalMin(value = "0", inclusive = false, message = "数量必须大于 0") + private BigDecimal quantity; + + @Schema(description = "批次ID", example = "1") + private Long batchId; + + @Schema(description = "仓库ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "仓库ID不能为空") + private Long warehouseId; + + @Schema(description = "库区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "库区ID不能为空") + private Long locationId; + + @Schema(description = "库位ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "库位ID不能为空") + private Long areaId; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLinePageReqVO.java new file mode 100644 index 0000000..838cd7e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLinePageReqVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 管理后台 - MES 销售退货相关 + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - MES 销售退货单行分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class MesWmReturnSalesLinePageReqVO extends PageParam { + + @Schema(description = "退货单ID", example = "1") + private Long returnId; + + @Schema(description = "物料ID", example = "1") + private Long itemId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java new file mode 100644 index 0000000..7f4637c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineRespVO.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 管理后台 - MES 销售退货相关 + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - MES 销售退货单行 Response VO") +@Data +public class MesWmReturnSalesLineRespVO { + + @Schema(description = "行ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "退货单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long returnId; + + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long itemId; + + @Schema(description = "物料编码", example = "M001") + private String itemCode; + + @Schema(description = "物料名称", example = "物料A") + private String itemName; + + @Schema(description = "物料规格", example = "100*200") + private String itemSpecification; + + @Schema(description = "计量单位", example = "个") + private String itemUnit; + + @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + private BigDecimal quantityReturned; + + @Schema(description = "批次ID", example = "1") + private Long batchId; + + @Schema(description = "批次号", example = "B001") + private String batchCode; + + @Schema(description = "质量状态", example = "合格") + private String qualityStatus; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java new file mode 100644 index 0000000..c790801 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/vo/line/MesWmReturnSalesLineSaveReqVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 管理后台 - MES 销售退货相关 + * + * @author 芋道源码 + */ +@Schema(description = "管理后台 - MES 销售退货单行新增/修改 Request VO") +@Data +public class MesWmReturnSalesLineSaveReqVO { + + @Schema(description = "行ID", example = "1") + private Long id; + + @Schema(description = "退货单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "退货单ID不能为空") + private Long returnId; + + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "物料ID不能为空") + private Long itemId; + + @Schema(description = "退货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + @NotNull(message = "退货数量不能为空") + @DecimalMin(value = "0", inclusive = false, message = "退货数量必须大于 0") + private BigDecimal quantityReturned; + + @Schema(description = "批次ID", example = "1") + private Long batchId; + + @Schema(description = "质量状态", example = "合格") + private String qualityStatus; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java new file mode 100644 index 0000000..590a84e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDO.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * + * @author 芋道源码 + * MES 销售退货单 DO + */ +@TableName("mes_wm_return_sales") +@KeySequence("mes_wm_return_sales_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmReturnSalesDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 退货单编号 + */ + private String code; + /** + * 退货单名称 + */ + private String name; + /** + * 销售订单编号 + */ + private String salesOrderCode; + // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面,以及 service 校验 + /** + * 客户 ID + * + * 关联 {@link MesMdClientDO#getId()} + */ + private Long clientId; + // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面 + /** + * 退货日期 + */ + private LocalDateTime returnDate; + // TODO @AI:这个前端界面必填;注意 save vo(validator)、前端界面 + /** + * 退货原因 + */ + private String returnReason; + /** + * 状态 + * + * 枚举 {@link MesWmReturnSalesStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java new file mode 100644 index 0000000..dadd941 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesDetailDO.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales; + +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.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; + +/** + * + * @author 芋道源码 + * MES 销售退货明细 DO + */ +@TableName("mes_wm_return_sales_detail") +@KeySequence("mes_wm_return_sales_detail_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmReturnSalesDetailDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在 + /** + * 退货单 ID + * + * 关联 {@link MesWmReturnSalesDO#getId()} + */ + private Long returnId; + /** + * 行 ID + * + * 关联 {@link MesWmReturnSalesLineDO#getId()} + */ + private Long lineId; + // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在 + /** + * 物料 ID + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填; + /** + * 数量 + */ + private BigDecimal quantity; + /** + * 批次 ID + */ + private Long batchId; + // TODO @AI:必须传递;并且要在 save vo(validator)中校验;前端界面必填;service 校验存在 + /** + * 仓库 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/returnsales/MesWmReturnSalesLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java new file mode 100644 index 0000000..a4ca76f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/returnsales/MesWmReturnSalesLineDO.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales; + +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; + +/** + * + * @author 芋道源码 + * MES 销售退货单行 DO + */ +@TableName("mes_wm_return_sales_line") +@KeySequence("mes_wm_return_sales_line_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmReturnSalesLineDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 退货单 ID + * + * 关联 {@link MesWmReturnSalesDO#getId()} + */ + private Long returnId; + /** + * 物料 ID + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + // TODO @AI:这个改成 quantity;简化(听我的) + /** + * 退货数量 + */ + private BigDecimal quantityReturned; + /** + * 批次 ID + */ + private Long batchId; + // TODO @AI:需要 @下对应的枚举类,方便理解; + /** + * 质量状态 + */ + private String qualityStatus; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesDetailMapper.java new file mode 100644 index 0000000..f54010a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesDetailMapper.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales; + +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.returnsales.vo.detail.MesWmReturnSalesDetailPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * + * @author 芋道源码 + * MES 销售退货明细 Mapper + */ +@Mapper +public interface MesWmReturnSalesDetailMapper extends BaseMapperX { + + default PageResult selectPage(MesWmReturnSalesDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesWmReturnSalesDetailDO::getReturnId, reqVO.getReturnId()) + .eqIfPresent(MesWmReturnSalesDetailDO::getLineId, reqVO.getLineId()) + .eqIfPresent(MesWmReturnSalesDetailDO::getItemId, reqVO.getItemId()) + .orderByDesc(MesWmReturnSalesDetailDO::getId)); + } + + default List selectListByReturnId(Long returnId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmReturnSalesDetailDO::getReturnId, returnId)); + } + + default List selectListByLineId(Long lineId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmReturnSalesDetailDO::getLineId, lineId)); + } + + default void deleteByReturnId(Long returnId) { + delete(new LambdaQueryWrapperX() + .eq(MesWmReturnSalesDetailDO::getReturnId, returnId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesLineMapper.java new file mode 100644 index 0000000..0974b8c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesLineMapper.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales; + +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.returnsales.vo.line.MesWmReturnSalesLinePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * + * @author 芋道源码 + * MES 销售退货单行 Mapper + */ +@Mapper +public interface MesWmReturnSalesLineMapper extends BaseMapperX { + + default PageResult selectPage(MesWmReturnSalesLinePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesWmReturnSalesLineDO::getReturnId, reqVO.getReturnId()) + .eqIfPresent(MesWmReturnSalesLineDO::getItemId, reqVO.getItemId()) + .orderByDesc(MesWmReturnSalesLineDO::getId)); + } + + default List selectListByReturnId(Long returnId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmReturnSalesLineDO::getReturnId, returnId)); + } + + default void deleteByReturnId(Long returnId) { + delete(new LambdaQueryWrapperX() + .eq(MesWmReturnSalesLineDO::getReturnId, returnId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesMapper.java new file mode 100644 index 0000000..497ac53 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/returnsales/MesWmReturnSalesMapper.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales; + +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.returnsales.vo.MesWmReturnSalesPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * + * @author 芋道源码 + * MES 销售退货单 Mapper + */ +@Mapper +public interface MesWmReturnSalesMapper extends BaseMapperX { + + default PageResult selectPage(MesWmReturnSalesPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmReturnSalesDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmReturnSalesDO::getName, reqVO.getName()) + .likeIfPresent(MesWmReturnSalesDO::getSalesOrderCode, reqVO.getSalesOrderCode()) + .eqIfPresent(MesWmReturnSalesDO::getClientId, reqVO.getClientId()) + .eqIfPresent(MesWmReturnSalesDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(MesWmReturnSalesDO::getReturnDate, reqVO.getReturnDate()) + .orderByDesc(MesWmReturnSalesDO::getId)); + } + +} 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 1d4e1c2..49d07a1 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 @@ -413,4 +413,16 @@ public interface ErrorCodeConstants { ErrorCode WM_PRODUCT_RECPT_LINE_NOT_EXISTS = new ErrorCode(1_040_712_100, "产品收货单行不存在"); ErrorCode WM_PRODUCT_RECPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_712_200, "产品收货明细不存在"); + // ========== MES 仓库管理-销售退货单(1-040-713-000) ========== + ErrorCode WM_RETURN_SALES_NOT_EXISTS = new ErrorCode(1_040_713_000, "销售退货单不存在"); + ErrorCode WM_RETURN_SALES_CODE_DUPLICATE = new ErrorCode(1_040_713_001, "销售退货单编码已存在"); + ErrorCode WM_RETURN_SALES_STATUS_NOT_PREPARE = new ErrorCode(1_040_713_002, "只有草稿状态才允许此操作"); + ErrorCode WM_RETURN_SALES_STATUS_NOT_APPROVING = new ErrorCode(1_040_713_003, "只有待执行状态才允许执行退货"); + ErrorCode WM_RETURN_SALES_STATUS_NOT_APPROVED = new ErrorCode(1_040_713_004, "只有待上架状态才允许执行上架"); + ErrorCode WM_RETURN_SALES_NO_LINE = new ErrorCode(1_040_713_005, "销售退货单至少需要一条行数据"); + ErrorCode WM_RETURN_SALES_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_713_006, "销售退货单行数量与明细数量不一致"); + ErrorCode WM_RETURN_SALES_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_713_007, "销售退货单已完成或已取消,无法取消"); + ErrorCode WM_RETURN_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_713_100, "销售退货单行不存在"); + ErrorCode WM_RETURN_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_713_200, "销售退货单明细不存在"); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java new file mode 100644 index 0000000..9541ac7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnSalesStatusEnum.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * MES 销售退货单状态枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum MesWmReturnSalesStatusEnum implements ArrayValuable { + + // TODO @AI:参考 {@link MesWmProductReceiptStatusEnum},增加注释,说明每个状态对应的业务含义,以及对应的方法(如果有的话)。方便开发人员理解。 + /** + * 草稿 + */ + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), + /** + * 待执行 + */ + APPROVING(MesOrderStatusConstants.APPROVING, "待执行"), + /** + * 待上架 + */ + APPROVED(MesOrderStatusConstants.APPROVED, "待上架"), + /** + * 已完成 + */ + FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), + /** + * 已取消 + */ + CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmReturnSalesStatusEnum::getStatus).toArray(Integer[]::new); + + /** + * 状态值 + */ + private final Integer status; + /** + * 状态名 + */ + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesDetailService.java new file mode 100644 index 0000000..5862d4a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesDetailService.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnsales; + +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail.MesWmReturnSalesDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * + * @author 芋道源码 + * MES 销售退货明细 Service 接口 + */ +public interface MesWmReturnSalesDetailService { + + /** + * 创建销售退货明细 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createReturnSalesDetail(@Valid MesWmReturnSalesDetailSaveReqVO createReqVO); + + /** + * 更新销售退货明细 + * + * @param updateReqVO 更新信息 + */ + void updateReturnSalesDetail(@Valid MesWmReturnSalesDetailSaveReqVO updateReqVO); + + /** + * 删除销售退货明细 + * + * @param id 编号 + */ + void deleteReturnSalesDetail(Long id); + + /** + * 获得销售退货明细 + * + * @param id 编号 + * @return 销售退货明细 + */ + MesWmReturnSalesDetailDO getReturnSalesDetail(Long id); + + /** + * 根据行ID获取明细列表 + * + * @param lineId 行ID + * @return 明细列表 + */ + List getReturnSalesDetailListByLineId(Long lineId); + + /** + * 根据退货单ID获取明细列表 + * + * @param returnId 退货单ID + * @return 明细列表 + */ + List getReturnSalesDetailListByReturnId(Long returnId); + + /** + * 根据退货单ID删除明细 + * + * @param returnId 退货单ID + */ + void deleteReturnSalesDetailByReturnId(Long returnId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesDetailServiceImpl.java new file mode 100644 index 0000000..e7da4b2 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesDetailServiceImpl.java @@ -0,0 +1,98 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnsales; + +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail.MesWmReturnSalesDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesDetailMapper; +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_SALES_DETAIL_NOT_EXISTS; + +/** + * + * @author 芋道源码 + * MES 销售退货明细 Service 实现类 + */ +@Service +@Validated +public class MesWmReturnSalesDetailServiceImpl implements MesWmReturnSalesDetailService { + + @Resource + private MesWmReturnSalesDetailMapper returnSalesDetailMapper; + + @Resource + @Lazy + private MesWmReturnSalesLineService returnSalesLineService; + + @Resource + private MesMdItemService itemService; + + @Override + public Long createReturnSalesDetail(MesWmReturnSalesDetailSaveReqVO createReqVO) { + // 校验父数据存在 + returnSalesLineService.validateReturnSalesLineExists(createReqVO.getLineId()); + // 校验物料存在 + itemService.validateItemExists(createReqVO.getItemId()); + + // 插入 + MesWmReturnSalesDetailDO detail = BeanUtils.toBean(createReqVO, MesWmReturnSalesDetailDO.class); + returnSalesDetailMapper.insert(detail); + return detail.getId(); + } + + @Override + public void updateReturnSalesDetail(MesWmReturnSalesDetailSaveReqVO updateReqVO) { + // 校验存在 + validateReturnSalesDetailExists(updateReqVO.getId()); + // 校验父数据存在 + returnSalesLineService.validateReturnSalesLineExists(updateReqVO.getLineId()); + // 校验物料存在 + itemService.validateItemExists(updateReqVO.getItemId()); + + // 更新 + MesWmReturnSalesDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesDetailDO.class); + returnSalesDetailMapper.updateById(updateObj); + } + + @Override + public void deleteReturnSalesDetail(Long id) { + // 校验存在 + validateReturnSalesDetailExists(id); + // 删除 + returnSalesDetailMapper.deleteById(id); + } + + @Override + public MesWmReturnSalesDetailDO getReturnSalesDetail(Long id) { + return returnSalesDetailMapper.selectById(id); + } + + @Override + public List getReturnSalesDetailListByLineId(Long lineId) { + return returnSalesDetailMapper.selectListByLineId(lineId); + } + + @Override + public List getReturnSalesDetailListByReturnId(Long returnId) { + return returnSalesDetailMapper.selectListByReturnId(returnId); + } + + @Override + public void deleteReturnSalesDetailByReturnId(Long returnId) { + returnSalesDetailMapper.deleteByReturnId(returnId); + } + + private void validateReturnSalesDetailExists(Long id) { + if (returnSalesDetailMapper.selectById(id) == null) { + throw exception(WM_RETURN_SALES_DETAIL_NOT_EXISTS); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineService.java new file mode 100644 index 0000000..e3a3f00 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineService.java @@ -0,0 +1,79 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnsales; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * + * @author 芋道源码 + * MES 销售退货单行 Service 接口 + */ +public interface MesWmReturnSalesLineService { + + /** + * 创建销售退货单行 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createReturnSalesLine(@Valid MesWmReturnSalesLineSaveReqVO createReqVO); + + /** + * 更新销售退货单行 + * + * @param updateReqVO 更新信息 + */ + void updateReturnSalesLine(@Valid MesWmReturnSalesLineSaveReqVO updateReqVO); + + /** + * 删除销售退货单行 + * + * @param id 编号 + */ + void deleteReturnSalesLine(Long id); + + /** + * 获得销售退货单行 + * + * @param id 编号 + * @return 销售退货单行 + */ + MesWmReturnSalesLineDO getReturnSalesLine(Long id); + + /** + * 获得销售退货单行分页 + * + * @param pageReqVO 分页查询 + * @return 销售退货单行分页 + */ + PageResult getReturnSalesLinePage(MesWmReturnSalesLinePageReqVO pageReqVO); + + /** + * 根据退货单ID获取行列表 + * + * @param returnId 退货单ID + * @return 行列表 + */ + List getReturnSalesLineListByReturnId(Long returnId); + + /** + * 根据退货单ID删除行 + * + * @param returnId 退货单ID + */ + void deleteReturnSalesLineByReturnId(Long returnId); + + /** + * 校验销售退货单行是否存在 + * + * @param id 编号 + * @return 销售退货单行 + */ + MesWmReturnSalesLineDO validateReturnSalesLineExists(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java new file mode 100644 index 0000000..d5bcdbf --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java @@ -0,0 +1,104 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnsales; + +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.returnsales.vo.line.MesWmReturnSalesLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper; +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_SALES_LINE_NOT_EXISTS; + +/** + * + * @author 芋道源码 + * MES 销售退货单行 Service 实现类 + */ +@Service +@Validated +public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineService { + + @Resource + private MesWmReturnSalesLineMapper returnSalesLineMapper; + + @Resource + @Lazy + private MesWmReturnSalesService returnSalesService; + @Resource + private MesMdItemService itemService; + + @Override + public Long createReturnSalesLine(MesWmReturnSalesLineSaveReqVO createReqVO) { + // 校验父数据存在 + returnSalesService.validateReturnSalesExists(createReqVO.getReturnId()); + // 校验物料存在 + itemService.validateItemExists(createReqVO.getItemId()); + // TODO @AI:请选择批次;假设物料开启了批次号 + + // 插入 + MesWmReturnSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnSalesLineDO.class); + returnSalesLineMapper.insert(line); + return line.getId(); + } + + @Override + public void updateReturnSalesLine(MesWmReturnSalesLineSaveReqVO updateReqVO) { + // 校验存在 + validateReturnSalesLineExists(updateReqVO.getId()); + // 校验父数据存在 + returnSalesService.validateReturnSalesExists(updateReqVO.getReturnId()); + // 校验物料存在 + itemService.validateItemExists(updateReqVO.getItemId()); + // TODO @AI:请选择批次;假设物料开启了批次号 + + // 更新 + MesWmReturnSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesLineDO.class); + returnSalesLineMapper.updateById(updateObj); + } + + @Override + public void deleteReturnSalesLine(Long id) { + // 校验存在 + validateReturnSalesLineExists(id); + // 删除 + returnSalesLineMapper.deleteById(id); + } + + @Override + public MesWmReturnSalesLineDO getReturnSalesLine(Long id) { + return returnSalesLineMapper.selectById(id); + } + + @Override + public PageResult getReturnSalesLinePage(MesWmReturnSalesLinePageReqVO pageReqVO) { + return returnSalesLineMapper.selectPage(pageReqVO); + } + + @Override + public List getReturnSalesLineListByReturnId(Long returnId) { + return returnSalesLineMapper.selectListByReturnId(returnId); + } + + @Override + public void deleteReturnSalesLineByReturnId(Long returnId) { + returnSalesLineMapper.deleteByReturnId(returnId); + } + + @Override + public MesWmReturnSalesLineDO validateReturnSalesLineExists(Long id) { + MesWmReturnSalesLineDO line = returnSalesLineMapper.selectById(id); + if (line == null) { + throw exception(WM_RETURN_SALES_LINE_NOT_EXISTS); + } + return line; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesService.java new file mode 100644 index 0000000..cbec94e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesService.java @@ -0,0 +1,98 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnsales; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO; +import jakarta.validation.Valid; + +/** + * + * @author 芋道源码 + * MES 销售退货单 Service 接口 + */ +public interface MesWmReturnSalesService { + + /** + * 创建销售退货单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createReturnSales(@Valid MesWmReturnSalesSaveReqVO createReqVO); + + /** + * 修改销售退货单 + * + * @param updateReqVO 修改信息 + */ + void updateReturnSales(@Valid MesWmReturnSalesSaveReqVO updateReqVO); + + /** + * 删除销售退货单 + * + * @param id 编号 + */ + void deleteReturnSales(Long id); + + /** + * 获得销售退货单 + * + * @param id 编号 + * @return 销售退货单 + */ + MesWmReturnSalesDO getReturnSales(Long id); + + /** + * 获得销售退货单分页 + * + * @param pageReqVO 分页参数 + * @return 销售退货单分页 + */ + PageResult getReturnSalesPage(MesWmReturnSalesPageReqVO pageReqVO); + + /** + * 校验销售退货单是否存在 + * + * @param id 编号 + * @return 销售退货单 + */ + MesWmReturnSalesDO validateReturnSalesExists(Long id); + + /** + * 提交销售退货单(草稿 -> 待执行) + * + * @param id 编号 + */ + void submitReturnSales(Long id); + + /** + * 执行退货(待执行 -> 待上架) + * + * @param id 编号 + */ + void executeReturnSales(Long id); + + /** + * 执行上架(待上架 -> 已完成),更新库存台账 + * + * @param id 编号 + */ + void stockReturnSales(Long id); + + /** + * 取消销售退货单(任意非已完成/已取消状态 -> 已取消) + * + * @param id 编号 + */ + void cancelReturnSales(Long id); + + /** + * 校验销售退货单的数量:每行明细数量之和是否等于行退货数量 + * + * @param id 编号 + * @return 是否全部一致 + */ + Boolean checkReturnSalesQuantity(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java new file mode 100644 index 0000000..ff1717e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java @@ -0,0 +1,200 @@ +package cn.iocoder.yudao.module.mes.service.wm.returnsales; + +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.returnsales.vo.MesWmReturnSalesPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesMapper; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum; +import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; +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.*; + +/** + * + * @author 芋道源码 + * MES 销售退货单 Service 实现类 + */ +@Service +@Validated +public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService { + + @Resource + private MesWmReturnSalesMapper returnSalesMapper; + + @Resource + private MesWmReturnSalesLineService returnSalesLineService; + @Resource + private MesWmReturnSalesDetailService returnSalesDetailService; + @Resource + private MesMdClientService clientService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createReturnSales(MesWmReturnSalesSaveReqVO createReqVO) { + // 1. 校验关联数据 + clientService.validateClientExists(createReqVO.getClientId()); + + // 2. 插入主表 + MesWmReturnSalesDO returnSales = BeanUtils.toBean(createReqVO, MesWmReturnSalesDO.class); + returnSales.setStatus(MesWmReturnSalesStatusEnum.PREPARE.getStatus()); + returnSalesMapper.insert(returnSales); + return returnSales.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateReturnSales(MesWmReturnSalesSaveReqVO updateReqVO) { + // 1.1 校验存在 + 准备中状态 + validateReturnSalesExistsAndPrepare(updateReqVO.getId()); + // 1.2 校验关联数据 + clientService.validateClientExists(updateReqVO.getClientId()); + + // 2. 更新主表 + MesWmReturnSalesDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesDO.class); + returnSalesMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteReturnSales(Long id) { + // 1. 校验存在 + 准备中状态 + validateReturnSalesExistsAndPrepare(id); + + // 2.1 级联删除明细 + returnSalesDetailService.deleteReturnSalesDetailByReturnId(id); + // 2.2 级联删除行 + returnSalesLineService.deleteReturnSalesLineByReturnId(id); + // 2.3 删除主表 + returnSalesMapper.deleteById(id); + } + + @Override + public MesWmReturnSalesDO getReturnSales(Long id) { + return returnSalesMapper.selectById(id); + } + + @Override + public PageResult getReturnSalesPage(MesWmReturnSalesPageReqVO pageReqVO) { + return returnSalesMapper.selectPage(pageReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submitReturnSales(Long id) { + // 校验存在 + 草稿状态 + validateReturnSalesExistsAndPrepare(id); + // 校验至少有一条行 + List lines = returnSalesLineService.getReturnSalesLineListByReturnId(id); + if (CollUtil.isEmpty(lines)) { + throw exception(WM_RETURN_SALES_NO_LINE); + } + + // 提交(草稿 -> 待执行) + returnSalesMapper.updateById(new MesWmReturnSalesDO() + .setId(id).setStatus(MesWmReturnSalesStatusEnum.APPROVING.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void executeReturnSales(Long id) { + // 校验存在 + MesWmReturnSalesDO returnSales = validateReturnSalesExists(id); + if (ObjUtil.notEqual(MesWmReturnSalesStatusEnum.APPROVING.getStatus(), returnSales.getStatus())) { + throw exception(WM_RETURN_SALES_STATUS_NOT_APPROVING); + } + // 执行退货(待执行 -> 待上架) + returnSalesMapper.updateById(new MesWmReturnSalesDO() + .setId(id).setStatus(MesWmReturnSalesStatusEnum.APPROVED.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void stockReturnSales(Long id) { + // 校验存在 + MesWmReturnSalesDO returnSales = validateReturnSalesExists(id); + if (ObjUtil.notEqual(MesWmReturnSalesStatusEnum.APPROVED.getStatus(), returnSales.getStatus())) { + throw exception(WM_RETURN_SALES_STATUS_NOT_APPROVED); + } + + // 遍历所有明细,更新库存台账(增加库存) + // TODO @芋艿:【后续在弄】这里需要库存更新;后面在弄 + List details = returnSalesDetailService.getReturnSalesDetailListByReturnId(id); + for (MesWmReturnSalesDetailDO detail : details) { + // materialStockService.increaseStock( + // detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(), + // detail.getBatchId(), detail.getQuantity(), null, null, null); + } + + // 更新退货单状态 + returnSalesMapper.updateById(new MesWmReturnSalesDO() + .setId(id).setStatus(MesWmReturnSalesStatusEnum.FINISHED.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelReturnSales(Long id) { + // 校验存在 + MesWmReturnSalesDO returnSales = validateReturnSalesExists(id); + // 已完成和已取消不允许取消 + if (ObjectUtils.equalsAny(returnSales.getStatus(), + MesWmReturnSalesStatusEnum.FINISHED.getStatus(), + MesWmReturnSalesStatusEnum.CANCELED.getStatus())) { + throw exception(WM_RETURN_SALES_CANCEL_NOT_ALLOWED); + } + + // 取消 + returnSalesMapper.updateById(new MesWmReturnSalesDO() + .setId(id).setStatus(MesWmReturnSalesStatusEnum.CANCELED.getStatus())); + } + + @Override + public Boolean checkReturnSalesQuantity(Long id) { + List lines = returnSalesLineService.getReturnSalesLineListByReturnId(id); + for (MesWmReturnSalesLineDO line : lines) { + List details = returnSalesDetailService.getReturnSalesDetailListByLineId(line.getId()); + BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, + MesWmReturnSalesDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); + if (line.getQuantityReturned() != null && totalDetailQty.compareTo(line.getQuantityReturned()) != 0) { + return false; + } + } + return true; + } + + @Override + public MesWmReturnSalesDO validateReturnSalesExists(Long id) { + MesWmReturnSalesDO returnSales = returnSalesMapper.selectById(id); + if (returnSales == null) { + throw exception(WM_RETURN_SALES_NOT_EXISTS); + } + return returnSales; + } + + /** + * 校验销售退货单存在且为准备中状态 + */ + private MesWmReturnSalesDO validateReturnSalesExistsAndPrepare(Long id) { + MesWmReturnSalesDO returnSales = validateReturnSalesExists(id); + if (ObjUtil.notEqual(MesWmReturnSalesStatusEnum.PREPARE.getStatus(), returnSales.getStatus())) { + throw exception(WM_RETURN_SALES_STATUS_NOT_PREPARE); + } + return returnSales; + } + +}