🐛 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
@@ -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()));
}