🐛 fix(打卡里程): 回显里程去掉两位小数

运单里程列是 decimal(18,2),BigDecimal 经全局 ToStringSerializer 序列化后
下发成 "200.00",而客户端按正整数校验,原样回填直接提交会被拒。

- DriverPunchNodeVO / WaybillPunchRecordItemVO 的 mileage 改 String(正整数文本)
- 新增 TransportBusinessSupport.mileageText,去尾随零后再下发
- 打卡记录单测断言同步为字符串
This commit is contained in:
2026-10-25 21:57:33 +08:00
parent a4de458d27
commit c95dccc871
6 changed files with 22 additions and 9 deletions
@@ -11,7 +11,6 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@@ -103,8 +102,11 @@ public class DriverPunchNodeVO implements Serializable {
@Schema(description = "本节点是否需要采集里程(末位可打卡节点且计费规则含里程)")
private Boolean needMileage;
@Schema(description = "运单里程(公里),needMileage 为真时用于回显")
private BigDecimal mileage;
/**
* 里程只有正整数口径(ADR-0023 决策 6),下发的是去尾随零的文本,如 "200" 而非 "200.00"。
*/
@Schema(description = "运单里程(公里,正整数文本),needMileage 为真时用于回显")
private String mileage;
@Schema(description = "已上传凭证图(已打卡回显)")
private List<DriverPunchPhotoVO> photos = new ArrayList<>();
@@ -9,7 +9,6 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@@ -62,8 +61,11 @@ public class WaybillPunchRecordItemVO implements Serializable {
@Schema(description = "本条是否需要采集里程(末位打卡节点且计费规则含里程)")
private Boolean needMileage;
@Schema(description = "运单里程(公里),needMileage 为真时用于回显")
private BigDecimal mileage;
/**
* 里程只有正整数口径(ADR-0023 决策 6),下发的是去尾随零的文本,如 "200" 而非 "200.00"。
*/
@Schema(description = "运单里程(公里,正整数文本),needMileage 为真时用于回显")
private String mileage;
@Schema(description = "里程是否已冻结(运单已生成结算单,只能看不能改)")
private Boolean mileageLocked;
@@ -1649,7 +1649,7 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService {
// 里程同样只在末位卡采集:末位判定与上面同一个变量,避免两处各算一次走偏。
if (lastPunchNode && lastNodeNeedsMileage) {
vo.setNeedMileage(true);
vo.setMileage(waybill.getMileage());
vo.setMileage(TransportBusinessSupport.mileageText(waybill.getMileage()));
}
if (done) {
if (punched.getPunchTime() != null) {
@@ -442,7 +442,7 @@ public class WaybillServiceImpl extends BaseServiceImpl<WaybillMapper, Waybill>
item.setType(isTransit ? "enroute" : "node");
if (lastNodeNeedsMileage && !isTransit && lastPunchKey.equals(nodeCode)) {
item.setNeedMileage(true);
item.setMileage(waybill.getMileage());
item.setMileage(TransportBusinessSupport.mileageText(waybill.getMileage()));
item.setMileageLocked(punchMileageLocked);
}
item.setExceptionFlag(false);
@@ -282,4 +282,13 @@ public final class TransportBusinessSupport {
return mileage;
}
/**
* 里程回显文本:去掉列上 decimal(18,2) 带来的尾随零,使 "200.00" 下发为 "200"。
* <p>
* 客户端按正整数校验里程,回显成两位小数会被当成非法值拒掉——不清零就等于「原样回填不能提交」。
*/
public static String mileageText(BigDecimal mileage) {
return mileage == null ? null : mileage.stripTrailingZeros().toPlainString();
}
}
@@ -211,7 +211,7 @@ class WaybillPunchRecordListTest {
// 接单不参与司机打卡序列,末位是装货
assertFalse(Boolean.TRUE.equals(accept.getNeedMileage()));
assertTrue(Boolean.TRUE.equals(load.getNeedMileage()));
assertEquals(0, new BigDecimal("128").compareTo(load.getMileage()));
assertEquals("128", load.getMileage());
assertFalse(Boolean.TRUE.equals(load.getMileageLocked()));
}