设计人员连续保存多个内部图纸版本(A9/A10/A11)后,物料详情或打印页面仍展示较旧版本。所有入口应选择语义上的最高版本 A11,而非按字符串排序。
// InternalVersionHelper.java — 图纸版本排序逻辑
// 问题:A9、A10、A11 的字符串 compareTo 顺序 ≠ 业务版本顺序
public static String pickLatestByVersion(List<String> versions) {
return versions.stream()
.max(String::compareTo) // BUG: "A9" > "A11" 字符串序
.orElse(null);
}
// BizMaterialListServiceImpl.java — 物料详情图纸
private String pickLatestDrawing(List<BizDrawing> drawings) {
return drawings.stream()
.map(BizDrawing::getInternalVersion)
.max(String::compareTo)
.orElse(null);
}
// BizProductionInfoPrintServiceImpl.java — 打印图纸
private String getDrawingVersionForPrint(String designTaskId) {
List<BizDrawing> list = drawingMapper.selectByTaskId(designTaskId);
if (list.isEmpty()) return "";
list.sort((a, b) -> a.getInternalVersion().compareTo(b.getInternalVersion()));
return list.get(list.size() - 1).getInternalVersion();
}
库存用千克维护,物料清单用克填写需求时,系统直接比较数字判断齐套。2kg 库存 vs 1200g 需求被误判为缺料。
// BizMaterialListServiceImpl.java — 齐套判断
private boolean isStockSufficient(BizMaterialListItem item, StockRecord stock) {
// BUG: 直接比较数字,忽略单位差异
// stockCount 单位是 kg,count 单位是 g,不可直接比较
BigDecimal stockCount = stock.getCount();
BigDecimal required = item.getCount();
return stockCount.compareTo(required) >= 0;
// 2 (kg) vs 1200 (g) → false,实际 2000g > 1200g 是足够的
}
// 更隐蔽的问题:单位字段分散在不同实体中
// 库存表字段叫 countUnit,物料行叫 materialUnit,请购单叫 quantityUnit
// 同一业务概念三个不同字段名,极易遗漏单位转换
同一审批请求下存在多个设计单时,各自生产文件中的物料行可能混入另一个设计单的数据。requestNo 聚合主表,但子表删除重建未按 designTaskId 精准限定。
// BizProductionInfoCreateServiceImpl.java
public void refreshProductionInfo(String requestNo, List<String> designTaskIds) {
// BUG: 主表按 requestNo 聚合,子表删除重建时只按 productionInfoId
// 多设计单场景下,子表删除范围过大,重建时只取第一个 designTaskId 的数据
BizProductionInfo info = productionInfoMapper.selectByRequestNo(requestNo);
if (info == null) {
info = buildNewProductionInfo(requestNo);
}
// 删除所有子快照,不限 designTaskId
productionInfoItemMapper.deleteByInfoId(info.getId());
// 重建时取所有物料行,未按 designTaskId 隔离
List<BizMaterialListItem> allItems =
materialListItemMapper.selectByRequestNo(requestNo);
// ...
}
// BizDesignTaskMapper.xml — SQL 层孤儿归并
// customerDrawingUrls 子查询中 d.design_task_id IS NULL
// 的图纸也被归入当前设计单,导致跨单串扰