From 5ed2a5c0fc832c1e0c18c975508a499fda45af82 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Thu, 8 Oct 2026 23:27:35 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=96=B0=E5=A2=9E=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=8F=B8=E6=9C=BA=E7=AB=AF=E8=BF=90=E5=8D=95?= =?UTF-8?q?=E8=A1=8C=E9=A9=B6=E8=BD=A8=E8=BF=B9=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按打卡记录/计划时间自动推导起止日期后查询 LBS 轨迹。 Co-authored-by: Cursor --- .../controller/DriverWaybillController.java | 8 +++ .../service/IDriverWaybillService.java | 14 ++++ .../impl/DriverWaybillServiceImpl.java | 64 +++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/DriverWaybillController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/DriverWaybillController.java index af5d2c1e..f966601d 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/DriverWaybillController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/DriverWaybillController.java @@ -38,6 +38,7 @@ import org.springblade.transport.pojo.vo.DriverNodePunchVO; import org.springblade.transport.pojo.vo.DriverWaybillCardVO; import org.springblade.transport.pojo.vo.DriverWaybillPreviewVO; import org.springblade.transport.pojo.vo.DriverWaybillTabCountsVO; +import org.springblade.transport.pojo.vo.WaybillTrackVO; import org.springblade.transport.service.IDriverWaybillService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -104,6 +105,13 @@ public class DriverWaybillController extends BladeController { return R.data(driverWaybillService.detail(id)); } + @PostMapping("/track") + @ApiOperationSupport(order = 11) + @Operation(summary = "司机端行驶轨迹", description = "按当前用户手机号校验归属后,根据打卡记录/计划时间自动推导起止日期并查询 LBS 轨迹(WGS-84)") + public R track(@Parameter(description = "运单ID", required = true) @RequestParam Long id) { + return R.data(driverWaybillService.track(id)); + } + @PostMapping("/accept") @ApiOperationSupport(order = 6) @Operation(summary = "司机确认接单", description = "过程配置接单为「是」时,司机确认接单后运单进入进行中") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IDriverWaybillService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IDriverWaybillService.java index e1735c5d..0d9d3f15 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IDriverWaybillService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IDriverWaybillService.java @@ -30,6 +30,7 @@ import org.springblade.transport.pojo.vo.DriverNodePunchVO; import org.springblade.transport.pojo.vo.DriverWaybillCardVO; import org.springblade.transport.pojo.vo.DriverWaybillPreviewVO; import org.springblade.transport.pojo.vo.DriverWaybillTabCountsVO; +import org.springblade.transport.pojo.vo.WaybillTrackVO; import java.util.Map; @@ -70,6 +71,19 @@ public interface IDriverWaybillService { */ DriverWaybillCardVO detail(Long id); + /** + * 司机端运单行驶轨迹:按打卡记录 / 计划时间自动推导起止日期后查询 LBS 轨迹。 + *

+ * 起止日期优先级: + *

    + *
  1. 有打卡且多于 1 条:首条打卡日 → 末条打卡日
  2. + *
  3. 有打卡且仅 1 条:首条打卡日 → 今天
  4. + *
  5. 无打卡有计划开始日:计划开始日 → 今天
  6. + *
  7. 无打卡无计划:3 天前 → 今天
  8. + *
+ */ + WaybillTrackVO track(Long id); + /** * 按运单ID组装详情打卡数据(punchNodes / enrouteRecords),不校验当前登录人是否为该司机。 * 供调度端 manage/detail 复用。 diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java index 050066de..36cfd859 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java @@ -56,6 +56,7 @@ import org.springblade.transport.pojo.vo.DriverPunchPhotoVO; import org.springblade.transport.pojo.vo.DriverWaybillCardVO; import org.springblade.transport.pojo.vo.DriverWaybillPreviewVO; import org.springblade.transport.pojo.vo.DriverWaybillTabCountsVO; +import org.springblade.transport.pojo.vo.WaybillTrackVO; import org.springblade.transport.service.IDriverService; import org.springblade.transport.service.IDriverWaybillService; import org.springblade.transport.service.IProcessConfigService; @@ -239,6 +240,69 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService { return toCard(normalizeAcceptStatus(waybill), true); } + @Override + public WaybillTrackVO track(Long id) { + requireCurrentDriver(); + Waybill waybill = loadDriverWaybill(id); + LocalDate[] range = resolveTrackDateRange(waybill); + return waybillService.trackVehicle(waybill.getId(), range[0].toString(), range[1].toString()); + } + + /** + * 小程序行驶轨迹查询区间: + * 1/2 有打卡 → 首条打卡日为开始;多于 1 条结束取末条日,仅 1 条结束取今天 + * 3 无打卡有计划开始日 → 计划开始日到今天 + * 4 无打卡无计划 → 3 天前到今天 + */ + private LocalDate[] resolveTrackDateRange(Waybill waybill) { + LocalDate today = LocalDate.now(); + List punchTimes = listAllPunchTimes(waybill.getId()); + if (!punchTimes.isEmpty()) { + LocalDate start = toLocalDate(punchTimes.get(0)); + LocalDate end = punchTimes.size() > 1 + ? toLocalDate(punchTimes.get(punchTimes.size() - 1)) + : today; + return clampTrackRange(start, end, today); + } + LocalDate planStart = waybill.getEstimatedStartTime(); + if (planStart != null) { + return clampTrackRange(planStart, today, today); + } + return clampTrackRange(today.minusDays(3), today, today); + } + + private LocalDate[] clampTrackRange(LocalDate start, LocalDate end, LocalDate today) { + LocalDate safeStart = start == null ? today.minusDays(3) : start; + LocalDate safeEnd = end == null ? today : end; + if (safeEnd.isBefore(safeStart)) { + safeEnd = safeStart; + } + return new LocalDate[]{safeStart, safeEnd}; + } + + private List listAllPunchTimes(Long waybillId) { + if (waybillId == null) { + return Collections.emptyList(); + } + List times = new ArrayList<>(); + nodePunchMapper.selectList(Wrappers.lambdaQuery() + .eq(WaybillNodePunch::getWaybillId, waybillId) + .isNotNull(WaybillNodePunch::getPunchTime) + .orderByAsc(WaybillNodePunch::getPunchTime)) + .forEach(punch -> times.add(punch.getPunchTime())); + enroutePunchMapper.selectList(Wrappers.lambdaQuery() + .eq(WaybillEnroutePunch::getWaybillId, waybillId) + .isNotNull(WaybillEnroutePunch::getPunchTime) + .orderByAsc(WaybillEnroutePunch::getPunchTime)) + .forEach(punch -> times.add(punch.getPunchTime())); + times.sort(Date::compareTo); + return times; + } + + private LocalDate toLocalDate(Date date) { + return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + } + @Override public DriverWaybillCardVO detailPunchSnapshot(Long id) { if (id == null) {