Browse Source

2026-06-15

标签拆分浮点精度问题
master
fengyuan_yang 2 days ago
parent
commit
0bbbdd9459
  1. 66
      src/main/java/com/gaotao/modules/labelSplitMerge/service/impl/LabelSplitMergeServiceImpl.java

66
src/main/java/com/gaotao/modules/labelSplitMerge/service/impl/LabelSplitMergeServiceImpl.java

@ -88,19 +88,19 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
if (currentStock == null) { if (currentStock == null) {
throw new RuntimeException("未找到原标签库存信息"); throw new RuntimeException("未找到原标签库存信息");
} }
Float originalQuantity = Float.parseFloat(currentStock.get("qtyOnHand").toString());
BigDecimal originalQuantity = parseQuantity(currentStock.get("qtyOnHand"), "原标签库存数量");
// 获取拆分张数默认为1兼容旧版本 // 获取拆分张数默认为1兼容旧版本
Integer splitCount = params.get("splitCount") != null ? Integer.parseInt(params.get("splitCount").toString()) : 1; Integer splitCount = params.get("splitCount") != null ? Integer.parseInt(params.get("splitCount").toString()) : 1;
Float splitQuantity = Float.parseFloat(params.get("splitQuantity").toString());
BigDecimal splitQuantity = parseQuantity(params.get("splitQuantity"), "拆分数量");
// 总拆分数量 = 拆分张数 * 每张数量 // 总拆分数量 = 拆分张数 * 每张数量
Float totalSplitQuantity = splitCount * splitQuantity;
Float remainingQuantity = originalQuantity - totalSplitQuantity;
BigDecimal totalSplitQuantity = splitQuantity.multiply(BigDecimal.valueOf(splitCount));
BigDecimal remainingQuantity = originalQuantity.subtract(totalSplitQuantity);
if (splitCount <= 0) { if (splitCount <= 0) {
throw new RuntimeException("拆分张数必须大于0"); throw new RuntimeException("拆分张数必须大于0");
} }
if (splitQuantity <= 0 || totalSplitQuantity >= originalQuantity) {
if (splitQuantity.compareTo(BigDecimal.ZERO) <= 0 || totalSplitQuantity.compareTo(originalQuantity) >= 0) {
throw new RuntimeException("拆分总数量必须大于0且小于原数量"); throw new RuntimeException("拆分总数量必须大于0且小于原数量");
} }
@ -151,9 +151,9 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
insertParams.put("latestInDate", new Date()); insertParams.put("latestInDate", new Date());
insertParams.put("activeDate", new Date()); insertParams.put("activeDate", new Date());
insertParams.put("inQty", splitQuantity); insertParams.put("inQty", splitQuantity);
insertParams.put("outQty", 0.0f);
insertParams.put("outQty", BigDecimal.ZERO);
insertParams.put("qtyOnHand", splitQuantity); insertParams.put("qtyOnHand", splitQuantity);
insertParams.put("qtyReserved", 0.0f);
insertParams.put("qtyReserved", BigDecimal.ZERO);
insertParams.put("freezeFlag", params.get("freezeFlag")); insertParams.put("freezeFlag", params.get("freezeFlag"));
insertParams.put("manufactureDate", params.get("manufactureDate")); insertParams.put("manufactureDate", params.get("manufactureDate"));
insertParams.put("expiredDate", params.get("expiredDate")); insertParams.put("expiredDate", params.get("expiredDate"));
@ -232,9 +232,9 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
String status = (String) params.get("status"); String status = (String) params.get("status");
String statusTb = (String) params.get("statusTb"); String statusTb = (String) params.get("statusTb");
Float targetQuantity = Float.parseFloat(params.get("targetQuantity").toString());
Float sourceQuantity = Float.parseFloat(params.get("sourceQuantity").toString());
Float mergedQuantity = targetQuantity + sourceQuantity;
BigDecimal targetQuantity = parseQuantity(params.get("targetQuantity"), "目标标签数量");
BigDecimal sourceQuantity = parseQuantity(params.get("sourceQuantity"), "源标签数量");
BigDecimal mergedQuantity = targetQuantity.add(sourceQuantity);
// 1. 更新源标签的库存数量增加合并后的总数量 // 1. 更新源标签的库存数量增加合并后的总数量
Map<String, Object> updateSourceParams = new HashMap<>(); Map<String, Object> updateSourceParams = new HashMap<>();
@ -299,7 +299,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
* 生成标签拆分事务记录 * 生成标签拆分事务记录
*/ */
private void generateSplitTransaction(String site, String buNo, String warehouseId, String originalLabelCode, private void generateSplitTransaction(String site, String buNo, String warehouseId, String originalLabelCode,
String newLabelCode, String partNo, String batchNo, Float splitQuantity, Float remainingQuantity, String locationCode) {
String newLabelCode, String partNo, String batchNo, BigDecimal splitQuantity, BigDecimal remainingQuantity, String locationCode) {
logger.info("开始生成标签拆分事务记录,原标签: {}, 新标签: {}", originalLabelCode, newLabelCode); logger.info("开始生成标签拆分事务记录,原标签: {}, 新标签: {}", originalLabelCode, newLabelCode);
try { try {
@ -337,7 +337,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
* 生成标签合并事务记录 * 生成标签合并事务记录
*/ */
private void generateMergeTransaction(String site, String buNo, String warehouseId, String sourceLabelCode, private void generateMergeTransaction(String site, String buNo, String warehouseId, String sourceLabelCode,
String targetLabelCode, String partNo, String batchNo, Float sourceQuantity, Float targetQuantity, Float mergedQuantity, String locationCode) {
String targetLabelCode, String partNo, String batchNo, BigDecimal sourceQuantity, BigDecimal targetQuantity, BigDecimal mergedQuantity, String locationCode) {
logger.info("开始生成标签合并事务记录,源标签: {}, 目标标签: {}", sourceLabelCode, targetLabelCode); logger.info("开始生成标签合并事务记录,源标签: {}, 目标标签: {}", sourceLabelCode, targetLabelCode);
try { try {
@ -374,7 +374,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
* 生成标签拆分事务明细记录 * 生成标签拆分事务明细记录
*/ */
private void generateSplitTransactionDetails(String transNo, String originalLabelCode, String newLabelCode, private void generateSplitTransactionDetails(String transNo, String originalLabelCode, String newLabelCode,
String partNo, String batchNo, Float splitQuantity, Float remainingQuantity, String site, String buNo) {
String partNo, String batchNo, BigDecimal splitQuantity, BigDecimal remainingQuantity, String site, String buNo) {
logger.info("开始生成标签拆分事务明细记录,事务单号: {}", transNo); logger.info("开始生成标签拆分事务明细记录,事务单号: {}", transNo);
List<TransDetail> transDetailList = new ArrayList<>(); List<TransDetail> transDetailList = new ArrayList<>();
@ -384,7 +384,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
originalDetail.setTransno(transNo); originalDetail.setTransno(transNo);
originalDetail.setItemno(1.0); originalDetail.setItemno(1.0);
originalDetail.setPartno(partNo); originalDetail.setPartno(partNo);
originalDetail.setTransqty(new BigDecimal(splitQuantity.toString()));
originalDetail.setTransqty(splitQuantity);
originalDetail.setBatchno(batchNo); originalDetail.setBatchno(batchNo);
originalDetail.setDirection("-"); // 减少方向 originalDetail.setDirection("-"); // 减少方向
originalDetail.setOrderref1(originalLabelCode); // 原标签条码 originalDetail.setOrderref1(originalLabelCode); // 原标签条码
@ -399,7 +399,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
newDetail.setTransno(transNo); newDetail.setTransno(transNo);
newDetail.setItemno(2.0); newDetail.setItemno(2.0);
newDetail.setPartno(partNo); newDetail.setPartno(partNo);
newDetail.setTransqty(new BigDecimal(splitQuantity.toString()));
newDetail.setTransqty(splitQuantity);
newDetail.setBatchno(batchNo); newDetail.setBatchno(batchNo);
newDetail.setDirection("+"); // 增加方向 newDetail.setDirection("+"); // 增加方向
newDetail.setOrderref1(newLabelCode); // 新标签条码 newDetail.setOrderref1(newLabelCode); // 新标签条码
@ -419,8 +419,8 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
/** /**
* 添加子明细数据 * 添加子明细数据
*/ */
private void addSubTransactionDetails(String transNo, String originalLabelCode, String newLabelCode, String batchNo, Float splitQuantity,
Float remainingQuantity, String site, String buNo, String warehouseId, String locationCode) {
private void addSubTransactionDetails(String transNo, String originalLabelCode, String newLabelCode, String batchNo, BigDecimal splitQuantity,
BigDecimal remainingQuantity, String site, String buNo, String warehouseId, String locationCode) {
logger.info("开始添加子明细数据,事务单号: {}", transNo); logger.info("开始添加子明细数据,事务单号: {}", transNo);
List<TransDetailSub> subDetailList = new ArrayList<>(); List<TransDetailSub> subDetailList = new ArrayList<>();
@ -429,7 +429,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
originalSubDetail.setTransNo(transNo); originalSubDetail.setTransNo(transNo);
originalSubDetail.setItemNo(1.0); originalSubDetail.setItemNo(1.0);
originalSubDetail.setSubNo(originalLabelCode); originalSubDetail.setSubNo(originalLabelCode);
originalSubDetail.setSubQty(Double.valueOf(splitQuantity));
originalSubDetail.setSubQty(splitQuantity.doubleValue());
originalSubDetail.setDirection("-"); originalSubDetail.setDirection("-");
originalSubDetail.setOrderRef2(buNo); originalSubDetail.setOrderRef2(buNo);
originalSubDetail.setOrderRef3(batchNo); originalSubDetail.setOrderRef3(batchNo);
@ -442,7 +442,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
newSubDetail.setTransNo(transNo); newSubDetail.setTransNo(transNo);
newSubDetail.setItemNo(2.0); newSubDetail.setItemNo(2.0);
newSubDetail.setSubNo(newLabelCode); newSubDetail.setSubNo(newLabelCode);
newSubDetail.setSubQty(Double.valueOf(splitQuantity));
newSubDetail.setSubQty(splitQuantity.doubleValue());
newSubDetail.setDirection("+"); newSubDetail.setDirection("+");
newSubDetail.setOrderRef2(buNo); newSubDetail.setOrderRef2(buNo);
newSubDetail.setOrderRef3(batchNo); newSubDetail.setOrderRef3(batchNo);
@ -461,7 +461,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
* 生成标签合并事务明细记录 * 生成标签合并事务明细记录
*/ */
private void generateMergeTransactionDetails(String transNo, String sourceLabelCode, String targetLabelCode, private void generateMergeTransactionDetails(String transNo, String sourceLabelCode, String targetLabelCode,
String partNo, String batchNo, Float sourceQuantity, Float targetQuantity, Float mergedQuantity, String site, String buNo) {
String partNo, String batchNo, BigDecimal sourceQuantity, BigDecimal targetQuantity, BigDecimal mergedQuantity, String site, String buNo) {
logger.info("开始生成标签合并事务明细记录,事务单号: {}", transNo); logger.info("开始生成标签合并事务明细记录,事务单号: {}", transNo);
List<TransDetail> transDetailList = new ArrayList<>(); List<TransDetail> transDetailList = new ArrayList<>();
@ -472,7 +472,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
targetDetail.setTransno(transNo); targetDetail.setTransno(transNo);
targetDetail.setItemno(1.0); targetDetail.setItemno(1.0);
targetDetail.setPartno(partNo); targetDetail.setPartno(partNo);
targetDetail.setTransqty(new BigDecimal(targetQuantity.toString()));
targetDetail.setTransqty(targetQuantity);
targetDetail.setBatchno(batchNo); targetDetail.setBatchno(batchNo);
targetDetail.setDirection("-"); // 减少方向 targetDetail.setDirection("-"); // 减少方向
targetDetail.setOrderref1(targetLabelCode); // 目标标签条码 targetDetail.setOrderref1(targetLabelCode); // 目标标签条码
@ -487,7 +487,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
sourceDetail.setTransno(transNo); sourceDetail.setTransno(transNo);
sourceDetail.setItemno(2.0); sourceDetail.setItemno(2.0);
sourceDetail.setPartno(partNo); sourceDetail.setPartno(partNo);
sourceDetail.setTransqty(new BigDecimal(mergedQuantity.toString()));
sourceDetail.setTransqty(mergedQuantity);
sourceDetail.setBatchno(batchNo); sourceDetail.setBatchno(batchNo);
sourceDetail.setDirection("+"); // 增加方向 sourceDetail.setDirection("+"); // 增加方向
sourceDetail.setOrderref1(sourceLabelCode); // 源标签条码 sourceDetail.setOrderref1(sourceLabelCode); // 源标签条码
@ -506,8 +506,8 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
/** /**
* 添加子明细数据 * 添加子明细数据
*/ */
private void addSubTransactionDetails2(String transNo, String sourceLabelCode, String targetLabelCode, String batchNo, Float sourceQuantity,
Float targetQuantity, Float mergedQuantity, String site, String buNo, String warehouseId, String locationCode) {
private void addSubTransactionDetails2(String transNo, String sourceLabelCode, String targetLabelCode, String batchNo, BigDecimal sourceQuantity,
BigDecimal targetQuantity, BigDecimal mergedQuantity, String site, String buNo, String warehouseId, String locationCode) {
logger.info("开始添加子明细数据,事务单号: {}", transNo); logger.info("开始添加子明细数据,事务单号: {}", transNo);
List<TransDetailSub> subDetailList = new ArrayList<>(); List<TransDetailSub> subDetailList = new ArrayList<>();
@ -516,7 +516,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
originalSubDetail.setTransNo(transNo); originalSubDetail.setTransNo(transNo);
originalSubDetail.setItemNo(1.0); originalSubDetail.setItemNo(1.0);
originalSubDetail.setSubNo(sourceLabelCode); originalSubDetail.setSubNo(sourceLabelCode);
originalSubDetail.setSubQty(Double.valueOf(targetQuantity));
originalSubDetail.setSubQty(targetQuantity.doubleValue());
originalSubDetail.setDirection("-"); originalSubDetail.setDirection("-");
originalSubDetail.setOrderRef2(buNo); originalSubDetail.setOrderRef2(buNo);
originalSubDetail.setOrderRef3(batchNo); originalSubDetail.setOrderRef3(batchNo);
@ -529,7 +529,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
newSubDetail.setTransNo(transNo); newSubDetail.setTransNo(transNo);
newSubDetail.setItemNo(2.0); newSubDetail.setItemNo(2.0);
newSubDetail.setSubNo(targetLabelCode); newSubDetail.setSubNo(targetLabelCode);
newSubDetail.setSubQty(Double.valueOf(mergedQuantity));
newSubDetail.setSubQty(mergedQuantity.doubleValue());
newSubDetail.setDirection("+"); newSubDetail.setDirection("+");
newSubDetail.setOrderRef2(buNo); newSubDetail.setOrderRef2(buNo);
newSubDetail.setOrderRef3(batchNo); newSubDetail.setOrderRef3(batchNo);
@ -543,4 +543,18 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe
} }
logger.info("子明细记录生成成功,共生成 {} 条子明细记录", subDetailList.size()); logger.info("子明细记录生成成功,共生成 {} 条子明细记录", subDetailList.size());
} }
/**
* 统一数量解析避免浮点精度误差
*/
private BigDecimal parseQuantity(Object value, String fieldName) {
if (value == null) {
throw new RuntimeException(fieldName + "不能为空");
}
try {
return new BigDecimal(value.toString().trim());
} catch (NumberFormatException e) {
throw new RuntimeException(fieldName + "格式不正确: " + value);
}
}
} }
Loading…
Cancel
Save