diff --git a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java index ea0d8ffa5..313403caf 100644 --- a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java +++ b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java @@ -90,6 +90,12 @@ public interface ErrorCodeConstants { // ========== ERP 仓库 1-030-400-000 ========== ErrorCode WAREHOUSE_NOT_EXISTS = new ErrorCode(1_030_400_000, "仓库不存在"); ErrorCode WAREHOUSE_NOT_ENABLE = new ErrorCode(1_030_400_001, "仓库({})未启用"); + ErrorCode WAREHOUSE_AREA_CODE_EXISTS = new ErrorCode(1_030_400_002, "仓库库区编码不存在"); + ErrorCode WAREHOUSE_AREA_DELETE_FAIL_EXISTS_LOCATION = new ErrorCode(1_030_400_003, "仓库库区删除失败,请先删除对应库位信息"); + ErrorCode WAREHOUSE_AREA_NOT_EXISTS = new ErrorCode(1_030_400_004, "仓库库区不存在"); + ErrorCode WAREHOUSE_LOCATION_CODE_EXISTS = new ErrorCode(1_030_400_005, "库位编码不存在"); + ErrorCode WAREHOUSE_LOCATION_NOT_EXISTS = new ErrorCode(1_030_400_006, "库位不存在"); + ErrorCode WAREHOUSE_LOCATION_WAREHOUSE_AREA_NOT_MATCH = new ErrorCode(1_030_400_007, "暂无匹配库位信息"); // ========== ERP 其它入库单 1-030-401-000 ========== ErrorCode STOCK_IN_NOT_EXISTS = new ErrorCode(1_030_401_000, "其它入库单不存在"); diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpWarehouseController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpWarehouseController.java index 9de214b80..f25a6b627 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpWarehouseController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpWarehouseController.java @@ -5,11 +5,11 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 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.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehousePageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehouseRespVO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehouseSaveReqVO; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpWarehouseDO; import cn.iocoder.yudao.module.erp.service.stock.ErpWarehouseService; import io.swagger.v3.oas.annotations.Operation; @@ -80,8 +80,7 @@ public class ErpWarehouseController { @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('erp:warehouse:query')") public CommonResult getWarehouse(@RequestParam("id") Long id) { - ErpWarehouseDO warehouse = warehouseService.getWarehouse(id); - return success(BeanUtils.toBean(warehouse, ErpWarehouseRespVO.class)); + return success(warehouseService.getWarehouseDetail(id)); } @GetMapping("/page") @@ -113,4 +112,4 @@ public class ErpWarehouseController { BeanUtils.toBean(list, ErpWarehouseRespVO.class)); } -} \ No newline at end of file +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseRespVO.java index 188d42699..e51086788 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseRespVO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseRespVO.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse; import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.WarehouseAreaRespVO; +import cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo.WarehouseLocationRespVO; import cn.iocoder.yudao.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; @@ -10,6 +12,7 @@ import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; @Schema(description = "管理后台 - ERP 仓库 Response VO") @Data @@ -20,7 +23,7 @@ public class ErpWarehouseRespVO { @ExcelProperty("仓库编号") private Long id; - @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "成品仓") @ExcelProperty("仓库名称") private String name; @@ -32,11 +35,11 @@ public class ErpWarehouseRespVO { @ExcelProperty("排序") private Long sort; - @Schema(description = "备注", example = "随便") + @Schema(description = "备注", example = "主仓") @ExcelProperty("备注") private String remark; - @Schema(description = "负责人", example = "芋头") + @Schema(description = "负责人", example = "张三") @ExcelProperty("负责人") private String principal; @@ -57,8 +60,23 @@ public class ErpWarehouseRespVO { @ExcelProperty("是否默认") private Boolean defaultStatus; + @Schema(description = "库区数量", example = "2") + @ExcelProperty("库区数量") + private Long areaCount; + + @Schema(description = "库位数量", example = "10") + @ExcelProperty("库位数量") + private Long locationCount; + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") private LocalDateTime createTime; -} \ No newline at end of file + @Schema(description = "库区列表") + private List areaList; + + @Schema(description = "库位列表") + private List locationList; + + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseSaveReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseSaveReqVO.java index 06bf5580e..96e843979 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseSaveReqVO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/warehouse/ErpWarehouseSaveReqVO.java @@ -3,10 +3,10 @@ package cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.validation.InEnum; import io.swagger.v3.oas.annotations.media.Schema; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; import lombok.Data; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.math.BigDecimal; @Schema(description = "管理后台 - ERP 仓库新增/修改 Request VO") @@ -16,7 +16,7 @@ public class ErpWarehouseSaveReqVO { @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11614") private Long id; - @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "成品仓") @NotEmpty(message = "仓库名称不能为空") private String name; @@ -27,10 +27,10 @@ public class ErpWarehouseSaveReqVO { @NotNull(message = "排序不能为空") private Long sort; - @Schema(description = "备注", example = "随便") + @Schema(description = "备注", example = "主仓") private String remark; - @Schema(description = "负责人", example = "芋头") + @Schema(description = "负责人", example = "张三") private String principal; @Schema(description = "仓储费,单位:元", example = "13973") @@ -39,9 +39,9 @@ public class ErpWarehouseSaveReqVO { @Schema(description = "搬运费,单位:元", example = "9903") private BigDecimal truckagePrice; - @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "开启状态不能为空") @InEnum(CommonStatusEnum.class) private Integer status; -} \ No newline at end of file +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/WarehouseAreaController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/WarehouseAreaController.java new file mode 100644 index 000000000..a798cff36 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/WarehouseAreaController.java @@ -0,0 +1,114 @@ +package cn.iocoder.yudao.module.erp.controller.admin.warehousearea; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehouseRespVO; +import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpWarehouseDO; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + + +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; + +import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea.WarehouseAreaDO; +import cn.iocoder.yudao.module.erp.service.warehousearea.WarehouseAreaService; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + +@Tag(name = "管理后台 - ERP 库区信息") +@RestController +@RequestMapping("/erp/warehouse-area") +@Validated +public class WarehouseAreaController { + + @Resource + private WarehouseAreaService warehouseAreaService; + + @PostMapping("/create") + @Operation(summary = "创建ERP 库区信息") + @PreAuthorize("@ss.hasPermission('erp:warehouse-area:create')") + public CommonResult createWarehouseArea(@Valid @RequestBody WarehouseAreaSaveReqVO createReqVO) { + return success(warehouseAreaService.createWarehouseArea(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新ERP 库区信息") + @PreAuthorize("@ss.hasPermission('erp:warehouse-area:update')") + public CommonResult updateWarehouseArea(@Valid @RequestBody WarehouseAreaSaveReqVO updateReqVO) { + warehouseAreaService.updateWarehouseArea(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除ERP 库区信息") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('erp:warehouse-area:delete')") + public CommonResult deleteWarehouseArea(@RequestParam("id") Long id) { + warehouseAreaService.deleteWarehouseArea(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得ERP 库区信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('erp:warehouse-area:query')") + public CommonResult getWarehouseArea(@RequestParam("id") Long id) { + WarehouseAreaDO warehouseArea = warehouseAreaService.getWarehouseArea(id); + return success(BeanUtils.toBean(warehouseArea, WarehouseAreaRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得ERP 库区信息分页") + @PreAuthorize("@ss.hasPermission('erp:warehouse-area:query')") + public CommonResult> getWarehouseAreaPage(@Valid WarehouseAreaPageReqVO pageReqVO) { + PageResult pageResult = warehouseAreaService.getWarehouseAreaPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, WarehouseAreaRespVO.class)); + } + + + @GetMapping("/simple-list") + @Operation(summary = "获得库区精简列表", description = "只包含被开启的仓库库区,主要用于前端的下拉选项") + public CommonResult> getWarehouseSimpleList(@RequestParam(value = "warehouseId", required = false) Long warehouseId) { + List list = warehouseAreaService.getWarehouseListByStatusAndWarehouseId(CommonStatusEnum.ENABLE.getStatus(), warehouseId); + return success(convertList(list, area -> new WarehouseAreaRespVO() + .setId(area.getId()) + .setWarehouseId(area.getWarehouseId()) + .setAreaCode(area.getAreaCode()) + .setAreaName(area.getAreaName()) + .setStatus(area.getStatus()))); + } + + + @GetMapping("/export-excel") + @Operation(summary = "导出ERP 库区信息 Excel") + @PreAuthorize("@ss.hasPermission('erp:warehouse-area:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportWarehouseAreaExcel(@Valid WarehouseAreaPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = warehouseAreaService.getWarehouseAreaPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "ERP 库区信息.xls", "数据", WarehouseAreaRespVO.class, + BeanUtils.toBean(list, WarehouseAreaRespVO.class)); + } + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaPageReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaPageReqVO.java new file mode 100644 index 000000000..3aaa7e62f --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaPageReqVO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import java.math.BigDecimal; +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; + +@Schema(description = "管理后台 - ERP 库区信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WarehouseAreaPageReqVO extends PageParam { + + @Schema(description = "所属仓库id", example = "19404") + private Long warehouseId; + + @Schema(description = "库区编码") + private String areaCode; + + @Schema(description = "库区名称", example = "赵六") + private String areaName; + + @Schema(description = "面积(平方米)") + private BigDecimal areaSize; + + @Schema(description = "库区描述", example = "你说的对") + private String description; + + @Schema(description = "开启状态", example = "2") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaRespVO.java new file mode 100644 index 000000000..e0278110a --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaRespVO.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - ERP 库区信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class WarehouseAreaRespVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1157") + @ExcelProperty("id") + private Long id; + + @Schema(description = "所属仓库id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19404") + @ExcelProperty("所属仓库id") + private Long warehouseId; + + @Schema(description = "库区编码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("库区编码") + private String areaCode; + + @Schema(description = "库区名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @ExcelProperty("库区名称") + private String areaName; + + @Schema(description = "面积(平方米)") + @ExcelProperty("面积(平方米)") + private BigDecimal areaSize; + + @Schema(description = "库区描述", example = "你说的对") + @ExcelProperty("库区描述") + private String description; + + @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty("开启状态") + private Integer status; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaSaveReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaSaveReqVO.java new file mode 100644 index 000000000..b38b9833c --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaSaveReqVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - ERP 库区信息新增/修改 Request VO") +@Data +public class WarehouseAreaSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1157") + private Long id; + + @Schema(description = "所属仓库id", example = "19404") + private Long warehouseId; + + @Schema(description = "库区编码", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotEmpty(message = "库区编码不能为空") + private String areaCode; + + @Schema(description = "库区名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "A区") + @NotEmpty(message = "库区名称不能为空") + private String areaName; + + @Schema(description = "面积(平方米)") + private BigDecimal areaSize; + + @Schema(description = "库区描述", example = "常温区") + private String description; + + @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "开启状态不能为空") + private Integer status; + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/WarehouseLocationController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/WarehouseLocationController.java new file mode 100644 index 000000000..cf58dbf37 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/WarehouseLocationController.java @@ -0,0 +1,110 @@ +package cn.iocoder.yudao.module.erp.controller.admin.warehouselocation; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehouselocation.WarehouseLocationDO; +import cn.iocoder.yudao.module.erp.service.warehouselocation.WarehouseLocationService; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + +@Tag(name = "管理后台 - ERP 库位信息") +@RestController +@RequestMapping("/erp/warehouse-location") +@Validated +public class WarehouseLocationController { + + @Resource + private WarehouseLocationService warehouseLocationService; + + @PostMapping("/create") + @Operation(summary = "创建ERP 库位信息") + @PreAuthorize("@ss.hasPermission('erp:warehouse-location:create')") + public CommonResult createWarehouseLocation(@Valid @RequestBody WarehouseLocationSaveReqVO createReqVO) { + return success(warehouseLocationService.createWarehouseLocation(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新ERP 库位信息") + @PreAuthorize("@ss.hasPermission('erp:warehouse-location:update')") + public CommonResult updateWarehouseLocation(@Valid @RequestBody WarehouseLocationSaveReqVO updateReqVO) { + warehouseLocationService.updateWarehouseLocation(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除ERP 库位信息") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('erp:warehouse-location:delete')") + public CommonResult deleteWarehouseLocation(@RequestParam("id") Long id) { + warehouseLocationService.deleteWarehouseLocation(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得ERP 库位信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('erp:warehouse-location:query')") + public CommonResult getWarehouseLocation(@RequestParam("id") Long id) { + WarehouseLocationDO warehouseLocation = warehouseLocationService.getWarehouseLocation(id); + return success(BeanUtils.toBean(warehouseLocation, WarehouseLocationRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得ERP 库位信息分页") + @PreAuthorize("@ss.hasPermission('erp:warehouse-location:query')") + public CommonResult> getWarehouseLocationPage(@Valid WarehouseLocationPageReqVO pageReqVO) { + PageResult pageResult = warehouseLocationService.getWarehouseLocationPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, WarehouseLocationRespVO.class)); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得ERP 库位信息精简列表", description = "只包含已启用的库位,主要用于前端下拉选项") + public CommonResult> getWarehouseLocationSimpleList() { + List list = warehouseLocationService.getWarehouseLocationListByStatus(CommonStatusEnum.ENABLE.getStatus()); + return success(convertList(list, item -> new WarehouseLocationRespVO() + .setId(item.getId()) + .setWarehouseId(item.getWarehouseId()) + .setAreaId(item.getAreaId()) + .setCode(item.getCode()) + .setName(item.getName()) + .setStatus(item.getStatus()))); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出ERP 库位信息 Excel") + @PreAuthorize("@ss.hasPermission('erp:warehouse-location:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportWarehouseLocationExcel(@Valid WarehouseLocationPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = warehouseLocationService.getWarehouseLocationPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "ERP 库位信息.xls", "数据", WarehouseLocationRespVO.class, + BeanUtils.toBean(list, WarehouseLocationRespVO.class)); + } + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationPageReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationPageReqVO.java new file mode 100644 index 000000000..e06f2a814 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationPageReqVO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import java.math.BigDecimal; +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; + +@Schema(description = "管理后台 - ERP 库位信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WarehouseLocationPageReqVO extends PageParam { + + @Schema(description = "所属仓库ID", example = "19287") + private Long warehouseId; + + @Schema(description = "所属库区ID", example = "513") + private Long areaId; + + @Schema(description = "库位编码") + private String code; + + @Schema(description = "库位名称", example = "张三") + private String name; + + @Schema(description = "面积") + private BigDecimal areaSize; + + @Schema(description = "最大载重量") + private BigDecimal maxLoadWeight; + + @Schema(description = "库位位置X") + private Integer positionX; + + @Schema(description = "库位位置Y") + private Integer positionY; + + @Schema(description = "库位位置Z") + private Integer positionZ; + + @Schema(description = "是否允许产品混放") + private Boolean allowProductMix; + + @Schema(description = "是否允许批次混放") + private Boolean allowBatchMix; + + @Schema(description = "开启状态", example = "1") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationRespVO.java new file mode 100644 index 000000000..546628e05 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationRespVO.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - ERP 库位信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class WarehouseLocationRespVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "7300") + @ExcelProperty("id") + private Long id; + + @Schema(description = "所属仓库ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19287") + @ExcelProperty("所属仓库ID") + private Long warehouseId; + + @Schema(description = "所属库区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "513") + @ExcelProperty("所属库区ID") + private Long areaId; + + @Schema(description = "库位编码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("库位编码") + private String code; + + @Schema(description = "库位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @ExcelProperty("库位名称") + private String name; + + @Schema(description = "面积") + @ExcelProperty("面积") + private BigDecimal areaSize; + + @Schema(description = "最大载重量") + @ExcelProperty("最大载重量") + private BigDecimal maxLoadWeight; + + @Schema(description = "库位位置X") + @ExcelProperty("库位位置X") + private Integer positionX; + + @Schema(description = "库位位置Y") + @ExcelProperty("库位位置Y") + private Integer positionY; + + @Schema(description = "库位位置Z") + @ExcelProperty("库位位置Z") + private Integer positionZ; + + @Schema(description = "是否允许产品混放", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("是否允许产品混放") + private Boolean allowProductMix; + + @Schema(description = "是否允许批次混放", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("是否允许批次混放") + private Boolean allowBatchMix; + + @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("开启状态") + private Integer status; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationSaveReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationSaveReqVO.java new file mode 100644 index 000000000..5cd8e9553 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationSaveReqVO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - ERP 库位信息新增/修改 Request VO") +@Data +public class WarehouseLocationSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "7300") + private Long id; + + @Schema(description = "所属仓库ID", example = "19287") + private Long warehouseId; + + @Schema(description = "所属库区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "513") + @NotNull(message = "所属库区ID不能为空") + private Long areaId; + + @Schema(description = "库位编码", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotEmpty(message = "库位编码不能为空") + private String code; + + @Schema(description = "库位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "A-01-01") + @NotEmpty(message = "库位名称不能为空") + private String name; + + @Schema(description = "面积") + private BigDecimal areaSize; + + @Schema(description = "最大载重量") + private BigDecimal maxLoadWeight; + + @Schema(description = "库位位置X") + private Integer positionX; + + @Schema(description = "库位位置Y") + private Integer positionY; + + @Schema(description = "库位位置Z") + private Integer positionZ; + + @Schema(description = "是否允许产品混放", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否允许产品混放不能为空") + private Boolean allowProductMix; + + @Schema(description = "是否允许批次混放", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否允许批次混放不能为空") + private Boolean allowBatchMix; + + @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "开启状态不能为空") + private Integer status; + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/warehousearea/WarehouseAreaDO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/warehousearea/WarehouseAreaDO.java new file mode 100644 index 000000000..560e6d7b5 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/warehousearea/WarehouseAreaDO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * ERP 库区信息 DO + * + * @author 必硕智能 + */ +@TableName("erp_warehouse_area") +@KeySequence("erp_warehouse_area_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WarehouseAreaDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 所属仓库id + */ + private Long warehouseId; + /** + * 库区编码 + */ + private String areaCode; + /** + * 库区名称 + */ + private String areaName; + /** + * 面积(平方米) + */ + private BigDecimal areaSize; + /** + * 库区描述 + */ + private String description; + /** + * 开启状态 + */ + private Integer status; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/warehouselocation/WarehouseLocationDO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/warehouselocation/WarehouseLocationDO.java new file mode 100644 index 000000000..aa5584dca --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/warehouselocation/WarehouseLocationDO.java @@ -0,0 +1,81 @@ +package cn.iocoder.yudao.module.erp.dal.dataobject.warehouselocation; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * ERP 库位信息 DO + * + * @author 必硕智能 + */ +@TableName("erp_warehouse_location") +@KeySequence("erp_warehouse_location_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WarehouseLocationDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 所属仓库ID + */ + private Long warehouseId; + /** + * 所属库区ID + */ + private Long areaId; + /** + * 库位编码 + */ + private String code; + /** + * 库位名称 + */ + private String name; + /** + * 面积 + */ + private BigDecimal areaSize; + /** + * 最大载重量 + */ + private BigDecimal maxLoadWeight; + /** + * 库位位置X + */ + private Integer positionX; + /** + * 库位位置Y + */ + private Integer positionY; + /** + * 库位位置Z + */ + private Integer positionZ; + /** + * 是否允许产品混放 + */ + private Boolean allowProductMix; + /** + * 是否允许批次混放 + */ + private Boolean allowBatchMix; + /** + * 开启状态 + */ + private Integer status; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/warehousearea/WarehouseAreaMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/warehousearea/WarehouseAreaMapper.java new file mode 100644 index 000000000..d4a645d5a --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/warehousearea/WarehouseAreaMapper.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.erp.dal.mysql.warehousearea; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea.WarehouseAreaDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.*; + +/** + * ERP 库区信息 Mapper + * + * @author 必硕智能 + */ +@Mapper +public interface WarehouseAreaMapper extends BaseMapperX { + + default PageResult selectPage(WarehouseAreaPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WarehouseAreaDO::getWarehouseId, reqVO.getWarehouseId()) + .eqIfPresent(WarehouseAreaDO::getAreaCode, reqVO.getAreaCode()) + .likeIfPresent(WarehouseAreaDO::getAreaName, reqVO.getAreaName()) + .eqIfPresent(WarehouseAreaDO::getAreaSize, reqVO.getAreaSize()) + .eqIfPresent(WarehouseAreaDO::getDescription, reqVO.getDescription()) + .eqIfPresent(WarehouseAreaDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(WarehouseAreaDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WarehouseAreaDO::getId)); + } + + + default WarehouseAreaDO selectByNo(String no) { + return selectOne(WarehouseAreaDO::getAreaCode, no); + } + + default List selectListByStatus(Integer status) { + return selectList(WarehouseAreaDO::getStatus, status); + } + + default List selectListByWarehouseId(Long warehouseId) { + return selectList(WarehouseAreaDO::getWarehouseId, warehouseId); + } + + default void deleteByWarehouseId(Long warehouseId) { + delete(WarehouseAreaDO::getWarehouseId, warehouseId); + } + + default Long selectCountByWarehouseId(Long warehouseId) { + return selectCount(WarehouseAreaDO::getWarehouseId, warehouseId); + } + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/warehouselocation/WarehouseLocationMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/warehouselocation/WarehouseLocationMapper.java new file mode 100644 index 000000000..50793269b --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/warehouselocation/WarehouseLocationMapper.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.erp.dal.mysql.warehouselocation; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehouselocation.WarehouseLocationDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo.*; + +/** + * ERP 库位信息 Mapper + * + * @author 必硕智能 + */ +@Mapper +public interface WarehouseLocationMapper extends BaseMapperX { + + default PageResult selectPage(WarehouseLocationPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WarehouseLocationDO::getWarehouseId, reqVO.getWarehouseId()) + .eqIfPresent(WarehouseLocationDO::getAreaId, reqVO.getAreaId()) + .eqIfPresent(WarehouseLocationDO::getCode, reqVO.getCode()) + .likeIfPresent(WarehouseLocationDO::getName, reqVO.getName()) + .eqIfPresent(WarehouseLocationDO::getAreaSize, reqVO.getAreaSize()) + .eqIfPresent(WarehouseLocationDO::getMaxLoadWeight, reqVO.getMaxLoadWeight()) + .eqIfPresent(WarehouseLocationDO::getPositionX, reqVO.getPositionX()) + .eqIfPresent(WarehouseLocationDO::getPositionY, reqVO.getPositionY()) + .eqIfPresent(WarehouseLocationDO::getPositionZ, reqVO.getPositionZ()) + .eqIfPresent(WarehouseLocationDO::getAllowProductMix, reqVO.getAllowProductMix()) + .eqIfPresent(WarehouseLocationDO::getAllowBatchMix, reqVO.getAllowBatchMix()) + .eqIfPresent(WarehouseLocationDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(WarehouseLocationDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WarehouseLocationDO::getId)); + } + + default WarehouseLocationDO selectByNo(String no) { + return selectOne(WarehouseLocationDO::getCode, no); + } + + default List selectListByWarehouseId(Long warehouseId) { + return selectList(WarehouseLocationDO::getWarehouseId, warehouseId); + } + + default void deleteByWarehouseId(Long warehouseId) { + delete(WarehouseLocationDO::getWarehouseId, warehouseId); + } + + default List selectListByStatus(Integer status) { + return selectList(WarehouseLocationDO::getStatus, status); + } + + default List selectListByAreaId(Long areaId) { + return selectList(WarehouseLocationDO::getAreaId, areaId); + } + + default Long selectCountByWarehouseId(Long warehouseId) { + return selectCount(WarehouseLocationDO::getWarehouseId, warehouseId); + } +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseService.java index 42f493263..0d514cabb 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseService.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseService.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.erp.service.stock; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehouseRespVO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehouseSaveReqVO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehousePageReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpWarehouseDO; @@ -58,6 +59,8 @@ public interface ErpWarehouseService { */ ErpWarehouseDO getWarehouse(Long id); + ErpWarehouseRespVO getWarehouseDetail(Long id); + /** * 校验仓库列表的有效性 * @@ -101,4 +104,4 @@ public interface ErpWarehouseService { */ PageResult getWarehousePage(ErpWarehousePageReqVO pageReqVO); -} \ No newline at end of file +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseServiceImpl.java index 9e80128dd..10eade2f5 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpWarehouseServiceImpl.java @@ -4,10 +4,17 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehouseSaveReqVO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehousePageReqVO; +import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehouseRespVO; +import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehouseSaveReqVO; +import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.WarehouseAreaRespVO; +import cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo.WarehouseLocationRespVO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpWarehouseDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea.WarehouseAreaDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehouselocation.WarehouseLocationDO; import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpWarehouseMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.warehousearea.WarehouseAreaMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.warehouselocation.WarehouseLocationMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -23,11 +30,6 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_NOT_ENABLE; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_NOT_EXISTS; -/** - * ERP 仓库 Service 实现类 - * - * @author 芋道源码 - */ @Service @Validated public class ErpWarehouseServiceImpl implements ErpWarehouseService { @@ -35,20 +37,22 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService { @Resource private ErpWarehouseMapper warehouseMapper; + @Resource + private WarehouseAreaMapper warehouseAreaMapper; + + @Resource + private WarehouseLocationMapper warehouseLocationMapper; + @Override public Long createWarehouse(ErpWarehouseSaveReqVO createReqVO) { - // 插入 ErpWarehouseDO warehouse = BeanUtils.toBean(createReqVO, ErpWarehouseDO.class); warehouseMapper.insert(warehouse); - // 返回 return warehouse.getId(); } @Override public void updateWarehouse(ErpWarehouseSaveReqVO updateReqVO) { - // 校验存在 validateWarehouseExists(updateReqVO.getId()); - // 更新 ErpWarehouseDO updateObj = BeanUtils.toBean(updateReqVO, ErpWarehouseDO.class); warehouseMapper.updateById(updateObj); } @@ -56,25 +60,22 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService { @Override @Transactional(rollbackFor = Exception.class) public void updateWarehouseDefaultStatus(Long id, Boolean defaultStatus) { - // 1. 校验存在 validateWarehouseExists(id); - - // 2.1 如果开启,则需要关闭所有其它的默认 if (defaultStatus) { ErpWarehouseDO warehouse = warehouseMapper.selectByDefaultStatus(); if (warehouse != null) { warehouseMapper.updateById(new ErpWarehouseDO().setId(warehouse.getId()).setDefaultStatus(false)); } } - // 2.2 更新对应的默认状态 warehouseMapper.updateById(new ErpWarehouseDO().setId(id).setDefaultStatus(defaultStatus)); } @Override + @Transactional(rollbackFor = Exception.class) public void deleteWarehouse(Long id) { - // 校验存在 validateWarehouseExists(id); - // 删除 + warehouseLocationMapper.deleteByWarehouseId(id); + warehouseAreaMapper.deleteByWarehouseId(id); warehouseMapper.deleteById(id); } @@ -89,6 +90,24 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService { return warehouseMapper.selectById(id); } + @Override + public ErpWarehouseRespVO getWarehouseDetail(Long id) { + ErpWarehouseDO warehouse = warehouseMapper.selectById(id); + if (warehouse == null) { + return null; + } + ErpWarehouseRespVO respVO = BeanUtils.toBean(warehouse, ErpWarehouseRespVO.class); + + List areaList = warehouseAreaMapper.selectListByWarehouseId(id); + List locationList = warehouseLocationMapper.selectListByWarehouseId(id); + + respVO.setAreaCount((long) areaList.size()); + respVO.setLocationCount((long) locationList.size()); + respVO.setAreaList(BeanUtils.toBean(areaList, WarehouseAreaRespVO.class)); + respVO.setLocationList(BeanUtils.toBean(locationList, WarehouseLocationRespVO.class)); + return respVO; + } + @Override public List validWarehouseList(Collection ids) { if (CollUtil.isEmpty(ids)) { @@ -98,7 +117,7 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService { Map warehouseMap = convertMap(list, ErpWarehouseDO::getId); for (Long id : ids) { ErpWarehouseDO warehouse = warehouseMap.get(id); - if (warehouseMap.get(id) == null) { + if (warehouse == null) { throw exception(WAREHOUSE_NOT_EXISTS); } if (CommonStatusEnum.isDisable(warehouse.getStatus())) { @@ -123,4 +142,4 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService { return warehouseMapper.selectPage(pageReqVO); } -} \ No newline at end of file +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaService.java new file mode 100644 index 000000000..0f1a26d9c --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaService.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.erp.service.warehousearea; + +import java.util.*; +import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea.WarehouseAreaDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +import javax.validation.Valid; + +/** + * ERP 库区信息 Service 接口 + * + * @author 必硕智能 + */ +public interface WarehouseAreaService { + + /** + * 创建ERP 库区信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWarehouseArea(@Valid WarehouseAreaSaveReqVO createReqVO); + + /** + * 更新ERP 库区信息 + * + * @param updateReqVO 更新信息 + */ + void updateWarehouseArea(@Valid WarehouseAreaSaveReqVO updateReqVO); + + /** + * 删除ERP 库区信息 + * + * @param id 编号 + */ + void deleteWarehouseArea(Long id); + + /** + * 获得ERP 库区信息 + * + * @param id 编号 + * @return ERP 库区信息 + */ + WarehouseAreaDO getWarehouseArea(Long id); + + /** + * 获得ERP 库区信息分页 + * + * @param pageReqVO 分页查询 + * @return ERP 库区信息分页 + */ + PageResult getWarehouseAreaPage(WarehouseAreaPageReqVO pageReqVO); + + List getWarehouseListByStatus(Integer status); + + List getWarehouseListByStatusAndWarehouseId(Integer status, Long warehouseId); +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaServiceImpl.java new file mode 100644 index 000000000..b19faa7ea --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaServiceImpl.java @@ -0,0 +1,100 @@ +package cn.iocoder.yudao.module.erp.service.warehousearea; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.util.AutoCodeUtil; +import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.WarehouseAreaPageReqVO; +import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.WarehouseAreaSaveReqVO; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea.WarehouseAreaDO; +import cn.iocoder.yudao.module.erp.dal.mysql.warehousearea.WarehouseAreaMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.warehouselocation.WarehouseLocationMapper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_CODE_EXISTS; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_DELETE_FAIL_EXISTS_LOCATION; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_NOT_EXISTS; + +@Service +@Validated +public class WarehouseAreaServiceImpl implements WarehouseAreaService { + + @Resource + private WarehouseAreaMapper warehouseAreaMapper; + + @Resource + private WarehouseLocationMapper warehouseLocationMapper; + + @Resource + private AutoCodeUtil autoCodeUtil; + + @Override + public Long createWarehouseArea(WarehouseAreaSaveReqVO createReqVO) { + WarehouseAreaDO warehouseArea = BeanUtils.toBean(createReqVO, WarehouseAreaDO.class); + if (StringUtils.isEmpty(warehouseArea.getAreaCode())) { + warehouseArea.setAreaCode(autoCodeUtil.genSerialCode("RESERVOIR_AREA_GENERATE", null)); + } else if (warehouseAreaMapper.selectByNo(warehouseArea.getAreaCode()) != null) { + throw exception(WAREHOUSE_AREA_CODE_EXISTS); + } + warehouseAreaMapper.insert(warehouseArea); + return warehouseArea.getId(); + } + + @Override + public void updateWarehouseArea(WarehouseAreaSaveReqVO updateReqVO) { + validateWarehouseAreaExists(updateReqVO.getId()); + warehouseAreaMapper.updateById(BeanUtils.toBean(updateReqVO, WarehouseAreaDO.class)); + } + + @Override + public void deleteWarehouseArea(Long id) { + validateWarehouseAreaExists(id); + if (!warehouseLocationMapper.selectListByAreaId(id).isEmpty()) { + throw exception(WAREHOUSE_AREA_DELETE_FAIL_EXISTS_LOCATION); + } + warehouseAreaMapper.deleteById(id); + } + + private void validateWarehouseAreaExists(Long id) { + if (warehouseAreaMapper.selectById(id) == null) { + throw exception(WAREHOUSE_AREA_NOT_EXISTS); + } + } + + @Override + public WarehouseAreaDO getWarehouseArea(Long id) { + return warehouseAreaMapper.selectById(id); + } + + @Override + public PageResult getWarehouseAreaPage(WarehouseAreaPageReqVO pageReqVO) { + return warehouseAreaMapper.selectPage(pageReqVO); + } + + @Override + public List getWarehouseListByStatus(Integer status) { + return warehouseAreaMapper.selectListByStatus(status); + } + + @Override + public List getWarehouseListByStatusAndWarehouseId(Integer status, Long warehouseId) { + List list = warehouseAreaMapper.selectListByStatus(status); + if (warehouseId == null) { + return list; + } + List result = new ArrayList<>(); + for (WarehouseAreaDO item : list) { + if (warehouseId.equals(item.getWarehouseId())) { + result.add(item); + } + } + return result; + } + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationService.java new file mode 100644 index 000000000..a2b3b252b --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationService.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.erp.service.warehouselocation; + +import java.util.*; +import cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehouselocation.WarehouseLocationDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +import javax.validation.Valid; + +/** + * ERP 库位信息 Service 接口 + * + * @author 必硕智能 + */ +public interface WarehouseLocationService { + + /** + * 创建ERP 库位信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWarehouseLocation(@Valid WarehouseLocationSaveReqVO createReqVO); + + /** + * 更新ERP 库位信息 + * + * @param updateReqVO 更新信息 + */ + void updateWarehouseLocation(@Valid WarehouseLocationSaveReqVO updateReqVO); + + /** + * 删除ERP 库位信息 + * + * @param id 编号 + */ + void deleteWarehouseLocation(Long id); + + /** + * 获得ERP 库位信息 + * + * @param id 编号 + * @return ERP 库位信息 + */ + WarehouseLocationDO getWarehouseLocation(Long id); + + List getWarehouseLocationListByStatus(Integer status); + + /** + * 获得ERP 库位信息分页 + * + * @param pageReqVO 分页查询 + * @return ERP 库位信息分页 + */ + PageResult getWarehouseLocationPage(WarehouseLocationPageReqVO pageReqVO); + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationServiceImpl.java new file mode 100644 index 000000000..e4c106613 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationServiceImpl.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.erp.service.warehouselocation; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.util.AutoCodeUtil; +import cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo.WarehouseLocationPageReqVO; +import cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo.WarehouseLocationSaveReqVO; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea.WarehouseAreaDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehouselocation.WarehouseLocationDO; +import cn.iocoder.yudao.module.erp.dal.mysql.warehousearea.WarehouseAreaMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.warehouselocation.WarehouseLocationMapper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_NOT_EXISTS; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_LOCATION_CODE_EXISTS; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_LOCATION_NOT_EXISTS; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_LOCATION_WAREHOUSE_AREA_NOT_MATCH; + +@Service +@Validated +public class WarehouseLocationServiceImpl implements WarehouseLocationService { + + @Resource + private WarehouseLocationMapper warehouseLocationMapper; + + @Resource + private WarehouseAreaMapper warehouseAreaMapper; + + @Resource + private AutoCodeUtil autoCodeUtil; + + @Override + public Long createWarehouseLocation(WarehouseLocationSaveReqVO createReqVO) { + validateWarehouseAreaMatch(createReqVO.getWarehouseId(), createReqVO.getAreaId()); + WarehouseLocationDO warehouseLocation = BeanUtils.toBean(createReqVO, WarehouseLocationDO.class); + if (StringUtils.isEmpty(warehouseLocation.getCode())) { + warehouseLocation.setCode(autoCodeUtil.genSerialCode("RESERVOIR_AREA_GENERATE", null)); + } else if (warehouseLocationMapper.selectByNo(warehouseLocation.getCode()) != null) { + throw exception(WAREHOUSE_LOCATION_CODE_EXISTS); + } + warehouseLocationMapper.insert(warehouseLocation); + return warehouseLocation.getId(); + } + + @Override + public void updateWarehouseLocation(WarehouseLocationSaveReqVO updateReqVO) { + validateWarehouseLocationExists(updateReqVO.getId()); + validateWarehouseAreaMatch(updateReqVO.getWarehouseId(), updateReqVO.getAreaId()); + warehouseLocationMapper.updateById(BeanUtils.toBean(updateReqVO, WarehouseLocationDO.class)); + } + + @Override + public void deleteWarehouseLocation(Long id) { + validateWarehouseLocationExists(id); + warehouseLocationMapper.deleteById(id); + } + + private void validateWarehouseLocationExists(Long id) { + if (warehouseLocationMapper.selectById(id) == null) { + throw exception(WAREHOUSE_LOCATION_NOT_EXISTS); + } + } + + private void validateWarehouseAreaMatch(Long warehouseId, Long areaId) { + WarehouseAreaDO area = warehouseAreaMapper.selectById(areaId); + if (area == null) { + throw exception(WAREHOUSE_AREA_NOT_EXISTS); + } + if (warehouseId == null || !warehouseId.equals(area.getWarehouseId())) { + throw exception(WAREHOUSE_LOCATION_WAREHOUSE_AREA_NOT_MATCH); + } + } + + @Override + public WarehouseLocationDO getWarehouseLocation(Long id) { + return warehouseLocationMapper.selectById(id); + } + + @Override + public List getWarehouseLocationListByStatus(Integer status) { + return warehouseLocationMapper.selectListByStatus(status); + } + + @Override + public PageResult getWarehouseLocationPage(WarehouseLocationPageReqVO pageReqVO) { + return warehouseLocationMapper.selectPage(pageReqVO); + } + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/warehousearea/WarehouseAreaMapper.xml b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/warehousearea/WarehouseAreaMapper.xml new file mode 100644 index 000000000..123b6c774 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/warehousearea/WarehouseAreaMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/warehouselocation/WarehouseLocationMapper.xml b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/warehouselocation/WarehouseLocationMapper.xml new file mode 100644 index 000000000..9d39d7109 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/warehouselocation/WarehouseLocationMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file