feat(warehouse): 添加仓库使用次数统计功能

- 在WmsMaterialCoilMapper中新增selectWarehouseIdCount方法用于统计仓库钢卷数量
- 在WmsWarehouseBo中新增orderByUseCount字段支持按使用次数排序
- 修改WmsWarehouseServiceImpl实现按使用次数或序号排序逻辑
- 创建WarehouseUseCountTask定时任务每晚1点更新仓库使用次数
- 实现定时计算各仓库中钢卷数量并更新到useCount字段功能
This commit is contained in:
2026-04-16 14:25:54 +08:00
parent 623e78629d
commit e99d7709d2
5 changed files with 92 additions and 2 deletions

View File

@@ -62,5 +62,10 @@ public class WmsWarehouseBo extends TreeEntity<WmsWarehouseBo> {
*/ */
private String remark; private String remark;
/**
* 是否按使用次数排序true=按useCount降序false或不传=按sortNo升序
*/
private Boolean orderByUseCount;
} }

View File

@@ -104,5 +104,13 @@ List<WmsMaterialCoilDeliveryExportVo> selectDeliveryExportListByCoilIds(@Param("
* @return 统计结果Map包含totalGrossWeight, totalNetWeight * @return 统计结果Map包含totalGrossWeight, totalNetWeight
*/ */
Map<String, Object> selectStatistics(@Param("ew") QueryWrapper<WmsMaterialCoil> qw); Map<String, Object> selectStatistics(@Param("ew") QueryWrapper<WmsMaterialCoil> qw);
/**
* 统计仓库使用次数按warehouse_id出现次数排序
*
* @param warehouseIds 仓库ID列表
* @return 每个仓库的钢卷数量
*/
List<Map<String, Object>> selectWarehouseIdCount(@Param("list") List<Long> warehouseIds);
} }

View File

@@ -56,8 +56,12 @@ public class WmsWarehouseServiceImpl implements IWmsWarehouseService {
lqw.eq(bo.getSortNo() != null, WmsWarehouse::getSortNo, bo.getSortNo()); lqw.eq(bo.getSortNo() != null, WmsWarehouse::getSortNo, bo.getSortNo());
lqw.eq(bo.getUseCount() != null, WmsWarehouse::getUseCount, bo.getUseCount()); lqw.eq(bo.getUseCount() != null, WmsWarehouse::getUseCount, bo.getUseCount());
lqw.eq(bo.getIsEnabled() != null, WmsWarehouse::getIsEnabled, bo.getIsEnabled()); lqw.eq(bo.getIsEnabled() != null, WmsWarehouse::getIsEnabled, bo.getIsEnabled());
// 新增排序SortNo升序 // 排序逻辑orderByUseCount为true时按useCount降序否则按sortNo升序
lqw.orderByAsc(WmsWarehouse::getSortNo); if (Boolean.TRUE.equals(bo.getOrderByUseCount())) {
lqw.orderByDesc(WmsWarehouse::getUseCount).orderByAsc(WmsWarehouse::getSortNo);
} else {
lqw.orderByAsc(WmsWarehouse::getSortNo);
}
return lqw; return lqw;
} }

View File

@@ -0,0 +1,61 @@
package com.klp.task;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.klp.domain.WmsWarehouse;
import com.klp.mapper.WmsMaterialCoilMapper;
import com.klp.mapper.WmsWarehouseMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@RequiredArgsConstructor
@Component
public class WarehouseUseCountTask {
private final WmsMaterialCoilMapper materialCoilMapper;
private final WmsWarehouseMapper warehouseMapper;
@Scheduled(cron = "0 0 1 * * ?")
@Transactional(rollbackFor = Exception.class)
public void calculateWarehouseUseCount() {
log.info("[仓库使用次数定时任务] 开始计算仓库使用次数");
LambdaQueryWrapper<WmsWarehouse> wrapper = new LambdaQueryWrapper<>();
wrapper.select(WmsWarehouse::getWarehouseId);
List<WmsWarehouse> warehouses = warehouseMapper.selectList(wrapper);
if (warehouses.isEmpty()) {
log.info("[仓库使用次数定时任务] 未找到仓库记录");
return;
}
List<Long> warehouseIds = warehouses.stream()
.map(WmsWarehouse::getWarehouseId)
.collect(Collectors.toList());
List<Map<String, Object>> countList = materialCoilMapper.selectWarehouseIdCount(warehouseIds);
Map<Long, Long> countMap = new HashMap<>();
for (Map<String, Object> item : countList) {
Long wid = ((Number) item.get("warehouse_id")).longValue();
Long count = ((Number) item.get("coil_count")).longValue();
countMap.put(wid, count);
}
for (WmsWarehouse warehouse : warehouses) {
Long count = countMap.getOrDefault(warehouse.getWarehouseId(), 0L);
warehouse.setUseCount(count.intValue());
warehouseMapper.updateById(warehouse);
}
log.info("[仓库使用次数定时任务] 完成,共更新 {} 个仓库", warehouses.size());
}
}

View File

@@ -924,5 +924,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
${ew.customSqlSegment} ${ew.customSqlSegment}
</select> </select>
<!-- 统计仓库使用次数按warehouse_id出现次数排序 -->
<select id="selectWarehouseIdCount" resultType="java.util.Map">
SELECT warehouse_id, COUNT(*) AS coil_count
FROM wms_material_coil
WHERE del_flag = 0
AND warehouse_id IN
<foreach collection="list" item="wid" open="(" separator="," close=")">
#{wid}
</foreach>
GROUP BY warehouse_id
</select>
</mapper> </mapper>