diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/MesWmWarehouseAreaController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/MesWmWarehouseAreaController.java new file mode 100644 index 0000000..75a15de --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/MesWmWarehouseAreaController.java @@ -0,0 +1,147 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +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.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 库位") +@RestController +@RequestMapping("/mes/wm/warehouse-area") +@Validated +public class MesWmWarehouseAreaController { + + @Resource + private MesWmWarehouseAreaService areaService; + + @Resource + private MesWmWarehouseLocationService locationService; + + @Resource + private MesWmWarehouseService warehouseService; + + @PostMapping("/create") + @Operation(summary = "创建库位") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-area:create')") + public CommonResult createWarehouseArea(@Valid @RequestBody MesWmWarehouseAreaSaveReqVO createReqVO) { + return success(areaService.createWarehouseArea(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新库位") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-area:update')") + public CommonResult updateWarehouseArea(@Valid @RequestBody MesWmWarehouseAreaSaveReqVO updateReqVO) { + areaService.updateWarehouseArea(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除库位") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-area:delete')") + public CommonResult deleteWarehouseArea(@RequestParam("id") Long id) { + areaService.deleteWarehouseArea(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得库位") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-area:query')") + public CommonResult getWarehouseArea(@RequestParam("id") Long id) { + MesWmWarehouseAreaDO area = areaService.getWarehouseArea(id); + return success(buildWarehouseAreaRespVO(area)); + } + + @GetMapping("/page") + @Operation(summary = "获得库位分页") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-area:query')") + public CommonResult> getWarehouseAreaPage(@Valid MesWmWarehouseAreaPageReqVO pageReqVO) { + PageResult pageResult = areaService.getWarehouseAreaPage(pageReqVO); + return success(new PageResult<>(buildWarehouseAreaRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得库位精简列表", description = "只包含启用状态,可按库区过滤") + public CommonResult> getWarehouseAreaSimpleList( + @Parameter(name = "locationId", description = "库区编号") @RequestParam(value = "locationId", required = false) Long locationId) { + List list = areaService.getWarehouseAreaList(locationId, CommonStatusEnum.ENABLE.getStatus()); + return success(buildWarehouseAreaRespVOList(list)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出库位 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-area:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportWarehouseAreaExcel(@Valid MesWmWarehouseAreaPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = areaService.getWarehouseAreaPage(pageReqVO).getList(); + ExcelUtils.write(response, "库位.xls", "数据", MesWmWarehouseAreaRespVO.class, + buildWarehouseAreaRespVOList(list)); + } + + // TODO @AI:这里有个注释块,参考别的方法; + + // TODO @AI:下面这个,就不用愁方法了;直接 get 那处理下 get 0; + + private MesWmWarehouseAreaRespVO buildWarehouseAreaRespVO(MesWmWarehouseAreaDO area) { + if (area == null) { + return null; + } + List list = buildWarehouseAreaRespVOList(Collections.singletonList(area)); + return CollUtil.isEmpty(list) ? null : CollUtil.getFirst(list); + } + + private List buildWarehouseAreaRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Set locationIds = convertSet(list, MesWmWarehouseAreaDO::getLocationId); + Map locationMap = locationService.getWarehouseLocationMap(locationIds); + Set warehouseIds = convertSet(locationMap.values(), MesWmWarehouseLocationDO::getWarehouseId); + Map warehouseMap = warehouseService.getWarehouseMap(warehouseIds); + + return BeanUtils.toBean(list, MesWmWarehouseAreaRespVO.class, vo -> { + MapUtils.findAndThen(locationMap, vo.getLocationId(), location -> { + vo.setLocationName(location.getName()); + vo.setWarehouseId(location.getWarehouseId()); + MapUtils.findAndThen(warehouseMap, location.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName())); + }); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/MesWmWarehouseController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/MesWmWarehouseController.java new file mode 100644 index 0000000..b68e6bf --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/MesWmWarehouseController.java @@ -0,0 +1,100 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +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.mes.controller.admin.wm.warehouse.vo.MesWmWarehousePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.MesWmWarehouseRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.MesWmWarehouseSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - MES 仓库") +@RestController +@RequestMapping("/mes/wm/warehouse") +@Validated +public class MesWmWarehouseController { + + @Resource + private MesWmWarehouseService warehouseService; + + @PostMapping("/create") + @Operation(summary = "创建仓库") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse:create')") + public CommonResult createWarehouse(@Valid @RequestBody MesWmWarehouseSaveReqVO createReqVO) { + return success(warehouseService.createWarehouse(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新仓库") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse:update')") + public CommonResult updateWarehouse(@Valid @RequestBody MesWmWarehouseSaveReqVO updateReqVO) { + warehouseService.updateWarehouse(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除仓库") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse:delete')") + public CommonResult deleteWarehouse(@RequestParam("id") Long id) { + warehouseService.deleteWarehouse(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得仓库") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse:query')") + public CommonResult getWarehouse(@RequestParam("id") Long id) { + MesWmWarehouseDO warehouse = warehouseService.getWarehouse(id); + return success(BeanUtils.toBean(warehouse, MesWmWarehouseRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得仓库分页") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse:query')") + public CommonResult> getWarehousePage(@Valid MesWmWarehousePageReqVO pageReqVO) { + PageResult pageResult = warehouseService.getWarehousePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MesWmWarehouseRespVO.class)); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得仓库精简列表", description = "只包含启用状态,主要用于前端下拉") + public CommonResult> getWarehouseSimpleList() { + List list = warehouseService.getWarehouseListByStatus(CommonStatusEnum.ENABLE.getStatus()); + return success(BeanUtils.toBean(list, MesWmWarehouseRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出仓库 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportWarehouseExcel(@Valid MesWmWarehousePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = warehouseService.getWarehousePage(pageReqVO).getList(); + ExcelUtils.write(response, "仓库.xls", "数据", MesWmWarehouseRespVO.class, + BeanUtils.toBean(list, MesWmWarehouseRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/MesWmWarehouseLocationController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/MesWmWarehouseLocationController.java new file mode 100644 index 0000000..b2010d6 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/MesWmWarehouseLocationController.java @@ -0,0 +1,131 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +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.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 库区") +@RestController +@RequestMapping("/mes/wm/warehouse-location") +@Validated +public class MesWmWarehouseLocationController { + + @Resource + private MesWmWarehouseLocationService locationService; + + @Resource + private MesWmWarehouseService warehouseService; + + @PostMapping("/create") + @Operation(summary = "创建库区") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-location:create')") + public CommonResult createWarehouseLocation(@Valid @RequestBody MesWmWarehouseLocationSaveReqVO createReqVO) { + return success(locationService.createWarehouseLocation(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新库区") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-location:update')") + public CommonResult updateWarehouseLocation(@Valid @RequestBody MesWmWarehouseLocationSaveReqVO updateReqVO) { + locationService.updateWarehouseLocation(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除库区") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-location:delete')") + public CommonResult deleteWarehouseLocation(@RequestParam("id") Long id) { + locationService.deleteWarehouseLocation(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得库区") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-location:query')") + public CommonResult getWarehouseLocation(@RequestParam("id") Long id) { + MesWmWarehouseLocationDO location = locationService.getWarehouseLocation(id); + return success(buildWarehouseLocationRespVO(location)); + } + + @GetMapping("/page") + @Operation(summary = "获得库区分页") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-location:query')") + public CommonResult> getWarehouseLocationPage(@Valid MesWmWarehouseLocationPageReqVO pageReqVO) { + PageResult pageResult = locationService.getWarehouseLocationPage(pageReqVO); + return success(new PageResult<>(buildWarehouseLocationRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得库区精简列表", description = "只包含启用状态,可按仓库过滤") + public CommonResult> getWarehouseLocationSimpleList( + @Parameter(name = "warehouseId", description = "仓库编号") @RequestParam(value = "warehouseId", required = false) Long warehouseId) { + List list = locationService.getWarehouseLocationList(warehouseId, CommonStatusEnum.ENABLE.getStatus()); + return success(buildWarehouseLocationRespVOList(list)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出库区 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-warehouse-location:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportWarehouseLocationExcel(@Valid MesWmWarehouseLocationPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = locationService.getWarehouseLocationPage(pageReqVO).getList(); + ExcelUtils.write(response, "库区.xls", "数据", MesWmWarehouseLocationRespVO.class, + buildWarehouseLocationRespVOList(list)); + } + + // TODO @AI:这里有个注释块,参考别的方法; + + // TODO @AI:下面这个,就不用愁方法了;直接 get 那处理下 get 0; + private MesWmWarehouseLocationRespVO buildWarehouseLocationRespVO(MesWmWarehouseLocationDO location) { + if (location == null) { + return null; + } + List list = buildWarehouseLocationRespVOList(Collections.singletonList(location)); + return CollUtil.isEmpty(list) ? null : CollUtil.getFirst(list); + } + + private List buildWarehouseLocationRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Map warehouseMap = warehouseService.getWarehouseMap(convertSet(list, MesWmWarehouseLocationDO::getWarehouseId)); + return BeanUtils.toBean(list, MesWmWarehouseLocationRespVO.class, vo -> + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()))); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/MesWmWarehousePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/MesWmWarehousePageReqVO.java new file mode 100644 index 0000000..6122f0e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/MesWmWarehousePageReqVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - MES 仓库分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesWmWarehousePageReqVO extends PageParam { + + @Schema(description = "仓库编码", example = "WH001") + private String code; + + @Schema(description = "仓库名称", example = "原料仓") + private String name; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "是否冻结", example = "false") + private Boolean frozen; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/MesWmWarehouseRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/MesWmWarehouseRespVO.java new file mode 100644 index 0000000..e34345b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/MesWmWarehouseRespVO.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 仓库 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesWmWarehouseRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "仓库编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "WH001") + @ExcelProperty("仓库编码") + private String code; + + @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料仓") + @ExcelProperty("仓库名称") + private String name; + + @Schema(description = "仓库地址", example = "A 区一号楼") + @ExcelProperty("仓库地址") + private String address; + + @Schema(description = "面积", example = "1200.50") + @ExcelProperty("面积") + private BigDecimal area; + + @Schema(description = "负责人用户编号", example = "1") + private Long chargeUserId; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty("状态") + private Integer status; + + @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @ExcelProperty("是否冻结") + private Boolean frozen; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/MesWmWarehouseSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/MesWmWarehouseSaveReqVO.java new file mode 100644 index 0000000..36b26d1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/MesWmWarehouseSaveReqVO.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 仓库新增/修改 Request VO") +@Data +public class MesWmWarehouseSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "仓库编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "WH001") + @NotEmpty(message = "仓库编码不能为空") + private String code; + + @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料仓") + @NotEmpty(message = "仓库名称不能为空") + private String name; + + @Schema(description = "仓库地址", example = "A 区一号楼") + private String address; + + @Schema(description = "面积", example = "1200.50") + private BigDecimal area; + + @Schema(description = "负责人用户编号", example = "1") + private Long chargeUserId; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @NotNull(message = "是否冻结不能为空") + private Boolean frozen; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/area/MesWmWarehouseAreaPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/area/MesWmWarehouseAreaPageReqVO.java new file mode 100644 index 0000000..df35f8b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/area/MesWmWarehouseAreaPageReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - MES 库位分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesWmWarehouseAreaPageReqVO extends PageParam { + + @Schema(description = "库位编码", example = "A001") + private String code; + + @Schema(description = "库位名称", example = "默认库位") + private String name; + + @Schema(description = "库区编号", example = "1") + private Long locationId; + + @Schema(description = "是否启用", example = "true") + private Boolean enabled; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "是否冻结", example = "false") + private Boolean frozen; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/area/MesWmWarehouseAreaRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/area/MesWmWarehouseAreaRespVO.java new file mode 100644 index 0000000..fadea40 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/area/MesWmWarehouseAreaRespVO.java @@ -0,0 +1,102 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 库位 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesWmWarehouseAreaRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "库位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "A001") + @ExcelProperty("库位编码") + private String code; + + @Schema(description = "库位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "默认库位") + @ExcelProperty("库位名称") + private String name; + + @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long locationId; + + @Schema(description = "库区名称", example = "原料区") + @ExcelProperty("库区名称") + private String locationName; + + @Schema(description = "仓库编号", example = "1") + private Long warehouseId; + + @Schema(description = "仓库名称", example = "原料仓") + @ExcelProperty("仓库名称") + private String warehouseName; + + @Schema(description = "面积", example = "20.00") + @ExcelProperty("面积") + private BigDecimal area; + + @Schema(description = "最大载重", example = "1000.00") + @ExcelProperty("最大载重") + private BigDecimal maxLoad; + + @Schema(description = "坐标 X", example = "1") + @ExcelProperty("坐标 X") + private Integer positionX; + + @Schema(description = "坐标 Y", example = "1") + @ExcelProperty("坐标 Y") + private Integer positionY; + + @Schema(description = "坐标 Z", example = "1") + @ExcelProperty("坐标 Z") + private Integer positionZ; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @ExcelProperty("是否启用") + private Boolean enabled; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty("状态") + private Integer status; + + @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @ExcelProperty("是否冻结") + private Boolean frozen; + + @Schema(description = "是否允许物料混放", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @ExcelProperty("允许物料混放") + private Boolean allowItemMixing; + + @Schema(description = "是否允许批次混放", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @ExcelProperty("允许批次混放") + private Boolean allowBatchMixing; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/area/MesWmWarehouseAreaSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/area/MesWmWarehouseAreaSaveReqVO.java new file mode 100644 index 0000000..9af013e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/area/MesWmWarehouseAreaSaveReqVO.java @@ -0,0 +1,79 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 库位新增/修改 Request VO") +@Data +public class MesWmWarehouseAreaSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "库位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "A001") + @NotEmpty(message = "库位编码不能为空") + private String code; + + @Schema(description = "库位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "默认库位") + @NotEmpty(message = "库位名称不能为空") + private String name; + + @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "库区不能为空") + private Long locationId; + + @Schema(description = "面积", example = "20.00") + private BigDecimal area; + + @Schema(description = "最大载重", example = "1000.00") + private BigDecimal maxLoad; + + @Schema(description = "坐标 X", example = "1") + private Integer positionX; + + @Schema(description = "坐标 Y", example = "1") + private Integer positionY; + + @Schema(description = "坐标 Z", example = "1") + private Integer positionZ; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否启用不能为空") + private Boolean enabled; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @NotNull(message = "是否冻结不能为空") + private Boolean frozen; + + @Schema(description = "是否允许物料混放", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否允许物料混放不能为空") + private Boolean allowItemMixing; + + @Schema(description = "是否允许批次混放", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否允许批次混放不能为空") + private Boolean allowBatchMixing; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationPageReqVO.java new file mode 100644 index 0000000..044d08f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationPageReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - MES 库区分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesWmWarehouseLocationPageReqVO extends PageParam { + + @Schema(description = "库区编码", example = "L001") + private String code; + + @Schema(description = "库区名称", example = "原料区") + private String name; + + @Schema(description = "仓库编号", example = "1") + private Long warehouseId; + + @Schema(description = "是否启用库位管理", example = "true") + private Boolean areaEnabled; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "是否冻结", example = "false") + private Boolean frozen; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationRespVO.java new file mode 100644 index 0000000..0b08f22 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationRespVO.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 库区 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesWmWarehouseLocationRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "库区编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "L001") + @ExcelProperty("库区编码") + private String code; + + @Schema(description = "库区名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料区") + @ExcelProperty("库区名称") + private String name; + + @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long warehouseId; + + @Schema(description = "仓库名称", example = "原料仓") + @ExcelProperty("仓库名称") + private String warehouseName; + + @Schema(description = "面积", example = "500.00") + @ExcelProperty("面积") + private BigDecimal area; + + @Schema(description = "是否启用库位管理", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @ExcelProperty("启用库位管理") + private Boolean areaEnabled; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty("状态") + private Integer status; + + @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @ExcelProperty("是否冻结") + private Boolean frozen; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationSaveReqVO.java new file mode 100644 index 0000000..d5d38f8 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/vo/location/MesWmWarehouseLocationSaveReqVO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 库区新增/修改 Request VO") +@Data +public class MesWmWarehouseLocationSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "库区编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "L001") + @NotEmpty(message = "库区编码不能为空") + private String code; + + @Schema(description = "库区名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料区") + @NotEmpty(message = "库区名称不能为空") + private String name; + + @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "仓库不能为空") + private Long warehouseId; + + @Schema(description = "面积", example = "500.00") + private BigDecimal area; + + @Schema(description = "是否启用库位管理", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否启用库位管理不能为空") + private Boolean areaEnabled; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @NotNull(message = "是否冻结不能为空") + private Boolean frozen; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/MesProProcessContentDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/MesProProcessContentDO.java new file mode 100644 index 0000000..1095fc4 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/MesProProcessContentDO.java @@ -0,0 +1,76 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.pro; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * MES 生产工序内容 DO + * + * @author 芋道源码 + */ +@TableName("mes_pro_process_content") +@KeySequence("mes_pro_process_content_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesProProcessContentDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 工序编号 + * + * 关联 {@link MesProProcessDO#getId()} + */ + private Long processId; + /** + * 顺序编号 + */ + private Integer sort; + /** + * 步骤说明 + */ + private String content; + /** + * 辅助设备 + */ + private String device; + /** + * 辅助材料 + */ + private String material; + /** + * 材料文档 URL + */ + private String docUrl; + /** + * 备注 + */ + private String remark; + /** + * 预留字段1 + */ + private String attribute1; + /** + * 预留字段2 + */ + private String attribute2; + /** + * 预留字段3 + */ + private Integer attribute3; + /** + * 预留字段4 + */ + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/MesProProcessDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/MesProProcessDO.java new file mode 100644 index 0000000..7afc933 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/MesProProcessDO.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.pro; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * MES 生产工序 DO + * + * @author 芋道源码 + */ +@TableName("mes_pro_process") +@KeySequence("mes_pro_process_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesProProcessDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 工序编码 + */ + private String code; + /** + * 工序名称 + */ + private String name; + /** + * 工艺要求 + */ + private String attention; + /** + * 状态 + * + * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 预留字段1 + */ + private String attribute1; + /** + * 预留字段2 + */ + private String attribute2; + /** + * 预留字段3 + */ + private Integer attribute3; + /** + * 预留字段4 + */ + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseAreaDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseAreaDO.java new file mode 100644 index 0000000..c20c528 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseAreaDO.java @@ -0,0 +1,105 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 库位 DO + */ +@TableName("mes_wm_warehouse_area") +@KeySequence("mes_wm_warehouse_area_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmWarehouseAreaDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 库位编码 + */ + private String code; + /** + * 库位名称 + */ + private String name; + // TODO @AI:需要关联下 mes_wm_warehouse_location 表; + /** + * 库区编号 + */ + private Long locationId; + /** + * 面积 + */ + private BigDecimal area; + /** + * 最大载重 + */ + private BigDecimal maxLoad; + /** + * 坐标 X + */ + private Integer positionX; + /** + * 坐标 Y + */ + private Integer positionY; + /** + * 坐标 Z + */ + private Integer positionZ; + /** + * 是否启用 + */ + private Boolean enabled; + /** + * 状态 + * + * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} + */ + private Integer status; + /** + * 是否冻结 + */ + private Boolean frozen; + /** + * 是否允许物料混放 + */ + private Boolean allowItemMixing; + /** + * 是否允许批次混放 + */ + private Boolean allowBatchMixing; + /** + * 备注 + */ + private String remark; + /** + * 预留字段1 + */ + private String attribute1; + /** + * 预留字段2 + */ + private String attribute2; + /** + * 预留字段3 + */ + private Integer attribute3; + /** + * 预留字段4 + */ + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseDO.java new file mode 100644 index 0000000..2f521bf --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseDO.java @@ -0,0 +1,81 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 仓库 DO + */ +@TableName("mes_wm_warehouse") +@KeySequence("mes_wm_warehouse_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmWarehouseDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 仓库编码 + */ + private String code; + /** + * 仓库名称 + */ + private String name; + /** + * 仓库地址 + */ + private String address; + /** + * 面积 + */ + private BigDecimal area; + // TODO @AI:需要关联下 system_users 表; + /** + * 负责人用户编号 + */ + private Long chargeUserId; + /** + * 状态 + * + * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} + */ + private Integer status; + /** + * 是否冻结 + */ + private Boolean frozen; + /** + * 备注 + */ + private String remark; + /** + * 预留字段1 + */ + private String attribute1; + /** + * 预留字段2 + */ + private String attribute2; + /** + * 预留字段3 + */ + private Integer attribute3; + /** + * 预留字段4 + */ + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseLocationDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseLocationDO.java new file mode 100644 index 0000000..149efae --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseLocationDO.java @@ -0,0 +1,81 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 库区 DO + */ +@TableName("mes_wm_warehouse_location") +@KeySequence("mes_wm_warehouse_location_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmWarehouseLocationDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 库区编码 + */ + private String code; + /** + * 库区名称 + */ + private String name; + // TODO @AI:需要关联下 mes_wm_warehouse 表; + /** + * 仓库编号 + */ + private Long warehouseId; + /** + * 面积 + */ + private BigDecimal area; + /** + * 是否启用库位管理 + */ + private Boolean areaEnabled; + /** + * 状态 + * + * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} + */ + private Integer status; + /** + * 是否冻结 + */ + private Boolean frozen; + /** + * 备注 + */ + private String remark; + /** + * 预留字段1 + */ + private String attribute1; + /** + * 预留字段2 + */ + private String attribute2; + /** + * 预留字段3 + */ + private Integer attribute3; + /** + * 预留字段4 + */ + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseAreaMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseAreaMapper.java new file mode 100644 index 0000000..758e291 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseAreaMapper.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +/** + * MES 库位 Mapper + */ +@Mapper +public interface MesWmWarehouseAreaMapper extends BaseMapperX { + + default PageResult selectPage(MesWmWarehouseAreaPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmWarehouseAreaDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmWarehouseAreaDO::getName, reqVO.getName()) + .eqIfPresent(MesWmWarehouseAreaDO::getLocationId, reqVO.getLocationId()) + .eqIfPresent(MesWmWarehouseAreaDO::getEnabled, reqVO.getEnabled()) + .eqIfPresent(MesWmWarehouseAreaDO::getStatus, reqVO.getStatus()) + .eqIfPresent(MesWmWarehouseAreaDO::getFrozen, reqVO.getFrozen()) + .orderByDesc(MesWmWarehouseAreaDO::getId)); + } + + default MesWmWarehouseAreaDO selectByCode(Long locationId, String code) { + return selectOne(new LambdaQueryWrapperX() + .eq(MesWmWarehouseAreaDO::getLocationId, locationId) + .eq(MesWmWarehouseAreaDO::getCode, code)); + } + + default MesWmWarehouseAreaDO selectByName(Long locationId, String name) { + return selectOne(new LambdaQueryWrapperX() + .eq(MesWmWarehouseAreaDO::getLocationId, locationId) + .eq(MesWmWarehouseAreaDO::getName, name)); + } + + default List selectListByLocationIdAndStatus(Long locationId, Integer status) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MesWmWarehouseAreaDO::getLocationId, locationId) + .eqIfPresent(MesWmWarehouseAreaDO::getStatus, status) + .orderByDesc(MesWmWarehouseAreaDO::getId)); + } + + default List selectListByIds(Collection ids) { + return selectByIds(ids); + } + + default Long selectCountByLocationId(Long locationId) { + return selectCount(MesWmWarehouseAreaDO::getLocationId, locationId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseLocationMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseLocationMapper.java new file mode 100644 index 0000000..b0c6f35 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseLocationMapper.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +/** + * MES 库区 Mapper + */ +@Mapper +public interface MesWmWarehouseLocationMapper extends BaseMapperX { + + default PageResult selectPage(MesWmWarehouseLocationPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmWarehouseLocationDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmWarehouseLocationDO::getName, reqVO.getName()) + .eqIfPresent(MesWmWarehouseLocationDO::getWarehouseId, reqVO.getWarehouseId()) + .eqIfPresent(MesWmWarehouseLocationDO::getAreaEnabled, reqVO.getAreaEnabled()) + .eqIfPresent(MesWmWarehouseLocationDO::getStatus, reqVO.getStatus()) + .eqIfPresent(MesWmWarehouseLocationDO::getFrozen, reqVO.getFrozen()) + .orderByDesc(MesWmWarehouseLocationDO::getId)); + } + + default MesWmWarehouseLocationDO selectByCode(Long warehouseId, String code) { + return selectOne(new LambdaQueryWrapperX() + .eq(MesWmWarehouseLocationDO::getWarehouseId, warehouseId) + .eq(MesWmWarehouseLocationDO::getCode, code)); + } + + default MesWmWarehouseLocationDO selectByName(Long warehouseId, String name) { + return selectOne(new LambdaQueryWrapperX() + .eq(MesWmWarehouseLocationDO::getWarehouseId, warehouseId) + .eq(MesWmWarehouseLocationDO::getName, name)); + } + + default List selectListByWarehouseIdAndStatus(Long warehouseId, Integer status) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MesWmWarehouseLocationDO::getWarehouseId, warehouseId) + .eqIfPresent(MesWmWarehouseLocationDO::getStatus, status) + .orderByDesc(MesWmWarehouseLocationDO::getId)); + } + + default List selectListByIds(Collection ids) { + return selectByIds(ids); + } + + default Long selectCountByWarehouseId(Long warehouseId) { + return selectCount(MesWmWarehouseLocationDO::getWarehouseId, warehouseId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseMapper.java new file mode 100644 index 0000000..49fb7ed --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseMapper.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.MesWmWarehousePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +/** + * MES 仓库 Mapper + */ +@Mapper +public interface MesWmWarehouseMapper extends BaseMapperX { + + default PageResult selectPage(MesWmWarehousePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmWarehouseDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmWarehouseDO::getName, reqVO.getName()) + .eqIfPresent(MesWmWarehouseDO::getStatus, reqVO.getStatus()) + .eqIfPresent(MesWmWarehouseDO::getFrozen, reqVO.getFrozen()) + .orderByDesc(MesWmWarehouseDO::getId)); + } + + default MesWmWarehouseDO selectByCode(String code) { + return selectOne(MesWmWarehouseDO::getCode, code); + } + + default MesWmWarehouseDO selectByName(String name) { + return selectOne(MesWmWarehouseDO::getName, name); + } + + default List selectListByStatus(Integer status) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MesWmWarehouseDO::getStatus, status) + .orderByDesc(MesWmWarehouseDO::getId)); + } + + default List selectListByIds(Collection ids) { + return selectByIds(ids); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaService.java new file mode 100644 index 0000000..f15f65c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaService.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.service.wm.warehouse; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +// TODO @AI:方法注释; +/** + * MES 库位 Service 接口 + */ +public interface MesWmWarehouseAreaService { + + Long createWarehouseArea(@Valid MesWmWarehouseAreaSaveReqVO createReqVO); + + void updateWarehouseArea(@Valid MesWmWarehouseAreaSaveReqVO updateReqVO); + + void deleteWarehouseArea(Long id); + + MesWmWarehouseAreaDO getWarehouseArea(Long id); + + PageResult getWarehouseAreaPage(MesWmWarehouseAreaPageReqVO pageReqVO); + + List getWarehouseAreaList(Long locationId, Integer status); + + List getWarehouseAreaList(Collection ids); + + default Map getWarehouseAreaMap(Collection ids) { + return convertMap(getWarehouseAreaList(ids), MesWmWarehouseAreaDO::getId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaServiceImpl.java new file mode 100644 index 0000000..a81ad4d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaServiceImpl.java @@ -0,0 +1,137 @@ +package cn.iocoder.yudao.module.mes.service.wm.warehouse; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkstationMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse.MesWmWarehouseAreaMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 库位 Service 实现类 + */ +@Service +@Validated +public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService { + + @Resource + private MesWmWarehouseAreaMapper areaMapper; + + @Resource + private MesMdWorkstationMapper workstationMapper; + + @Resource + private MesWmWarehouseLocationService locationService; + + @Override + public Long createWarehouseArea(MesWmWarehouseAreaSaveReqVO createReqVO) { + // 校验库区存在 + validateWarehouseLocationExists(createReqVO.getLocationId()); + // 校验编码唯一 + validateWarehouseAreaCodeUnique(null, createReqVO.getLocationId(), createReqVO.getCode()); + // 校验名称唯一 + validateWarehouseAreaNameUnique(null, createReqVO.getLocationId(), createReqVO.getName()); + + MesWmWarehouseAreaDO area = BeanUtils.toBean(createReqVO, MesWmWarehouseAreaDO.class); + areaMapper.insert(area); + return area.getId(); + } + + @Override + public void updateWarehouseArea(MesWmWarehouseAreaSaveReqVO updateReqVO) { + // 校验存在 + validateWarehouseAreaExists(updateReqVO.getId()); + // 校验库区存在 + validateWarehouseLocationExists(updateReqVO.getLocationId()); + // 校验编码唯一 + validateWarehouseAreaCodeUnique(updateReqVO.getId(), updateReqVO.getLocationId(), updateReqVO.getCode()); + // 校验名称唯一 + validateWarehouseAreaNameUnique(updateReqVO.getId(), updateReqVO.getLocationId(), updateReqVO.getName()); + + MesWmWarehouseAreaDO updateObj = BeanUtils.toBean(updateReqVO, MesWmWarehouseAreaDO.class); + areaMapper.updateById(updateObj); + } + + @Override + public void deleteWarehouseArea(Long id) { + // 校验存在 + validateWarehouseAreaExists(id); + // 校验是否被工作站引用 + if (ObjUtil.defaultIfNull(workstationMapper.selectCountByAreaId(id), 0L) > 0) { + throw exception(WM_WAREHOUSE_AREA_HAS_WORKSTATION); + } + // TODO @芋艿:库存表(mes_wm_material_stock)迁移后,补充库位库存占用校验 + + areaMapper.deleteById(id); + } + + // TODO @AI: locationService 抽个类似的方法被调用; + private void validateWarehouseLocationExists(Long locationId) { + if (locationService.getWarehouseLocation(locationId) == null) { + throw exception(WM_WAREHOUSE_LOCATION_NOT_EXISTS); + } + } + + private void validateWarehouseAreaExists(Long id) { + if (areaMapper.selectById(id) == null) { + throw exception(WM_WAREHOUSE_AREA_NOT_EXISTS); + } + } + + private void validateWarehouseAreaCodeUnique(Long id, Long locationId, String code) { + MesWmWarehouseAreaDO area = areaMapper.selectByCode(locationId, code); + if (area == null) { + return; + } + if (ObjUtil.notEqual(area.getId(), id)) { + throw exception(WM_WAREHOUSE_AREA_CODE_DUPLICATE); + } + } + + private void validateWarehouseAreaNameUnique(Long id, Long locationId, String name) { + MesWmWarehouseAreaDO area = areaMapper.selectByName(locationId, name); + if (area == null) { + return; + } + if (ObjUtil.notEqual(area.getId(), id)) { + throw exception(WM_WAREHOUSE_AREA_NAME_DUPLICATE); + } + } + + @Override + public MesWmWarehouseAreaDO getWarehouseArea(Long id) { + return areaMapper.selectById(id); + } + + @Override + public PageResult getWarehouseAreaPage(MesWmWarehouseAreaPageReqVO pageReqVO) { + return areaMapper.selectPage(pageReqVO); + } + + @Override + public List getWarehouseAreaList(Long locationId, Integer status) { + return areaMapper.selectListByLocationIdAndStatus(locationId, status); + } + + @Override + public List getWarehouseAreaList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return areaMapper.selectListByIds(ids); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationService.java new file mode 100644 index 0000000..3870ac0 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationService.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.service.wm.warehouse; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +// TODO @AI:方法注释; +/** + * MES 库区 Service 接口 + */ +public interface MesWmWarehouseLocationService { + + Long createWarehouseLocation(@Valid MesWmWarehouseLocationSaveReqVO createReqVO); + + void updateWarehouseLocation(@Valid MesWmWarehouseLocationSaveReqVO updateReqVO); + + void deleteWarehouseLocation(Long id); + + MesWmWarehouseLocationDO getWarehouseLocation(Long id); + + PageResult getWarehouseLocationPage(MesWmWarehouseLocationPageReqVO pageReqVO); + + List getWarehouseLocationList(Long warehouseId, Integer status); + + List getWarehouseLocationList(Collection ids); + + default Map getWarehouseLocationMap(Collection ids) { + return convertMap(getWarehouseLocationList(ids), MesWmWarehouseLocationDO::getId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationServiceImpl.java new file mode 100644 index 0000000..d9119db --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationServiceImpl.java @@ -0,0 +1,146 @@ +package cn.iocoder.yudao.module.mes.service.wm.warehouse; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkstationMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse.MesWmWarehouseAreaMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse.MesWmWarehouseLocationMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 库区 Service 实现类 + */ +@Service +@Validated +public class MesWmWarehouseLocationServiceImpl implements MesWmWarehouseLocationService { + + @Resource + private MesWmWarehouseLocationMapper locationMapper; + + @Resource + private MesWmWarehouseAreaMapper areaMapper; + + @Resource + private MesMdWorkstationMapper workstationMapper; + + @Resource + private MesWmWarehouseService warehouseService; + + @Override + public Long createWarehouseLocation(MesWmWarehouseLocationSaveReqVO createReqVO) { + // 校验仓库存在 + validateWarehouseExists(createReqVO.getWarehouseId()); + // 校验编码唯一 + validateWarehouseLocationCodeUnique(null, createReqVO.getWarehouseId(), createReqVO.getCode()); + // 校验名称唯一 + validateWarehouseLocationNameUnique(null, createReqVO.getWarehouseId(), createReqVO.getName()); + + MesWmWarehouseLocationDO location = BeanUtils.toBean(createReqVO, MesWmWarehouseLocationDO.class); + locationMapper.insert(location); + return location.getId(); + } + + @Override + public void updateWarehouseLocation(MesWmWarehouseLocationSaveReqVO updateReqVO) { + // 校验存在 + validateWarehouseLocationExists(updateReqVO.getId()); + // 校验仓库存在 + validateWarehouseExists(updateReqVO.getWarehouseId()); + // 校验编码唯一 + validateWarehouseLocationCodeUnique(updateReqVO.getId(), updateReqVO.getWarehouseId(), updateReqVO.getCode()); + // 校验名称唯一 + validateWarehouseLocationNameUnique(updateReqVO.getId(), updateReqVO.getWarehouseId(), updateReqVO.getName()); + + MesWmWarehouseLocationDO updateObj = BeanUtils.toBean(updateReqVO, MesWmWarehouseLocationDO.class); + locationMapper.updateById(updateObj); + } + + @Override + public void deleteWarehouseLocation(Long id) { + // 校验存在 + validateWarehouseLocationExists(id); + // 校验是否有库位 + if (ObjUtil.defaultIfNull(areaMapper.selectCountByLocationId(id), 0L) > 0) { + throw exception(WM_WAREHOUSE_LOCATION_HAS_AREA); + } + // 校验是否被工作站引用 + if (ObjUtil.defaultIfNull(workstationMapper.selectCountByLocationId(id), 0L) > 0) { + throw exception(WM_WAREHOUSE_LOCATION_HAS_WORKSTATION); + } + // TODO @芋艿:库存表(mes_wm_material_stock)迁移后,补充库区库存占用校验 + + locationMapper.deleteById(id); + } + + // TODO @AI:使用 warehouseService 里的;抽过去; + private void validateWarehouseExists(Long warehouseId) { + if (warehouseService.getWarehouse(warehouseId) == null) { + throw exception(WM_WAREHOUSE_NOT_EXISTS); + } + } + + // TODO @AI:使用 warehouseLocationService 里的;抽过去; + private void validateWarehouseLocationExists(Long id) { + if (locationMapper.selectById(id) == null) { + throw exception(WM_WAREHOUSE_LOCATION_NOT_EXISTS); + } + } + + private void validateWarehouseLocationCodeUnique(Long id, Long warehouseId, String code) { + MesWmWarehouseLocationDO location = locationMapper.selectByCode(warehouseId, code); + if (location == null) { + return; + } + if (ObjUtil.notEqual(location.getId(), id)) { + throw exception(WM_WAREHOUSE_LOCATION_CODE_DUPLICATE); + } + } + + private void validateWarehouseLocationNameUnique(Long id, Long warehouseId, String name) { + MesWmWarehouseLocationDO location = locationMapper.selectByName(warehouseId, name); + if (location == null) { + return; + } + if (ObjUtil.notEqual(location.getId(), id)) { + throw exception(WM_WAREHOUSE_LOCATION_NAME_DUPLICATE); + } + } + + @Override + public MesWmWarehouseLocationDO getWarehouseLocation(Long id) { + return locationMapper.selectById(id); + } + + @Override + public PageResult getWarehouseLocationPage(MesWmWarehouseLocationPageReqVO pageReqVO) { + return locationMapper.selectPage(pageReqVO); + } + + @Override + public List getWarehouseLocationList(Long warehouseId, Integer status) { + return locationMapper.selectListByWarehouseIdAndStatus(warehouseId, status); + } + + @Override + public List getWarehouseLocationList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return locationMapper.selectListByIds(ids); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseService.java new file mode 100644 index 0000000..cd9ff7a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseService.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.service.wm.warehouse; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.MesWmWarehousePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.MesWmWarehouseSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +// TODO @AI:方法注释; +/** + * MES 仓库 Service 接口 + */ +public interface MesWmWarehouseService { + + Long createWarehouse(@Valid MesWmWarehouseSaveReqVO createReqVO); + + void updateWarehouse(@Valid MesWmWarehouseSaveReqVO updateReqVO); + + void deleteWarehouse(Long id); + + MesWmWarehouseDO getWarehouse(Long id); + + PageResult getWarehousePage(MesWmWarehousePageReqVO pageReqVO); + + List getWarehouseListByStatus(Integer status); + + List getWarehouseList(Collection ids); + + default Map getWarehouseMap(Collection ids) { + return convertMap(getWarehouseList(ids), MesWmWarehouseDO::getId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseServiceImpl.java new file mode 100644 index 0000000..ecf6f56 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseServiceImpl.java @@ -0,0 +1,134 @@ +package cn.iocoder.yudao.module.mes.service.wm.warehouse; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.MesWmWarehousePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.MesWmWarehouseSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkstationMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse.MesWmWarehouseLocationMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse.MesWmWarehouseMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 仓库 Service 实现类 + */ +@Service +@Validated +public class MesWmWarehouseServiceImpl implements MesWmWarehouseService { + + @Resource + private MesWmWarehouseMapper warehouseMapper; + + @Resource + private MesWmWarehouseLocationMapper locationMapper; + + @Resource + private MesMdWorkstationMapper workstationMapper; + + @Override + public Long createWarehouse(MesWmWarehouseSaveReqVO createReqVO) { + // 校验编码唯一 + validateWarehouseCodeUnique(null, createReqVO.getCode()); + // 校验名称唯一 + validateWarehouseNameUnique(null, createReqVO.getName()); + + // 插入 + MesWmWarehouseDO warehouse = BeanUtils.toBean(createReqVO, MesWmWarehouseDO.class); + warehouseMapper.insert(warehouse); + return warehouse.getId(); + } + + @Override + public void updateWarehouse(MesWmWarehouseSaveReqVO updateReqVO) { + // 校验存在 + validateWarehouseExists(updateReqVO.getId()); + // 校验编码唯一 + validateWarehouseCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + // 校验名称唯一 + validateWarehouseNameUnique(updateReqVO.getId(), updateReqVO.getName()); + + // 更新 + MesWmWarehouseDO updateObj = BeanUtils.toBean(updateReqVO, MesWmWarehouseDO.class); + warehouseMapper.updateById(updateObj); + } + + @Override + public void deleteWarehouse(Long id) { + // 校验存在 + validateWarehouseExists(id); + // 校验是否有库区 + if (locationMapper.selectCountByWarehouseId(id) > 0) { + throw exception(WM_WAREHOUSE_HAS_LOCATION); + } + // 校验是否被工作站引用 + if (workstationMapper.selectCountByWarehouseId(id) > 0) { + throw exception(WM_WAREHOUSE_HAS_WORKSTATION); + } + // TODO @芋艿:库存表(mes_wm_material_stock)迁移后,补充仓库库存占用校验 + + // 删除 + warehouseMapper.deleteById(id); + } + + private void validateWarehouseExists(Long id) { + if (warehouseMapper.selectById(id) == null) { + throw exception(WM_WAREHOUSE_NOT_EXISTS); + } + } + + private void validateWarehouseCodeUnique(Long id, String code) { + MesWmWarehouseDO warehouse = warehouseMapper.selectByCode(code); + if (warehouse == null) { + return; + } + if (ObjUtil.notEqual(warehouse.getId(), id)) { + throw exception(WM_WAREHOUSE_CODE_DUPLICATE); + } + } + + private void validateWarehouseNameUnique(Long id, String name) { + MesWmWarehouseDO warehouse = warehouseMapper.selectByName(name); + if (warehouse == null) { + return; + } + if (ObjUtil.notEqual(warehouse.getId(), id)) { + throw exception(WM_WAREHOUSE_NAME_DUPLICATE); + } + } + + @Override + public MesWmWarehouseDO getWarehouse(Long id) { + return warehouseMapper.selectById(id); + } + + @Override + public PageResult getWarehousePage(MesWmWarehousePageReqVO pageReqVO) { + return warehouseMapper.selectPage(pageReqVO); + } + + @Override + public List getWarehouseListByStatus(Integer status) { + return warehouseMapper.selectListByStatus(status); + } + + @Override + public List getWarehouseList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return warehouseMapper.selectListByIds(ids); + } + +}