From af3b6982fd42559d31f8e54ddc69f8c241f502a7 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Tue, 15 Sep 2026 17:52:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=20=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/pojo/vo/LoadingManageVO.java | 4 + .../transport/pojo/vo/TransportPlanVO.java | 22 +++++ .../controller/LoadingManageController.java | 13 ++- .../service/ILoadingManageService.java | 2 + .../impl/LoadingManageServiceImpl.java | 95 ++++++++++++++++++- .../service/impl/MasterOrderServiceImpl.java | 2 +- .../impl/TransportPlanServiceImpl.java | 14 ++- .../service/impl/WaybillServiceImpl.java | 9 +- 8 files changed, 151 insertions(+), 10 deletions(-) diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/LoadingManageVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/LoadingManageVO.java index c2ce78f..f576efd 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/LoadingManageVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/LoadingManageVO.java @@ -46,6 +46,10 @@ public class LoadingManageVO extends LoadingManage { @Schema(description = "业务状态名称") private String businessStatusName; + @TableField(exist = false) + @Schema(description = "是否存在司机拒绝接单(可重新派单)") + private Boolean driverRejected; + @TableField(exist = false) @Schema(description = "运单号") private String waybillNo; diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/TransportPlanVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/TransportPlanVO.java index a8d394d..49e6e89 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/TransportPlanVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/TransportPlanVO.java @@ -27,8 +27,11 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import org.springblade.transport.pojo.entity.TransportPlan; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; /** @@ -72,5 +75,24 @@ public class TransportPlanVO extends TransportPlan { @Schema(description = "计划调度生成的运单") private List dispatchRows; + @TableField(exist = false) + @Schema(description = "计划开始日期起") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate planStartDateStart; + + @TableField(exist = false) + @Schema(description = "计划开始日期止") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate planStartDateEnd; + + @TableField(exist = false) + @Schema(description = "创建开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTimeStart; + + @TableField(exist = false) + @Schema(description = "创建结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTimeEnd; } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/LoadingManageController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/LoadingManageController.java index ff7cacc..ab1bed9 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/LoadingManageController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/LoadingManageController.java @@ -119,22 +119,29 @@ public class LoadingManageController extends BladeController { return R.status(loadingManageService.changeRoute(loadingManage)); } - @PostMapping("/cancel") + @PostMapping("/start") @ApiOperationSupport(order = 10) + @Operation(summary = "改为进行中", description = "传入id") + public R start(@Parameter(description = "主键", required = true) @RequestParam Long id) { + return R.status(loadingManageService.start(id)); + } + + @PostMapping("/cancel") + @ApiOperationSupport(order = 11) @Operation(summary = "取消", description = "传入id") public R cancel(@Parameter(description = "主键", required = true) @RequestParam Long id) { return R.status(loadingManageService.cancel(id)); } @PostMapping("/complete") - @ApiOperationSupport(order = 11) + @ApiOperationSupport(order = 12) @Operation(summary = "完成", description = "传入id") public R complete(@Parameter(description = "主键", required = true) @RequestParam Long id) { return R.status(loadingManageService.complete(id)); } @PostMapping("/batch-complete") - @ApiOperationSupport(order = 12) + @ApiOperationSupport(order = 13) @Operation(summary = "批量完成", description = "传入ids") public R batchComplete(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { return R.data(loadingManageService.batchComplete(ids)); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ILoadingManageService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ILoadingManageService.java index 1b72c3b..90562fe 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ILoadingManageService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ILoadingManageService.java @@ -50,6 +50,8 @@ public interface ILoadingManageService extends BaseService { boolean changeRoute(LoadingManage loadingManage); + boolean start(Long id); + boolean cancel(Long id); boolean complete(Long id); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/LoadingManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/LoadingManageServiceImpl.java index 71c9694..dfbd4de 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/LoadingManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/LoadingManageServiceImpl.java @@ -29,6 +29,7 @@ import org.springblade.transport.service.IContractManageService; import org.springblade.transport.service.ILoadingManageService; import org.springblade.transport.service.IReceivablePayableDetailService; import org.springblade.transport.support.TransportBusinessSupport; +import org.springblade.transport.support.WaybillProcessSupport; import org.springblade.transport.wrapper.LoadingManageWrapper; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -40,8 +41,10 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; /** @@ -76,6 +79,7 @@ public class LoadingManageServiceImpl extends BaseServiceImpl entityPage = page(page, buildQuery(loadingManage)); IPage voPage = LoadingManageWrapper.build().pageVO(entityPage); voPage.getRecords().forEach(this::fillReadonly); + fillDriverRejected(voPage.getRecords()); return voPage; } @@ -83,6 +87,7 @@ public class LoadingManageServiceImpl extends BaseServiceImpl oldWaybillIds = new ArrayList<>(); + // 新建暂存为草稿;编辑已有单据时保持原业务状态(如待执行),避免被改回草稿 + String businessStatus = STATUS_DRAFT; if (Func.isNotEmpty(loadingManage.getId())) { LoadingManage oldRecord = loadEditable(loadingManage.getId(), true); oldWaybillIds = waybillIds(oldRecord.getWaybillIdsJson()); loadingManage.setLoadingNo(oldRecord.getLoadingNo()); loadingManage.setDeptId(oldRecord.getDeptId()); loadingManage.setDeptName(oldRecord.getDeptName()); + if (Func.isNotEmpty(oldRecord.getBusinessStatus())) { + businessStatus = oldRecord.getBusinessStatus(); + } } prepareCreateOrUpdate(loadingManage); - loadingManage.setBusinessStatus(STATUS_DRAFT); + loadingManage.setBusinessStatus(businessStatus); if (Func.isEmpty(loadingManage.getLoadingNo())) { loadingManage.setLoadingNo(nextCode()); } validateWaybillsAvailable(loadingManage, waybillIds(loadingManage.getWaybillIdsJson())); validateCarrierContract(loadingManage, false); boolean result = saveOrUpdate(loadingManage); - syncAssociatedWaybills(loadingManage, STATUS_DRAFT, oldWaybillIds); + syncAssociatedWaybills(loadingManage, businessStatus, oldWaybillIds); return result; } @@ -321,6 +331,9 @@ public class LoadingManageServiceImpl extends BaseServiceImpl oldWaybillIds = waybillIds(oldRecord.getWaybillIdsJson()); @@ -332,6 +345,7 @@ public class LoadingManageServiceImpl extends BaseServiceImpl()); + return result; + } + @Override @Transactional(rollbackFor = Exception.class) public boolean cancel(Long id) { @@ -817,6 +844,70 @@ public class LoadingManageServiceImpl extends BaseServiceImpl records) { + if (Func.isEmpty(records)) { + return; + } + List loadingNos = records.stream() + .map(LoadingManage::getLoadingNo) + .filter(Func::isNotEmpty) + .distinct() + .toList(); + Set rejectedLoadingNos = new HashSet<>(); + if (Func.isNotEmpty(loadingNos)) { + rejectedLoadingNos.addAll(waybillMapper.selectList(Wrappers.lambdaQuery() + .select(Waybill::getLoadingNo) + .in(Waybill::getLoadingNo, loadingNos) + .eq(Waybill::getIsDeleted, 0) + .eq(Waybill::getDriverAcceptStatus, WaybillProcessSupport.ACCEPT_REJECTED)) + .stream() + .map(Waybill::getLoadingNo) + .filter(Func::isNotEmpty) + .collect(Collectors.toSet())); + } + for (LoadingManageVO record : records) { + record.setDriverRejected(rejectedLoadingNos.contains(record.getLoadingNo())); + } + } + + private boolean hasDriverRejectedWaybill(LoadingManage loadingManage) { + if (Func.isNotEmpty(loadingManage.getLoadingNo())) { + Long count = waybillMapper.selectCount(Wrappers.lambdaQuery() + .eq(Waybill::getLoadingNo, loadingManage.getLoadingNo()) + .eq(Waybill::getIsDeleted, 0) + .eq(Waybill::getDriverAcceptStatus, WaybillProcessSupport.ACCEPT_REJECTED)); + if (count != null && count > 0) { + return true; + } + } + List ids = waybillIds(loadingManage.getWaybillIdsJson()); + if (Func.isEmpty(ids)) { + return false; + } + Long count = waybillMapper.selectCount(Wrappers.lambdaQuery() + .in(Waybill::getId, ids) + .eq(Waybill::getIsDeleted, 0) + .eq(Waybill::getDriverAcceptStatus, WaybillProcessSupport.ACCEPT_REJECTED)); + return count != null && count > 0; + } + + private void clearAssociatedWaybillAcceptRecords(LoadingManage loadingManage) { + List ids = waybillIds(loadingManage.getWaybillIdsJson()); + var update = Wrappers.lambdaUpdate() + .set(Waybill::getDriverAcceptStatus, WaybillProcessSupport.ACCEPT_PENDING) + .set(Waybill::getDriverAcceptTime, null) + .set(Waybill::getDriverAcceptDriverId, null) + .set(Waybill::getDriverRejectTime, null) + .set(Waybill::getDriverRejectReason, null); + if (Func.isNotEmpty(ids)) { + waybillMapper.update(null, update.in(Waybill::getId, ids)); + return; + } + if (Func.isNotEmpty(loadingManage.getLoadingNo())) { + waybillMapper.update(null, update.eq(Waybill::getLoadingNo, loadingManage.getLoadingNo())); + } + } + private String formatMileage(BigDecimal mileage) { if (mileage == null) { return null; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/MasterOrderServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/MasterOrderServiceImpl.java index f71af8d..14468a3 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/MasterOrderServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/MasterOrderServiceImpl.java @@ -572,6 +572,6 @@ public class MasterOrderServiceImpl extends BaseServiceImpl } } else { waybill.setLoadingNo(null); + waybill.setMasterNo(null); waybill.setMileageRemark(null); + // 新建(含复制后提交)不沿用源单据状态,与纯新增一致 + waybill.setBusinessStatus(null); } // 无过程快照时按项目回填;再按接单设置决定 pending / running fillProjectProcessConfig(waybill); @@ -717,13 +720,12 @@ public class WaybillServiceImpl extends BaseServiceImpl target.setOtherFeeTotal(source.getOtherFeeTotal()); target.setTaskRemark(source.getTaskRemark()); target.setOriginalNo(source.getOriginalNo()); - target.setBusinessStatus(source.getBusinessStatus()); target.setDataSource(source.getDataSource()); target.setStartDate(source.getStartDate()); target.setEndDate(source.getEndDate()); target.setPlanId(source.getPlanId()); target.setPlanName(source.getPlanName()); - target.setMasterNo(source.getMasterNo()); + target.setMasterNo(null); target.setLoadingNo(null); target.setBatchNo(source.getBatchNo()); target.setRelationNo(source.getRelationNo()); @@ -736,7 +738,8 @@ public class WaybillServiceImpl extends BaseServiceImpl target.setFreightJson(source.getFreightJson()); target.setAttachmentsJson(source.getAttachmentsJson()); target.setRemark(source.getRemark()); - target.setBusinessStatus("pending"); + // 复制后状态与新增一致:先置空,再按过程配置校正为 pending/running + target.setBusinessStatus(null); target.setWaybillNo(nextCode()); clearDriverAcceptRecord(target); fillProjectProcessConfig(target);