Browse Source

2026-03-06

优化仓库盘点管理
master
fengyuan_yang 2 days ago
parent
commit
e0d15a440c
  1. 26
      src/main/java/com/gaotao/modules/warehouse/controller/CountingReportController.java
  2. 16
      src/main/java/com/gaotao/modules/warehouse/dao/CountingReportMapper.java
  3. 16
      src/main/java/com/gaotao/modules/warehouse/service/CountingReportService.java
  4. 38
      src/main/java/com/gaotao/modules/warehouse/service/impl/CountingReportServiceImpl.java
  5. 36
      src/main/resources/mapper/warehouse/CountingReportMapper.xml

26
src/main/java/com/gaotao/modules/warehouse/controller/CountingReportController.java

@ -304,7 +304,7 @@ public class CountingReportController extends AbstractController {
} }
/** /**
* 查询盘点单明细列表
* 查询盘点单明细列表带分页
*/ */
@PostMapping("detailList") @PostMapping("detailList")
public R detailList(@RequestBody Map<String, Object> params) { public R detailList(@RequestBody Map<String, Object> params) {
@ -323,13 +323,33 @@ public class CountingReportController extends AbstractController {
return R.error("盘点任务单号不能为空"); return R.error("盘点任务单号不能为空");
} }
// 查询明细列表支持查询条件
// 分页参数
int page = params.get("page") != null ? Integer.parseInt(params.get("page").toString()) : 1;
int limit = params.get("limit") != null ? Integer.parseInt(params.get("limit").toString()) : 50;
int offset = (page - 1) * limit;
params.put("offset", offset);
params.put("limit", limit);
// 分页查询明细列表
List<CountingReportDetail> detailList = countingReportService.queryDetailListWithCondition(params); List<CountingReportDetail> detailList = countingReportService.queryDetailListWithCondition(params);
// 查询当前筛选条件下的总数
int total = countingReportService.queryDetailTotal(params);
// 查询全量统计信息不受查询条件影响只按 site/buNo/reportId
Map<String, Object> statisticsParams = new java.util.HashMap<>();
statisticsParams.put("site", site);
statisticsParams.put("buNo", buNo);
statisticsParams.put("reportId", reportId);
Map<String, Object> statistics = countingReportService.queryDetailStatistics(statisticsParams);
PageUtils pageUtils = new PageUtils(detailList, total, limit, page);
return R.ok() return R.ok()
.put("code", 0) .put("code", 0)
.put("msg", getLanguageMsg(SysMsgConstant.OBJECT_ID_200000)) .put("msg", getLanguageMsg(SysMsgConstant.OBJECT_ID_200000))
.put("detailList", detailList);
.put("page", pageUtils)
.put("statistics", statistics);
} catch (Exception e) { } catch (Exception e) {
logger.error("查询盘点单明细列表失败", e); logger.error("查询盘点单明细列表失败", e);
return R.error("查询盘点单明细列表失败: " + e.getMessage()); return R.error("查询盘点单明细列表失败: " + e.getMessage());

16
src/main/java/com/gaotao/modules/warehouse/dao/CountingReportMapper.java

@ -118,6 +118,22 @@ public interface CountingReportMapper {
@Param("buNo") String buNo, @Param("buNo") String buNo,
@Param("reportId") String reportId); @Param("reportId") String reportId);
/**
* 根据条件查询盘点单明细总数
*
* @param params 查询参数
* @return 总数
*/
int queryDetailTotal(Map<String, Object> params);
/**
* 查询盘点单明细统计信息标签总数物料总数已盘点数
*
* @param params 查询参数sitebuNoreportId
* @return 统计信息
*/
Map<String, Object> queryDetailStatistics(Map<String, Object> params);
/** /**
* 根据条件查询盘点单明细列表带查询条件 * 根据条件查询盘点单明细列表带查询条件
* *

16
src/main/java/com/gaotao/modules/warehouse/service/CountingReportService.java

@ -111,6 +111,22 @@ public interface CountingReportService {
*/ */
List<CountingReportDetail> queryDetailListWithCondition(Map<String, Object> params); List<CountingReportDetail> queryDetailListWithCondition(Map<String, Object> params);
/**
* 根据条件查询盘点单明细总数
*
* @param params 查询参数
* @return 总数
*/
int queryDetailTotal(Map<String, Object> params);
/**
* 查询盘点单明细统计信息标签总数物料总数已盘点数
*
* @param params 查询参数sitebuNoreportId
* @return 统计信息
*/
Map<String, Object> queryDetailStatistics(Map<String, Object> params);
/** /**
* 生成盘点任务单号 * 生成盘点任务单号
* *

38
src/main/java/com/gaotao/modules/warehouse/service/impl/CountingReportServiceImpl.java

@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -99,9 +100,14 @@ public class CountingReportServiceImpl implements CountingReportService {
detail.setCreateBy(countingReport.getCreateBy()); detail.setCreateBy(countingReport.getCreateBy());
detail.setUpdateBy(countingReport.getUpdateBy()); detail.setUpdateBy(countingReport.getUpdateBy());
} }
// 批量保存明细
countingReportMapper.batchSaveDetail(detailList);
logger.info("批量新增盘点单明细成功,明细数: {}", detailList.size());
// 分批保存明细每批100条避免 SQL Server 2100 参数上限每条13个参数100条=1300个参数
final int BATCH_SIZE = 100;
int total = detailList.size();
for (int i = 0; i < total; i += BATCH_SIZE) {
List<CountingReportDetail> batch = new ArrayList<>(detailList.subList(i, Math.min(i + BATCH_SIZE, total)));
countingReportMapper.batchSaveDetail(batch);
}
logger.info("批量新增盘点单明细成功,明细数: {}", total);
} }
return result; return result;
@ -242,6 +248,32 @@ public class CountingReportServiceImpl implements CountingReportService {
} }
} }
@Override
public int queryDetailTotal(Map<String, Object> params) {
logger.info("查询盘点单明细总数,参数: {}", params);
try {
int total = countingReportMapper.queryDetailTotal(params);
logger.info("查询盘点单明细总数成功,总数: {}", total);
return total;
} catch (Exception e) {
logger.error("查询盘点单明细总数失败,错误信息: {}", e.getMessage(), e);
throw new RuntimeException("查询盘点单明细总数失败: " + e.getMessage(), e);
}
}
@Override
public Map<String, Object> queryDetailStatistics(Map<String, Object> params) {
logger.info("查询盘点单明细统计信息,参数: {}", params);
try {
Map<String, Object> statistics = countingReportMapper.queryDetailStatistics(params);
logger.info("查询盘点单明细统计信息成功");
return statistics;
} catch (Exception e) {
logger.error("查询盘点单明细统计信息失败,错误信息: {}", e.getMessage(), e);
throw new RuntimeException("查询盘点单明细统计信息失败: " + e.getMessage(), e);
}
}
@Override @Override
public String generateReportId(String site, String buNo, String type) { public String generateReportId(String site, String buNo, String type) {
logger.info("生成盘点任务单号,站点: {}, BU: {}, 类型: {}", site, buNo, type); logger.info("生成盘点任务单号,站点: {}, BU: {}, 类型: {}", site, buNo, type);

36
src/main/resources/mapper/warehouse/CountingReportMapper.xml

@ -286,7 +286,7 @@
ORDER BY create_date DESC ORDER BY create_date DESC
</select> </select>
<!-- 根据条件查询盘点单明细列表 -->
<!-- 根据条件查询盘点单明细列表(带分页) -->
<select id="queryDetailListWithCondition" resultMap="countingReportDetailMap"> <select id="queryDetailListWithCondition" resultMap="countingReportDetailMap">
SELECT SELECT
site, site,
@ -318,6 +318,39 @@
AND checked_flag = #{checkedFlag} AND checked_flag = #{checkedFlag}
</if> </if>
ORDER BY create_date DESC ORDER BY create_date DESC
<if test="offset != null and limit != null">
OFFSET #{offset} ROWS FETCH NEXT #{limit} ROWS ONLY
</if>
</select>
<!-- 查询盘点单明细总数 -->
<select id="queryDetailTotal" resultType="int">
SELECT COUNT(1)
FROM counting_report_detail
WHERE site = #{site}
AND bu_no = #{buNo}
AND report_id = #{reportId}
<if test="rollNo != null and rollNo != ''">
AND roll_no LIKE '%' + #{rollNo} + '%'
</if>
<if test="partNo != null and partNo != ''">
AND part_no LIKE '%' + #{partNo} + '%'
</if>
<if test="checkedFlag != null and checkedFlag != ''">
AND checked_flag = #{checkedFlag}
</if>
</select>
<!-- 查询盘点单明细统计信息(全量,不受分页和查询条件影响) -->
<select id="queryDetailStatistics" resultType="java.util.Map">
SELECT
COUNT(1) AS totalCount,
ISNULL(SUM(roll_qty), 0) AS totalQty,
ISNULL(SUM(CASE WHEN checked_flag = 'Y' THEN roll_qty ELSE 0 END), 0) AS checkedQty
FROM counting_report_detail
WHERE site = #{site}
AND bu_no = #{buNo}
AND report_id = #{reportId}
</select> </select>
<!-- 批量新增盘点单明细 --> <!-- 批量新增盘点单明细 -->
@ -385,6 +418,7 @@
LEFT JOIN part AS p ON a.site = p.site AND a.part_no = p.partNo LEFT JOIN part AS p ON a.site = p.site AND a.part_no = p.partNo
WHERE a.site = #{site} WHERE a.site = #{site}
AND a.bu_no = #{buNo} AND a.bu_no = #{buNo}
and a.status_tb = 'C'
<if test="warehouseId != null and warehouseId != ''"> <if test="warehouseId != null and warehouseId != ''">
<choose> <choose>
<when test="warehouseId.indexOf(',') > 0"> <when test="warehouseId.indexOf(',') > 0">

Loading…
Cancel
Save