🐛 导入运单地点名称为空时司机端回退显示详细地址

This commit is contained in:
2026-10-08 00:15:35 +08:00
parent 44197a4cff
commit f3ae784f20
2 changed files with 142 additions and 4 deletions
@@ -632,10 +632,12 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService {
DriverWaybillCardVO card = new DriverWaybillCardVO();
card.setId(waybill.getId());
card.setWaybillNo(waybill.getWaybillNo());
card.setFromName(Func.toStr(waybill.getDepartureName(), ""));
card.setToName(Func.toStr(waybill.getArrivalName(), ""));
card.setFromAddress(Func.toStr(waybill.getDepartureAddress(), card.getFromName()));
card.setToAddress(Func.toStr(waybill.getArrivalAddress(), card.getToName()));
// 批量导入的运单只有发货/到货地址、没有地点名称,名称为空时回退到地址,
// 否则司机端首页、运单列表与打卡页的地点位置都是空的
card.setFromName(Func.toStrWithEmpty(waybill.getDepartureName(), Func.toStr(waybill.getDepartureAddress(), "")));
card.setToName(Func.toStrWithEmpty(waybill.getArrivalName(), Func.toStr(waybill.getArrivalAddress(), "")));
card.setFromAddress(Func.toStrWithEmpty(waybill.getDepartureAddress(), card.getFromName()));
card.setToAddress(Func.toStrWithEmpty(waybill.getArrivalAddress(), card.getToName()));
card.setCargoNames(splitCargoNames(waybill.getCargoName()));
card.setCargoCategory(Func.toStr(waybill.getCargoType(), ""));
card.setWeight(formatWeight(waybill.getQuantity(), waybill.getQuantityUnit()));
@@ -0,0 +1,136 @@
package org.springblade.transport.service.impl;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import org.apache.ibatis.builder.MapperBuilderAssistant;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springblade.transport.mapper.ExceptionDisposalMapper;
import org.springblade.transport.mapper.WaybillEnroutePunchMapper;
import org.springblade.transport.mapper.WaybillNodePunchMapper;
import org.springblade.transport.pojo.entity.ExceptionDisposal;
import org.springblade.transport.pojo.entity.Waybill;
import org.springblade.transport.pojo.entity.WaybillEnroutePunch;
import org.springblade.transport.pojo.entity.WaybillNodePunch;
import org.springblade.transport.pojo.vo.DriverWaybillCardVO;
import org.springblade.transport.service.IDriverService;
import org.springblade.transport.service.IProcessConfigService;
import org.springblade.transport.service.ITransportVehicleService;
import org.springblade.transport.service.IWaybillService;
import org.springblade.transport.support.CertificationGate;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* 司机端卡片上的发货地 / 到货地。
* <p>
* 地点名称与详细地址是两列:批量导入的运单只填了地址(导入模板里没有「发货地」「收货地」列),
* 名称为空时卡片要回退到地址,否则司机端的地点位置是空的。
*/
class DriverWaybillCardLocationTest {
private static final Long WAYBILL_ID = 5601L;
private static final String PROCESS_JSON = """
[{"key":"accept","name":"接单","type":"confirm","enabled":true,"punch":true},
{"key":"load","name":"装货","type":"cargo","enabled":true,"punch":true},
{"key":"transit","name":"在途","type":"transit","enabled":true,"punch":true},
{"key":"sign","name":"签收","type":"cargo","enabled":true,"punch":true}]
""";
private static final String DEPARTURE_ADDRESS = "广西壮族自治区南宁市西乡塘区安吉大道";
private static final String ARRIVAL_ADDRESS = "广西壮族自治区河池市金城江区金城中路1号";
private IWaybillService waybillService;
private DriverWaybillServiceImpl service;
@BeforeAll
static void initTableInfo() {
// 构造 LambdaQueryWrapper 需要 MyBatis-Plus 的实体元数据缓存
MybatisConfiguration configuration = new MybatisConfiguration();
MapperBuilderAssistant assistant = new MapperBuilderAssistant(configuration, "");
assistant.setCurrentNamespace("test");
TableInfoHelper.initTableInfo(assistant, WaybillNodePunch.class);
TableInfoHelper.initTableInfo(assistant, WaybillEnroutePunch.class);
TableInfoHelper.initTableInfo(assistant, ExceptionDisposal.class);
}
@BeforeEach
void setUp() {
waybillService = mock(IWaybillService.class);
WaybillNodePunchMapper nodePunchMapper = mock(WaybillNodePunchMapper.class);
WaybillEnroutePunchMapper enroutePunchMapper = mock(WaybillEnroutePunchMapper.class);
ExceptionDisposalMapper exceptionDisposalMapper = mock(ExceptionDisposalMapper.class);
service = new DriverWaybillServiceImpl(
waybillService,
mock(IDriverService.class),
mock(IProcessConfigService.class),
mock(ITransportVehicleService.class),
mock(CertificationGate.class),
enroutePunchMapper,
nodePunchMapper,
exceptionDisposalMapper);
when(waybillService.syncDriverAcceptState(any())).thenAnswer(invocation -> invocation.getArgument(0));
when(nodePunchMapper.selectList(any())).thenReturn(List.of());
when(enroutePunchMapper.selectOne(any())).thenReturn(null);
when(enroutePunchMapper.selectList(any())).thenReturn(List.of());
when(exceptionDisposalMapper.selectList(any())).thenReturn(List.of());
}
@Test
@DisplayName("地点名称为空(导入的运单)时,名称回退到详细地址")
void nameFallsBackToAddressWhenBlank() {
Waybill waybill = waybill();
waybill.setDepartureName(null);
waybill.setDepartureAddress(DEPARTURE_ADDRESS);
waybill.setArrivalName("");
waybill.setArrivalAddress(ARRIVAL_ADDRESS);
when(waybillService.getById(WAYBILL_ID)).thenReturn(waybill);
DriverWaybillCardVO card = service.detailPunchSnapshot(WAYBILL_ID);
assertEquals(DEPARTURE_ADDRESS, card.getFromName());
assertEquals(ARRIVAL_ADDRESS, card.getToName());
assertEquals(DEPARTURE_ADDRESS, card.getFromAddress());
assertEquals(ARRIVAL_ADDRESS, card.getToAddress());
assertEquals(DEPARTURE_ADDRESS, card.getPickupAddress());
assertEquals(ARRIVAL_ADDRESS, card.getUnloadAddress());
}
@Test
@DisplayName("地点名称有值时用它,不被地址覆盖")
void nameWinsWhenPresent() {
Waybill waybill = waybill();
waybill.setDepartureName("南宁市西乡塘区");
waybill.setDepartureAddress(DEPARTURE_ADDRESS);
waybill.setArrivalName("河池市金城江区");
waybill.setArrivalAddress(ARRIVAL_ADDRESS);
when(waybillService.getById(WAYBILL_ID)).thenReturn(waybill);
DriverWaybillCardVO card = service.detailPunchSnapshot(WAYBILL_ID);
assertEquals("南宁市西乡塘区", card.getFromName());
assertEquals("河池市金城江区", card.getToName());
assertEquals(DEPARTURE_ADDRESS, card.getFromAddress());
assertEquals(ARRIVAL_ADDRESS, card.getToAddress());
}
private Waybill waybill() {
Waybill waybill = new Waybill();
waybill.setId(WAYBILL_ID);
waybill.setWaybillNo("YD-20261007-0006");
waybill.setProcessJson(PROCESS_JSON);
waybill.setBusinessStatus("running");
waybill.setIsDeleted(0);
return waybill;
}
}