feat(wms): 优化钢卷库区操作记录吞吐报表统计功能

- 后端新增 statistics 接口聚合图表数据,避免前端遍历计算
- 新增 WmsCoilWarehouseOperationLogStatisticsVo 数据传输对象
- 实现按操作人汇总、按日趋势、汇总指标三个维度的数据查询
- 前端 record 页面集成统计卡片、趋势图、饼图、柱状图展示
- 优化分页逻辑,移除前端全量数据存储和分页计算
- 添加完整的 SQL 统计查询语句支持多维度数据聚合
This commit is contained in:
2026-06-22 17:27:08 +08:00
parent 6436d56ab8
commit b5a269a37a
8 changed files with 254 additions and 111 deletions

View File

@@ -23,6 +23,7 @@ import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogVo;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogExportVo;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogStatisticsVo;
import com.klp.domain.bo.WmsCoilWarehouseOperationLogBo;
import com.klp.service.IWmsCoilWarehouseOperationLogService;
import com.klp.common.core.page.TableDataInfo;
@@ -178,5 +179,13 @@ public class WmsCoilWarehouseOperationLogController extends BaseController {
ExcelUtil.exportExcel(list, "钢卷库区操作记录导出", WmsCoilWarehouseOperationLogExportVo.class, response);
}
/**
* 吞吐报表统计 —— 后端聚合图表数据,前端仅负责渲染
*/
@GetMapping("/statistics")
public R<WmsCoilWarehouseOperationLogStatisticsVo> statistics(WmsCoilWarehouseOperationLogBo bo) {
return R.ok(iWmsCoilWarehouseOperationLogService.statistics(bo));
}
}

View File

@@ -0,0 +1,51 @@
package com.klp.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 吞吐报表统计结果 VO —— 后端聚合所有图表数据,前端不再遍历全量 rows
*
* @author klp
* @date 2026-06-22
*/
@Data
public class WmsCoilWarehouseOperationLogStatisticsVo {
/** 操作记录总数 */
private long totalCount;
/** 总重量kg所有关联钢卷净重之和 */
private BigDecimal totalWeight;
/** 涉及库位数量(去重) */
private long warehouseCount;
/** 操作人汇总(用于左侧表格 + 饼图 + 柱状图) */
private List<UserSummary> userSummary;
/** 按日趋势数据(用于折线图) */
private List<TrendItem> trendData;
// ---------- inner types ----------
@Data
public static class UserSummary {
/** 操作人 */
private String createBy;
/** 操作卷数 */
private long coilCount;
/** 总重量kg */
private BigDecimal totalWeight;
}
@Data
public static class TrendItem {
/** 日期,格式 yyyy-MM-dd */
private String date;
/** 当天操作笔数 */
private long count;
}
}

View File

@@ -2,6 +2,7 @@ package com.klp.mapper;
import com.klp.domain.WmsCoilWarehouseOperationLog;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogVo;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogStatisticsVo;
import com.klp.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
@@ -21,4 +22,34 @@ public interface WmsCoilWarehouseOperationLogMapper extends BaseMapperPlus<WmsCo
@Param("inOutType") Integer inOutType,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
/**
* 吞吐报表统计 —— 汇总指标(总数、总重量、涉及库位数)
*/
WmsCoilWarehouseOperationLogStatisticsVo selectStatisticsSummary(@Param("actualWarehouseId") Long actualWarehouseId,
@Param("operationType") Integer operationType,
@Param("inOutType") Integer inOutType,
@Param("createBy") String createBy,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
/**
* 吞吐报表统计 —— 按操作人汇总
*/
List<WmsCoilWarehouseOperationLogStatisticsVo.UserSummary> selectUserSummary(@Param("actualWarehouseId") Long actualWarehouseId,
@Param("operationType") Integer operationType,
@Param("inOutType") Integer inOutType,
@Param("createBy") String createBy,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
/**
* 吞吐报表统计 —— 按日趋势
*/
List<WmsCoilWarehouseOperationLogStatisticsVo.TrendItem> selectTrendData(@Param("actualWarehouseId") Long actualWarehouseId,
@Param("operationType") Integer operationType,
@Param("inOutType") Integer inOutType,
@Param("createBy") String createBy,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
}

View File

@@ -9,6 +9,7 @@ import com.klp.common.core.domain.PageQuery;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogExportVo;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogStatisticsVo;
import java.util.Date;
import java.util.List;
@@ -85,4 +86,12 @@ public interface IWmsCoilWarehouseOperationLogService {
* @return 导出数据列表
*/
List<WmsCoilWarehouseOperationLogExportVo> exportBySecondWarehouseIdAndTimeRange(Long secondWarehouseId, Integer operationType, Integer inOutType, Date startTime, Date endTime);
/**
* 吞吐报表统计 —— 后端聚合,返回图表所需全部数据
*
* @param bo 查询条件(与 /list 共用同一套 BO
* @return 统计结果(汇总卡片 + 操作人排名 + 按日趋势)
*/
WmsCoilWarehouseOperationLogStatisticsVo statistics(WmsCoilWarehouseOperationLogBo bo);
}

View File

@@ -18,6 +18,7 @@ import org.springframework.stereotype.Service;
import com.klp.domain.bo.WmsCoilWarehouseOperationLogBo;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogVo;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogExportVo;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogStatisticsVo;
import java.math.BigDecimal;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.domain.WmsCoilWarehouseOperationLog;
@@ -352,4 +353,34 @@ public class WmsCoilWarehouseOperationLogServiceImpl implements IWmsCoilWarehous
default: return String.valueOf(inOutType);
}
}
@Override
public WmsCoilWarehouseOperationLogStatisticsVo statistics(WmsCoilWarehouseOperationLogBo bo) {
Long actualWarehouseId = bo.getActualWarehouseId();
Integer operationType = bo.getOperationType();
Integer inOutType = bo.getInOutType();
String createBy = bo.getCreateBy();
Date startTime = bo.getCreateStartTime();
Date endTime = bo.getCreateEndTime();
// 一次 RPC 内三次轻量 GROUP BY 查询,远比拉取全量 rows 再聚合快
WmsCoilWarehouseOperationLogStatisticsVo summary =
baseMapper.selectStatisticsSummary(actualWarehouseId, operationType, inOutType, createBy, startTime, endTime);
List<WmsCoilWarehouseOperationLogStatisticsVo.UserSummary> userSummary =
baseMapper.selectUserSummary(actualWarehouseId, operationType, inOutType, createBy, startTime, endTime);
List<WmsCoilWarehouseOperationLogStatisticsVo.TrendItem> trendData =
baseMapper.selectTrendData(actualWarehouseId, operationType, inOutType, createBy, startTime, endTime);
if (summary == null) {
summary = new WmsCoilWarehouseOperationLogStatisticsVo();
summary.setTotalCount(0);
summary.setTotalWeight(BigDecimal.ZERO);
summary.setWarehouseCount(0);
}
summary.setUserSummary(userSummary);
summary.setTrendData(trendData);
return summary;
}
}