diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/WmsHomeStatisticsController.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/WmsHomeStatisticsController.java new file mode 100644 index 0000000..c1c29bc --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/WmsHomeStatisticsController.java @@ -0,0 +1,62 @@ +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> 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> 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 getInventorySummary( + @RequestParam(value = "warehouseId", required = false) Long warehouseId) { + return success(homeStatisticsService.getInventorySummary(warehouseId)); + } + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeInventoryItemRankRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeInventoryItemRankRespVO.java new file mode 100644 index 0000000..80229c1 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeInventoryItemRankRespVO.java @@ -0,0 +1,23 @@ +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; + +@Schema(description = "管理后台 - WMS 首页商品库存排行 Response VO") +@Data +public class WmsHomeInventoryItemRankRespVO { + + // TODO @AI:改成 id、name 会不会更好? + + @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long itemId; + + @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "A4 复印纸") + private String itemName; + + @Schema(description = "库存数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + private BigDecimal quantity; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeInventorySummaryRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeInventorySummaryRespVO.java new file mode 100644 index 0000000..8739679 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeInventorySummaryRespVO.java @@ -0,0 +1,24 @@ +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 { + + // TODO @AI:一次性的 VO ,要不合并到 WmsHomeInventorySummaryRespVO 里?一个叫 ItemRank,一个叫 WarehouseRank? + + @Schema(description = "总库存数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000.00") + private BigDecimal totalQuantity; + + @Schema(description = "商品库存占比列表") + private List goodsShareList; + + @Schema(description = "仓库库存分布列表") + private List warehouseDistributionList; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeInventoryWarehouseRankRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeInventoryWarehouseRankRespVO.java new file mode 100644 index 0000000..8fb55ec --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeInventoryWarehouseRankRespVO.java @@ -0,0 +1,23 @@ +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; + +@Schema(description = "管理后台 - WMS 首页仓库库存排行 Response VO") +@Data +public class WmsHomeInventoryWarehouseRankRespVO { + + // TODO @AI:改成 id、name 会不会更好? + + @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long warehouseId; + + @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "上海仓") + private String warehouseName; + + @Schema(description = "库存数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + private BigDecimal quantity; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderStatusRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderStatusRespVO.java new file mode 100644 index 0000000..cfa7e42 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderStatusRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.wms.controller.admin.home.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - WMS 首页单据状态统计 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class WmsHomeOrderStatusRespVO { + + @Schema(description = "状态值", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Integer status; + + // TODO @AI:statusName 前端字段就翻译点? + @Schema(description = "状态名", requiredMode = Schema.RequiredMode.REQUIRED, example = "草稿") + private String statusName; + + @Schema(description = "单据数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "12") + private Long count; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderSummaryRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderSummaryRespVO.java new file mode 100644 index 0000000..c062ce4 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderSummaryRespVO.java @@ -0,0 +1,28 @@ +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 { + + // TODO @AI:orderType 缩写成 type? + + @Schema(description = "单据类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer orderType; + + // TODO @AI:type 改成 dict tag 去翻译?或者字典工具类? + @Schema(description = "单据类型名", requiredMode = Schema.RequiredMode.REQUIRED, example = "入库单") + private String orderTypeName; + + @Schema(description = "单据总数", requiredMode = Schema.RequiredMode.REQUIRED, example = "12") + private Long total; + + // TODO @AI:statuses;状态分布; + @Schema(description = "状态分布") + private List statusList; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderTrendRespVO.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderTrendRespVO.java new file mode 100644 index 0000000..97dda88 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/controller/admin/home/vo/WmsHomeOrderTrendRespVO.java @@ -0,0 +1,26 @@ +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 WmsHomeOrderTrendRespVO { + + // TODO @AI:可以使用 localdatetime?前端按需翻译?无非是 time 是 00 00 00 这样。灵活性更大。 + @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-05-14") + private String date; + + @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; + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/home/WmsHomeStatisticsMapper.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/home/WmsHomeStatisticsMapper.java new file mode 100644 index 0000000..f1f3aa3 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/dal/mysql/home/WmsHomeStatisticsMapper.java @@ -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> selectOrderCountGroupByTypeAndStatus(@Param("warehouseId") Long warehouseId); + + /** + * 按天聚合单据数量 + * + * @param beginTime >= 开始时间 + * @param endTime < 结束时间 + * @param warehouseId 仓库编号 + * @return [{ "date": "2026-05-14", "orderType": 1, "count": 5 }, ...] + */ + List> 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 [{ "itemId": 1, "itemName": "A4 复印纸", "quantity": 100 }, ...] + */ + List> selectInventoryItemRank(@Param("warehouseId") Long warehouseId, + @Param("limit") Integer limit); + + /** + * 按仓库统计库存数量排行 + * + * @param warehouseId 仓库编号 + * @param limit 数量限制 + * @return [{ "warehouseId": 1, "warehouseName": "上海仓", "quantity": 100 }, ...] + */ + List> selectInventoryWarehouseRank(@Param("warehouseId") Long warehouseId, + @Param("limit") Integer limit); + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/home/WmsHomeStatisticsService.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/home/WmsHomeStatisticsService.java new file mode 100644 index 0000000..7a3abbc --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/home/WmsHomeStatisticsService.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.wms.service.home; + +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 java.util.List; + +/** + * WMS 首页统计 Service 接口 + * + * @author 芋道源码 + */ +public interface WmsHomeStatisticsService { + + /** + * 获得单据汇总统计 + * + * @param warehouseId 仓库编号 + * @return 单据汇总统计 + */ + List getOrderSummary(Long warehouseId); + + /** + * 获得单据趋势 + * + * @param days 天数 + * @param warehouseId 仓库编号 + * @return 单据趋势 + */ + List getOrderTrend(Integer days, Long warehouseId); + + /** + * 获得库存汇总统计 + * + * @param warehouseId 仓库编号 + * @return 库存汇总统计 + */ + WmsHomeInventorySummaryRespVO getInventorySummary(Long warehouseId); + +} diff --git a/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/home/WmsHomeStatisticsServiceImpl.java b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/home/WmsHomeStatisticsServiceImpl.java new file mode 100644 index 0000000..4be90d7 --- /dev/null +++ b/yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/service/home/WmsHomeStatisticsServiceImpl.java @@ -0,0 +1,168 @@ +package cn.iocoder.yudao.module.wms.service.home; + +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.module.wms.controller.admin.home.vo.WmsHomeInventoryItemRankRespVO; +import cn.iocoder.yudao.module.wms.controller.admin.home.vo.WmsHomeInventorySummaryRespVO; +import cn.iocoder.yudao.module.wms.controller.admin.home.vo.WmsHomeInventoryWarehouseRankRespVO; +import cn.iocoder.yudao.module.wms.controller.admin.home.vo.WmsHomeOrderStatusRespVO; +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.dal.mysql.home.WmsHomeStatisticsMapper; +import cn.iocoder.yudao.module.wms.enums.order.WmsOrderStatusEnum; +import cn.iocoder.yudao.module.wms.enums.order.WmsOrderTypeEnum; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * WMS 首页统计 Service 实现类 + * + * @author 芋道源码 + */ +@Service +public class WmsHomeStatisticsServiceImpl implements WmsHomeStatisticsService { + + // TODO @AI:8、5、交给前端传递; + private static final int GOODS_SHARE_LIMIT = 5; + private static final int WAREHOUSE_DISTRIBUTION_LIMIT = 8; + + @Resource + private WmsHomeStatisticsMapper homeStatisticsMapper; + + @Override + public List getOrderSummary(Long warehouseId) { + List> stats = homeStatisticsMapper.selectOrderCountGroupByTypeAndStatus(warehouseId); + // TODO @AI:convertList 链式调用。 + List result = new ArrayList<>(); + for (WmsOrderTypeEnum orderTypeEnum : WmsOrderTypeEnum.values()) { + WmsHomeOrderSummaryRespVO vo = new WmsHomeOrderSummaryRespVO() + .setOrderType(orderTypeEnum.getType()).setOrderTypeName(orderTypeEnum.getName()); + // TODO @AI:collutils sum 是不是可以? + long total = 0L; + List statusList = new ArrayList<>(); + for (WmsOrderStatusEnum statusEnum : WmsOrderStatusEnum.values()) { + long count = getOrderCount(stats, orderTypeEnum.getType(), statusEnum.getStatus()); + total += count; + statusList.add(new WmsHomeOrderStatusRespVO(statusEnum.getStatus(), statusEnum.getName(), count)); + } + vo.setTotal(total).setStatusList(statusList); + result.add(vo); + } + return result; + } + + @Override + public List getOrderTrend(Integer days, Long warehouseId) { + // TODO @AI:同上? + LocalDate endDate = LocalDate.now().plusDays(1); + LocalDate startDate = endDate.minusDays(days); + LocalDateTime beginTime = startDate.atStartOfDay(); + LocalDateTime endTime = endDate.atStartOfDay(); + + List> dbData = homeStatisticsMapper.selectDailyOrderTrend(beginTime, endTime, warehouseId); + Map> dateMap = new LinkedHashMap<>(); + for (Map row : dbData) { + String date = (String) row.get("date"); + Integer orderType = getInteger(row, "orderType"); + Long count = getLong(row, "count"); + dateMap.computeIfAbsent(date, key -> new HashMap<>()).put(orderType, count); + } + // TODO @AI:链式调用; + DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + List result = new ArrayList<>(); + for (LocalDate d = startDate; d.isBefore(endDate); d = d.plusDays(1)) { + String dateStr = d.format(fmt); + Map row = dateMap.getOrDefault(dateStr, Collections.emptyMap()); + WmsHomeOrderTrendRespVO vo = new WmsHomeOrderTrendRespVO(); + vo.setDate(dateStr); + vo.setReceiptCount(row.getOrDefault(WmsOrderTypeEnum.RECEIPT.getType(), 0L)); + vo.setShipmentCount(row.getOrDefault(WmsOrderTypeEnum.SHIPMENT.getType(), 0L)); + vo.setMovementCount(row.getOrDefault(WmsOrderTypeEnum.MOVEMENT.getType(), 0L)); + vo.setCheckCount(row.getOrDefault(WmsOrderTypeEnum.CHECK.getType(), 0L)); + result.add(vo); + } + return result; + } + + @Override + public WmsHomeInventorySummaryRespVO getInventorySummary(Long warehouseId) { + // TODO @AI:要不都先查询;然后 set 设置值; + return new WmsHomeInventorySummaryRespVO() + .setTotalQuantity(getDecimal(homeStatisticsMapper.selectInventoryTotalQuantity(warehouseId))) + .setGoodsShareList(buildInventoryItemRankList(homeStatisticsMapper.selectInventoryItemRank(warehouseId, GOODS_SHARE_LIMIT))) + .setWarehouseDistributionList(buildInventoryWarehouseRankList(homeStatisticsMapper.selectInventoryWarehouseRank(warehouseId, WAREHOUSE_DISTRIBUTION_LIMIT))); + } + + // TODO @AI:这个 ===== 太短了,加长! + // ========== 工具方法 ========== + + private long getOrderCount(List> stats, Integer orderType, Integer status) { + for (Map stat : stats) { + if (ObjectUtil.equal(getInteger(stat, "orderType"), orderType) + && ObjectUtil.equal(getInteger(stat, "status"), status)) { + return getLong(stat, "count"); + } + } + return 0L; + } + + // TODO @AI:convertList;然后链式调用; + private List buildInventoryItemRankList(List> rows) { + List result = new ArrayList<>(rows.size()); + for (Map row : rows) { + WmsHomeInventoryItemRankRespVO vo = new WmsHomeInventoryItemRankRespVO(); + vo.setItemId(getLong(row, "itemId")); + vo.setItemName((String) row.get("itemName")); + vo.setQuantity(getDecimal(row.get("quantity"))); + result.add(vo); + } + return result; + } + + // TODO @AI:convertList;然后链式调用; + private List buildInventoryWarehouseRankList(List> rows) { + List result = new ArrayList<>(rows.size()); + for (Map row : rows) { + WmsHomeInventoryWarehouseRankRespVO vo = new WmsHomeInventoryWarehouseRankRespVO(); + vo.setWarehouseId(getLong(row, "warehouseId")); + vo.setWarehouseName((String) row.get("warehouseName")); + vo.setQuantity(getDecimal(row.get("quantity"))); + result.add(vo); + } + return result; + } + + // TODO @AI:maputil 直接使用 + private Integer getInteger(Map map, String key) { + Object value = map.get(key); + return value == null ? null : ((Number) value).intValue(); + } + + // TODO @AI:maputil 直接使用 + private Long getLong(Map map, String key) { + Object value = map.get(key); + return value == null ? 0L : ((Number) value).longValue(); + } + + // TODO @AI:maputil 直接使用 + private BigDecimal getDecimal(Object value) { + if (value == null) { + return BigDecimal.ZERO; + } + if (value instanceof BigDecimal) { + return (BigDecimal) value; + } + return new BigDecimal(value.toString()); + } + +} diff --git a/yudao-module-wms/src/main/resources/mapper/home/WmsHomeStatisticsMapper.xml b/yudao-module-wms/src/main/resources/mapper/home/WmsHomeStatisticsMapper.xml new file mode 100644 index 0000000..aa8c928 --- /dev/null +++ b/yudao-module-wms/src/main/resources/mapper/home/WmsHomeStatisticsMapper.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + +