💬 同意调整路线的跟进记录改写成调整后的整条路线

原来只写变化差分(「到货地 旧 → 新」「途经站由 X 个改为 Y 个」),
中间站变化时会出现「途经站由 2 个改为 2 个」这种没有信息量的句子。
改成按站序把调整后的地址用「 → 」连起来;一个地址都没改时仍写
「同意调整路线,未修改路线」。
This commit is contained in:
2026-10-23 14:01:15 +08:00
parent 50354f358d
commit 8d8fc30616
2 changed files with 21 additions and 35 deletions
@@ -107,6 +107,9 @@ public class ExceptionDisposalServiceImpl
private static final String ROUTE_CHANGE_UNCHANGED = "同意调整路线,未修改路线";
private static final String ROUTE_CHANGE_PREFIX = "同意调整路线:";
/** 结论里站点之间的连接符,如「A → B → C」 */
private static final String ROUTE_STATION_SEPARATOR = " → ";
/** task_info_json 里存路线变更记录数组的键,与 PC 同一份结构 */
private static final String TASK_INFO_ROUTE_CHANGE_RECORDS = "routeChangeRecords";
@@ -719,40 +722,18 @@ public class ExceptionDisposalServiceImpl
/**
* 同一份结论既进跟进记录,也进 task_info_json 的变更记录:
* 首末站地址变了逐条写「出发地 / 到货地 旧 → 新」,否则说明途经站变化,完全没变给固定的一句。
* 写调整后的站点顺序(地址 → 地址 → …),不写「哪一站从什么改成什么」;
* 一个地址都没改时给固定的一句。
*/
private String routeChangeContent(List<String> sourceAddresses, List<String> targetAddresses) {
if (sourceAddresses.equals(targetAddresses)) {
return ROUTE_CHANGE_UNCHANGED;
}
List<String> parts = new ArrayList<>(2);
String sourceStart = firstOf(sourceAddresses);
String targetStart = firstOf(targetAddresses);
if (!Objects.equals(sourceStart, targetStart)) {
parts.add("出发地 " + displayAddress(sourceStart) + " → " + displayAddress(targetStart));
List<String> parts = new ArrayList<>(targetAddresses.size());
for (String address : targetAddresses) {
parts.add(displayAddress(address));
}
String sourceEnd = lastOf(sourceAddresses);
String targetEnd = lastOf(targetAddresses);
if (!Objects.equals(sourceEnd, targetEnd)) {
parts.add("到货地 " + displayAddress(sourceEnd) + " → " + displayAddress(targetEnd));
}
if (parts.isEmpty()) {
// 首末站未变时按途经站数量说明变化
parts.add("途经站由 " + transitCount(sourceAddresses) + " 个改为 " + transitCount(targetAddresses) + " 个");
}
return ROUTE_CHANGE_PREFIX + String.join(";", parts);
}
private String firstOf(List<String> addresses) {
return addresses.isEmpty() ? "" : addresses.get(0);
}
private String lastOf(List<String> addresses) {
return addresses.isEmpty() ? "" : addresses.get(addresses.size() - 1);
}
private int transitCount(List<String> addresses) {
return Math.max(addresses.size() - 2, 0);
return ROUTE_CHANGE_PREFIX + String.join(ROUTE_STATION_SEPARATOR, parts);
}
private String displayAddress(String address) {
@@ -140,11 +140,11 @@ class ExceptionDisposalRouteAdjustTest {
assertEquals("", latest.get("remark"));
String changeTime = String.valueOf(latest.get("changeTime"));
assertTrue(changeTime.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}"), changeTime);
assertEquals("同意调整路线:途经站由 1 个改为 2 个", latest.get("content"));
assertEquals(routeContent(START, TRANSIT_SECOND, TRANSIT, END), latest.get("content"));
assertEquals("旧记录", ((Map<?, ?>) records.get(1)).get("content"), "已有记录排在新的后面");
ExceptionDisposalFollowRecord record = insertedRecord();
assertEquals("同意调整路线:途经站由 1 个改为 2 个", record.getFollowContent());
assertEquals(routeContent(START, TRANSIT_SECOND, TRANSIT, END), record.getFollowContent());
assertEquals(USER_ID, record.getFollowUser());
assertEquals("韦调度", record.getFollowUserName());
assertNotNull(record.getFollowTime());
@@ -314,7 +314,7 @@ class ExceptionDisposalRouteAdjustTest {
assertEquals(NEW_END, updated.getArrivalAddress());
Map<String, Object> taskInfo = JsonUtil.toMap(updated.getTaskInfoJson());
Map<?, ?> latest = (Map<?, ?>) ((List<?>) taskInfo.get("routeChangeRecords")).get(0);
assertEquals("同意调整路线:到货地 " + END + " → " + NEW_END, latest.get("content"));
assertEquals(routeContent(START, TRANSIT, NEW_END), latest.get("content"));
assertEquals("completed", updatedDisposal().getDisposalStatus());
verify(loadingManageMapper, never()).selectOne(any());
}
@@ -355,7 +355,7 @@ class ExceptionDisposalRouteAdjustTest {
assertEquals(legacyRouteJson, updated.getRouteJson(), "认不出的路线形状不能瞎写");
assertEquals(START, updated.getDepartureAddress());
assertEquals(NEW_END, updated.getArrivalAddress());
assertEquals("同意调整路线:到货地 " + END + " → " + NEW_END, insertedRecord().getFollowContent());
assertEquals(routeContent(START, NEW_END), insertedRecord().getFollowContent());
assertEquals("completed", updatedDisposal().getDisposalStatus());
}
@@ -400,8 +400,8 @@ class ExceptionDisposalRouteAdjustTest {
}
@Test
@DisplayName("目的地未变而只见中间站变化时,按途经站数量说明")
void adjustRouteReportsTransitCountChange() {
@DisplayName("目的地未变而只见中间站变化时,结论仍写调整后的整条路线")
void adjustRouteWritesResultingRouteWhenOnlyTransitChanges() {
stubPendingDisposal();
stubLoading(loading("in_progress",
stationRowsJson(List.of(
@@ -416,11 +416,16 @@ class ExceptionDisposalRouteAdjustTest {
node("transit", TRANSIT, List.of("装2")),
node("end", END, List.of("卸2")))));
assertEquals("同意调整路线:途经站由 1 个改为 2 个", insertedRecord().getFollowContent());
assertEquals(routeContent(START, TRANSIT_SECOND, TRANSIT, END), insertedRecord().getFollowContent());
}
// ------------------------------------------------------------ 夹具
/** 结论写调整后的站点顺序,如「同意调整路线:A → B → C」 */
private static String routeContent(String... addresses) {
return "同意调整路线:" + String.join(" → ", addresses);
}
private void stubPendingDisposal() {
ExceptionDisposal disposal = new ExceptionDisposal();
disposal.setId(DISPOSAL_ID);