🎉 Initial commit

This commit is contained in:
2026-07-27 14:26:14 +08:00
commit fd54f07889
6935 changed files with 617410 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
package cn.iocoder.yudao.module.wms.controller.admin.home;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.wms.controller.admin.home.vo.WmsHomeInventorySummaryRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.home.vo.WmsHomeOrderSummaryRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.home.vo.WmsHomeOrderTrendRespVO;
import cn.iocoder.yudao.module.wms.service.home.WmsHomeStatisticsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - WMS 首页统计")
@RestController
@RequestMapping("/wms/home-statistics")
@Validated
public class WmsHomeStatisticsController {
@Resource
private WmsHomeStatisticsService homeStatisticsService;
@GetMapping("/order-summary")
@Operation(summary = "获得首页单据汇总统计")
@Parameter(name = "warehouseId", description = "仓库编号", example = "1024")
@PreAuthorize("@ss.hasPermission('wms:home:query')")
public CommonResult<List<WmsHomeOrderSummaryRespVO>> getOrderSummary(
@RequestParam(value = "warehouseId", required = false) Long warehouseId) {
return success(homeStatisticsService.getOrderSummary(warehouseId));
}
@GetMapping("/order-trend")
@Operation(summary = "获得首页单据趋势")
@Parameter(name = "days", description = "天数", example = "7")
@PreAuthorize("@ss.hasPermission('wms:home:query')")
public CommonResult<List<WmsHomeOrderTrendRespVO>> getOrderTrend(
@RequestParam(value = "days", defaultValue = "7") @Min(1) @Max(90) Integer days,
@RequestParam(value = "warehouseId", required = false) Long warehouseId) {
return success(homeStatisticsService.getOrderTrend(days, warehouseId));
}
@GetMapping("/inventory-summary")
@Operation(summary = "获得首页库存汇总统计")
@Parameter(name = "warehouseId", description = "仓库编号", example = "1024")
@PreAuthorize("@ss.hasPermission('wms:home:query')")
public CommonResult<WmsHomeInventorySummaryRespVO> getInventorySummary(
@RequestParam(value = "warehouseId", required = false) Long warehouseId,
@RequestParam(value = "goodsLimit", defaultValue = "5") @Min(1) @Max(20) Integer goodsLimit,
@RequestParam(value = "warehouseLimit", defaultValue = "8") @Min(1) @Max(20) Integer warehouseLimit) {
return success(homeStatisticsService.getInventorySummary(warehouseId, goodsLimit, warehouseLimit));
}
}

View File

@@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.wms.controller.admin.home.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Schema(description = "管理后台 - WMS 首页库存汇总统计 Response VO")
@Data
public class WmsHomeInventorySummaryRespVO {
@Schema(description = "总库存数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000.00")
private BigDecimal totalQuantity;
@Schema(description = "商品库存占比列表")
private List<ItemRank> goodsShareList;
@Schema(description = "仓库库存分布列表")
private List<WarehouseRank> warehouseDistributionList;
@Schema(description = "管理后台 - WMS 首页商品库存排行 Response VO")
@Data
public static class ItemRank {
@Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "A4 复印纸")
private String name;
@Schema(description = "库存数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
private BigDecimal quantity;
}
@Schema(description = "管理后台 - WMS 首页仓库库存排行 Response VO")
@Data
public static class WarehouseRank {
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "上海仓")
private String name;
@Schema(description = "库存数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
private BigDecimal quantity;
}
}

View File

@@ -0,0 +1,16 @@
package cn.iocoder.yudao.module.wms.controller.admin.home.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - WMS 首页单据状态统计 Response VO")
@Data
public class WmsHomeOrderStatusRespVO {
@Schema(description = "状态值", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
private Integer status;
@Schema(description = "单据数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
private Long count;
}

View File

@@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.wms.controller.admin.home.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Schema(description = "管理后台 - WMS 首页单据汇总统计 Response VO")
@Data
public class WmsHomeOrderSummaryRespVO {
@Schema(description = "单据类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer type;
@Schema(description = "单据总数", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
private Long total;
@Schema(description = "状态分布")
private List<WmsHomeOrderStatusRespVO> statuses;
}

View File

@@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.wms.controller.admin.home.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 首页单据趋势 Response VO")
@Data
public class WmsHomeOrderTrendRespVO {
@Schema(description = "时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1778169600000")
private LocalDateTime time;
@Schema(description = "入库单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
private Long receiptCount;
@Schema(description = "出库单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "8")
private Long shipmentCount;
@Schema(description = "移库单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")
private Long movementCount;
@Schema(description = "盘库单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
private Long checkCount;
}

View File

@@ -0,0 +1,87 @@
package cn.iocoder.yudao.module.wms.controller.admin.inventory;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryListReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryRespVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@Tag(name = "管理后台 - WMS 库存统计")
@RestController
@RequestMapping("/wms/inventory")
@Validated
public class WmsInventoryController {
@Resource
private WmsInventoryService inventoryService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private WmsWarehouseService warehouseService;
@GetMapping("/page")
@Operation(summary = "获得库存统计分页")
@PreAuthorize("@ss.hasPermission('wms:inventory:query')")
public CommonResult<PageResult<WmsInventoryRespVO>> getInventoryPage(@Valid WmsInventoryPageReqVO pageReqVO) {
PageResult<WmsInventoryDO> pageResult = inventoryService.getInventoryPage(pageReqVO);
return success(new PageResult<>(buildInventoryRespVOList(pageResult.getList()), pageResult.getTotal()));
}
@GetMapping("/list")
@Operation(summary = "获得库存统计列表")
@PreAuthorize("@ss.hasPermission('wms:inventory:query')")
public CommonResult<List<WmsInventoryRespVO>> getInventoryList(@Valid WmsInventoryListReqVO listReqVO) {
List<WmsInventoryDO> list = inventoryService.getInventoryList(listReqVO);
return success(buildInventoryRespVOList(list));
}
// ==================== 拼接 VO ====================
private List<WmsInventoryRespVO> buildInventoryRespVOList(List<WmsInventoryDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
Map<Long, WmsItemSkuDO> skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsInventoryDO::getSkuId));
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
convertSet(list, WmsInventoryDO::getWarehouseId));
return BeanUtils.toBean(list, WmsInventoryRespVO.class, vo -> {
MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> {
vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId());
MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode())
.setItemName(item.getName()).setUnit(item.getUnit()));
});
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
});
}
}

View File

@@ -0,0 +1,79 @@
package cn.iocoder.yudao.module.wms.controller.admin.inventory;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.history.WmsInventoryHistoryPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.history.WmsInventoryHistoryRespVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryHistoryDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryHistoryService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@Tag(name = "管理后台 - WMS 库存流水")
@RestController
@RequestMapping("/wms/inventory-history")
@Validated
public class WmsInventoryHistoryController {
@Resource
private WmsInventoryHistoryService inventoryHistoryService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private WmsWarehouseService warehouseService;
@GetMapping("/page")
@Operation(summary = "获得库存流水分页")
@PreAuthorize("@ss.hasPermission('wms:inventory-history:query')")
public CommonResult<PageResult<WmsInventoryHistoryRespVO>> getInventoryHistoryPage(
@Valid WmsInventoryHistoryPageReqVO pageReqVO) {
PageResult<WmsInventoryHistoryDO> pageResult = inventoryHistoryService.getInventoryHistoryPage(pageReqVO);
return success(new PageResult<>(buildInventoryHistoryRespVOList(pageResult.getList()), pageResult.getTotal()));
}
// ==================== 拼接 VO ====================
private List<WmsInventoryHistoryRespVO> buildInventoryHistoryRespVOList(List<WmsInventoryHistoryDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
Map<Long, WmsItemSkuDO> skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsInventoryHistoryDO::getSkuId));
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
convertSet(list, WmsInventoryHistoryDO::getWarehouseId));
return BeanUtils.toBean(list, WmsInventoryHistoryRespVO.class, vo -> {
MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> {
vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId());
MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode())
.setItemName(item.getName()).setUnit(item.getUnit()));
});
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
});
}
}

View File

@@ -0,0 +1,15 @@
package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Schema(description = "管理后台 - WMS 库存统计列表 Request VO")
@Data
public class WmsInventoryListReqVO {
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
@NotNull(message = "仓库编号不能为空")
private Long warehouseId;
}

View File

@@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.math.BigDecimal;
@Schema(description = "管理后台 - WMS 库存统计分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsInventoryPageReqVO extends PageParam {
/**
* 按仓库维度统计
*/
public static final String TYPE_WAREHOUSE = "warehouse";
/**
* 按商品维度统计
*/
public static final String TYPE_ITEM = "item";
@Schema(description = "统计维度", requiredMode = Schema.RequiredMode.REQUIRED, example = "warehouse")
@NotBlank(message = "统计维度不能为空")
private String type;
@Schema(description = "商品编号", example = "ITEM001")
private String itemCode;
@Schema(description = "商品名称", example = "红富士苹果")
private String itemName;
@Schema(description = "商品 SKU 编号", example = "1024")
private Long skuId;
@Schema(description = "规格编号", example = "SKU001")
private String skuCode;
@Schema(description = "规格名称", example = "10kg 箱装")
private String skuName;
@Schema(description = "仓库编号", example = "2048")
private Long warehouseId;
@Schema(description = "最小库存数量", example = "0.01")
private BigDecimal minQuantity;
@Schema(description = "是否只查询正库存", example = "true")
private Boolean onlyPositiveQuantity;
}

View File

@@ -0,0 +1,44 @@
package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 库存统计 Response VO")
@Data
public class WmsInventoryRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
private Long itemId;
@Schema(description = "商品编码", example = "ITEM001")
private String itemCode;
@Schema(description = "商品名称", example = "红富士苹果")
private String itemName;
@Schema(description = "商品单位", example = "")
private String unit;
@Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096")
private Long skuId;
@Schema(description = "规格编号", example = "SKU001")
private String skuCode;
@Schema(description = "规格名称", example = "10kg 箱装")
private String skuName;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8192")
private Long warehouseId;
@Schema(description = "仓库名称", example = "成品仓")
private String warehouseName;
@Schema(description = "库存数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
private BigDecimal quantity;
@Schema(description = "备注", example = "备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,48 @@
package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.history;
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;
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 = "管理后台 - WMS 库存流水分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsInventoryHistoryPageReqVO extends PageParam {
@Schema(description = "商品编号", example = "ITEM001")
private String itemCode;
@Schema(description = "商品名称", example = "红富士苹果")
private String itemName;
@Schema(description = "商品 SKU 编号", example = "1024")
private Long skuId;
@Schema(description = "规格编号", example = "SKU001")
private String skuCode;
@Schema(description = "规格名称", example = "10kg 箱装")
private String skuName;
@Schema(description = "仓库编号", example = "2048")
private Long warehouseId;
@Schema(description = "单据号", example = "RK202605110001")
private String orderNo;
@Schema(description = "单据类型", example = "1")
private Integer orderType;
@Schema(description = "操作时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@@ -0,0 +1,59 @@
package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.history;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 库存流水 Response VO")
@Data
public class WmsInventoryHistoryRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
private Long itemId;
@Schema(description = "商品编码", example = "ITEM001")
private String itemCode;
@Schema(description = "商品名称", example = "红富士苹果")
private String itemName;
@Schema(description = "商品单位", example = "")
private String unit;
@Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096")
private Long skuId;
@Schema(description = "规格编号", example = "SKU001")
private String skuCode;
@Schema(description = "规格名称", example = "10kg 箱装")
private String skuName;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8192")
private Long warehouseId;
@Schema(description = "仓库名称", example = "成品仓")
private String warehouseName;
@Schema(description = "库存变化数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10.00")
private BigDecimal quantity;
@Schema(description = "变化前库存数量", example = "90.00")
private BigDecimal beforeQuantity;
@Schema(description = "变化后库存数量", example = "100.00")
private BigDecimal afterQuantity;
@Schema(description = "单价", example = "1000.00")
private BigDecimal price;
@Schema(description = "库存变化金额", example = "10000.00")
private BigDecimal totalPrice;
@Schema(description = "备注", example = "备注")
private String remark;
@Schema(description = "单据编号", example = "1024")
private Long orderId;
@Schema(description = "单据号", example = "RK202605110001")
private String orderNo;
@Schema(description = "单据类型", example = "1")
private Integer orderType;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,100 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.brand.WmsItemBrandPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.brand.WmsItemBrandRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.brand.WmsItemBrandSaveReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemBrandDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemBrandService;
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 = "管理后台 - WMS 商品品牌")
@RestController
@RequestMapping("/wms/item-brand")
@Validated
public class WmsItemBrandController {
@Resource
private WmsItemBrandService brandService;
@PostMapping("/create")
@Operation(summary = "创建商品品牌")
@PreAuthorize("@ss.hasPermission('wms:item-brand:create')")
public CommonResult<Long> createItemBrand(@Valid @RequestBody WmsItemBrandSaveReqVO createReqVO) {
return success(brandService.createItemBrand(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新商品品牌")
@PreAuthorize("@ss.hasPermission('wms:item-brand:update')")
public CommonResult<Boolean> updateItemBrand(@Valid @RequestBody WmsItemBrandSaveReqVO updateReqVO) {
brandService.updateItemBrand(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除商品品牌")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:item-brand:delete')")
public CommonResult<Boolean> deleteItemBrand(@RequestParam("id") Long id) {
brandService.deleteItemBrand(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得商品品牌")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:item-brand:query')")
public CommonResult<WmsItemBrandRespVO> getItemBrand(@RequestParam("id") Long id) {
WmsItemBrandDO brand = brandService.getItemBrand(id);
return success(BeanUtils.toBean(brand, WmsItemBrandRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得商品品牌分页")
@PreAuthorize("@ss.hasPermission('wms:item-brand:query')")
public CommonResult<PageResult<WmsItemBrandRespVO>> getItemBrandPage(@Valid WmsItemBrandPageReqVO pageReqVO) {
PageResult<WmsItemBrandDO> pageResult = brandService.getItemBrandPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, WmsItemBrandRespVO.class));
}
@GetMapping("/simple-list")
@Operation(summary = "获得商品品牌精简列表", description = "主要用于前端下拉")
@PreAuthorize("@ss.hasPermission('wms:item-brand:query')")
public CommonResult<List<WmsItemBrandRespVO>> getItemBrandSimpleList() {
List<WmsItemBrandDO> list = brandService.getItemBrandList();
return success(BeanUtils.toBean(list, WmsItemBrandRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出商品品牌 Excel")
@PreAuthorize("@ss.hasPermission('wms:item-brand:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportItemBrandExcel(@Valid WmsItemBrandPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<WmsItemBrandDO> list = brandService.getItemBrandPage(pageReqVO).getList();
ExcelUtils.write(response, "商品品牌.xls", "数据", WmsItemBrandRespVO.class,
BeanUtils.toBean(list, WmsItemBrandRespVO.class));
}
}

View File

@@ -0,0 +1,81 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.category.WmsItemCategoryListReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.category.WmsItemCategoryRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.category.WmsItemCategorySaveReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemCategoryDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemCategoryService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - WMS 商品分类")
@RestController
@RequestMapping("/wms/item-category")
@Validated
public class WmsItemCategoryController {
@Resource
private WmsItemCategoryService categoryService;
@PostMapping("/create")
@Operation(summary = "创建商品分类")
@PreAuthorize("@ss.hasPermission('wms:item-category:create')")
public CommonResult<Long> createItemCategory(@Valid @RequestBody WmsItemCategorySaveReqVO createReqVO) {
return success(categoryService.createItemCategory(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新商品分类")
@PreAuthorize("@ss.hasPermission('wms:item-category:update')")
public CommonResult<Boolean> updateItemCategory(@Valid @RequestBody WmsItemCategorySaveReqVO updateReqVO) {
categoryService.updateItemCategory(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除商品分类")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:item-category:delete')")
public CommonResult<Boolean> deleteItemCategory(@RequestParam("id") Long id) {
categoryService.deleteItemCategory(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得商品分类")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:item-category:query')")
public CommonResult<WmsItemCategoryRespVO> getItemCategory(@RequestParam("id") Long id) {
WmsItemCategoryDO category = categoryService.getItemCategory(id);
return success(BeanUtils.toBean(category, WmsItemCategoryRespVO.class));
}
@GetMapping("/list")
@Operation(summary = "获得商品分类列表")
@PreAuthorize("@ss.hasPermission('wms:item-category:query')")
public CommonResult<List<WmsItemCategoryRespVO>> getItemCategoryList(@Valid WmsItemCategoryListReqVO listReqVO) {
List<WmsItemCategoryDO> list = categoryService.getItemCategoryList(listReqVO);
return success(BeanUtils.toBean(list, WmsItemCategoryRespVO.class));
}
@GetMapping("/simple-list")
@Operation(summary = "获得商品分类精简列表", description = "主要用于前端下拉")
@PreAuthorize("@ss.hasPermission('wms:item-category:query')")
public CommonResult<List<WmsItemCategoryRespVO>> getItemCategorySimpleList() {
List<WmsItemCategoryDO> list = categoryService.getItemCategoryList(new WmsItemCategoryListReqVO());
return success(BeanUtils.toBean(list, WmsItemCategoryRespVO.class));
}
}

View File

@@ -0,0 +1,150 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item.WmsItemListReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item.WmsItemPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item.WmsItemRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item.WmsItemSaveReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku.WmsItemSkuRespVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemBrandDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemCategoryDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemBrandService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemCategoryService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
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.*;
@Tag(name = "管理后台 - WMS 商品")
@RestController
@RequestMapping("/wms/item")
@Validated
public class WmsItemController {
@Resource
private WmsItemService itemService;
@Resource
private WmsItemCategoryService categoryService;
@Resource
private WmsItemBrandService brandService;
@Resource
private WmsItemSkuService itemSkuService;
@PostMapping("/create")
@Operation(summary = "创建商品")
@PreAuthorize("@ss.hasPermission('wms:item:create')")
public CommonResult<Long> createItem(@Valid @RequestBody WmsItemSaveReqVO createReqVO) {
return success(itemService.createItem(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新商品")
@PreAuthorize("@ss.hasPermission('wms:item:update')")
public CommonResult<Boolean> updateItem(@Valid @RequestBody WmsItemSaveReqVO updateReqVO) {
itemService.updateItem(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除商品")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:item:delete')")
public CommonResult<Boolean> deleteItem(@RequestParam("id") Long id) {
itemService.deleteItem(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得商品")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:item:query')")
public CommonResult<WmsItemRespVO> getItem(@RequestParam("id") Long id) {
WmsItemDO item = itemService.getItem(id);
return success(buildItemRespVO(item));
}
@GetMapping("/page")
@Operation(summary = "获得商品分页")
@PreAuthorize("@ss.hasPermission('wms:item:query')")
public CommonResult<PageResult<WmsItemRespVO>> getItemPage(@Valid WmsItemPageReqVO pageReqVO) {
PageResult<WmsItemDO> pageResult = itemService.getItemPage(pageReqVO);
return success(new PageResult<>(buildItemRespVOList(pageResult.getList()), pageResult.getTotal()));
}
@GetMapping("/simple-list")
@Operation(summary = "获得商品精简列表")
@PreAuthorize("@ss.hasPermission('wms:item:query')")
public CommonResult<List<WmsItemRespVO>> getItemSimpleList(@Valid WmsItemListReqVO listReqVO) {
List<WmsItemDO> list = itemService.getItemList(listReqVO);
return success(buildItemRespVOList(list));
}
@GetMapping("/export-excel")
@Operation(summary = "导出商品 Excel")
@PreAuthorize("@ss.hasPermission('wms:item:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportItemExcel(@Valid WmsItemPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<WmsItemDO> list = itemService.getItemPage(pageReqVO).getList();
ExcelUtils.write(response, "商品.xls", "数据", WmsItemRespVO.class,
buildItemRespVOList(list));
}
// ==================== 拼接 VO ====================
private WmsItemRespVO buildItemRespVO(WmsItemDO item) {
if (item == null) {
return null;
}
return getFirst(buildItemRespVOList(Collections.singletonList(item)));
}
private List<WmsItemRespVO> buildItemRespVOList(List<WmsItemDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 查询关联数据
Map<Long, WmsItemCategoryDO> categoryMap = categoryService.getItemCategoryMap(
convertSet(list, WmsItemDO::getCategoryId));
Map<Long, WmsItemBrandDO> brandMap = brandService.getItemBrandMap(
convertSet(list, WmsItemDO::getBrandId));
Map<Long, List<WmsItemSkuDO>> skuMap = itemSkuService.getItemSkuMultiMap(
convertSet(list, WmsItemDO::getId));
// 拼接 VO
return BeanUtils.toBean(list, WmsItemRespVO.class, vo -> {
MapUtils.findAndThen(categoryMap, vo.getCategoryId(), category ->
vo.setCategoryName(category.getName()));
MapUtils.findAndThen(brandMap, vo.getBrandId(), brand ->
vo.setBrandName(brand.getName()));
vo.setSkus(BeanUtils.toBean(skuMap.getOrDefault(vo.getId(), Collections.emptyList()),
WmsItemSkuRespVO.class));
});
}
}

View File

@@ -0,0 +1,89 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku.WmsItemSkuPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku.WmsItemSkuRespVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemBrandDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemCategoryDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemBrandService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemCategoryService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
/**
* WMS 商品 SKU Controller。
*
* <p>SKU 维度的查询入口:弹窗 / 选择器场景使用,按 SKU 一行展开,支持商品 / 品牌 / 分类多表联查筛选。
* 复用商品权限 {@code wms:item:query}不单独建权限点lite 也是商品/SKU 共用 {@code wms:item:list})。
*
* <p>SKU 的新增 / 修改 / 删除仍随商品弹窗一并维护,不在本 Controller 暴露。
*/
@Tag(name = "管理后台 - WMS 商品 SKU")
@RestController
@RequestMapping("/wms/item-sku")
@Validated
public class WmsItemSkuController {
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemCategoryService categoryService;
@Resource
private WmsItemBrandService brandService;
@GetMapping("/page")
@Operation(summary = "获得商品 SKU 分页", description = "按 SKU 维度分页,支持商品 / 品牌 / 分类多表联查筛选")
@PreAuthorize("@ss.hasPermission('wms:item:query')")
public CommonResult<PageResult<WmsItemSkuRespVO>> getItemSkuPage(@Valid WmsItemSkuPageReqVO pageReqVO) {
PageResult<WmsItemSkuDO> pageResult = itemSkuService.getItemSkuPage(pageReqVO);
return success(new PageResult<>(buildItemSkuRespVOList(pageResult.getList()), pageResult.getTotal()));
}
// ==================== 拼接 VO ====================
private List<WmsItemSkuRespVO> buildItemSkuRespVOList(List<WmsItemSkuDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 查询关联数据
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(list, WmsItemSkuDO::getItemId));
Map<Long, WmsItemCategoryDO> categoryMap = categoryService.getItemCategoryMap(
convertSet(itemMap.values(), WmsItemDO::getCategoryId));
Map<Long, WmsItemBrandDO> brandMap = brandService.getItemBrandMap(
convertSet(itemMap.values(), WmsItemDO::getBrandId));
// 拼接 VO
return BeanUtils.toBean(list, WmsItemSkuRespVO.class, vo -> MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
vo.setItemCode(item.getCode()).setItemName(item.getName()).setUnit(item.getUnit())
.setCategoryId(item.getCategoryId()).setBrandId(item.getBrandId());
MapUtils.findAndThen(categoryMap, item.getCategoryId(), category ->
vo.setCategoryName(category.getName()));
MapUtils.findAndThen(brandMap, item.getBrandId(), brand ->
vo.setBrandName(brand.getName()));
}));
}
}

View File

@@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.brand;
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 = "管理后台 - WMS 商品品牌分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsItemBrandPageReqVO extends PageParam {
@Schema(description = "品牌编号", example = "B00000001")
private String code;
@Schema(description = "品牌名称", example = "华为")
private String name;
}

View File

@@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.brand;
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.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 商品品牌 Response VO")
@Data
@ExcelIgnoreUnannotated
public class WmsItemBrandRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@ExcelProperty("编号")
private Long id;
@Schema(description = "品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "B00000001")
@ExcelProperty("品牌编号")
private String code;
@Schema(description = "品牌名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "华为")
@ExcelProperty("品牌名称")
private String name;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,25 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.brand;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Schema(description = "管理后台 - WMS 商品品牌新增/修改 Request VO")
@Data
public class WmsItemBrandSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "B00000001")
@NotEmpty(message = "品牌编号不能为空")
@Size(max = 20, message = "品牌编号长度不能超过 20 个字符")
private String code;
@Schema(description = "品牌名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "华为")
@NotEmpty(message = "品牌名称不能为空")
@Size(max = 30, message = "品牌名称长度不能超过 30 个字符")
private String name;
}

View File

@@ -0,0 +1,25 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.category;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - WMS 商品分类列表 Request VO")
@Data
public class WmsItemCategoryListReqVO {
@Schema(description = "父级编号", example = "1")
private Long parentId;
@Schema(description = "分类编号", example = "C00000001")
private String code;
@Schema(description = "分类名称", example = "原料")
private String name;
@Schema(description = "状态", example = "0")
@InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}")
private Integer status;
}

View File

@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.category;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 商品分类 Response VO")
@Data
public class WmsItemCategoryRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "父级编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
private Long parentId;
@Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "C00000001")
private String code;
@Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料")
private String name;
@Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer sort;
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
private Integer status;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,41 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.category;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Schema(description = "管理后台 - WMS 商品分类新增/修改 Request VO")
@Data
public class WmsItemCategorySaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "父级编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
@NotNull(message = "父级编号不能为空")
private Long parentId;
@Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "C00000001")
@NotEmpty(message = "分类编号不能为空")
@Size(max = 20, message = "分类编号长度不能超过 20 个字符")
private String code;
@Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料")
@NotEmpty(message = "分类名称不能为空")
@Size(max = 30, message = "分类名称长度不能超过 30 个字符")
private String name;
@Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "排序不能为空")
private Integer sort;
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
@NotNull(message = "状态不能为空")
@InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}")
private Integer status;
}

View File

@@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
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 = "管理后台 - WMS 商品列表 Request VO")
@Data
public class WmsItemListReqVO {
@Schema(description = "商品编号", example = "ITEM001")
private String code;
@Schema(description = "商品名称", example = "华为 nova flip")
private String name;
@Schema(description = "商品分类编号", example = "1024")
private Long categoryId;
@Schema(description = "商品品牌编号", example = "2048")
private Long brandId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item;
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;
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 = "管理后台 - WMS 商品分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsItemPageReqVO extends PageParam {
@Schema(description = "商品编号", example = "ITEM001")
private String code;
@Schema(description = "商品名称", example = "华为 nova flip")
private String name;
@Schema(description = "商品分类编号", example = "1024")
private Long categoryId;
@Schema(description = "商品品牌编号", example = "2048")
private Long brandId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@@ -0,0 +1,58 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku.WmsItemSkuRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - WMS 商品 Response VO")
@Data
@ExcelIgnoreUnannotated
public class WmsItemRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@ExcelProperty("编号")
private Long id;
@Schema(description = "商品编号", example = "ITEM001")
@ExcelProperty("商品编号")
private String code;
@Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "华为 nova flip")
@ExcelProperty("商品名称")
private String name;
@Schema(description = "商品分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long categoryId;
@Schema(description = "商品分类名称", example = "手机")
@ExcelProperty("商品分类")
private String categoryName;
@Schema(description = "单位", example = "")
@ExcelProperty("单位")
private String unit;
@Schema(description = "商品品牌编号", example = "1")
private Long brandId;
@Schema(description = "商品品牌名称", example = "华为")
@ExcelProperty("商品品牌")
private String brandName;
@Schema(description = "备注", example = "备注")
@ExcelProperty("备注")
private String remark;
@Schema(description = "规格列表")
private List<WmsItemSkuRespVO> skus;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,51 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku.WmsItemSkuSaveReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.util.List;
@Schema(description = "管理后台 - WMS 商品创建/更新 Request VO")
@Data
public class WmsItemSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "ITEM001")
@NotBlank(message = "商品编号不能为空")
@Size(max = 20, message = "商品编号长度不能超过 20 个字符")
private String code;
@Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "华为 nova flip")
@NotBlank(message = "商品名称不能为空")
@Size(max = 60, message = "商品名称长度不能超过 60 个字符")
private String name;
@Schema(description = "商品分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "商品分类不能为空")
private Long categoryId;
@Schema(description = "单位", example = "")
@Size(max = 20, message = "单位长度不能超过 20 个字符")
private String unit;
@Schema(description = "商品品牌编号", example = "1")
private Long brandId;
@Schema(description = "备注", example = "备注")
@Size(max = 255, message = "备注长度不能超过 255 个字符")
private String remark;
@Schema(description = "规格列表")
@Valid
@NotEmpty(message = "至少包含一个商品规格")
private List<WmsItemSkuSaveReqVO> skus;
}

View File

@@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku;
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 = "管理后台 - WMS 商品 SKU 分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsItemSkuPageReqVO extends PageParam {
@Schema(description = "商品编号", example = "I00000001")
private String itemCode;
@Schema(description = "商品名称", example = "华为 nova flip")
private String itemName;
@Schema(description = "商品分类编号", example = "1")
private Long categoryId;
@Schema(description = "商品品牌编号", example = "1")
private Long brandId;
@Schema(description = "规格编号", example = "S00000001")
private String code;
@Schema(description = "规格名称", example = "黑色")
private String name;
@Schema(description = "条码", example = "12345678")
private String barCode;
}

View File

@@ -0,0 +1,73 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 商品 SKU Response VO")
@Data
public class WmsItemSkuRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "黑色")
private String name;
@Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long itemId;
@Schema(description = "商品编码", example = "ITEM001")
private String itemCode;
@Schema(description = "商品名称", example = "华为 nova flip")
private String itemName;
@Schema(description = "商品分类编号", example = "1")
private Long categoryId;
@Schema(description = "商品分类名称", example = "手机")
private String categoryName;
@Schema(description = "单位", example = "")
private String unit;
@Schema(description = "商品品牌编号", example = "1")
private Long brandId;
@Schema(description = "商品品牌名称", example = "华为")
private String brandName;
@Schema(description = "条码", example = "690000000001")
private String barCode;
@Schema(description = "规格编号", example = "SKU001")
private String code;
@Schema(description = "长,单位 cm", example = "10.0")
private BigDecimal length;
@Schema(description = "宽,单位 cm", example = "8.0")
private BigDecimal width;
@Schema(description = "高,单位 cm", example = "1.0")
private BigDecimal height;
@Schema(description = "毛重,单位 kg", example = "1.000")
private BigDecimal grossWeight;
@Schema(description = "净重,单位 kg", example = "0.900")
private BigDecimal netWeight;
@Schema(description = "成本价,单位元", example = "5000.00")
private BigDecimal costPrice;
@Schema(description = "销售价,单位元", example = "5288.00")
private BigDecimal sellingPrice;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,62 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "管理后台 - WMS 商品 SKU 创建/更新 Request VO")
@Data
public class WmsItemSkuSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "规格名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "黑色")
@NotBlank(message = "规格名称不能为空")
@Size(max = 255, message = "规格名称长度不能超过 255 个字符")
private String name;
@Schema(description = "商品编号", example = "1")
private Long itemId;
@Schema(description = "条码", example = "690000000001")
@Size(max = 64, message = "条码长度不能超过 64 个字符")
private String barCode;
@Schema(description = "规格编号", example = "SKU001")
@Size(max = 64, message = "规格编号长度不能超过 64 个字符")
private String code;
@Schema(description = "长,单位 cm", example = "10.0")
@DecimalMin(value = "0", message = "长不能小于 0")
private BigDecimal length;
@Schema(description = "宽,单位 cm", example = "8.0")
@DecimalMin(value = "0", message = "宽不能小于 0")
private BigDecimal width;
@Schema(description = "高,单位 cm", example = "1.0")
@DecimalMin(value = "0", message = "高不能小于 0")
private BigDecimal height;
@Schema(description = "毛重,单位 kg", example = "1.000")
@DecimalMin(value = "0", message = "毛重不能小于 0")
private BigDecimal grossWeight;
@Schema(description = "净重,单位 kg", example = "0.900")
@DecimalMin(value = "0", message = "净重不能小于 0")
private BigDecimal netWeight;
@Schema(description = "成本价,单位元", example = "5000.00")
@DecimalMin(value = "0", message = "成本价不能小于 0")
private BigDecimal costPrice;
@Schema(description = "销售价,单位元", example = "5288.00")
@DecimalMin(value = "0", message = "销售价不能小于 0")
private BigDecimal sellingPrice;
}

View File

@@ -0,0 +1,101 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.merchant;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.wms.controller.admin.md.merchant.vo.WmsMerchantListReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.merchant.vo.WmsMerchantPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.merchant.vo.WmsMerchantRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.merchant.vo.WmsMerchantSaveReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.merchant.WmsMerchantDO;
import cn.iocoder.yudao.module.wms.service.md.merchant.WmsMerchantService;
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 = "管理后台 - WMS 往来企业")
@RestController
@RequestMapping("/wms/merchant")
@Validated
public class WmsMerchantController {
@Resource
private WmsMerchantService merchantService;
@PostMapping("/create")
@Operation(summary = "创建往来企业")
@PreAuthorize("@ss.hasPermission('wms:merchant:create')")
public CommonResult<Long> createMerchant(@Valid @RequestBody WmsMerchantSaveReqVO createReqVO) {
return success(merchantService.createMerchant(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新往来企业")
@PreAuthorize("@ss.hasPermission('wms:merchant:update')")
public CommonResult<Boolean> updateMerchant(@Valid @RequestBody WmsMerchantSaveReqVO updateReqVO) {
merchantService.updateMerchant(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除往来企业")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:merchant:delete')")
public CommonResult<Boolean> deleteMerchant(@RequestParam("id") Long id) {
merchantService.deleteMerchant(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得往来企业")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:merchant:query')")
public CommonResult<WmsMerchantRespVO> getMerchant(@RequestParam("id") Long id) {
WmsMerchantDO merchant = merchantService.getMerchant(id);
return success(BeanUtils.toBean(merchant, WmsMerchantRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得往来企业分页")
@PreAuthorize("@ss.hasPermission('wms:merchant:query')")
public CommonResult<PageResult<WmsMerchantRespVO>> getMerchantPage(@Valid WmsMerchantPageReqVO pageReqVO) {
PageResult<WmsMerchantDO> pageResult = merchantService.getMerchantPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, WmsMerchantRespVO.class));
}
@GetMapping("/simple-list")
@Operation(summary = "获得往来企业精简列表", description = "主要用于前端下拉")
@PreAuthorize("@ss.hasPermission('wms:merchant:query')")
public CommonResult<List<WmsMerchantRespVO>> getMerchantSimpleList(@Valid WmsMerchantListReqVO listReqVO) {
List<WmsMerchantDO> list = merchantService.getMerchantList(listReqVO);
return success(BeanUtils.toBean(list, WmsMerchantRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出往来企业 Excel")
@PreAuthorize("@ss.hasPermission('wms:merchant:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportMerchantExcel(@Valid WmsMerchantPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<WmsMerchantDO> list = merchantService.getMerchantPage(pageReqVO).getList();
ExcelUtils.write(response, "往来企业.xls", "数据", WmsMerchantRespVO.class,
BeanUtils.toBean(list, WmsMerchantRespVO.class));
}
}

View File

@@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.merchant.vo;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.wms.enums.md.WmsMerchantTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Schema(description = "管理后台 - WMS 往来企业列表 Request VO")
@Data
public class WmsMerchantListReqVO {
@Schema(description = "往来企业编号", example = "MER001")
private String code;
@Schema(description = "往来企业名称", example = "华为")
private String name;
@Schema(description = "往来企业类型", example = "2")
@InEnum(value = WmsMerchantTypeEnum.class, message = "往来企业类型必须是 {value}")
private Integer type;
@Schema(description = "往来企业类型数组", example = "2,3")
@InEnum(value = WmsMerchantTypeEnum.class, message = "往来企业类型必须是 {value}")
private List<Integer> types;
}

View File

@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.merchant.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.wms.enums.md.WmsMerchantTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.List;
@Schema(description = "管理后台 - WMS 往来企业分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsMerchantPageReqVO extends PageParam {
@Schema(description = "往来企业编号", example = "MER001")
private String code;
@Schema(description = "往来企业名称", example = "华为")
private String name;
@Schema(description = "往来企业类型", example = "2")
@InEnum(value = WmsMerchantTypeEnum.class, message = "往来企业类型必须是 {value}")
private Integer type;
@Schema(description = "往来企业类型数组", example = "2,3")
@InEnum(value = WmsMerchantTypeEnum.class, message = "往来企业类型必须是 {value}")
private List<Integer> types;
}

View File

@@ -0,0 +1,68 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.merchant.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.module.wms.enums.DictTypeConstants;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 往来企业 Response VO")
@Data
@ExcelIgnoreUnannotated
public class WmsMerchantRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@ExcelProperty("编号")
private Long id;
@Schema(description = "往来企业编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "MER001")
@ExcelProperty("往来企业编号")
private String code;
@Schema(description = "往来企业名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "华为")
@ExcelProperty("往来企业名称")
private String name;
@Schema(description = "往来企业类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@ExcelProperty(value = "往来企业类型", converter = DictConvert.class)
@DictFormat(DictTypeConstants.MERCHANT_TYPE)
private Integer type;
@Schema(description = "级别", example = "A")
@ExcelProperty("级别")
private String level;
@Schema(description = "开户行", example = "招商银行")
private String bankName;
@Schema(description = "银行账户", example = "6225888888888888")
private String bankAccount;
@Schema(description = "地址", example = "深圳市南山区")
private String address;
@Schema(description = "手机号", example = "15601691300")
private String mobile;
@Schema(description = "座机号", example = "0755-88888888")
private String telephone;
@Schema(description = "联系人", example = "王五")
@ExcelProperty("联系人")
private String contact;
@Schema(description = "Email", example = "wms@example.com")
private String email;
@Schema(description = "备注", example = "备注")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,69 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.merchant.vo;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.wms.enums.md.WmsMerchantTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Schema(description = "管理后台 - WMS 往来企业创建/更新 Request VO")
@Data
public class WmsMerchantSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "往来企业编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "MER001")
@NotBlank(message = "往来企业编号不能为空")
@Size(max = 20, message = "往来企业编号长度不能超过 20 个字符")
private String code;
@Schema(description = "往来企业名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "华为")
@NotBlank(message = "往来企业名称不能为空")
@Size(max = 60, message = "往来企业名称长度不能超过 60 个字符")
private String name;
@Schema(description = "往来企业类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@NotNull(message = "往来企业类型不能为空")
@InEnum(value = WmsMerchantTypeEnum.class, message = "往来企业类型必须是 {value}")
private Integer type;
@Schema(description = "级别", example = "A")
@Size(max = 10, message = "级别长度不能超过 10 个字符")
private String level;
@Schema(description = "开户行", example = "招商银行")
@Size(max = 255, message = "开户行长度不能超过 255 个字符")
private String bankName;
@Schema(description = "银行账户", example = "6225888888888888")
@Size(max = 40, message = "银行账户长度不能超过 40 个字符")
private String bankAccount;
@Schema(description = "地址", example = "深圳市南山区")
@Size(max = 200, message = "地址长度不能超过 200 个字符")
private String address;
@Schema(description = "手机号", example = "15601691300")
@Size(max = 13, message = "手机号长度不能超过 13 个字符")
private String mobile;
@Schema(description = "座机号", example = "0755-88888888")
@Size(max = 13, message = "座机号长度不能超过 13 个字符")
private String telephone;
@Schema(description = "联系人", example = "王五")
@Size(max = 30, message = "联系人长度不能超过 30 个字符")
private String contact;
@Schema(description = "Email", example = "wms@example.com")
@Size(max = 50, message = "Email 长度不能超过 50 个字符")
private String email;
@Schema(description = "备注", example = "备注")
@Size(max = 255, message = "备注长度不能超过 255 个字符")
private String remark;
}

View File

@@ -0,0 +1,100 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.warehouse;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.wms.controller.admin.md.warehouse.vo.WmsWarehousePageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.warehouse.vo.WmsWarehouseRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.warehouse.vo.WmsWarehouseSaveReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService;
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 = "管理后台 - WMS 仓库")
@RestController
@RequestMapping("/wms/warehouse")
@Validated
public class WmsWarehouseController {
@Resource
private WmsWarehouseService warehouseService;
@PostMapping("/create")
@Operation(summary = "创建仓库")
@PreAuthorize("@ss.hasPermission('wms:warehouse:create')")
public CommonResult<Long> createWarehouse(@Valid @RequestBody WmsWarehouseSaveReqVO createReqVO) {
return success(warehouseService.createWarehouse(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新仓库")
@PreAuthorize("@ss.hasPermission('wms:warehouse:update')")
public CommonResult<Boolean> updateWarehouse(@Valid @RequestBody WmsWarehouseSaveReqVO updateReqVO) {
warehouseService.updateWarehouse(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除仓库")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:warehouse:delete')")
public CommonResult<Boolean> 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('wms:warehouse:query')")
public CommonResult<WmsWarehouseRespVO> getWarehouse(@RequestParam("id") Long id) {
WmsWarehouseDO warehouse = warehouseService.getWarehouse(id);
return success(BeanUtils.toBean(warehouse, WmsWarehouseRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得仓库分页")
@PreAuthorize("@ss.hasPermission('wms:warehouse:query')")
public CommonResult<PageResult<WmsWarehouseRespVO>> getWarehousePage(@Valid WmsWarehousePageReqVO pageReqVO) {
PageResult<WmsWarehouseDO> pageResult = warehouseService.getWarehousePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, WmsWarehouseRespVO.class));
}
@GetMapping("/simple-list")
@Operation(summary = "获得仓库精简列表", description = "主要用于前端下拉")
@PreAuthorize("@ss.hasPermission('wms:warehouse:query')")
public CommonResult<List<WmsWarehouseRespVO>> getWarehouseSimpleList() {
List<WmsWarehouseDO> list = warehouseService.getWarehouseList();
return success(BeanUtils.toBean(list, WmsWarehouseRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出仓库 Excel")
@PreAuthorize("@ss.hasPermission('wms:warehouse:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportWarehouseExcel(@Valid WmsWarehousePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<WmsWarehouseDO> list = warehouseService.getWarehousePage(pageReqVO).getList();
ExcelUtils.write(response, "仓库.xls", "数据", WmsWarehouseRespVO.class,
BeanUtils.toBean(list, WmsWarehouseRespVO.class));
}
}

View File

@@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.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 = "管理后台 - WMS 仓库分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsWarehousePageReqVO extends PageParam {
@Schema(description = "仓库编号", example = "WH001")
private String code;
@Schema(description = "仓库名称", example = "原料仓")
private String name;
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.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.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 仓库 Response VO")
@Data
@ExcelIgnoreUnannotated
public class WmsWarehouseRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@ExcelProperty("编号")
private Long id;
@Schema(description = "仓库编号", example = "WH001")
@ExcelProperty("仓库编号")
private String code;
@Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料仓")
@ExcelProperty("仓库名称")
private String name;
@Schema(description = "备注", example = "备注")
@ExcelProperty("备注")
private String remark;
@Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("排序")
private Integer sort;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.wms.controller.admin.md.warehouse.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Schema(description = "管理后台 - WMS 仓库新增/修改 Request VO")
@Data
public class WmsWarehouseSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "WH001")
@NotEmpty(message = "仓库编号不能为空")
@Size(max = 20, message = "仓库编号长度不能超过 20 个字符")
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 Integer sort;
@Schema(description = "备注", example = "备注")
private String remark;
}

View File

@@ -0,0 +1,198 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.check;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.NumberUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.detail.WmsCheckOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order.WmsCheckOrderPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order.WmsCheckOrderRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order.WmsCheckOrderSaveReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.check.WmsCheckOrderDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.check.WmsCheckOrderDetailDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService;
import cn.iocoder.yudao.module.wms.service.order.check.WmsCheckOrderDetailService;
import cn.iocoder.yudao.module.wms.service.order.check.WmsCheckOrderService;
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.stream.Stream;
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;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
@Tag(name = "管理后台 - WMS 盘库单")
@RestController
@RequestMapping("/wms/check-order")
@Validated
public class WmsCheckOrderController {
@Resource
private WmsCheckOrderService checkOrderService;
@Resource
private WmsCheckOrderDetailService checkOrderDetailService;
@Resource
private WmsWarehouseService warehouseService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private AdminUserApi adminUserApi;
@PostMapping("/create")
@Operation(summary = "创建盘库单")
@PreAuthorize("@ss.hasPermission('wms:check-order:create')")
public CommonResult<Long> createCheckOrder(@Valid @RequestBody WmsCheckOrderSaveReqVO createReqVO) {
return success(checkOrderService.createCheckOrder(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新盘库单")
@PreAuthorize("@ss.hasPermission('wms:check-order:update')")
public CommonResult<Boolean> updateCheckOrder(@Valid @RequestBody WmsCheckOrderSaveReqVO updateReqVO) {
checkOrderService.updateCheckOrder(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除盘库单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:check-order:delete')")
public CommonResult<Boolean> deleteCheckOrder(@RequestParam("id") Long id) {
checkOrderService.deleteCheckOrder(id);
return success(true);
}
@PutMapping("/complete")
@Operation(summary = "完成盘库")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:check-order:complete')")
public CommonResult<Boolean> completeCheckOrder(@RequestParam("id") Long id) {
checkOrderService.completeCheckOrder(id);
return success(true);
}
@PutMapping("/cancel")
@Operation(summary = "作废盘库单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:check-order:cancel')")
public CommonResult<Boolean> cancelCheckOrder(@RequestParam("id") Long id) {
checkOrderService.cancelCheckOrder(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得盘库单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:check-order:query')")
public CommonResult<WmsCheckOrderRespVO> getCheckOrder(@RequestParam("id") Long id) {
WmsCheckOrderDO order = checkOrderService.getCheckOrder(id);
if (order == null) {
return success(null);
}
// 获得盘库单的明细列表
List<WmsCheckOrderDetailDO> detailList = checkOrderDetailService.getCheckOrderDetailList(id);
// 拼接结果返回
WmsCheckOrderRespVO respVO = buildCheckOrderRespVO(order)
.setDetails(buildCheckOrderDetailRespVOList(detailList));
return success(respVO);
}
@GetMapping("/page")
@Operation(summary = "获得盘库单分页")
@PreAuthorize("@ss.hasPermission('wms:check-order:query')")
public CommonResult<PageResult<WmsCheckOrderRespVO>> getCheckOrderPage(@Valid WmsCheckOrderPageReqVO pageReqVO) {
PageResult<WmsCheckOrderDO> pageResult = checkOrderService.getCheckOrderPage(pageReqVO);
return success(new PageResult<>(buildCheckOrderRespVOList(pageResult.getList()), pageResult.getTotal()));
}
@GetMapping("/export-excel")
@Operation(summary = "导出盘库单 Excel")
@PreAuthorize("@ss.hasPermission('wms:check-order:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportCheckOrderExcel(@Valid WmsCheckOrderPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<WmsCheckOrderDO> list = checkOrderService.getCheckOrderPage(pageReqVO).getList();
ExcelUtils.write(response, "盘库单.xls", "数据", WmsCheckOrderRespVO.class,
buildCheckOrderRespVOList(list));
}
// ==================== 拼接 VO ====================
private WmsCheckOrderRespVO buildCheckOrderRespVO(WmsCheckOrderDO order) {
if (order == null) {
return null;
}
List<WmsCheckOrderRespVO> list = buildCheckOrderRespVOList(Collections.singletonList(order));
return CollUtil.getFirst(list);
}
private List<WmsCheckOrderRespVO> buildCheckOrderRespVOList(List<WmsCheckOrderDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 获取相关的仓库、用户等数据
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(convertSet(list, WmsCheckOrderDO::getWarehouseId));
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSetByFlatMap(list,
order -> Stream.of(parseUserId(order.getCreator()), parseUserId(order.getUpdater()))));
// 拼接数据
return BeanUtils.toBean(list, WmsCheckOrderRespVO.class, vo -> {
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
MapUtils.findAndThen(userMap, parseUserId(vo.getCreator()), user -> vo.setCreatorName(user.getNickname()));
MapUtils.findAndThen(userMap, parseUserId(vo.getUpdater()), user -> vo.setUpdaterName(user.getNickname()));
});
}
private Long parseUserId(String userId) {
return NumberUtil.parseLong(userId, null);
}
private List<WmsCheckOrderDetailRespVO> buildCheckOrderDetailRespVOList(List<WmsCheckOrderDetailDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 获取相关的商品、SKU、仓库等数据
Map<Long, WmsItemSkuDO> skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsCheckOrderDetailDO::getSkuId));
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
convertSet(list, WmsCheckOrderDetailDO::getWarehouseId));
// 拼接数据
return BeanUtils.toBean(list, WmsCheckOrderDetailRespVO.class, vo -> {
MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> {
vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId());
MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode())
.setItemName(item.getName()).setUnit(item.getUnit()));
});
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
});
}
}

View File

@@ -0,0 +1,81 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.check;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.detail.WmsCheckOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.check.WmsCheckOrderDetailDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService;
import cn.iocoder.yudao.module.wms.service.order.check.WmsCheckOrderDetailService;
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 org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@Tag(name = "管理后台 - WMS 盘库单明细")
@RestController
@RequestMapping("/wms/check-order-detail")
@Validated
public class WmsCheckOrderDetailController {
@Resource
private WmsCheckOrderDetailService checkOrderDetailService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private WmsWarehouseService warehouseService;
@GetMapping("/list-by-order-id")
@Operation(summary = "获得盘库单明细列表")
@Parameter(name = "orderId", description = "盘库单编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:check-order:query')")
public CommonResult<List<WmsCheckOrderDetailRespVO>> getCheckOrderDetailListByOrderId(
@RequestParam("orderId") Long orderId) {
List<WmsCheckOrderDetailDO> list = checkOrderDetailService.getCheckOrderDetailList(orderId);
return success(buildCheckOrderDetailRespVOList(list));
}
// ==================== 拼接 VO ====================
private List<WmsCheckOrderDetailRespVO> buildCheckOrderDetailRespVOList(List<WmsCheckOrderDetailDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 查询关联数据
Map<Long, WmsItemSkuDO> skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsCheckOrderDetailDO::getSkuId));
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
convertSet(list, WmsCheckOrderDetailDO::getWarehouseId));
// 拼接数据
return BeanUtils.toBean(list, WmsCheckOrderDetailRespVO.class, vo -> {
MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> {
vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId());
MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode())
.setItemName(item.getName()).setUnit(item.getUnit()));
});
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
});
}
}

View File

@@ -0,0 +1,64 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.detail;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 盘库单明细 Response VO")
@Data
public class WmsCheckOrderDetailRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "盘库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long orderId;
@Schema(description = "商品编号", example = "2048")
private Long itemId;
@Schema(description = "商品编号", example = "SPU-APPLE")
private String itemCode;
@Schema(description = "商品名称", example = "红富士苹果")
private String itemName;
@Schema(description = "商品单位", example = "")
private String unit;
@Schema(description = "SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
private Long skuId;
@Schema(description = "规格编号", example = "SKU-APPLE-10KG")
private String skuCode;
@Schema(description = "规格名称", example = "10kg 箱装")
private String skuName;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long warehouseId;
@Schema(description = "仓库名称", example = "北京仓")
private String warehouseName;
@Schema(description = "库存编号", example = "1024")
private Long inventoryId;
@Schema(description = "入库时间")
private LocalDateTime receiptTime;
@Schema(description = "账面数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
private BigDecimal quantity;
@Schema(description = "实盘数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "98.00")
private BigDecimal checkQuantity;
@Schema(description = "单价", example = "1000.00")
private BigDecimal price;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.detail;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 盘库单明细保存 Request VO")
@Data
public class WmsCheckOrderDetailSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
@NotNull(message = "SKU 不能为空")
private Long skuId;
@Schema(description = "库存编号", example = "1024")
private Long inventoryId;
@Schema(description = "入库时间")
private LocalDateTime receiptTime;
@Schema(description = "账面数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "账面数量不能为空")
@DecimalMin(value = "0", message = "账面数量不能小于 0")
private BigDecimal quantity;
@Schema(description = "实盘数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "98.00")
@NotNull(message = "实盘数量不能为空")
@DecimalMin(value = "0", message = "实盘数量不能小于 0")
private BigDecimal checkQuantity;
@Schema(description = "单价", example = "1000.00")
@DecimalMin(value = "0", message = "单价不能小于 0")
private BigDecimal price;
}

View File

@@ -0,0 +1,69 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.wms.enums.order.WmsOrderStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - WMS 盘库单分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsCheckOrderPageReqVO extends PageParam {
@Schema(description = "盘库单号", example = "PK202605110001")
private String no;
@Schema(description = "单据状态", example = "0")
@InEnum(WmsOrderStatusEnum.class)
private Integer status;
@Schema(description = "仓库编号", example = "1024")
private Long warehouseId;
@Schema(description = "单据日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] orderTime;
@Schema(description = "最小盈亏数量", example = "-10.00")
private BigDecimal totalQuantityMin;
@Schema(description = "最大盈亏数量", example = "100.00")
private BigDecimal totalQuantityMax;
@Schema(description = "最小总金额", example = "1.00")
private BigDecimal totalPriceMin;
@Schema(description = "最大总金额", example = "1000.00")
private BigDecimal totalPriceMax;
@Schema(description = "最小实际金额", example = "1.00")
private BigDecimal actualPriceMin;
@Schema(description = "最大实际金额", example = "1000.00")
private BigDecimal actualPriceMax;
@Schema(description = "创建用户", example = "1")
private String creator;
@Schema(description = "更新用户", example = "1")
private String updater;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "更新时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] updateTime;
}

View File

@@ -0,0 +1,79 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.detail.WmsCheckOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.enums.DictTypeConstants;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - WMS 盘库单 Response VO")
@Data
@ExcelIgnoreUnannotated
public class WmsCheckOrderRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "盘库单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "PK202605110001")
@ExcelProperty("盘库单号")
private String no;
@Schema(description = "单据日期", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("单据日期")
private LocalDateTime orderTime;
@Schema(description = "盘库状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
@ExcelProperty(value = "盘库状态", converter = DictConvert.class)
@DictFormat(DictTypeConstants.ORDER_STATUS)
private Integer status;
@Schema(description = "备注", example = "备注")
private String remark;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long warehouseId;
@Schema(description = "仓库名称", example = "北京仓")
@ExcelProperty("仓库")
private String warehouseName;
@Schema(description = "盈亏数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@ExcelProperty("盈亏数量")
private BigDecimal totalQuantity;
@Schema(description = "总金额(账面金额)", example = "1000.00")
@ExcelProperty("总金额")
private BigDecimal totalPrice;
@Schema(description = "实际金额", example = "980.00")
@ExcelProperty("实际金额")
private BigDecimal actualPrice;
@Schema(description = "盘库明细")
private List<WmsCheckOrderDetailRespVO> details;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "创建者", example = "1")
private String creator;
@Schema(description = "创建者名称", example = "芋道")
private String creatorName;
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime updateTime;
@Schema(description = "更新者", example = "1")
private String updater;
@Schema(description = "更新者名称", example = "芋道")
private String updaterName;
}

View File

@@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.order;
import cn.iocoder.yudao.module.wms.controller.admin.order.check.vo.detail.WmsCheckOrderDetailSaveReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - WMS 盘库单保存 Request VO")
@Data
public class WmsCheckOrderSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "盘库单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "PK202605110001")
@NotBlank(message = "盘库单号不能为空")
@Size(max = 64, message = "盘库单号长度不能超过 64 个字符")
private String no;
@Schema(description = "单据日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "单据日期不能为空")
private LocalDateTime orderTime;
@Schema(description = "备注", example = "备注")
@Size(max = 255, message = "备注长度不能超过 255 个字符")
private String remark;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "仓库不能为空")
private Long warehouseId;
@Schema(description = "盘库明细")
@Valid
private List<WmsCheckOrderDetailSaveReqVO> details;
}

View File

@@ -0,0 +1,206 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.movement;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.NumberUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.detail.WmsMovementOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order.WmsMovementOrderSaveReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDetailDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService;
import cn.iocoder.yudao.module.wms.service.order.movement.WmsMovementOrderDetailService;
import cn.iocoder.yudao.module.wms.service.order.movement.WmsMovementOrderService;
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.stream.Stream;
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;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
@Tag(name = "管理后台 - WMS 移库单")
@RestController
@RequestMapping("/wms/movement-order")
@Validated
public class WmsMovementOrderController {
@Resource
private WmsMovementOrderService movementOrderService;
@Resource
private WmsMovementOrderDetailService movementOrderDetailService;
@Resource
private WmsWarehouseService warehouseService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private AdminUserApi adminUserApi;
@PostMapping("/create")
@Operation(summary = "创建移库单")
@PreAuthorize("@ss.hasPermission('wms:movement-order:create')")
public CommonResult<Long> createMovementOrder(@Valid @RequestBody WmsMovementOrderSaveReqVO createReqVO) {
return success(movementOrderService.createMovementOrder(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新移库单")
@PreAuthorize("@ss.hasPermission('wms:movement-order:update')")
public CommonResult<Boolean> updateMovementOrder(@Valid @RequestBody WmsMovementOrderSaveReqVO updateReqVO) {
movementOrderService.updateMovementOrder(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除移库单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:movement-order:delete')")
public CommonResult<Boolean> deleteMovementOrder(@RequestParam("id") Long id) {
movementOrderService.deleteMovementOrder(id);
return success(true);
}
@PutMapping("/complete")
@Operation(summary = "完成移库")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:movement-order:complete')")
public CommonResult<Boolean> completeMovementOrder(@RequestParam("id") Long id) {
movementOrderService.completeMovementOrder(id);
return success(true);
}
@PutMapping("/cancel")
@Operation(summary = "作废移库单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:movement-order:cancel')")
public CommonResult<Boolean> cancelMovementOrder(@RequestParam("id") Long id) {
movementOrderService.cancelMovementOrder(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得移库单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:movement-order:query')")
public CommonResult<WmsMovementOrderRespVO> getMovementOrder(@RequestParam("id") Long id) {
WmsMovementOrderDO order = movementOrderService.getMovementOrder(id);
if (order == null) {
return success(null);
}
// 获得移库单的明细列表
List<WmsMovementOrderDetailDO> detailList = movementOrderDetailService.getMovementOrderDetailList(id);
// 拼接结果返回
WmsMovementOrderRespVO respVO = buildMovementOrderRespVO(order)
.setDetails(buildMovementOrderDetailRespVOList(detailList));
return success(respVO);
}
@GetMapping("/page")
@Operation(summary = "获得移库单分页")
@PreAuthorize("@ss.hasPermission('wms:movement-order:query')")
public CommonResult<PageResult<WmsMovementOrderRespVO>> getMovementOrderPage(
@Valid WmsMovementOrderPageReqVO pageReqVO) {
PageResult<WmsMovementOrderDO> pageResult = movementOrderService.getMovementOrderPage(pageReqVO);
return success(new PageResult<>(buildMovementOrderRespVOList(pageResult.getList()), pageResult.getTotal()));
}
@GetMapping("/export-excel")
@Operation(summary = "导出移库单 Excel")
@PreAuthorize("@ss.hasPermission('wms:movement-order:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportMovementOrderExcel(@Valid WmsMovementOrderPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<WmsMovementOrderDO> list = movementOrderService.getMovementOrderPage(pageReqVO).getList();
ExcelUtils.write(response, "移库单.xls", "数据", WmsMovementOrderRespVO.class,
buildMovementOrderRespVOList(list));
}
// ==================== 拼接 VO ====================
private WmsMovementOrderRespVO buildMovementOrderRespVO(WmsMovementOrderDO order) {
if (order == null) {
return null;
}
List<WmsMovementOrderRespVO> list = buildMovementOrderRespVOList(Collections.singletonList(order));
return CollUtil.getFirst(list);
}
private List<WmsMovementOrderRespVO> buildMovementOrderRespVOList(List<WmsMovementOrderDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 获取相关的仓库、用户等数据
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(convertSetByFlatMap(list,
order -> Stream.of(order.getSourceWarehouseId(), order.getTargetWarehouseId())));
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSetByFlatMap(list,
order -> Stream.of(parseUserId(order.getCreator()), parseUserId(order.getUpdater()))));
// 拼接数据
return BeanUtils.toBean(list, WmsMovementOrderRespVO.class, vo -> {
MapUtils.findAndThen(warehouseMap, vo.getSourceWarehouseId(),
warehouse -> vo.setSourceWarehouseName(warehouse.getName()));
MapUtils.findAndThen(warehouseMap, vo.getTargetWarehouseId(),
warehouse -> vo.setTargetWarehouseName(warehouse.getName()));
MapUtils.findAndThen(userMap, parseUserId(vo.getCreator()), user -> vo.setCreatorName(user.getNickname()));
MapUtils.findAndThen(userMap, parseUserId(vo.getUpdater()), user -> vo.setUpdaterName(user.getNickname()));
});
}
private Long parseUserId(String userId) {
return NumberUtil.parseLong(userId, null);
}
private List<WmsMovementOrderDetailRespVO> buildMovementOrderDetailRespVOList(List<WmsMovementOrderDetailDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 获取相关的商品、SKU、仓库等数据
Map<Long, WmsItemSkuDO> skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsMovementOrderDetailDO::getSkuId));
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(convertSetByFlatMap(list,
detail -> Stream.of(detail.getSourceWarehouseId(), detail.getTargetWarehouseId())));
// 拼接数据
return BeanUtils.toBean(list, WmsMovementOrderDetailRespVO.class, vo -> {
MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> {
vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId());
MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode())
.setItemName(item.getName()).setUnit(item.getUnit()));
});
MapUtils.findAndThen(warehouseMap, vo.getSourceWarehouseId(),
warehouse -> vo.setSourceWarehouseName(warehouse.getName()));
MapUtils.findAndThen(warehouseMap, vo.getTargetWarehouseId(),
warehouse -> vo.setTargetWarehouseName(warehouse.getName()));
});
}
}

View File

@@ -0,0 +1,86 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.movement;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.detail.WmsMovementOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDetailDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService;
import cn.iocoder.yudao.module.wms.service.order.movement.WmsMovementOrderDetailService;
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 org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
@Tag(name = "管理后台 - WMS 移库单明细")
@RestController
@RequestMapping("/wms/movement-order-detail")
@Validated
public class WmsMovementOrderDetailController {
@Resource
private WmsMovementOrderDetailService movementOrderDetailService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private WmsWarehouseService warehouseService;
@GetMapping("/list-by-order-id")
@Operation(summary = "获得移库单明细列表")
@Parameter(name = "orderId", description = "移库单编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:movement-order:query')")
public CommonResult<List<WmsMovementOrderDetailRespVO>> getMovementOrderDetailListByOrderId(
@RequestParam("orderId") Long orderId) {
List<WmsMovementOrderDetailDO> list = movementOrderDetailService.getMovementOrderDetailList(orderId);
return success(buildMovementOrderDetailRespVOList(list));
}
// ==================== 拼接 VO ====================
private List<WmsMovementOrderDetailRespVO> buildMovementOrderDetailRespVOList(List<WmsMovementOrderDetailDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 查询关联数据
Map<Long, WmsItemSkuDO> skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsMovementOrderDetailDO::getSkuId));
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(convertSetByFlatMap(list,
detail -> Stream.of(detail.getSourceWarehouseId(), detail.getTargetWarehouseId())));
// 拼接数据
return BeanUtils.toBean(list, WmsMovementOrderDetailRespVO.class, vo -> {
MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> {
vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId());
MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode())
.setItemName(item.getName()).setUnit(item.getUnit()));
});
MapUtils.findAndThen(warehouseMap, vo.getSourceWarehouseId(),
warehouse -> vo.setSourceWarehouseName(warehouse.getName()));
MapUtils.findAndThen(warehouseMap, vo.getTargetWarehouseId(),
warehouse -> vo.setTargetWarehouseName(warehouse.getName()));
});
}
}

View File

@@ -0,0 +1,64 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.detail;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 移库单明细 Response VO")
@Data
public class WmsMovementOrderDetailRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "移库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long orderId;
@Schema(description = "商品编号", example = "2048")
private Long itemId;
@Schema(description = "商品编号", example = "SPU-APPLE")
private String itemCode;
@Schema(description = "商品名称", example = "红富士苹果")
private String itemName;
@Schema(description = "商品单位", example = "")
private String unit;
@Schema(description = "SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
private Long skuId;
@Schema(description = "规格编号", example = "SKU-APPLE-10KG")
private String skuCode;
@Schema(description = "规格名称", example = "10kg 箱装")
private String skuName;
@Schema(description = "来源仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long sourceWarehouseId;
@Schema(description = "来源仓库名称", example = "北京仓")
private String sourceWarehouseName;
@Schema(description = "目标仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
private Long targetWarehouseId;
@Schema(description = "目标仓库名称", example = "上海仓")
private String targetWarehouseName;
@Schema(description = "移库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
private BigDecimal quantity;
@Schema(description = "单价", example = "100.00")
private BigDecimal price;
@Schema(description = "行金额", example = "1000.00")
private BigDecimal totalPrice;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.detail;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "管理后台 - WMS 移库单明细保存 Request VO")
@Data
public class WmsMovementOrderDetailSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
@NotNull(message = "SKU 不能为空")
private Long skuId;
@Schema(description = "移库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "移库数量不能为空")
@DecimalMin(value = "0", inclusive = false, message = "移库数量必须大于 0")
private BigDecimal quantity;
@Schema(description = "单价", example = "100.00")
@DecimalMin(value = "0", message = "单价不能小于 0")
private BigDecimal price;
@Schema(description = "行金额", example = "1000.00")
@DecimalMin(value = "0", message = "行金额不能小于 0")
private BigDecimal totalPrice;
}

View File

@@ -0,0 +1,66 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.wms.enums.order.WmsOrderStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - WMS 移库单分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsMovementOrderPageReqVO extends PageParam {
@Schema(description = "移库单号", example = "YK202605110001")
private String no;
@Schema(description = "单据状态", example = "0")
@InEnum(WmsOrderStatusEnum.class)
private Integer status;
@Schema(description = "来源仓库编号", example = "1024")
private Long sourceWarehouseId;
@Schema(description = "目标仓库编号", example = "2048")
private Long targetWarehouseId;
@Schema(description = "单据日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] orderTime;
@Schema(description = "最小数量", example = "1.00")
private BigDecimal totalQuantityMin;
@Schema(description = "最大数量", example = "100.00")
private BigDecimal totalQuantityMax;
@Schema(description = "最小总金额", example = "1.00")
private BigDecimal totalPriceMin;
@Schema(description = "最大总金额", example = "1000.00")
private BigDecimal totalPriceMax;
@Schema(description = "创建用户", example = "1")
private String creator;
@Schema(description = "更新用户", example = "1")
private String updater;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "更新时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] updateTime;
}

View File

@@ -0,0 +1,82 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.detail.WmsMovementOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.enums.DictTypeConstants;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - WMS 移库单 Response VO")
@Data
@ExcelIgnoreUnannotated
public class WmsMovementOrderRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "移库单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "YK202605110001")
@ExcelProperty("移库单号")
private String no;
@Schema(description = "单据日期", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("单据日期")
private LocalDateTime orderTime;
@Schema(description = "移库状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
@ExcelProperty(value = "移库状态", converter = DictConvert.class)
@DictFormat(DictTypeConstants.ORDER_STATUS)
private Integer status;
@Schema(description = "备注", example = "备注")
private String remark;
@Schema(description = "来源仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long sourceWarehouseId;
@Schema(description = "来源仓库名称", example = "北京仓")
@ExcelProperty("来源仓库")
private String sourceWarehouseName;
@Schema(description = "目标仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
private Long targetWarehouseId;
@Schema(description = "目标仓库名称", example = "上海仓")
@ExcelProperty("目标仓库")
private String targetWarehouseName;
@Schema(description = "移库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@ExcelProperty("移库数量")
private BigDecimal totalQuantity;
@Schema(description = "总金额", example = "1000.00")
@ExcelProperty("总金额")
private BigDecimal totalPrice;
@Schema(description = "移库明细")
private List<WmsMovementOrderDetailRespVO> details;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "创建者", example = "1")
private String creator;
@Schema(description = "创建者名称", example = "芋道")
private String creatorName;
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime updateTime;
@Schema(description = "更新者", example = "1")
private String updater;
@Schema(description = "更新者名称", example = "芋道")
private String updaterName;
}

View File

@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.order;
import cn.iocoder.yudao.module.wms.controller.admin.order.movement.vo.detail.WmsMovementOrderDetailSaveReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - WMS 移库单保存 Request VO")
@Data
public class WmsMovementOrderSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "移库单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "YK202605110001")
@NotBlank(message = "移库单号不能为空")
@Size(max = 64, message = "移库单号长度不能超过 64 个字符")
private String no;
@Schema(description = "单据日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "单据日期不能为空")
private LocalDateTime orderTime;
@Schema(description = "备注", example = "备注")
@Size(max = 255, message = "备注长度不能超过 255 个字符")
private String remark;
@Schema(description = "来源仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "来源仓库不能为空")
private Long sourceWarehouseId;
@Schema(description = "目标仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
@NotNull(message = "目标仓库不能为空")
private Long targetWarehouseId;
@Schema(description = "移库明细")
@Valid
private List<WmsMovementOrderDetailSaveReqVO> details;
}

View File

@@ -0,0 +1,204 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.receipt;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.NumberUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.detail.WmsReceiptOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order.WmsReceiptOrderPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order.WmsReceiptOrderRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order.WmsReceiptOrderSaveReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.merchant.WmsMerchantDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt.WmsReceiptOrderDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt.WmsReceiptOrderDetailDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import cn.iocoder.yudao.module.wms.service.md.merchant.WmsMerchantService;
import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService;
import cn.iocoder.yudao.module.wms.service.order.receipt.WmsReceiptOrderDetailService;
import cn.iocoder.yudao.module.wms.service.order.receipt.WmsReceiptOrderService;
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.stream.Stream;
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;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
@Tag(name = "管理后台 - WMS 入库单")
@RestController
@RequestMapping("/wms/receipt-order")
@Validated
public class WmsReceiptOrderController {
@Resource
private WmsReceiptOrderService receiptOrderService;
@Resource
private WmsReceiptOrderDetailService receiptOrderDetailService;
@Resource
private WmsMerchantService merchantService;
@Resource
private WmsWarehouseService warehouseService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private AdminUserApi adminUserApi;
@PostMapping("/create")
@Operation(summary = "创建入库单")
@PreAuthorize("@ss.hasPermission('wms:receipt-order:create')")
public CommonResult<Long> createReceiptOrder(@Valid @RequestBody WmsReceiptOrderSaveReqVO createReqVO) {
return success(receiptOrderService.createReceiptOrder(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新入库单")
@PreAuthorize("@ss.hasPermission('wms:receipt-order:update')")
public CommonResult<Boolean> updateReceiptOrder(@Valid @RequestBody WmsReceiptOrderSaveReqVO updateReqVO) {
receiptOrderService.updateReceiptOrder(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除入库单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:receipt-order:delete')")
public CommonResult<Boolean> deleteReceiptOrder(@RequestParam("id") Long id) {
receiptOrderService.deleteReceiptOrder(id);
return success(true);
}
@PutMapping("/complete")
@Operation(summary = "完成入库")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:receipt-order:complete')")
public CommonResult<Boolean> completeReceiptOrder(@RequestParam("id") Long id) {
receiptOrderService.completeReceiptOrder(id);
return success(true);
}
@PutMapping("/cancel")
@Operation(summary = "作废入库单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:receipt-order:cancel')")
public CommonResult<Boolean> cancelReceiptOrder(@RequestParam("id") Long id) {
receiptOrderService.cancelReceiptOrder(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得入库单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:receipt-order:query')")
public CommonResult<WmsReceiptOrderRespVO> getReceiptOrder(@RequestParam("id") Long id) {
WmsReceiptOrderDO order = receiptOrderService.getReceiptOrder(id);
if (order == null) {
return success(null);
}
// 获得入库单的明细列表
List<WmsReceiptOrderDetailDO> detailList = receiptOrderDetailService.getReceiptOrderDetailList(id);
// 拼接结果返回
WmsReceiptOrderRespVO respVO = buildReceiptOrderRespVO(order)
.setDetails(buildReceiptOrderDetailRespVOList(detailList));
return success(respVO);
}
@GetMapping("/page")
@Operation(summary = "获得入库单分页")
@PreAuthorize("@ss.hasPermission('wms:receipt-order:query')")
public CommonResult<PageResult<WmsReceiptOrderRespVO>> getReceiptOrderPage(@Valid WmsReceiptOrderPageReqVO pageReqVO) {
PageResult<WmsReceiptOrderDO> pageResult = receiptOrderService.getReceiptOrderPage(pageReqVO);
return success(new PageResult<>(buildReceiptOrderRespVOList(pageResult.getList()), pageResult.getTotal()));
}
@GetMapping("/export-excel")
@Operation(summary = "导出入库单 Excel")
@PreAuthorize("@ss.hasPermission('wms:receipt-order:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportReceiptOrderExcel(@Valid WmsReceiptOrderPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<WmsReceiptOrderDO> list = receiptOrderService.getReceiptOrderPage(pageReqVO).getList();
ExcelUtils.write(response, "入库单.xls", "数据", WmsReceiptOrderRespVO.class,
buildReceiptOrderRespVOList(list));
}
// ==================== 拼接 VO ====================
private WmsReceiptOrderRespVO buildReceiptOrderRespVO(WmsReceiptOrderDO order) {
if (order == null) {
return null;
}
List<WmsReceiptOrderRespVO> list = buildReceiptOrderRespVOList(Collections.singletonList(order));
return CollUtil.getFirst(list);
}
private List<WmsReceiptOrderRespVO> buildReceiptOrderRespVOList(List<WmsReceiptOrderDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 获取相关的商户、仓库、用户等数据
Map<Long, WmsMerchantDO> merchantMap = merchantService.getMerchantMap(convertSet(list, WmsReceiptOrderDO::getMerchantId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(convertSet(list, WmsReceiptOrderDO::getWarehouseId));
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSetByFlatMap(list,
order -> Stream.of(parseUserId(order.getCreator()), parseUserId(order.getUpdater()))));
// 拼接数据
return BeanUtils.toBean(list, WmsReceiptOrderRespVO.class, vo -> {
MapUtils.findAndThen(merchantMap, vo.getMerchantId(), merchant -> vo.setMerchantName(merchant.getName()));
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
MapUtils.findAndThen(userMap, parseUserId(vo.getCreator()), user -> vo.setCreatorName(user.getNickname()));
MapUtils.findAndThen(userMap, parseUserId(vo.getUpdater()), user -> vo.setUpdaterName(user.getNickname()));
});
}
private Long parseUserId(String userId) {
return NumberUtil.parseLong(userId, null);
}
private List<WmsReceiptOrderDetailRespVO> buildReceiptOrderDetailRespVOList(List<WmsReceiptOrderDetailDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 获取相关的商品、SKU、仓库等数据
Map<Long, WmsItemSkuDO> skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsReceiptOrderDetailDO::getSkuId));
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
convertSet(list, WmsReceiptOrderDetailDO::getWarehouseId));
// 拼接数据
return BeanUtils.toBean(list, WmsReceiptOrderDetailRespVO.class, vo -> {
MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> {
vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId());
MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode())
.setItemName(item.getName()).setUnit(item.getUnit()));
});
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
});
}
}

View File

@@ -0,0 +1,81 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.receipt;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.detail.WmsReceiptOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt.WmsReceiptOrderDetailDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService;
import cn.iocoder.yudao.module.wms.service.order.receipt.WmsReceiptOrderDetailService;
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 org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@Tag(name = "管理后台 - WMS 入库单明细")
@RestController
@RequestMapping("/wms/receipt-order-detail")
@Validated
public class WmsReceiptOrderDetailController {
@Resource
private WmsReceiptOrderDetailService receiptOrderDetailService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private WmsWarehouseService warehouseService;
@GetMapping("/list-by-order-id")
@Operation(summary = "获得入库单明细列表")
@Parameter(name = "orderId", description = "入库单编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:receipt-order:query')")
public CommonResult<List<WmsReceiptOrderDetailRespVO>> getReceiptOrderDetailListByOrderId(
@RequestParam("orderId") Long orderId) {
List<WmsReceiptOrderDetailDO> list = receiptOrderDetailService.getReceiptOrderDetailList(orderId);
return success(buildReceiptOrderDetailRespVOList(list));
}
// ==================== 拼接 VO ====================
private List<WmsReceiptOrderDetailRespVO> buildReceiptOrderDetailRespVOList(List<WmsReceiptOrderDetailDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 查询关联数据
Map<Long, WmsItemSkuDO> skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsReceiptOrderDetailDO::getSkuId));
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
convertSet(list, WmsReceiptOrderDetailDO::getWarehouseId));
// 拼接数据
return BeanUtils.toBean(list, WmsReceiptOrderDetailRespVO.class, vo -> {
MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> {
vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId());
MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode())
.setItemName(item.getName()).setUnit(item.getUnit()));
});
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
});
}
}

View File

@@ -0,0 +1,58 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.detail;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 入库单明细 Response VO")
@Data
public class WmsReceiptOrderDetailRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long orderId;
@Schema(description = "商品编号", example = "2048")
private Long itemId;
@Schema(description = "商品编号", example = "SPU-APPLE")
private String itemCode;
@Schema(description = "商品名称", example = "红富士苹果")
private String itemName;
@Schema(description = "商品单位", example = "")
private String unit;
@Schema(description = "SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
private Long skuId;
@Schema(description = "规格编号", example = "SKU-APPLE-10KG")
private String skuCode;
@Schema(description = "规格名称", example = "10kg 箱装")
private String skuName;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long warehouseId;
@Schema(description = "仓库名称", example = "北京仓")
private String warehouseName;
@Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
private BigDecimal quantity;
@Schema(description = "单价", example = "1000.00")
private BigDecimal price;
@Schema(description = "行金额", example = "1500.00")
private BigDecimal totalPrice;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.detail;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "管理后台 - WMS 入库单明细保存 Request VO")
@Data
public class WmsReceiptOrderDetailSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
@NotNull(message = "SKU 不能为空")
private Long skuId;
@Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "入库数量不能为空")
@DecimalMin(value = "0", inclusive = false, message = "入库数量必须大于 0")
private BigDecimal quantity;
@Schema(description = "单价", example = "1000.00")
@DecimalMin(value = "0", message = "单价不能小于 0")
private BigDecimal price;
@Schema(description = "行金额", example = "1500.00")
@DecimalMin(value = "0", message = "行金额不能小于 0")
private BigDecimal totalPrice;
}

View File

@@ -0,0 +1,74 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.wms.enums.order.WmsOrderStatusEnum;
import cn.iocoder.yudao.module.wms.enums.order.WmsReceiptOrderTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - WMS 入库单分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsReceiptOrderPageReqVO extends PageParam {
@Schema(description = "入库单号", example = "RK202605110001")
private String no;
@Schema(description = "单据状态", example = "0")
@InEnum(WmsOrderStatusEnum.class)
private Integer status;
@Schema(description = "仓库编号", example = "1024")
private Long warehouseId;
@Schema(description = "供应商编号", example = "1024")
private Long merchantId;
@Schema(description = "单据日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] orderTime;
@Schema(description = "最小数量", example = "1.00")
private BigDecimal totalQuantityMin;
@Schema(description = "最大数量", example = "100.00")
private BigDecimal totalQuantityMax;
@Schema(description = "最小总金额", example = "1.00")
private BigDecimal totalPriceMin;
@Schema(description = "最大总金额", example = "1000.00")
private BigDecimal totalPriceMax;
@Schema(description = "入库类型", example = "101")
@InEnum(WmsReceiptOrderTypeEnum.class)
private Integer type;
@Schema(description = "业务单号", example = "PO202605110001")
private String bizOrderNo;
@Schema(description = "创建用户", example = "1")
private String creator;
@Schema(description = "更新用户", example = "1")
private String updater;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "更新时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] updateTime;
}

View File

@@ -0,0 +1,91 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.detail.WmsReceiptOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.enums.DictTypeConstants;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - WMS 入库单 Response VO")
@Data
@ExcelIgnoreUnannotated
public class WmsReceiptOrderRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "入库单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "RK202605110001")
@ExcelProperty("入库单号")
private String no;
@Schema(description = "入库类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "101")
@ExcelProperty(value = "入库类型", converter = DictConvert.class)
@DictFormat(DictTypeConstants.RECEIPT_ORDER_TYPE)
private Integer type;
@Schema(description = "单据日期", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("单据日期")
private LocalDateTime orderTime;
@Schema(description = "入库状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
@ExcelProperty(value = "入库状态", converter = DictConvert.class)
@DictFormat(DictTypeConstants.ORDER_STATUS)
private Integer status;
@Schema(description = "业务单号", example = "PO202605110001")
@ExcelProperty("业务单号")
private String bizOrderNo;
@Schema(description = "供应商编号", example = "1024")
private Long merchantId;
@Schema(description = "供应商名称", example = "某某公司")
@ExcelProperty("供应商")
private String merchantName;
@Schema(description = "备注", example = "备注")
private String remark;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long warehouseId;
@Schema(description = "仓库名称", example = "北京仓")
@ExcelProperty("仓库")
private String warehouseName;
@Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@ExcelProperty("入库数量")
private BigDecimal totalQuantity;
@Schema(description = "总金额", example = "1000.00")
@ExcelProperty("总金额")
private BigDecimal totalPrice;
@Schema(description = "入库明细")
private List<WmsReceiptOrderDetailRespVO> details;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "创建者", example = "1")
private String creator;
@Schema(description = "创建者名称", example = "芋道")
private String creatorName;
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime updateTime;
@Schema(description = "更新者", example = "1")
private String updater;
@Schema(description = "更新者名称", example = "芋道")
private String updaterName;
}

View File

@@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.order;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.wms.controller.admin.order.receipt.vo.detail.WmsReceiptOrderDetailSaveReqVO;
import cn.iocoder.yudao.module.wms.enums.order.WmsReceiptOrderTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - WMS 入库单保存 Request VO")
@Data
public class WmsReceiptOrderSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "入库单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "RK202605110001")
@NotBlank(message = "入库单号不能为空")
@Size(max = 64, message = "入库单号长度不能超过 64 个字符")
private String no;
@Schema(description = "入库类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "101")
@NotNull(message = "入库类型不能为空")
@InEnum(WmsReceiptOrderTypeEnum.class)
private Integer type;
@Schema(description = "单据日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "单据日期不能为空")
private LocalDateTime orderTime;
@Schema(description = "业务单号", example = "PO202605110001")
@Size(max = 64, message = "业务单号长度不能超过 64 个字符")
private String bizOrderNo;
@Schema(description = "供应商编号", example = "1024")
private Long merchantId;
@Schema(description = "备注", example = "备注")
@Size(max = 255, message = "备注长度不能超过 255 个字符")
private String remark;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "仓库不能为空")
private Long warehouseId;
@Schema(description = "入库明细")
@Valid
private List<WmsReceiptOrderDetailSaveReqVO> details;
}

View File

@@ -0,0 +1,204 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.shipment;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.NumberUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.detail.WmsShipmentOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order.WmsShipmentOrderPageReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order.WmsShipmentOrderRespVO;
import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order.WmsShipmentOrderSaveReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.merchant.WmsMerchantDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment.WmsShipmentOrderDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment.WmsShipmentOrderDetailDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import cn.iocoder.yudao.module.wms.service.md.merchant.WmsMerchantService;
import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService;
import cn.iocoder.yudao.module.wms.service.order.shipment.WmsShipmentOrderDetailService;
import cn.iocoder.yudao.module.wms.service.order.shipment.WmsShipmentOrderService;
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.stream.Stream;
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;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
@Tag(name = "管理后台 - WMS 出库单")
@RestController
@RequestMapping("/wms/shipment-order")
@Validated
public class WmsShipmentOrderController {
@Resource
private WmsShipmentOrderService shipmentOrderService;
@Resource
private WmsShipmentOrderDetailService shipmentOrderDetailService;
@Resource
private WmsMerchantService merchantService;
@Resource
private WmsWarehouseService warehouseService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private AdminUserApi adminUserApi;
@PostMapping("/create")
@Operation(summary = "创建出库单")
@PreAuthorize("@ss.hasPermission('wms:shipment-order:create')")
public CommonResult<Long> createShipmentOrder(@Valid @RequestBody WmsShipmentOrderSaveReqVO createReqVO) {
return success(shipmentOrderService.createShipmentOrder(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新出库单")
@PreAuthorize("@ss.hasPermission('wms:shipment-order:update')")
public CommonResult<Boolean> updateShipmentOrder(@Valid @RequestBody WmsShipmentOrderSaveReqVO updateReqVO) {
shipmentOrderService.updateShipmentOrder(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除出库单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:shipment-order:delete')")
public CommonResult<Boolean> deleteShipmentOrder(@RequestParam("id") Long id) {
shipmentOrderService.deleteShipmentOrder(id);
return success(true);
}
@PutMapping("/complete")
@Operation(summary = "完成出库")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:shipment-order:complete')")
public CommonResult<Boolean> completeShipmentOrder(@RequestParam("id") Long id) {
shipmentOrderService.completeShipmentOrder(id);
return success(true);
}
@PutMapping("/cancel")
@Operation(summary = "作废出库单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wms:shipment-order:cancel')")
public CommonResult<Boolean> cancelShipmentOrder(@RequestParam("id") Long id) {
shipmentOrderService.cancelShipmentOrder(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得出库单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:shipment-order:query')")
public CommonResult<WmsShipmentOrderRespVO> getShipmentOrder(@RequestParam("id") Long id) {
WmsShipmentOrderDO order = shipmentOrderService.getShipmentOrder(id);
if (order == null) {
return success(null);
}
// 获得出库单的明细列表
List<WmsShipmentOrderDetailDO> detailList = shipmentOrderDetailService.getShipmentOrderDetailList(id);
// 拼接结果返回
WmsShipmentOrderRespVO respVO = buildShipmentOrderRespVO(order)
.setDetails(buildShipmentOrderDetailRespVOList(detailList));
return success(respVO);
}
@GetMapping("/page")
@Operation(summary = "获得出库单分页")
@PreAuthorize("@ss.hasPermission('wms:shipment-order:query')")
public CommonResult<PageResult<WmsShipmentOrderRespVO>> getShipmentOrderPage(@Valid WmsShipmentOrderPageReqVO pageReqVO) {
PageResult<WmsShipmentOrderDO> pageResult = shipmentOrderService.getShipmentOrderPage(pageReqVO);
return success(new PageResult<>(buildShipmentOrderRespVOList(pageResult.getList()), pageResult.getTotal()));
}
@GetMapping("/export-excel")
@Operation(summary = "导出出库单 Excel")
@PreAuthorize("@ss.hasPermission('wms:shipment-order:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportShipmentOrderExcel(@Valid WmsShipmentOrderPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<WmsShipmentOrderDO> list = shipmentOrderService.getShipmentOrderPage(pageReqVO).getList();
ExcelUtils.write(response, "出库单.xls", "数据", WmsShipmentOrderRespVO.class,
buildShipmentOrderRespVOList(list));
}
// ==================== 拼接 VO ====================
private WmsShipmentOrderRespVO buildShipmentOrderRespVO(WmsShipmentOrderDO order) {
if (order == null) {
return null;
}
List<WmsShipmentOrderRespVO> list = buildShipmentOrderRespVOList(Collections.singletonList(order));
return CollUtil.getFirst(list);
}
private List<WmsShipmentOrderRespVO> buildShipmentOrderRespVOList(List<WmsShipmentOrderDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 获取相关的商户、仓库、用户等数据
Map<Long, WmsMerchantDO> merchantMap = merchantService.getMerchantMap(convertSet(list, WmsShipmentOrderDO::getMerchantId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(convertSet(list, WmsShipmentOrderDO::getWarehouseId));
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSetByFlatMap(list,
order -> Stream.of(parseUserId(order.getCreator()), parseUserId(order.getUpdater()))));
// 拼接数据
return BeanUtils.toBean(list, WmsShipmentOrderRespVO.class, vo -> {
MapUtils.findAndThen(merchantMap, vo.getMerchantId(), merchant -> vo.setMerchantName(merchant.getName()));
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
MapUtils.findAndThen(userMap, parseUserId(vo.getCreator()), user -> vo.setCreatorName(user.getNickname()));
MapUtils.findAndThen(userMap, parseUserId(vo.getUpdater()), user -> vo.setUpdaterName(user.getNickname()));
});
}
private Long parseUserId(String userId) {
return NumberUtil.parseLong(userId, null);
}
private List<WmsShipmentOrderDetailRespVO> buildShipmentOrderDetailRespVOList(List<WmsShipmentOrderDetailDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 获取相关的商品、SKU、仓库等数据
Map<Long, WmsItemSkuDO> skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsShipmentOrderDetailDO::getSkuId));
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
convertSet(list, WmsShipmentOrderDetailDO::getWarehouseId));
// 拼接数据
return BeanUtils.toBean(list, WmsShipmentOrderDetailRespVO.class, vo -> {
MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> {
vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId());
MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode())
.setItemName(item.getName()).setUnit(item.getUnit()));
});
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
});
}
}

View File

@@ -0,0 +1,81 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.shipment;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.detail.WmsShipmentOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment.WmsShipmentOrderDetailDO;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService;
import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService;
import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService;
import cn.iocoder.yudao.module.wms.service.order.shipment.WmsShipmentOrderDetailService;
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 org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@Tag(name = "管理后台 - WMS 出库单明细")
@RestController
@RequestMapping("/wms/shipment-order-detail")
@Validated
public class WmsShipmentOrderDetailController {
@Resource
private WmsShipmentOrderDetailService shipmentOrderDetailService;
@Resource
private WmsItemService itemService;
@Resource
private WmsItemSkuService itemSkuService;
@Resource
private WmsWarehouseService warehouseService;
@GetMapping("/list-by-order-id")
@Operation(summary = "获得出库单明细列表")
@Parameter(name = "orderId", description = "出库单编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wms:shipment-order:query')")
public CommonResult<List<WmsShipmentOrderDetailRespVO>> getShipmentOrderDetailListByOrderId(
@RequestParam("orderId") Long orderId) {
List<WmsShipmentOrderDetailDO> list = shipmentOrderDetailService.getShipmentOrderDetailList(orderId);
return success(buildShipmentOrderDetailRespVOList(list));
}
// ==================== 拼接 VO ====================
private List<WmsShipmentOrderDetailRespVO> buildShipmentOrderDetailRespVOList(List<WmsShipmentOrderDetailDO> list) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 查询关联数据
Map<Long, WmsItemSkuDO> skuMap = itemSkuService.getItemSkuMap(convertSet(list, WmsShipmentOrderDetailDO::getSkuId));
Map<Long, WmsItemDO> itemMap = itemService.getItemMap(convertSet(skuMap.values(), WmsItemSkuDO::getItemId));
Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
convertSet(list, WmsShipmentOrderDetailDO::getWarehouseId));
// 拼接数据
return BeanUtils.toBean(list, WmsShipmentOrderDetailRespVO.class, vo -> {
MapUtils.findAndThen(skuMap, vo.getSkuId(), sku -> {
vo.setSkuCode(sku.getCode()).setSkuName(sku.getName()).setItemId(sku.getItemId());
MapUtils.findAndThen(itemMap, sku.getItemId(), item -> vo.setItemCode(item.getCode())
.setItemName(item.getName()).setUnit(item.getUnit()));
});
MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
});
}
}

View File

@@ -0,0 +1,58 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.detail;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - WMS 出库单明细 Response VO")
@Data
public class WmsShipmentOrderDetailRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "出库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long orderId;
@Schema(description = "商品编号", example = "2048")
private Long itemId;
@Schema(description = "商品编号", example = "SPU-APPLE")
private String itemCode;
@Schema(description = "商品名称", example = "红富士苹果")
private String itemName;
@Schema(description = "商品单位", example = "")
private String unit;
@Schema(description = "SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
private Long skuId;
@Schema(description = "规格编号", example = "SKU-APPLE-10KG")
private String skuCode;
@Schema(description = "规格名称", example = "10kg 箱装")
private String skuName;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long warehouseId;
@Schema(description = "仓库名称", example = "北京仓")
private String warehouseName;
@Schema(description = "出库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
private BigDecimal quantity;
@Schema(description = "单价", example = "100.00")
private BigDecimal price;
@Schema(description = "行金额", example = "1000.00")
private BigDecimal totalPrice;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.detail;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "管理后台 - WMS 出库单明细保存 Request VO")
@Data
public class WmsShipmentOrderDetailSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
@NotNull(message = "SKU 不能为空")
private Long skuId;
@Schema(description = "出库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "出库数量不能为空")
@DecimalMin(value = "0", inclusive = false, message = "出库数量必须大于 0")
private BigDecimal quantity;
@Schema(description = "单价", example = "100.00")
@DecimalMin(value = "0", message = "单价不能小于 0")
private BigDecimal price;
@Schema(description = "行金额", example = "1000.00")
@DecimalMin(value = "0", message = "行金额不能小于 0")
private BigDecimal totalPrice;
}

View File

@@ -0,0 +1,74 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.wms.enums.order.WmsOrderStatusEnum;
import cn.iocoder.yudao.module.wms.enums.order.WmsShipmentOrderTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - WMS 出库单分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WmsShipmentOrderPageReqVO extends PageParam {
@Schema(description = "出库单号", example = "CK202605110001")
private String no;
@Schema(description = "单据状态", example = "0")
@InEnum(WmsOrderStatusEnum.class)
private Integer status;
@Schema(description = "仓库编号", example = "1024")
private Long warehouseId;
@Schema(description = "客户编号", example = "1024")
private Long merchantId;
@Schema(description = "单据日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] orderTime;
@Schema(description = "最小数量", example = "1.00")
private BigDecimal totalQuantityMin;
@Schema(description = "最大数量", example = "100.00")
private BigDecimal totalQuantityMax;
@Schema(description = "最小总金额", example = "1.00")
private BigDecimal totalPriceMin;
@Schema(description = "最大总金额", example = "1000.00")
private BigDecimal totalPriceMax;
@Schema(description = "出库类型", example = "201")
@InEnum(WmsShipmentOrderTypeEnum.class)
private Integer type;
@Schema(description = "业务单号", example = "SO202605110001")
private String bizOrderNo;
@Schema(description = "创建用户", example = "1")
private String creator;
@Schema(description = "更新用户", example = "1")
private String updater;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "更新时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] updateTime;
}

View File

@@ -0,0 +1,91 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.detail.WmsShipmentOrderDetailRespVO;
import cn.iocoder.yudao.module.wms.enums.DictTypeConstants;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - WMS 出库单 Response VO")
@Data
@ExcelIgnoreUnannotated
public class WmsShipmentOrderRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "出库单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "CK202605110001")
@ExcelProperty("出库单号")
private String no;
@Schema(description = "出库类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "201")
@ExcelProperty(value = "出库类型", converter = DictConvert.class)
@DictFormat(DictTypeConstants.SHIPMENT_ORDER_TYPE)
private Integer type;
@Schema(description = "单据日期", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("单据日期")
private LocalDateTime orderTime;
@Schema(description = "出库状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
@ExcelProperty(value = "出库状态", converter = DictConvert.class)
@DictFormat(DictTypeConstants.ORDER_STATUS)
private Integer status;
@Schema(description = "业务单号", example = "SO202605110001")
@ExcelProperty("业务单号")
private String bizOrderNo;
@Schema(description = "客户编号", example = "1024")
private Long merchantId;
@Schema(description = "客户名称", example = "某某公司")
@ExcelProperty("客户")
private String merchantName;
@Schema(description = "备注", example = "备注")
private String remark;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long warehouseId;
@Schema(description = "仓库名称", example = "北京仓")
@ExcelProperty("仓库")
private String warehouseName;
@Schema(description = "出库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@ExcelProperty("出库数量")
private BigDecimal totalQuantity;
@Schema(description = "总金额", example = "1000.00")
@ExcelProperty("总金额")
private BigDecimal totalPrice;
@Schema(description = "出库明细")
private List<WmsShipmentOrderDetailRespVO> details;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "创建者", example = "1")
private String creator;
@Schema(description = "创建者名称", example = "芋道")
private String creatorName;
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime updateTime;
@Schema(description = "更新者", example = "1")
private String updater;
@Schema(description = "更新者名称", example = "芋道")
private String updaterName;
}

View File

@@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.order;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.wms.controller.admin.order.shipment.vo.detail.WmsShipmentOrderDetailSaveReqVO;
import cn.iocoder.yudao.module.wms.enums.order.WmsShipmentOrderTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - WMS 出库单保存 Request VO")
@Data
public class WmsShipmentOrderSaveReqVO {
@Schema(description = "编号", example = "1024")
private Long id;
@Schema(description = "出库单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "CK202605110001")
@NotBlank(message = "出库单号不能为空")
@Size(max = 64, message = "出库单号长度不能超过 64 个字符")
private String no;
@Schema(description = "出库类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "201")
@NotNull(message = "出库类型不能为空")
@InEnum(WmsShipmentOrderTypeEnum.class)
private Integer type;
@Schema(description = "单据日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "单据日期不能为空")
private LocalDateTime orderTime;
@Schema(description = "业务单号", example = "SO202605110001")
@Size(max = 64, message = "业务单号长度不能超过 64 个字符")
private String bizOrderNo;
@Schema(description = "客户编号", example = "1024")
private Long merchantId;
@Schema(description = "备注", example = "备注")
@Size(max = 255, message = "备注长度不能超过 255 个字符")
private String remark;
@Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "仓库不能为空")
private Long warehouseId;
@Schema(description = "出库明细")
@Valid
private List<WmsShipmentOrderDetailSaveReqVO> details;
}

View File

@@ -0,0 +1,4 @@
/**
* WMS 管理后台 API
*/
package cn.iocoder.yudao.module.wms.controller.admin;

View File

@@ -0,0 +1,6 @@
/**
* 提供 RESTful API 给前端:
* 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目
* 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分
*/
package cn.iocoder.yudao.module.wms.controller;

View File

@@ -0,0 +1,54 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.inventory;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
/**
* WMS 库存 DO
*
* @author 芋道源码
*/
@TableName("wms_inventory")
@KeySequence("wms_inventory_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsInventoryDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
/**
* 商品 SKU 编号
*
* 关联 {@link WmsItemSkuDO#getId()}
*/
private Long skuId;
/**
* 仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long warehouseId;
/**
* 库存数量
*/
private BigDecimal quantity;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,94 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.inventory;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.enums.order.WmsOrderTypeEnum;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
/**
* WMS 库存流水 DO
*
* @author 芋道源码
*/
@TableName("wms_inventory_history")
@KeySequence("wms_inventory_history_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsInventoryHistoryDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
// ========= 库存维度相关字段 =========
/**
* 仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long warehouseId;
/**
* 商品 SKU 编号
*
* 关联 {@link WmsItemSkuDO#getId()}
*/
private Long skuId;
/**
* 库存变化数量
*/
private BigDecimal quantity;
/**
* 变化前库存数量
*/
private BigDecimal beforeQuantity;
/**
* 变化后库存数量
*/
private BigDecimal afterQuantity;
// ========= 单价备注相关字段 =========
/**
* 单价
*/
private BigDecimal price;
/**
* 库存变化金额
*/
private BigDecimal totalPrice;
/**
* 备注
*/
private String remark;
// ========= 来源单据相关字段 =========
/**
* 单据编号
*/
private Long orderId;
/**
* 单据号
*/
private String orderNo;
/**
* 单据类型
*
* 枚举 {@link WmsOrderTypeEnum#getType()}
*/
private Integer orderType;
}

View File

@@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.md.item;
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.*;
/**
* WMS 商品品牌 DO
*
* @author 芋道源码
*/
@TableName("wms_item_brand")
@KeySequence("wms_item_brand_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsItemBrandDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
/**
* 品牌编号
*/
private String code;
/**
* 品牌名称
*/
private String name;
}

View File

@@ -0,0 +1,60 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.md.item;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
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.*;
/**
* WMS 商品分类 DO
*
* @author 芋道源码
*/
@TableName("wms_item_category")
@KeySequence("wms_item_category_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsItemCategoryDO extends BaseDO {
/**
* 父级编号 - 根节点
*/
public static final Long PARENT_ID_ROOT = 0L;
/**
* 主键编号
*/
@TableId
private Long id;
/**
* 父级编号
*
* 关联 {@link #id}
*/
private Long parentId;
/**
* 分类编号
*/
private String code;
/**
* 分类名称
*/
private String name;
/**
* 排序
*/
private Integer sort;
/**
* 状态
*
* 枚举 {@link CommonStatusEnum}
*/
private Integer status;
}

View File

@@ -0,0 +1,58 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.md.item;
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.*;
/**
* WMS 商品 DO
*
* @author 芋道源码
*/
@TableName("wms_item")
@KeySequence("wms_item_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsItemDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
/**
* 商品编号
*/
private String code;
/**
* 商品名称
*/
private String name;
/**
* 单位
*/
private String unit;
/**
* 商品分类编号
*
* 关联 {@link WmsItemCategoryDO#getId()}
*/
private Long categoryId;
/**
* 商品品牌编号
*
* 关联 {@link WmsItemBrandDO#getId()}
*/
private Long brandId;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,81 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.md.item;
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;
/**
* WMS 商品 SKU DO
*
* @author 芋道源码
*/
@TableName("wms_item_sku")
@KeySequence("wms_item_sku_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsItemSkuDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
/**
* 规格名称
*/
private String name;
/**
* 商品编号
*
* 关联 {@link WmsItemDO#getId()}
*/
private Long itemId;
/**
* 条码
*/
private String barCode;
/**
* 规格编号
*/
private String code;
/**
* 长,单位 cm
*/
private BigDecimal length;
/**
* 宽,单位 cm
*/
private BigDecimal width;
/**
* 高,单位 cm
*/
private BigDecimal height;
/**
* 毛重,单位 kg
*/
private BigDecimal grossWeight;
/**
* 净重,单位 kg
*/
private BigDecimal netWeight;
/**
* 成本价,单位元
*/
private BigDecimal costPrice;
/**
* 销售价,单位元
*/
private BigDecimal sellingPrice;
}

View File

@@ -0,0 +1,81 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.md.merchant;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.wms.enums.md.WmsMerchantTypeEnum;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* WMS 往来企业 DO
*
* @author 芋道源码
*/
@TableName("wms_merchant")
@KeySequence("wms_merchant_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsMerchantDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
/**
* 往来企业编号
*/
private String code;
/**
* 往来企业名称
*/
private String name;
/**
* 往来企业类型
*
* 枚举 {@link WmsMerchantTypeEnum}
*/
private Integer type;
/**
* 级别
*/
private String level;
/**
* 开户行
*/
private String bankName;
/**
* 银行账户
*/
private String bankAccount;
/**
* 地址
*/
private String address;
/**
* 手机号
*/
private String mobile;
/**
* 座机号
*/
private String telephone;
/**
* 联系人
*/
private String contact;
/**
* Email
*/
private String email;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.md.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.*;
/**
* WMS 仓库 DO
*
* @author 芋道源码
*/
@TableName("wms_warehouse")
@KeySequence("wms_warehouse_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsWarehouseDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
/**
* 仓库编号
*/
private String code;
/**
* 名称
*/
private String name;
/**
* 备注
*/
private String remark;
/**
* 排序
*/
private Integer sort;
}

View File

@@ -0,0 +1,77 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.order.check;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.enums.DictTypeConstants;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* WMS 盘库单 DO
*
* @author 芋道源码
*/
@TableName("wms_check_order")
@KeySequence("wms_check_order_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsCheckOrderDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
/**
* 盘库单号
*/
private String no;
/**
* 单据日期
*/
private LocalDateTime orderTime;
/**
* 盘库状态
*
* 字典 {@link DictTypeConstants#ORDER_STATUS}
*/
private Integer status;
/**
* 备注
*/
private String remark;
// ========= 仓库字段 =========
/**
* 仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long warehouseId;
// ========= 汇总金额字段 =========
/**
* 盈亏数量(实盘数量 - 账面数量)
*/
private BigDecimal totalQuantity;
/**
* 总金额(账面数量 * 单价)
*/
private BigDecimal totalPrice;
/**
* 实际金额(实盘数量 * 单价)
*/
private BigDecimal actualPrice;
}

View File

@@ -0,0 +1,85 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.order.check;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* WMS 盘库单明细 DO
*
* @author 芋道源码
*/
@TableName("wms_check_order_detail")
@KeySequence("wms_check_order_detail_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsCheckOrderDetailDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
// ========= 单据商品字段 =========
/**
* 盘库单编号
*
* 关联 {@link WmsCheckOrderDO#getId()}
*/
private Long orderId;
/**
* 商品 SKU 编号
*
* 关联 {@link WmsItemSkuDO#getId()}
*/
private Long skuId;
// ========= 仓库字段 =========
/**
* 仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long warehouseId;
/**
* 库存编号
*
* 关联 {@link WmsInventoryDO#getId()}
*/
private Long inventoryId;
/**
* 入库时间
*/
private LocalDateTime receiptTime;
// ========= 数量金额字段 =========
/**
* 账面数量
*/
private BigDecimal quantity;
/**
* 实盘数量
*/
private BigDecimal checkQuantity;
/**
* 单价
*/
private BigDecimal price;
}

View File

@@ -0,0 +1,82 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.order.movement;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.enums.DictTypeConstants;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* WMS 移库单 DO
*
* @author 芋道源码
*/
@TableName("wms_movement_order")
@KeySequence("wms_movement_order_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsMovementOrderDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
/**
* 移库单号
*/
private String no;
/**
* 单据日期
*/
private LocalDateTime orderTime;
/**
* 移库状态
*
* 字典 {@link DictTypeConstants#ORDER_STATUS}
*/
private Integer status;
/**
* 备注
*/
private String remark;
// ========= 来源仓库字段 =========
/**
* 来源仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long sourceWarehouseId;
// ========= 目标仓库字段 =========
/**
* 目标仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long targetWarehouseId;
// ========= 汇总金额字段 =========
/**
* 总数量
*/
private BigDecimal totalQuantity;
/**
* 总金额
*/
private BigDecimal totalPrice;
}

View File

@@ -0,0 +1,81 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.order.movement;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
/**
* WMS 移库单明细 DO
*
* @author 芋道源码
*/
@TableName("wms_movement_order_detail")
@KeySequence("wms_movement_order_detail_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsMovementOrderDetailDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
// ========= 单据商品字段 =========
/**
* 移库单编号
*
* 关联 {@link WmsMovementOrderDO#getId()}
*/
private Long orderId;
/**
* 商品 SKU 编号
*
* 关联 {@link WmsItemSkuDO#getId()}
*/
private Long skuId;
// ========= 来源仓库字段 =========
/**
* 来源仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long sourceWarehouseId;
// ========= 目标仓库字段 =========
/**
* 目标仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long targetWarehouseId;
// ========= 数量金额字段 =========
/**
* 移库数量
*/
private BigDecimal quantity;
/**
* 单价
*/
private BigDecimal price;
/**
* 行金额(数量 * 单价)
*/
private BigDecimal totalPrice;
}

View File

@@ -0,0 +1,92 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.merchant.WmsMerchantDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.enums.DictTypeConstants;
import cn.iocoder.yudao.module.wms.enums.order.WmsReceiptOrderTypeEnum;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* WMS 入库单 DO
*
* @author 芋道源码
*/
@TableName("wms_receipt_order")
@KeySequence("wms_receipt_order_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsReceiptOrderDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
/**
* 入库单号
*/
private String no;
/**
* 入库类型
*
* 枚举 {@link WmsReceiptOrderTypeEnum}
* 字典 {@link DictTypeConstants#RECEIPT_ORDER_TYPE}
*/
private Integer type;
/**
* 单据日期
*/
private LocalDateTime orderTime;
/**
* 入库状态
*
* 字典 {@link DictTypeConstants#ORDER_STATUS}
*/
private Integer status;
/**
* 业务订单号
*/
private String bizOrderNo;
/**
* 供应商编号
*
* 关联 {@link WmsMerchantDO#getId()}
*/
private Long merchantId;
/**
* 备注
*/
private String remark;
// ========= 仓库字段 =========
/**
* 仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long warehouseId;
// ========= 汇总金额字段 =========
/**
* 总数量
*/
private BigDecimal totalQuantity;
/**
* 总金额
*/
private BigDecimal totalPrice;
}

View File

@@ -0,0 +1,72 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
/**
* WMS 入库单明细 DO
*
* @author 芋道源码
*/
@TableName("wms_receipt_order_detail")
@KeySequence("wms_receipt_order_detail_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsReceiptOrderDetailDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
// ========= 单据商品字段 =========
/**
* 入库单编号
*
* 关联 {@link WmsReceiptOrderDO#getId()}
*/
private Long orderId;
/**
* 商品 SKU 编号
*
* 关联 {@link WmsItemSkuDO#getId()}
*/
private Long skuId;
// ========= 仓库字段 =========
/**
* 仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long warehouseId;
// ========= 数量金额字段 =========
/**
* 入库数量
*/
private BigDecimal quantity;
/**
* 单价
*/
private BigDecimal price;
/**
* 行金额(数量 * 单价)
*/
private BigDecimal totalPrice;
}

View File

@@ -0,0 +1,92 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.merchant.WmsMerchantDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import cn.iocoder.yudao.module.wms.enums.DictTypeConstants;
import cn.iocoder.yudao.module.wms.enums.order.WmsShipmentOrderTypeEnum;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* WMS 出库单 DO
*
* @author 芋道源码
*/
@TableName("wms_shipment_order")
@KeySequence("wms_shipment_order_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsShipmentOrderDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
/**
* 出库单号
*/
private String no;
/**
* 出库类型
*
* 枚举 {@link WmsShipmentOrderTypeEnum}
* 字典 {@link DictTypeConstants#SHIPMENT_ORDER_TYPE}
*/
private Integer type;
/**
* 单据日期
*/
private LocalDateTime orderTime;
/**
* 出库状态
*
* 字典 {@link DictTypeConstants#ORDER_STATUS}
*/
private Integer status;
/**
* 业务订单号
*/
private String bizOrderNo;
/**
* 客户编号
*
* 关联 {@link WmsMerchantDO#getId()}
*/
private Long merchantId;
/**
* 备注
*/
private String remark;
// ========= 仓库字段 =========
/**
* 仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long warehouseId;
// ========= 汇总金额字段 =========
/**
* 总数量
*/
private BigDecimal totalQuantity;
/**
* 总金额
*/
private BigDecimal totalPrice;
}

View File

@@ -0,0 +1,72 @@
package cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.math.BigDecimal;
/**
* WMS 出库单明细 DO
*
* @author 芋道源码
*/
@TableName("wms_shipment_order_detail")
@KeySequence("wms_shipment_order_detail_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WmsShipmentOrderDetailDO extends BaseDO {
/**
* 主键编号
*/
@TableId
private Long id;
// ========= 单据商品字段 =========
/**
* 出库单编号
*
* 关联 {@link WmsShipmentOrderDO#getId()}
*/
private Long orderId;
/**
* 商品 SKU 编号
*
* 关联 {@link WmsItemSkuDO#getId()}
*/
private Long skuId;
// ========= 仓库字段 =========
/**
* 仓库编号
*
* 关联 {@link WmsWarehouseDO#getId()}
*/
private Long warehouseId;
// ========= 数量金额字段 =========
/**
* 出库数量
*/
private BigDecimal quantity;
/**
* 单价
*/
private BigDecimal price;
/**
* 行金额(数量 * 单价)
*/
private BigDecimal totalPrice;
}

View File

@@ -0,0 +1,67 @@
package cn.iocoder.yudao.module.wms.dal.mysql.home;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* WMS 首页统计 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsHomeStatisticsMapper {
/**
* 按单据类型和状态统计单据数量
*
* @param warehouseId 仓库编号
* @return [{ "orderType": 1, "status": 0, "count": 5 }, ...]
*/
List<Map<String, Object>> selectOrderCountGroupByTypeAndStatus(@Param("warehouseId") Long warehouseId);
/**
* 按天聚合单据数量
*
* @param beginTime >= 开始时间
* @param endTime < 结束时间
* @param warehouseId 仓库编号
* @return [{ "date": "2026-05-14", "orderType": 1, "count": 5 }, ...]
*/
List<Map<String, Object>> selectDailyOrderTrend(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime,
@Param("warehouseId") Long warehouseId);
/**
* 统计库存总数量
*
* @param warehouseId 仓库编号
* @return 库存总数量
*/
BigDecimal selectInventoryTotalQuantity(@Param("warehouseId") Long warehouseId);
/**
* 按商品统计库存数量排行
*
* @param warehouseId 仓库编号
* @param limit 数量限制
* @return [{ "id": 1, "name": "A4 复印纸", "quantity": 100 }, ...]
*/
List<Map<String, Object>> selectInventoryItemRank(@Param("warehouseId") Long warehouseId,
@Param("limit") Integer limit);
/**
* 按仓库统计库存数量排行
*
* @param warehouseId 仓库编号
* @param limit 数量限制
* @return [{ "id": 1, "name": "上海仓", "quantity": 100 }, ...]
*/
List<Map<String, Object>> selectInventoryWarehouseRank(@Param("warehouseId") Long warehouseId,
@Param("limit") Integer limit);
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.wms.dal.mysql.inventory;
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.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.history.WmsInventoryHistoryPageReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryHistoryDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import org.apache.ibatis.annotations.Mapper;
/**
* WMS 库存流水 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsInventoryHistoryMapper extends BaseMapperX<WmsInventoryHistoryDO> {
default PageResult<WmsInventoryHistoryDO> selectPage(WmsInventoryHistoryPageReqVO reqVO) {
MPJLambdaWrapperX<WmsInventoryHistoryDO> query = new MPJLambdaWrapperX<WmsInventoryHistoryDO>()
.selectAll(WmsInventoryHistoryDO.class)
.leftJoin(WmsItemSkuDO.class, WmsItemSkuDO::getId, WmsInventoryHistoryDO::getSkuId)
.leftJoin(WmsItemDO.class, WmsItemDO::getId, WmsItemSkuDO::getItemId)
.likeIfPresent(WmsItemDO::getCode, reqVO.getItemCode())
.likeIfPresent(WmsItemDO::getName, reqVO.getItemName())
.eqIfPresent(WmsInventoryHistoryDO::getSkuId, reqVO.getSkuId())
.likeIfPresent(WmsItemSkuDO::getCode, reqVO.getSkuCode())
.likeIfPresent(WmsItemSkuDO::getName, reqVO.getSkuName())
.eqIfPresent(WmsInventoryHistoryDO::getWarehouseId, reqVO.getWarehouseId())
.eqIfPresent(WmsInventoryHistoryDO::getOrderNo, reqVO.getOrderNo())
.eqIfPresent(WmsInventoryHistoryDO::getOrderType, reqVO.getOrderType())
.betweenIfPresent(WmsInventoryHistoryDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(WmsInventoryHistoryDO::getCreateTime)
.orderByDesc(WmsInventoryHistoryDO::getId);
return selectJoinPage(reqVO, WmsInventoryHistoryDO.class, query);
}
}

View File

@@ -0,0 +1,125 @@
package cn.iocoder.yudao.module.wms.dal.mysql.inventory;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
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.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryListReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryPageReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import org.apache.ibatis.annotations.Mapper;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* WMS 库存 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsInventoryMapper extends BaseMapperX<WmsInventoryDO> {
default PageResult<WmsInventoryDO> selectPage(WmsInventoryPageReqVO reqVO) {
MPJLambdaWrapperX<WmsInventoryDO> query = new MPJLambdaWrapperX<WmsInventoryDO>()
.selectAll(WmsInventoryDO.class)
.innerJoin(WmsItemSkuDO.class, WmsItemSkuDO::getId, WmsInventoryDO::getSkuId)
.innerJoin(WmsItemDO.class, WmsItemDO::getId, WmsItemSkuDO::getItemId)
.likeIfPresent(WmsItemDO::getCode, reqVO.getItemCode())
.likeIfPresent(WmsItemDO::getName, reqVO.getItemName())
.eqIfPresent(WmsInventoryDO::getSkuId, reqVO.getSkuId())
.likeIfPresent(WmsItemSkuDO::getCode, reqVO.getSkuCode())
.likeIfPresent(WmsItemSkuDO::getName, reqVO.getSkuName())
.eqIfPresent(WmsInventoryDO::getWarehouseId, reqVO.getWarehouseId())
.geIfPresent(WmsInventoryDO::getQuantity, reqVO.getMinQuantity());
if (Boolean.TRUE.equals(reqVO.getOnlyPositiveQuantity())) {
query.gt(WmsInventoryDO::getQuantity, BigDecimal.ZERO);
}
appendDimensionOrder(query, reqVO.getType());
return selectJoinPage(reqVO, WmsInventoryDO.class, query);
}
default Long selectCountBySkuId(Long skuId) {
return selectCount(WmsInventoryDO::getSkuId, skuId);
}
default Long selectCountByWarehouseId(Long warehouseId) {
return selectCount(WmsInventoryDO::getWarehouseId, warehouseId);
}
default List<WmsInventoryDO> selectList(WmsInventoryListReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<WmsInventoryDO>()
.eq(WmsInventoryDO::getWarehouseId, reqVO.getWarehouseId())
.orderByAsc(WmsInventoryDO::getSkuId)
.orderByAsc(WmsInventoryDO::getId));
}
default WmsInventoryDO selectBySkuIdAndWarehouseId(Long skuId, Long warehouseId) {
return selectOne(WmsInventoryDO::getSkuId, skuId,
WmsInventoryDO::getWarehouseId, warehouseId);
}
default WmsInventoryDO selectByIdForUpdate(Long id) {
return selectOne(new LambdaQueryWrapperX<WmsInventoryDO>()
.eq(WmsInventoryDO::getId, id)
.last("FOR UPDATE"));
}
/**
* 根据多个唯一键,批量查询库存列表
*
* @param keys 唯一键列表:由 SKU 编号 + 仓库编号组成
* @return 库存列表
*/
default List<WmsInventoryDO> selectListByKeys(Collection<WmsInventoryDO> keys) {
if (CollUtil.isEmpty(keys)) {
return Collections.emptyList();
}
return selectList(new LambdaQueryWrapperX<WmsInventoryDO>()
.and(query -> {
boolean first = true;
for (WmsInventoryDO key : keys) {
if (!first) {
query.or();
}
query.eq(WmsInventoryDO::getSkuId, key.getSkuId())
.eq(WmsInventoryDO::getWarehouseId, key.getWarehouseId());
first = false;
}
}));
}
default List<WmsInventoryDO> selectListByIdsForUpdate(Collection<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return Collections.emptyList();
}
return selectList(new LambdaQueryWrapperX<WmsInventoryDO>()
.in(WmsInventoryDO::getId, ids)
.last("FOR UPDATE"));
}
static void appendDimensionOrder(MPJLambdaWrapperX<WmsInventoryDO> query, String type) {
if (StrUtil.equals(WmsInventoryPageReqVO.TYPE_WAREHOUSE, type)) {
query.orderByAsc(WmsInventoryDO::getWarehouseId)
.orderByAsc(WmsItemSkuDO::getItemId)
.orderByAsc(WmsInventoryDO::getSkuId)
.orderByAsc(WmsInventoryDO::getId);
return;
}
if (StrUtil.equals(WmsInventoryPageReqVO.TYPE_ITEM, type)) {
query.orderByAsc(WmsItemSkuDO::getItemId)
.orderByAsc(WmsInventoryDO::getSkuId)
.orderByAsc(WmsInventoryDO::getWarehouseId)
.orderByAsc(WmsInventoryDO::getId);
return;
}
throw new IllegalArgumentException("未知库存统计维度:" + type);
}
}

View File

@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.wms.dal.mysql.md.item;
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.wms.controller.admin.md.item.vo.brand.WmsItemBrandPageReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemBrandDO;
import org.apache.ibatis.annotations.Mapper;
/**
* WMS 商品品牌 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsItemBrandMapper extends BaseMapperX<WmsItemBrandDO> {
default PageResult<WmsItemBrandDO> selectPage(WmsItemBrandPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<WmsItemBrandDO>()
.likeIfPresent(WmsItemBrandDO::getCode, reqVO.getCode())
.likeIfPresent(WmsItemBrandDO::getName, reqVO.getName())
.orderByDesc(WmsItemBrandDO::getId));
}
default WmsItemBrandDO selectByCode(String code) {
return selectOne(WmsItemBrandDO::getCode, code);
}
default WmsItemBrandDO selectByName(String name) {
return selectOne(WmsItemBrandDO::getName, name);
}
}

View File

@@ -0,0 +1,49 @@
package cn.iocoder.yudao.module.wms.dal.mysql.md.item;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.category.WmsItemCategoryListReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemCategoryDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.List;
/**
* WMS 商品分类 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsItemCategoryMapper extends BaseMapperX<WmsItemCategoryDO> {
default List<WmsItemCategoryDO> selectList(WmsItemCategoryListReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<WmsItemCategoryDO>()
.eqIfPresent(WmsItemCategoryDO::getParentId, reqVO.getParentId())
.likeIfPresent(WmsItemCategoryDO::getCode, reqVO.getCode())
.likeIfPresent(WmsItemCategoryDO::getName, reqVO.getName())
.eqIfPresent(WmsItemCategoryDO::getStatus, reqVO.getStatus())
.orderByAsc(WmsItemCategoryDO::getSort)
.orderByAsc(WmsItemCategoryDO::getId));
}
default WmsItemCategoryDO selectByParentIdAndName(Long parentId, String name) {
return selectOne(WmsItemCategoryDO::getParentId, parentId, WmsItemCategoryDO::getName, name);
}
default WmsItemCategoryDO selectByCode(String code) {
return selectOne(WmsItemCategoryDO::getCode, code);
}
default List<WmsItemCategoryDO> selectListByParentIds(Collection<Long> parentIds) {
return selectList(new LambdaQueryWrapperX<WmsItemCategoryDO>()
.in(WmsItemCategoryDO::getParentId, parentIds)
.orderByAsc(WmsItemCategoryDO::getSort)
.orderByAsc(WmsItemCategoryDO::getId));
}
default Long selectCountByParentId(Long parentId) {
return selectCount(WmsItemCategoryDO::getParentId, parentId);
}
}

View File

@@ -0,0 +1,58 @@
package cn.iocoder.yudao.module.wms.dal.mysql.md.item;
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.wms.controller.admin.md.item.vo.item.WmsItemListReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item.WmsItemPageReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.List;
/**
* WMS 商品 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsItemMapper extends BaseMapperX<WmsItemDO> {
default PageResult<WmsItemDO> selectPage(WmsItemPageReqVO reqVO, Collection<Long> categoryIds) {
return selectPage(reqVO, new LambdaQueryWrapperX<WmsItemDO>()
.likeIfPresent(WmsItemDO::getCode, reqVO.getCode())
.likeIfPresent(WmsItemDO::getName, reqVO.getName())
.inIfPresent(WmsItemDO::getCategoryId, categoryIds)
.eqIfPresent(WmsItemDO::getBrandId, reqVO.getBrandId())
.betweenIfPresent(WmsItemDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(WmsItemDO::getId));
}
default List<WmsItemDO> selectList(WmsItemListReqVO reqVO, Collection<Long> categoryIds) {
return selectList(new LambdaQueryWrapperX<WmsItemDO>()
.likeIfPresent(WmsItemDO::getCode, reqVO.getCode())
.likeIfPresent(WmsItemDO::getName, reqVO.getName())
.inIfPresent(WmsItemDO::getCategoryId, categoryIds)
.eqIfPresent(WmsItemDO::getBrandId, reqVO.getBrandId())
.betweenIfPresent(WmsItemDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(WmsItemDO::getId));
}
default WmsItemDO selectByName(String name) {
return selectOne(WmsItemDO::getName, name);
}
default WmsItemDO selectByCode(String code) {
return selectOne(WmsItemDO::getCode, code);
}
default Long selectCountByCategoryId(Long categoryId) {
return selectCount(WmsItemDO::getCategoryId, categoryId);
}
default Long selectCountByBrandId(Long brandId) {
return selectCount(WmsItemDO::getBrandId, brandId);
}
}

View File

@@ -0,0 +1,76 @@
package cn.iocoder.yudao.module.wms.dal.mysql.md.item;
import cn.hutool.core.collection.CollUtil;
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.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku.WmsItemSkuPageReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* WMS 商品 SKU Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsItemSkuMapper extends BaseMapperX<WmsItemSkuDO> {
/**
* 按 SKU 维度分页查询,支持商品 / 品牌 / 分类多表联查筛选。
*
* 使用 {@link MPJLambdaWrapperX} 替代 lite 的手写 XML JOIN见 lite
* {@code ItemSkuMapper.selectByBo}),范式参照本模块 {@code WmsInventoryMapper.selectPage}。
*/
default PageResult<WmsItemSkuDO> selectPage(WmsItemSkuPageReqVO reqVO) {
MPJLambdaWrapperX<WmsItemSkuDO> query = new MPJLambdaWrapperX<WmsItemSkuDO>()
.selectAll(WmsItemSkuDO.class)
.innerJoin(WmsItemDO.class, WmsItemDO::getId, WmsItemSkuDO::getItemId)
.likeIfPresent(WmsItemDO::getCode, reqVO.getItemCode())
.likeIfPresent(WmsItemDO::getName, reqVO.getItemName())
.eqIfPresent(WmsItemDO::getCategoryId, reqVO.getCategoryId())
.eqIfPresent(WmsItemDO::getBrandId, reqVO.getBrandId())
.likeIfPresent(WmsItemSkuDO::getCode, reqVO.getCode())
.likeIfPresent(WmsItemSkuDO::getName, reqVO.getName())
.likeIfPresent(WmsItemSkuDO::getBarCode, reqVO.getBarCode())
.orderByDesc(WmsItemSkuDO::getId);
return selectJoinPage(reqVO, WmsItemSkuDO.class, query);
}
default List<WmsItemSkuDO> selectListByItemId(Long itemId) {
return selectList(new LambdaQueryWrapperX<WmsItemSkuDO>()
.eq(WmsItemSkuDO::getItemId, itemId)
.orderByAsc(WmsItemSkuDO::getId));
}
default List<WmsItemSkuDO> selectListByItemIds(Collection<Long> itemIds) {
if (CollUtil.isEmpty(itemIds)) {
return Collections.emptyList();
}
return selectList(new LambdaQueryWrapperX<WmsItemSkuDO>()
.inIfPresent(WmsItemSkuDO::getItemId, itemIds)
.orderByAsc(WmsItemSkuDO::getId));
}
default List<WmsItemSkuDO> selectList(Collection<Long> itemIds, String code, String name) {
if (itemIds != null && CollUtil.isEmpty(itemIds)) {
return Collections.emptyList();
}
return selectList(new LambdaQueryWrapperX<WmsItemSkuDO>()
.inIfPresent(WmsItemSkuDO::getItemId, itemIds)
.likeIfPresent(WmsItemSkuDO::getCode, code)
.likeIfPresent(WmsItemSkuDO::getName, name)
.orderByAsc(WmsItemSkuDO::getId));
}
default void deleteByItemId(Long itemId) {
delete(WmsItemSkuDO::getItemId, itemId);
}
}

View File

@@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.wms.dal.mysql.md.merchant;
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.wms.controller.admin.md.merchant.vo.WmsMerchantListReqVO;
import cn.iocoder.yudao.module.wms.controller.admin.md.merchant.vo.WmsMerchantPageReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.merchant.WmsMerchantDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* WMS 往来企业 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsMerchantMapper extends BaseMapperX<WmsMerchantDO> {
default PageResult<WmsMerchantDO> selectPage(WmsMerchantPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<WmsMerchantDO>()
.eqIfPresent(WmsMerchantDO::getCode, reqVO.getCode())
.likeIfPresent(WmsMerchantDO::getName, reqVO.getName())
.eqIfPresent(WmsMerchantDO::getType, reqVO.getType())
.inIfPresent(WmsMerchantDO::getType, reqVO.getTypes())
.orderByDesc(WmsMerchantDO::getId));
}
default List<WmsMerchantDO> selectList(WmsMerchantListReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<WmsMerchantDO>()
.eqIfPresent(WmsMerchantDO::getCode, reqVO.getCode())
.likeIfPresent(WmsMerchantDO::getName, reqVO.getName())
.eqIfPresent(WmsMerchantDO::getType, reqVO.getType())
.inIfPresent(WmsMerchantDO::getType, reqVO.getTypes())
.orderByDesc(WmsMerchantDO::getId));
}
default WmsMerchantDO selectByCode(String code) {
return selectOne(WmsMerchantDO::getCode, code);
}
default WmsMerchantDO selectByName(String name) {
return selectOne(WmsMerchantDO::getName, name);
}
}

View File

@@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.wms.dal.mysql.md.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.wms.controller.admin.md.warehouse.vo.WmsWarehousePageReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* WMS 仓库 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsWarehouseMapper extends BaseMapperX<WmsWarehouseDO> {
default PageResult<WmsWarehouseDO> selectPage(WmsWarehousePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<WmsWarehouseDO>()
.eqIfPresent(WmsWarehouseDO::getCode, reqVO.getCode())
.likeIfPresent(WmsWarehouseDO::getName, reqVO.getName())
.orderByAsc(WmsWarehouseDO::getSort)
.orderByDesc(WmsWarehouseDO::getId));
}
default WmsWarehouseDO selectByCode(String code) {
return selectOne(WmsWarehouseDO::getCode, code);
}
default WmsWarehouseDO selectByName(String name) {
return selectOne(WmsWarehouseDO::getName, name);
}
default List<WmsWarehouseDO> selectSimpleList() {
return selectList(new LambdaQueryWrapperX<WmsWarehouseDO>()
.orderByAsc(WmsWarehouseDO::getSort)
.orderByDesc(WmsWarehouseDO::getId));
}
}

View File

@@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.wms.dal.mysql.order.check;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.check.WmsCheckOrderDetailDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.List;
/**
* WMS 盘库单明细 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsCheckOrderDetailMapper extends BaseMapperX<WmsCheckOrderDetailDO> {
default List<WmsCheckOrderDetailDO> selectListByOrderId(Long orderId) {
return selectList(WmsCheckOrderDetailDO::getOrderId, orderId);
}
default List<WmsCheckOrderDetailDO> selectListByOrderIds(Collection<Long> orderIds) {
return selectList(new LambdaQueryWrapperX<WmsCheckOrderDetailDO>()
.inIfPresent(WmsCheckOrderDetailDO::getOrderId, orderIds)
.orderByAsc(WmsCheckOrderDetailDO::getOrderId)
.orderByAsc(WmsCheckOrderDetailDO::getId));
}
default void deleteByOrderId(Long orderId) {
delete(WmsCheckOrderDetailDO::getOrderId, orderId);
}
default Long selectCountBySkuId(Long skuId) {
return selectCount(WmsCheckOrderDetailDO::getSkuId, skuId);
}
}

View File

@@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.wms.dal.mysql.order.check;
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.wms.controller.admin.order.check.vo.order.WmsCheckOrderPageReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.check.WmsCheckOrderDO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.ibatis.annotations.Mapper;
/**
* WMS 盘库单 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsCheckOrderMapper extends BaseMapperX<WmsCheckOrderDO> {
default PageResult<WmsCheckOrderDO> selectPage(WmsCheckOrderPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<WmsCheckOrderDO>()
.likeIfPresent(WmsCheckOrderDO::getNo, reqVO.getNo())
.eqIfPresent(WmsCheckOrderDO::getStatus, reqVO.getStatus())
.eqIfPresent(WmsCheckOrderDO::getWarehouseId, reqVO.getWarehouseId())
.betweenIfPresent(WmsCheckOrderDO::getOrderTime, reqVO.getOrderTime())
.geIfPresent(WmsCheckOrderDO::getTotalQuantity, reqVO.getTotalQuantityMin())
.leIfPresent(WmsCheckOrderDO::getTotalQuantity, reqVO.getTotalQuantityMax())
.geIfPresent(WmsCheckOrderDO::getTotalPrice, reqVO.getTotalPriceMin())
.leIfPresent(WmsCheckOrderDO::getTotalPrice, reqVO.getTotalPriceMax())
.geIfPresent(WmsCheckOrderDO::getActualPrice, reqVO.getActualPriceMin())
.leIfPresent(WmsCheckOrderDO::getActualPrice, reqVO.getActualPriceMax())
.eqIfPresent(WmsCheckOrderDO::getCreator, reqVO.getCreator())
.eqIfPresent(WmsCheckOrderDO::getUpdater, reqVO.getUpdater())
.betweenIfPresent(WmsCheckOrderDO::getCreateTime, reqVO.getCreateTime())
.betweenIfPresent(WmsCheckOrderDO::getUpdateTime, reqVO.getUpdateTime())
.orderByDesc(WmsCheckOrderDO::getId));
}
default WmsCheckOrderDO selectByNo(String no) {
return selectOne(WmsCheckOrderDO::getNo, no);
}
default Long selectCountByWarehouseId(Long warehouseId) {
return selectCount(WmsCheckOrderDO::getWarehouseId, warehouseId);
}
default int updateByIdAndStatus(Long id, Integer status, WmsCheckOrderDO updateObj) {
return update(updateObj, new LambdaQueryWrapper<WmsCheckOrderDO>()
.eq(WmsCheckOrderDO::getId, id)
.eq(WmsCheckOrderDO::getStatus, status));
}
}

View File

@@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.wms.dal.mysql.order.movement;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDetailDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.List;
/**
* WMS 移库单明细 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsMovementOrderDetailMapper extends BaseMapperX<WmsMovementOrderDetailDO> {
default List<WmsMovementOrderDetailDO> selectListByOrderId(Long orderId) {
return selectList(WmsMovementOrderDetailDO::getOrderId, orderId);
}
default List<WmsMovementOrderDetailDO> selectListByOrderIds(Collection<Long> orderIds) {
return selectList(new LambdaQueryWrapperX<WmsMovementOrderDetailDO>()
.inIfPresent(WmsMovementOrderDetailDO::getOrderId, orderIds)
.orderByAsc(WmsMovementOrderDetailDO::getOrderId)
.orderByAsc(WmsMovementOrderDetailDO::getId));
}
default void deleteByOrderId(Long orderId) {
delete(WmsMovementOrderDetailDO::getOrderId, orderId);
}
default Long selectCountBySkuId(Long skuId) {
return selectCount(WmsMovementOrderDetailDO::getSkuId, skuId);
}
}

View File

@@ -0,0 +1,53 @@
package cn.iocoder.yudao.module.wms.dal.mysql.order.movement;
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.wms.controller.admin.order.movement.vo.order.WmsMovementOrderPageReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.movement.WmsMovementOrderDO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.ibatis.annotations.Mapper;
/**
* WMS 移库单 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsMovementOrderMapper extends BaseMapperX<WmsMovementOrderDO> {
default PageResult<WmsMovementOrderDO> selectPage(WmsMovementOrderPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<WmsMovementOrderDO>()
.likeIfPresent(WmsMovementOrderDO::getNo, reqVO.getNo())
.eqIfPresent(WmsMovementOrderDO::getStatus, reqVO.getStatus())
.eqIfPresent(WmsMovementOrderDO::getSourceWarehouseId, reqVO.getSourceWarehouseId())
.eqIfPresent(WmsMovementOrderDO::getTargetWarehouseId, reqVO.getTargetWarehouseId())
.betweenIfPresent(WmsMovementOrderDO::getOrderTime, reqVO.getOrderTime())
.geIfPresent(WmsMovementOrderDO::getTotalQuantity, reqVO.getTotalQuantityMin())
.leIfPresent(WmsMovementOrderDO::getTotalQuantity, reqVO.getTotalQuantityMax())
.geIfPresent(WmsMovementOrderDO::getTotalPrice, reqVO.getTotalPriceMin())
.leIfPresent(WmsMovementOrderDO::getTotalPrice, reqVO.getTotalPriceMax())
.eqIfPresent(WmsMovementOrderDO::getCreator, reqVO.getCreator())
.eqIfPresent(WmsMovementOrderDO::getUpdater, reqVO.getUpdater())
.betweenIfPresent(WmsMovementOrderDO::getCreateTime, reqVO.getCreateTime())
.betweenIfPresent(WmsMovementOrderDO::getUpdateTime, reqVO.getUpdateTime())
.orderByDesc(WmsMovementOrderDO::getId));
}
default WmsMovementOrderDO selectByNo(String no) {
return selectOne(WmsMovementOrderDO::getNo, no);
}
default Long selectCountByWarehouseId(Long warehouseId) {
return selectCount(new LambdaQueryWrapperX<WmsMovementOrderDO>()
.and(query -> query.eq(WmsMovementOrderDO::getSourceWarehouseId, warehouseId)
.or().eq(WmsMovementOrderDO::getTargetWarehouseId, warehouseId)));
}
default int updateByIdAndStatus(Long id, Integer status, WmsMovementOrderDO updateObj) {
return update(updateObj, new LambdaQueryWrapper<WmsMovementOrderDO>()
.eq(WmsMovementOrderDO::getId, id)
.eq(WmsMovementOrderDO::getStatus, status));
}
}

View File

@@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.wms.dal.mysql.order.receipt;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt.WmsReceiptOrderDetailDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.List;
/**
* WMS 入库单明细 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsReceiptOrderDetailMapper extends BaseMapperX<WmsReceiptOrderDetailDO> {
default List<WmsReceiptOrderDetailDO> selectListByOrderId(Long orderId) {
return selectList(WmsReceiptOrderDetailDO::getOrderId, orderId);
}
default List<WmsReceiptOrderDetailDO> selectListByOrderIds(Collection<Long> orderIds) {
return selectList(new LambdaQueryWrapperX<WmsReceiptOrderDetailDO>()
.inIfPresent(WmsReceiptOrderDetailDO::getOrderId, orderIds)
.orderByAsc(WmsReceiptOrderDetailDO::getOrderId)
.orderByAsc(WmsReceiptOrderDetailDO::getId));
}
default void deleteByOrderId(Long orderId) {
delete(WmsReceiptOrderDetailDO::getOrderId, orderId);
}
default Long selectCountBySkuId(Long skuId) {
return selectCount(WmsReceiptOrderDetailDO::getSkuId, skuId);
}
}

View File

@@ -0,0 +1,57 @@
package cn.iocoder.yudao.module.wms.dal.mysql.order.receipt;
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.wms.controller.admin.order.receipt.vo.order.WmsReceiptOrderPageReqVO;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.receipt.WmsReceiptOrderDO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.ibatis.annotations.Mapper;
/**
* WMS 入库单 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsReceiptOrderMapper extends BaseMapperX<WmsReceiptOrderDO> {
default PageResult<WmsReceiptOrderDO> selectPage(WmsReceiptOrderPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<WmsReceiptOrderDO>()
.likeIfPresent(WmsReceiptOrderDO::getNo, reqVO.getNo())
.eqIfPresent(WmsReceiptOrderDO::getStatus, reqVO.getStatus())
.eqIfPresent(WmsReceiptOrderDO::getWarehouseId, reqVO.getWarehouseId())
.eqIfPresent(WmsReceiptOrderDO::getMerchantId, reqVO.getMerchantId())
.betweenIfPresent(WmsReceiptOrderDO::getOrderTime, reqVO.getOrderTime())
.geIfPresent(WmsReceiptOrderDO::getTotalQuantity, reqVO.getTotalQuantityMin())
.leIfPresent(WmsReceiptOrderDO::getTotalQuantity, reqVO.getTotalQuantityMax())
.geIfPresent(WmsReceiptOrderDO::getTotalPrice, reqVO.getTotalPriceMin())
.leIfPresent(WmsReceiptOrderDO::getTotalPrice, reqVO.getTotalPriceMax())
.eqIfPresent(WmsReceiptOrderDO::getType, reqVO.getType())
.likeIfPresent(WmsReceiptOrderDO::getBizOrderNo, reqVO.getBizOrderNo())
.eqIfPresent(WmsReceiptOrderDO::getCreator, reqVO.getCreator())
.eqIfPresent(WmsReceiptOrderDO::getUpdater, reqVO.getUpdater())
.betweenIfPresent(WmsReceiptOrderDO::getCreateTime, reqVO.getCreateTime())
.betweenIfPresent(WmsReceiptOrderDO::getUpdateTime, reqVO.getUpdateTime())
.orderByDesc(WmsReceiptOrderDO::getId));
}
default WmsReceiptOrderDO selectByNo(String no) {
return selectOne(WmsReceiptOrderDO::getNo, no);
}
default Long selectCountByMerchantId(Long merchantId) {
return selectCount(WmsReceiptOrderDO::getMerchantId, merchantId);
}
default Long selectCountByWarehouseId(Long warehouseId) {
return selectCount(WmsReceiptOrderDO::getWarehouseId, warehouseId);
}
default int updateByIdAndStatus(Long id, Integer status, WmsReceiptOrderDO updateObj) {
return update(updateObj, new LambdaQueryWrapper<WmsReceiptOrderDO>()
.eq(WmsReceiptOrderDO::getId, id)
.eq(WmsReceiptOrderDO::getStatus, status));
}
}

View File

@@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.wms.dal.mysql.order.shipment;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.wms.dal.dataobject.order.shipment.WmsShipmentOrderDetailDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.List;
/**
* WMS 出库单明细 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface WmsShipmentOrderDetailMapper extends BaseMapperX<WmsShipmentOrderDetailDO> {
default List<WmsShipmentOrderDetailDO> selectListByOrderId(Long orderId) {
return selectList(WmsShipmentOrderDetailDO::getOrderId, orderId);
}
default List<WmsShipmentOrderDetailDO> selectListByOrderIds(Collection<Long> orderIds) {
return selectList(new LambdaQueryWrapperX<WmsShipmentOrderDetailDO>()
.inIfPresent(WmsShipmentOrderDetailDO::getOrderId, orderIds)
.orderByAsc(WmsShipmentOrderDetailDO::getOrderId)
.orderByAsc(WmsShipmentOrderDetailDO::getId));
}
default void deleteByOrderId(Long orderId) {
delete(WmsShipmentOrderDetailDO::getOrderId, orderId);
}
default Long selectCountBySkuId(Long skuId) {
return selectCount(WmsShipmentOrderDetailDO::getSkuId, skuId);
}
}

Some files were not shown because too many files have changed in this diff Show More