feat:新增库区和库位页面

main
HuangHuiKang 2 weeks ago
parent ec455718f1
commit fcc3cf46c0

@ -90,6 +90,12 @@ public interface ErrorCodeConstants {
// ========== ERP 仓库 1-030-400-000 ========== // ========== ERP 仓库 1-030-400-000 ==========
ErrorCode WAREHOUSE_NOT_EXISTS = new ErrorCode(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_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 ========== // ========== ERP 其它入库单 1-030-401-000 ==========
ErrorCode STOCK_IN_NOT_EXISTS = new ErrorCode(1_030_401_000, "其它入库单不存在"); ErrorCode STOCK_IN_NOT_EXISTS = new ErrorCode(1_030_401_000, "其它入库单不存在");

@ -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.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult; 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.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.ErpWarehousePageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehouseRespVO; 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.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.dal.dataobject.stock.ErpWarehouseDO;
import cn.iocoder.yudao.module.erp.service.stock.ErpWarehouseService; import cn.iocoder.yudao.module.erp.service.stock.ErpWarehouseService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@ -80,8 +80,7 @@ public class ErpWarehouseController {
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('erp:warehouse:query')") @PreAuthorize("@ss.hasPermission('erp:warehouse:query')")
public CommonResult<ErpWarehouseRespVO> getWarehouse(@RequestParam("id") Long id) { public CommonResult<ErpWarehouseRespVO> getWarehouse(@RequestParam("id") Long id) {
ErpWarehouseDO warehouse = warehouseService.getWarehouse(id); return success(warehouseService.getWarehouseDetail(id));
return success(BeanUtils.toBean(warehouse, ErpWarehouseRespVO.class));
} }
@GetMapping("/page") @GetMapping("/page")

@ -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.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; 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 cn.iocoder.yudao.module.system.enums.DictTypeConstants;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
@ -10,6 +12,7 @@ import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - ERP 仓库 Response VO") @Schema(description = "管理后台 - ERP 仓库 Response VO")
@Data @Data
@ -20,7 +23,7 @@ public class ErpWarehouseRespVO {
@ExcelProperty("仓库编号") @ExcelProperty("仓库编号")
private Long id; private Long id;
@Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "成品仓")
@ExcelProperty("仓库名称") @ExcelProperty("仓库名称")
private String name; private String name;
@ -32,11 +35,11 @@ public class ErpWarehouseRespVO {
@ExcelProperty("排序") @ExcelProperty("排序")
private Long sort; private Long sort;
@Schema(description = "备注", example = "随便") @Schema(description = "备注", example = "主仓")
@ExcelProperty("备注") @ExcelProperty("备注")
private String remark; private String remark;
@Schema(description = "负责人", example = "芋头") @Schema(description = "负责人", example = "张三")
@ExcelProperty("负责人") @ExcelProperty("负责人")
private String principal; private String principal;
@ -57,8 +60,23 @@ public class ErpWarehouseRespVO {
@ExcelProperty("是否默认") @ExcelProperty("是否默认")
private Boolean defaultStatus; 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) @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间") @ExcelProperty("创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
@Schema(description = "库区列表")
private List<WarehouseAreaRespVO> areaList;
@Schema(description = "库位列表")
private List<WarehouseLocationRespVO> locationList;
} }

@ -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.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum; import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal; import java.math.BigDecimal;
@Schema(description = "管理后台 - ERP 仓库新增/修改 Request VO") @Schema(description = "管理后台 - ERP 仓库新增/修改 Request VO")
@ -16,7 +16,7 @@ public class ErpWarehouseSaveReqVO {
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11614") @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11614")
private Long id; private Long id;
@Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "成品仓")
@NotEmpty(message = "仓库名称不能为空") @NotEmpty(message = "仓库名称不能为空")
private String name; private String name;
@ -27,10 +27,10 @@ public class ErpWarehouseSaveReqVO {
@NotNull(message = "排序不能为空") @NotNull(message = "排序不能为空")
private Long sort; private Long sort;
@Schema(description = "备注", example = "随便") @Schema(description = "备注", example = "主仓")
private String remark; private String remark;
@Schema(description = "负责人", example = "芋头") @Schema(description = "负责人", example = "张三")
private String principal; private String principal;
@Schema(description = "仓储费,单位:元", example = "13973") @Schema(description = "仓储费,单位:元", example = "13973")
@ -39,7 +39,7 @@ public class ErpWarehouseSaveReqVO {
@Schema(description = "搬运费,单位:元", example = "9903") @Schema(description = "搬运费,单位:元", example = "9903")
private BigDecimal truckagePrice; private BigDecimal truckagePrice;
@Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "开启状态不能为空") @NotNull(message = "开启状态不能为空")
@InEnum(CommonStatusEnum.class) @InEnum(CommonStatusEnum.class)
private Integer status; private Integer status;

@ -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<Long> createWarehouseArea(@Valid @RequestBody WarehouseAreaSaveReqVO createReqVO) {
return success(warehouseAreaService.createWarehouseArea(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新ERP 库区信息")
@PreAuthorize("@ss.hasPermission('erp:warehouse-area:update')")
public CommonResult<Boolean> 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<Boolean> 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<WarehouseAreaRespVO> 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<PageResult<WarehouseAreaRespVO>> getWarehouseAreaPage(@Valid WarehouseAreaPageReqVO pageReqVO) {
PageResult<WarehouseAreaDO> pageResult = warehouseAreaService.getWarehouseAreaPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, WarehouseAreaRespVO.class));
}
@GetMapping("/simple-list")
@Operation(summary = "获得库区精简列表", description = "只包含被开启的仓库库区,主要用于前端的下拉选项")
public CommonResult<List<WarehouseAreaRespVO>> getWarehouseSimpleList(@RequestParam(value = "warehouseId", required = false) Long warehouseId) {
List<WarehouseAreaDO> 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<WarehouseAreaDO> list = warehouseAreaService.getWarehouseAreaPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "ERP 库区信息.xls", "数据", WarehouseAreaRespVO.class,
BeanUtils.toBean(list, WarehouseAreaRespVO.class));
}
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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<Long> createWarehouseLocation(@Valid @RequestBody WarehouseLocationSaveReqVO createReqVO) {
return success(warehouseLocationService.createWarehouseLocation(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新ERP 库位信息")
@PreAuthorize("@ss.hasPermission('erp:warehouse-location:update')")
public CommonResult<Boolean> 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<Boolean> 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<WarehouseLocationRespVO> 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<PageResult<WarehouseLocationRespVO>> getWarehouseLocationPage(@Valid WarehouseLocationPageReqVO pageReqVO) {
PageResult<WarehouseLocationDO> pageResult = warehouseLocationService.getWarehouseLocationPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, WarehouseLocationRespVO.class));
}
@GetMapping("/simple-list")
@Operation(summary = "获得ERP 库位信息精简列表", description = "只包含已启用的库位,主要用于前端下拉选项")
public CommonResult<List<WarehouseLocationRespVO>> getWarehouseLocationSimpleList() {
List<WarehouseLocationDO> 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<WarehouseLocationDO> list = warehouseLocationService.getWarehouseLocationPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "ERP 库位信息.xls", "数据", WarehouseLocationRespVO.class,
BeanUtils.toBean(list, WarehouseLocationRespVO.class));
}
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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<WarehouseAreaDO> {
default PageResult<WarehouseAreaDO> selectPage(WarehouseAreaPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<WarehouseAreaDO>()
.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<WarehouseAreaDO> selectListByStatus(Integer status) {
return selectList(WarehouseAreaDO::getStatus, status);
}
default List<WarehouseAreaDO> 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);
}
}

@ -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<WarehouseLocationDO> {
default PageResult<WarehouseLocationDO> selectPage(WarehouseLocationPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<WarehouseLocationDO>()
.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<WarehouseLocationDO> selectListByWarehouseId(Long warehouseId) {
return selectList(WarehouseLocationDO::getWarehouseId, warehouseId);
}
default void deleteByWarehouseId(Long warehouseId) {
delete(WarehouseLocationDO::getWarehouseId, warehouseId);
}
default List<WarehouseLocationDO> selectListByStatus(Integer status) {
return selectList(WarehouseLocationDO::getStatus, status);
}
default List<WarehouseLocationDO> selectListByAreaId(Long areaId) {
return selectList(WarehouseLocationDO::getAreaId, areaId);
}
default Long selectCountByWarehouseId(Long warehouseId) {
return selectCount(WarehouseLocationDO::getWarehouseId, warehouseId);
}
}

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.erp.service.stock; package cn.iocoder.yudao.module.erp.service.stock;
import cn.iocoder.yudao.framework.common.pojo.PageResult; 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.ErpWarehouseSaveReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehousePageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.warehouse.ErpWarehousePageReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpWarehouseDO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpWarehouseDO;
@ -58,6 +59,8 @@ public interface ErpWarehouseService {
*/ */
ErpWarehouseDO getWarehouse(Long id); ErpWarehouseDO getWarehouse(Long id);
ErpWarehouseRespVO getWarehouseDetail(Long id);
/** /**
* *
* *

@ -4,10 +4,17 @@ import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 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.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.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.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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; 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_ENABLE;
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_NOT_EXISTS; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_NOT_EXISTS;
/**
* ERP Service
*
* @author
*/
@Service @Service
@Validated @Validated
public class ErpWarehouseServiceImpl implements ErpWarehouseService { public class ErpWarehouseServiceImpl implements ErpWarehouseService {
@ -35,20 +37,22 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService {
@Resource @Resource
private ErpWarehouseMapper warehouseMapper; private ErpWarehouseMapper warehouseMapper;
@Resource
private WarehouseAreaMapper warehouseAreaMapper;
@Resource
private WarehouseLocationMapper warehouseLocationMapper;
@Override @Override
public Long createWarehouse(ErpWarehouseSaveReqVO createReqVO) { public Long createWarehouse(ErpWarehouseSaveReqVO createReqVO) {
// 插入
ErpWarehouseDO warehouse = BeanUtils.toBean(createReqVO, ErpWarehouseDO.class); ErpWarehouseDO warehouse = BeanUtils.toBean(createReqVO, ErpWarehouseDO.class);
warehouseMapper.insert(warehouse); warehouseMapper.insert(warehouse);
// 返回
return warehouse.getId(); return warehouse.getId();
} }
@Override @Override
public void updateWarehouse(ErpWarehouseSaveReqVO updateReqVO) { public void updateWarehouse(ErpWarehouseSaveReqVO updateReqVO) {
// 校验存在
validateWarehouseExists(updateReqVO.getId()); validateWarehouseExists(updateReqVO.getId());
// 更新
ErpWarehouseDO updateObj = BeanUtils.toBean(updateReqVO, ErpWarehouseDO.class); ErpWarehouseDO updateObj = BeanUtils.toBean(updateReqVO, ErpWarehouseDO.class);
warehouseMapper.updateById(updateObj); warehouseMapper.updateById(updateObj);
} }
@ -56,25 +60,22 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateWarehouseDefaultStatus(Long id, Boolean defaultStatus) { public void updateWarehouseDefaultStatus(Long id, Boolean defaultStatus) {
// 1. 校验存在
validateWarehouseExists(id); validateWarehouseExists(id);
// 2.1 如果开启,则需要关闭所有其它的默认
if (defaultStatus) { if (defaultStatus) {
ErpWarehouseDO warehouse = warehouseMapper.selectByDefaultStatus(); ErpWarehouseDO warehouse = warehouseMapper.selectByDefaultStatus();
if (warehouse != null) { if (warehouse != null) {
warehouseMapper.updateById(new ErpWarehouseDO().setId(warehouse.getId()).setDefaultStatus(false)); warehouseMapper.updateById(new ErpWarehouseDO().setId(warehouse.getId()).setDefaultStatus(false));
} }
} }
// 2.2 更新对应的默认状态
warehouseMapper.updateById(new ErpWarehouseDO().setId(id).setDefaultStatus(defaultStatus)); warehouseMapper.updateById(new ErpWarehouseDO().setId(id).setDefaultStatus(defaultStatus));
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void deleteWarehouse(Long id) { public void deleteWarehouse(Long id) {
// 校验存在
validateWarehouseExists(id); validateWarehouseExists(id);
// 删除 warehouseLocationMapper.deleteByWarehouseId(id);
warehouseAreaMapper.deleteByWarehouseId(id);
warehouseMapper.deleteById(id); warehouseMapper.deleteById(id);
} }
@ -89,6 +90,24 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService {
return warehouseMapper.selectById(id); 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<WarehouseAreaDO> areaList = warehouseAreaMapper.selectListByWarehouseId(id);
List<WarehouseLocationDO> 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 @Override
public List<ErpWarehouseDO> validWarehouseList(Collection<Long> ids) { public List<ErpWarehouseDO> validWarehouseList(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) { if (CollUtil.isEmpty(ids)) {
@ -98,7 +117,7 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService {
Map<Long, ErpWarehouseDO> warehouseMap = convertMap(list, ErpWarehouseDO::getId); Map<Long, ErpWarehouseDO> warehouseMap = convertMap(list, ErpWarehouseDO::getId);
for (Long id : ids) { for (Long id : ids) {
ErpWarehouseDO warehouse = warehouseMap.get(id); ErpWarehouseDO warehouse = warehouseMap.get(id);
if (warehouseMap.get(id) == null) { if (warehouse == null) {
throw exception(WAREHOUSE_NOT_EXISTS); throw exception(WAREHOUSE_NOT_EXISTS);
} }
if (CommonStatusEnum.isDisable(warehouse.getStatus())) { if (CommonStatusEnum.isDisable(warehouse.getStatus())) {

@ -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<WarehouseAreaDO> getWarehouseAreaPage(WarehouseAreaPageReqVO pageReqVO);
List<WarehouseAreaDO> getWarehouseListByStatus(Integer status);
List<WarehouseAreaDO> getWarehouseListByStatusAndWarehouseId(Integer status, Long warehouseId);
}

@ -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<WarehouseAreaDO> getWarehouseAreaPage(WarehouseAreaPageReqVO pageReqVO) {
return warehouseAreaMapper.selectPage(pageReqVO);
}
@Override
public List<WarehouseAreaDO> getWarehouseListByStatus(Integer status) {
return warehouseAreaMapper.selectListByStatus(status);
}
@Override
public List<WarehouseAreaDO> getWarehouseListByStatusAndWarehouseId(Integer status, Long warehouseId) {
List<WarehouseAreaDO> list = warehouseAreaMapper.selectListByStatus(status);
if (warehouseId == null) {
return list;
}
List<WarehouseAreaDO> result = new ArrayList<>();
for (WarehouseAreaDO item : list) {
if (warehouseId.equals(item.getWarehouseId())) {
result.add(item);
}
}
return result;
}
}

@ -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<WarehouseLocationDO> getWarehouseLocationListByStatus(Integer status);
/**
* ERP
*
* @param pageReqVO
* @return ERP
*/
PageResult<WarehouseLocationDO> getWarehouseLocationPage(WarehouseLocationPageReqVO pageReqVO);
}

@ -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<WarehouseLocationDO> getWarehouseLocationListByStatus(Integer status) {
return warehouseLocationMapper.selectListByStatus(status);
}
@Override
public PageResult<WarehouseLocationDO> getWarehouseLocationPage(WarehouseLocationPageReqVO pageReqVO) {
return warehouseLocationMapper.selectPage(pageReqVO);
}
}

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.erp.dal.mysql.warehousearea.WarehouseAreaMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.erp.dal.mysql.warehouselocation.WarehouseLocationMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>
Loading…
Cancel
Save