From 1109fe777cc8acc17988eb977ac82ad2a4e4cdad Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Wed, 12 Aug 2026 19:44:34 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81fix=20bug=202=E3=80=81=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E5=87=AD=E8=AF=81=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/dto/VoucherFileCompleteRequest.java | 12 ++++++ .../transport/pojo/entity/Waybill.java | 9 ++++ .../file/controller/FileTaskController.java | 13 ++++-- .../file/service/IFileTaskService.java | 2 + .../service/impl/FileTaskServiceImpl.java | 20 ++++++++- .../controller/VoucherManageController.java | 12 +++++- .../transport/mapper/VoucherManageMapper.java | 14 ++++++- .../mapper/VoucherWaybillBatchMapper.java | 3 +- .../mapper/VoucherWaybillBatchMapper.xml | 33 ++++++++------- .../service/IVoucherManageService.java | 4 +- .../impl/VoucherManageServiceImpl.java | 29 ++++++++++--- .../service/impl/WaybillServiceImpl.java | 42 +++++++++++++++---- .../blade_business_unzip_task_20260812.sql | 37 ++++++++++++++++ doc/sql/transport/blade_tms_business.sql | 3 ++ ..._waybill_non_road_task_fields_20260812.sql | 4 ++ 15 files changed, 198 insertions(+), 39 deletions(-) create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/VoucherFileCompleteRequest.java create mode 100644 doc/sql/transport/blade_business_unzip_task_20260812.sql create mode 100644 doc/sql/transport/blade_waybill_non_road_task_fields_20260812.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/VoucherFileCompleteRequest.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/VoucherFileCompleteRequest.java new file mode 100644 index 0000000..0da0b61 --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/VoucherFileCompleteRequest.java @@ -0,0 +1,12 @@ +package org.springblade.transport.pojo.dto; + +import lombok.Data; + +/** 分片上传完成后回写凭证文件。 */ +@Data +public class VoucherFileCompleteRequest { + private String voucherBatchNo; + private Long fileTaskId; + private String fileName; + private String fileUrl; +} diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/Waybill.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/Waybill.java index 1a01d2b..656e041 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/Waybill.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/Waybill.java @@ -139,6 +139,15 @@ public class Waybill extends TenantEntity { @Schema(description = "车/船/航班/班列号") private String vehicleNo; + @Schema(description = "船长") + private String captainName; + + @Schema(description = "舱位") + private String cabinNo; + + @Schema(description = "箱号") + private String containerNo; + @Schema(description = "挂车车牌号") private String trailerVehicleNo; diff --git a/blade-service/blade-file/src/main/java/org/springblade/file/controller/FileTaskController.java b/blade-service/blade-file/src/main/java/org/springblade/file/controller/FileTaskController.java index 09cf72d..62e4dab 100644 --- a/blade-service/blade-file/src/main/java/org/springblade/file/controller/FileTaskController.java +++ b/blade-service/blade-file/src/main/java/org/springblade/file/controller/FileTaskController.java @@ -41,9 +41,10 @@ public class FileTaskController extends BladeController { private final IFileService fileService; @GetMapping("/queryFileTask") - @Operation(summary = "根据文件的MD5值查询文件任务", description = "文件的MD5值检查分段,参数名:md5") - public R queryFileTask(@RequestParam(value = "md5") String md5) { - FileTaskUpdateVO fileTask = fileTaskService.queryFileTask(null, md5); + @Operation(summary = "查询文件任务", description = "传入 id 或 md5 查询文件任务") + public R queryFileTask(@RequestParam(required = false) Long id, + @RequestParam(value = "md5", required = false) String md5) { + FileTaskUpdateVO fileTask = fileTaskService.queryFileTask(id, md5); return R.data(fileTask); } @@ -94,6 +95,12 @@ public class FileTaskController extends BladeController { return R.status(fileTaskService.updatePaused(param.getIds())); } + @PostMapping("/resume") + @Operation(summary = "恢复文件任务上传") + public R resume(@RequestParam Long id) { + return R.status(fileTaskService.resume(id)); + } + @GetMapping("/getUploadUrl") @Parameters({ @Parameter(name = "id", description = "文件任务id", in = ParameterIn.QUERY, schema = @Schema(type = "string")), diff --git a/blade-service/blade-file/src/main/java/org/springblade/file/service/IFileTaskService.java b/blade-service/blade-file/src/main/java/org/springblade/file/service/IFileTaskService.java index a6788ef..ae39452 100644 --- a/blade-service/blade-file/src/main/java/org/springblade/file/service/IFileTaskService.java +++ b/blade-service/blade-file/src/main/java/org/springblade/file/service/IFileTaskService.java @@ -94,5 +94,7 @@ public interface IFileTaskService extends IService { */ boolean updatePaused(List param); + boolean resume(Long id); + IPage selectPage(Query query, String businessType, String businessId, String attachmentName, String status); } diff --git a/blade-service/blade-file/src/main/java/org/springblade/file/service/impl/FileTaskServiceImpl.java b/blade-service/blade-file/src/main/java/org/springblade/file/service/impl/FileTaskServiceImpl.java index 6eba087..1f64964 100644 --- a/blade-service/blade-file/src/main/java/org/springblade/file/service/impl/FileTaskServiceImpl.java +++ b/blade-service/blade-file/src/main/java/org/springblade/file/service/impl/FileTaskServiceImpl.java @@ -36,7 +36,6 @@ import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.core.mp.support.Condition; -import org.springblade.core.secure.utils.AuthUtil; import org.springblade.file.config.ObsProperties; import org.springblade.file.convert.FileTaskConvert; import org.springblade.file.listener.FileUploadedEvent; @@ -251,6 +250,9 @@ public class FileTaskServiceImpl extends ServiceImpl i if (FileTaskStatus.COMPLETED.getCode().equals(fileTask.getStatus())) { throw new ServiceException("文件任务已完成"); } + if (FileTaskStatus.PAUSED.getCode().equals(fileTask.getStatus())) { + throw new ServiceException("文件任务已暂停"); + } return fileService.getUploadPartUrl(fileTask.getObjectKey(), fileTask.getUploadId(), partNumber, null); } @@ -322,6 +324,19 @@ public class FileTaskServiceImpl extends ServiceImpl i ); } + @Override + public boolean resume(Long id) { + FileTask fileTask = getById(id); + Func.requireNotNull(fileTask, "文件任务不存在"); + if (FileTaskStatus.COMPLETED.getCode().equals(fileTask.getStatus())) { + throw new ServiceException("文件任务已完成"); + } + FileTask updateParam = new FileTask(); + updateParam.setId(id); + updateParam.setStatus(FileTaskStatus.UPLOADING.getCode()); + return updateById(updateParam); + } + @Override public IPage selectPage(org.springblade.core.mp.support.Query query, String businessType, String businessId, String attachmentName, String status) { IPage page = page(Condition.getPage(query), Wrappers.lambdaQuery() @@ -329,7 +344,7 @@ public class FileTaskServiceImpl extends ServiceImpl i .eq(StringUtil.isNotBlank(businessId), FileTask::getBusinessId, businessId) .like(StringUtil.isNotBlank(attachmentName), FileTask::getAttachmentName, attachmentName) .eq(StringUtil.isNotBlank(status), FileTask::getStatus, status) - .eq(FileTask::getCreateUser, AuthUtil.getUserId()).orderByDesc(FileTask::getCreateTime)); + .orderByDesc(FileTask::getCreateTime)); return page.convert(this::getFileTaskUpdateVO); } @@ -383,6 +398,7 @@ public class FileTaskServiceImpl extends ServiceImpl i return this.update(updateParam, Wrappers.lambdaUpdate() .eq(FileTask::getId, param.getId()) .lt(FileTask::getCurrentIndex, param.getPartNumber()) + .ne(FileTask::getStatus, FileTaskStatus.PAUSED.getCode()) ); } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/VoucherManageController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/VoucherManageController.java index e831a64..b4d9ee7 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/VoucherManageController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/VoucherManageController.java @@ -12,6 +12,7 @@ import org.springblade.core.secure.annotation.PreAuth; import org.springblade.core.tool.api.R; import org.springblade.transport.pojo.dto.VoucherManageSubmitRequest; import org.springblade.transport.pojo.dto.VoucherUploadDraftRequest; +import org.springblade.transport.pojo.dto.VoucherFileCompleteRequest; import org.springblade.transport.pojo.entity.VoucherManage; import org.springblade.transport.pojo.vo.VoucherManageVO; import org.springblade.transport.service.IVoucherManageService; @@ -57,6 +58,13 @@ public class VoucherManageController extends BladeController { return R.data(voucherManageService.createUploadDraft(request)); } + @PostMapping("/complete-upload-file") + @Operation(summary = "回写已完成上传的凭证文件") + public R completeUploadFile(@RequestBody VoucherFileCompleteRequest request) { + voucherManageService.completeUploadFile(request); + return R.success("文件已更新"); + } + @PostMapping("/remove") @ApiOperationSupport(order = 5) @Operation(summary = "删除凭证") @@ -65,9 +73,9 @@ public class VoucherManageController extends BladeController { @GetMapping("/waybill-batches") @ApiOperationSupport(order = 6) @Operation(summary = "可关联运输批次") - public R>> waybillBatches(@RequestParam(required = false) String batchNo, + public R>> waybillBatches(Query query, @RequestParam(required = false) String batchNo, @RequestParam(required = false) String createUser, @RequestParam(required = false) Integer waybillCount, @RequestParam(required = false) String createTimeStart, @RequestParam(required = false) String createTimeEnd) { - return R.data(voucherManageService.selectableWaybillBatches(batchNo, createUser, waybillCount, createTimeStart, createTimeEnd)); + return R.data(voucherManageService.selectableWaybillBatches(Condition.getPage(query), batchNo, createUser, waybillCount, createTimeStart, createTimeEnd)); } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherManageMapper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherManageMapper.java index 6bfed71..ef7e82f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherManageMapper.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherManageMapper.java @@ -1,6 +1,18 @@ package org.springblade.transport.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.springblade.transport.pojo.entity.VoucherManage; -public interface VoucherManageMapper extends BaseMapper { } +public interface VoucherManageMapper extends BaseMapper { + + /** + * 查询指定租户、指定日期前缀下已使用的最大凭证流水号。 + * 不过滤逻辑删除数据,避免唯一索引仍占用历史编号时重复生成。 + */ + @Select("SELECT COALESCE(MAX(CAST(SUBSTRING_INDEX(voucher_batch_no, '-', -1) AS UNSIGNED)), 0) " + + "FROM blade_voucher_manage WHERE tenant_id = #{tenantId} " + + "AND voucher_batch_no LIKE CONCAT(#{prefix}, '%')") + Long selectMaxDailySequence(@Param("tenantId") String tenantId, @Param("prefix") String prefix); +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherWaybillBatchMapper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherWaybillBatchMapper.java index d5300d1..20ede56 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherWaybillBatchMapper.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherWaybillBatchMapper.java @@ -1,6 +1,7 @@ package org.springblade.transport.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.transport.pojo.entity.VoucherWaybillBatch; import java.util.List; @@ -9,7 +10,7 @@ import java.util.Map; import org.apache.ibatis.annotations.Param; public interface VoucherWaybillBatchMapper extends BaseMapper { - List> selectWaybillBatches(@Param("tenantId") String tenantId, @Param("batchNo") String batchNo, @Param("createUser") String createUser, + IPage> selectVoucherWaybillBatchPage(IPage page, @Param("tenantId") String tenantId, @Param("batchNo") String batchNo, @Param("createUser") String createUser, @Param("waybillCount") Integer waybillCount, @Param("createTimeStart") String createTimeStart, @Param("createTimeEnd") String createTimeEnd); List> selectWaybillBatchesByIds(@Param("tenantId") String tenantId, @Param("ids") List ids); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherWaybillBatchMapper.xml b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherWaybillBatchMapper.xml index 8240c32..0c726f6 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherWaybillBatchMapper.xml +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/VoucherWaybillBatchMapper.xml @@ -1,24 +1,25 @@ - + SELECT MAX(w.create_time) AS createTime, MAX(w.create_user) AS createUser, + MAX(u.real_name) AS createUserName, COUNT(*) AS waybillCount, + COALESCE(NULLIF(w.batch_no, ''), '未分批运单') AS batchNo, GROUP_CONCAT(w.id ORDER BY w.create_time DESC) AS waybillIds + FROM blade_waybill w + LEFT JOIN blade_user u ON u.id = w.create_user + WHERE w.is_deleted = 0 AND w.tenant_id = #{tenantId} + AND w.batch_no LIKE CONCAT('%', #{batchNo}, '%') + AND w.create_user = #{createUser} + AND w.create_time =]]> #{createTimeStart} + AND w.create_time #{createTimeEnd} + GROUP BY COALESCE(NULLIF(w.batch_no, ''), '未分批运单') + HAVING COUNT(*) = #{waybillCount} + ORDER BY createTime DESC diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IVoucherManageService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IVoucherManageService.java index dad9a28..be5d296 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IVoucherManageService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IVoucherManageService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; import org.springblade.transport.pojo.dto.VoucherManageSubmitRequest; import org.springblade.transport.pojo.dto.VoucherUploadDraftRequest; +import org.springblade.transport.pojo.dto.VoucherFileCompleteRequest; import org.springblade.transport.pojo.entity.VoucherManage; import org.springblade.transport.pojo.vo.VoucherManageVO; @@ -15,6 +16,7 @@ public interface IVoucherManageService extends BaseService { VoucherManageVO detail(Long id); void submit(VoucherManageSubmitRequest request); VoucherManage createUploadDraft(VoucherUploadDraftRequest request); + void completeUploadFile(VoucherFileCompleteRequest request); void removeVoucher(Long id); - List> selectableWaybillBatches(String batchNo, String createUser, Integer waybillCount, String createTimeStart, String createTimeEnd); + IPage> selectableWaybillBatches(IPage page, String batchNo, String createUser, Integer waybillCount, String createTimeStart, String createTimeEnd); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/VoucherManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/VoucherManageServiceImpl.java index ca25485..604dd91 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/VoucherManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/VoucherManageServiceImpl.java @@ -11,6 +11,7 @@ import org.springblade.transport.mapper.VoucherManageMapper; import org.springblade.transport.mapper.VoucherWaybillBatchMapper; import org.springblade.transport.pojo.dto.VoucherManageSubmitRequest; import org.springblade.transport.pojo.dto.VoucherUploadDraftRequest; +import org.springblade.transport.pojo.dto.VoucherFileCompleteRequest; import org.springblade.transport.pojo.entity.VoucherManage; import org.springblade.transport.pojo.entity.VoucherWaybillBatch; import org.springblade.transport.pojo.entity.ProjectApply; @@ -80,7 +81,7 @@ public class VoucherManageServiceImpl extends BaseServiceImpllambdaQuery() + .eq(VoucherManage::getVoucherBatchNo, request.getVoucherBatchNo()) + .eq(VoucherManage::getIsDeleted, 0).last("limit 1")); + if (voucher == null) throw new ServiceException("凭证批次不存在"); + voucher.setFileTaskId(request.getFileTaskId()); + voucher.setFileName(request.getFileName()); + voucher.setFileUrl(request.getFileUrl()); + updateById(voucher); + } + @Override @Transactional(rollbackFor = Exception.class) public void removeVoucher(Long id) { @@ -129,8 +146,8 @@ public class VoucherManageServiceImpl extends BaseServiceImpl> selectableWaybillBatches(String batchNo, String createUser, Integer waybillCount, String createTimeStart, String createTimeEnd) { - return voucherWaybillBatchMapper.selectWaybillBatches(AuthUtil.getTenantId(), batchNo, createUser, waybillCount, createTimeStart, createTimeEnd); + public IPage> selectableWaybillBatches(IPage page, String batchNo, String createUser, Integer waybillCount, String createTimeStart, String createTimeEnd) { + return voucherWaybillBatchMapper.selectVoucherWaybillBatchPage(page, AuthUtil.getTenantId(), batchNo, createUser, waybillCount, createTimeStart, createTimeEnd); } private List> selectableWaybillBatchesByIds(List ids) { @@ -153,7 +170,7 @@ public class VoucherManageServiceImpl extends BaseServiceImpllambdaQuery().likeRight(VoucherManage::getVoucherBatchNo, prefix)); - return prefix + String.format("%03d", count + 1); + Long maxSequence = baseMapper.selectMaxDailySequence(AuthUtil.getTenantId(), prefix); + return prefix + String.format("%03d", (maxSequence == null ? 0 : maxSequence) + 1); } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/WaybillServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/WaybillServiceImpl.java index ae96456..8306ffe 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/WaybillServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/WaybillServiceImpl.java @@ -186,6 +186,9 @@ public class WaybillServiceImpl extends BaseServiceImpl target.setDriverName(source.getDriverName()); target.setDriverPhone(source.getDriverPhone()); target.setVehicleNo(source.getVehicleNo()); + target.setCaptainName(source.getCaptainName()); + target.setCabinNo(source.getCabinNo()); + target.setContainerNo(source.getContainerNo()); target.setTrailerVehicleNo(source.getTrailerVehicleNo()); target.setEscortName(source.getEscortName()); target.setEscortPhone(source.getEscortPhone()); @@ -382,6 +385,9 @@ public class WaybillServiceImpl extends BaseServiceImpl waybill.setDriverName(TransportBusinessSupport.trimToNull(waybill.getDriverName())); waybill.setDriverPhone(TransportBusinessSupport.trimToNull(waybill.getDriverPhone())); waybill.setVehicleNo(TransportBusinessSupport.trimToNull(waybill.getVehicleNo())); + waybill.setCaptainName(TransportBusinessSupport.trimToNull(waybill.getCaptainName())); + waybill.setCabinNo(TransportBusinessSupport.trimToNull(waybill.getCabinNo())); + waybill.setContainerNo(TransportBusinessSupport.trimToNull(waybill.getContainerNo())); waybill.setTrailerVehicleNo(TransportBusinessSupport.trimToNull(waybill.getTrailerVehicleNo())); waybill.setEscortName(TransportBusinessSupport.trimToNull(waybill.getEscortName())); waybill.setEscortPhone(TransportBusinessSupport.trimToNull(waybill.getEscortPhone())); @@ -422,13 +428,15 @@ public class WaybillServiceImpl extends BaseServiceImpl TransportBusinessSupport.validateRequired(waybill.getCargoType(), "货物类型不能为空"); TransportBusinessSupport.validateRequired(waybill.getQuantityUnit(), "数量单位不能为空"); TransportBusinessSupport.validateRequired(waybill.getCarrierType(), "承运类型不能为空"); - TransportBusinessSupport.validateRequired(waybill.getVehicleNo(), "车牌号不能为空"); - if ("承运商".equals(waybill.getCarrierType())) { - TransportBusinessSupport.validateRequired(waybill.getCarrierName(), "承运商不能为空"); - } else { - TransportBusinessSupport.validateRequired(waybill.getDriverName(), "司机不能为空"); - TransportBusinessSupport.validateRequired(waybill.getDriverPhone(), "司机手机号不能为空"); - if (!isRoadTransport(waybill.getTransportType())) { + TransportBusinessSupport.validateRequired( + waybill.getVehicleNo(), isRoadTransport(waybill.getTransportType()) ? "车牌号不能为空" : "船/航/班列号不能为空" + ); + if (isRoadTransport(waybill.getTransportType())) { + if ("承运商".equals(waybill.getCarrierType())) { + TransportBusinessSupport.validateRequired(waybill.getCarrierName(), "承运商不能为空"); + } else { + TransportBusinessSupport.validateRequired(waybill.getDriverName(), "司机不能为空"); + TransportBusinessSupport.validateRequired(waybill.getDriverPhone(), "司机手机号不能为空"); TransportBusinessSupport.validateRequired(waybill.getTrailerVehicleNo(), "挂车车牌号不能为空"); TransportBusinessSupport.validateRequired(waybill.getEscortName(), "押运人不能为空"); TransportBusinessSupport.validateRequired(waybill.getEscortPhone(), "押运人手机号不能为空"); @@ -465,6 +473,9 @@ public class WaybillServiceImpl extends BaseServiceImpl TransportBusinessSupport.validateLength(waybill.getDriverName(), 255, "司机姓名不能超过255字"); TransportBusinessSupport.validateLength(waybill.getDriverPhone(), 50, "司机手机号不能超过50字"); TransportBusinessSupport.validateLength(waybill.getVehicleNo(), 255, "车/船/航班/班列号不能超过255字"); + TransportBusinessSupport.validateLength(waybill.getCaptainName(), 20, "船长不能超过20字"); + TransportBusinessSupport.validateLength(waybill.getCabinNo(), 30, "舱位不能超过30字"); + TransportBusinessSupport.validateLength(waybill.getContainerNo(), 30, "箱号不能超过30字"); TransportBusinessSupport.validateLength(waybill.getTrailerVehicleNo(), 255, "挂车车牌号不能超过255字"); TransportBusinessSupport.validateLength(waybill.getEscortName(), 255, "押运人不能超过255字"); TransportBusinessSupport.validateLength(waybill.getEscortPhone(), 50, "押运人手机号不能超过50字"); @@ -496,6 +507,7 @@ public class WaybillServiceImpl extends BaseServiceImpl TransportBusinessSupport.validateNonNegative(waybill.getUnitPrice(), "单价"); TransportBusinessSupport.validateNonNegative(waybill.getOtherFeeTotal(), "其他费用合计"); validateRoadTaskInfo(waybill); + validateNonRoadTaskInfo(waybill); TransportBusinessSupport.validateDateRange(waybill.getStartDate(), waybill.getEndDate(), "开始日期不能晚于结束日期"); if (waybill.getEstimatedStartTime() != null && waybill.getEstimatedEndTime() != null @@ -542,6 +554,16 @@ public class WaybillServiceImpl extends BaseServiceImpl } } + private void validateNonRoadTaskInfo(Waybill waybill) { + if (isRoadTransport(waybill.getTransportType())) { + return; + } + TransportBusinessSupport.validateLength(waybill.getVehicleNo(), 30, "船/航/班列号不能超过30字"); + TransportBusinessSupport.validateLength(waybill.getCaptainName(), 20, "船长不能超过20字"); + TransportBusinessSupport.validateLength(waybill.getCabinNo(), 30, "舱位不能超过30字"); + TransportBusinessSupport.validateLength(waybill.getContainerNo(), 30, "箱号不能超过30字"); + } + private boolean isRoadTransport(String transportType) { String value = transportType == null ? "" : transportType.toLowerCase(); return value.contains("公路") || value.contains("道路") || value.contains("road") || "gl".equals(value); @@ -590,6 +612,9 @@ public class WaybillServiceImpl extends BaseServiceImpl putIfNotEmpty(carrier, "driverName", waybill.getDriverName()); putIfNotEmpty(carrier, "driverPhone", waybill.getDriverPhone()); putIfNotEmpty(carrier, "vehicleNo", waybill.getVehicleNo()); + putIfNotEmpty(carrier, "captainName", waybill.getCaptainName()); + putIfNotEmpty(carrier, "cabinNo", waybill.getCabinNo()); + putIfNotEmpty(carrier, "containerNo", waybill.getContainerNo()); putIfNotEmpty(carrier, "trailerVehicleNo", waybill.getTrailerVehicleNo()); putIfNotEmpty(carrier, "escortName", waybill.getEscortName()); putIfNotEmpty(carrier, "escortPhone", waybill.getEscortPhone()); @@ -630,6 +655,9 @@ public class WaybillServiceImpl extends BaseServiceImpl putIfNotEmpty(taskInfo, "driverName", waybill.getDriverName()); putIfNotEmpty(taskInfo, "driverPhone", waybill.getDriverPhone()); putIfNotEmpty(taskInfo, "vehicleNo", waybill.getVehicleNo()); + putIfNotEmpty(taskInfo, "captainName", waybill.getCaptainName()); + putIfNotEmpty(taskInfo, "cabinNo", waybill.getCabinNo()); + putIfNotEmpty(taskInfo, "containerNo", waybill.getContainerNo()); putIfNotEmpty(taskInfo, "trailerVehicleNo", waybill.getTrailerVehicleNo()); putIfNotEmpty(taskInfo, "escortName", waybill.getEscortName()); putIfNotEmpty(taskInfo, "escortPhone", waybill.getEscortPhone()); diff --git a/doc/sql/transport/blade_business_unzip_task_20260812.sql b/doc/sql/transport/blade_business_unzip_task_20260812.sql new file mode 100644 index 0000000..38215a2 --- /dev/null +++ b/doc/sql/transport/blade_business_unzip_task_20260812.sql @@ -0,0 +1,37 @@ +-- 文件服务当前使用 transport 数据库时必须执行。 +-- 文件上传任务在返回结果及完成事件中会查询该表;未启用压缩包解压业务时表中不会产生数据。 + +CREATE TABLE IF NOT EXISTS `blade_business_unzip_task` ( + `id` bigint NOT NULL COMMENT '主键ID', + `biz_id` bigint DEFAULT NULL COMMENT '业务ID', + `department_id` bigint DEFAULT NULL COMMENT '部门ID', + `biz_code` varchar(100) DEFAULT NULL COMMENT '业务编码', + `doc_code` varchar(100) DEFAULT NULL COMMENT '文档编号', + `relate_type` varchar(30) DEFAULT NULL COMMENT '关联类型:file_task、attachment', + `relate_id` bigint DEFAULT NULL COMMENT '关联ID:文件任务ID或附件ID', + `status` varchar(30) DEFAULT NULL COMMENT '状态:uploading、uploaded、unzipping、finished、failed', + `tenant_id` varchar(12) NOT NULL DEFAULT '000000' COMMENT '租户ID', + `create_user` bigint DEFAULT NULL COMMENT '创建人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_user` bigint DEFAULT NULL COMMENT '更新人', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除:0否、1是', + PRIMARY KEY (`id`), + KEY `idx_business_unzip_task_relate_id` (`relate_id`), + KEY `idx_business_unzip_task_biz_id` (`biz_id`), + KEY `idx_business_unzip_task_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务解压任务'; + +CREATE TABLE IF NOT EXISTS `blade_business_unzip_detail` ( + `id` bigint NOT NULL COMMENT '主键ID', + `business_unzip_task_id` bigint NOT NULL COMMENT '业务解压任务ID', + `attachment_id` bigint NOT NULL COMMENT '附件ID', + `create_user` bigint DEFAULT NULL COMMENT '创建人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_user` bigint DEFAULT NULL COMMENT '更新人', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除:0否、1是', + PRIMARY KEY (`id`), + KEY `idx_business_unzip_detail_task_id` (`business_unzip_task_id`), + KEY `idx_business_unzip_detail_attachment_id` (`attachment_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='业务解压明细'; diff --git a/doc/sql/transport/blade_tms_business.sql b/doc/sql/transport/blade_tms_business.sql index 9c3509f..b0b9f48 100644 --- a/doc/sql/transport/blade_tms_business.sql +++ b/doc/sql/transport/blade_tms_business.sql @@ -243,6 +243,9 @@ CREATE TABLE `blade_waybill` ( `driver_name` varchar(100) DEFAULT NULL COMMENT '司机姓名', `driver_phone` varchar(50) DEFAULT NULL COMMENT '司机手机号', `vehicle_no` varchar(100) DEFAULT NULL COMMENT '车/船/航班/班列号', + `captain_name` varchar(20) DEFAULT NULL COMMENT '船长', + `cabin_no` varchar(30) DEFAULT NULL COMMENT '舱位', + `container_no` varchar(30) DEFAULT NULL COMMENT '箱号', `trailer_vehicle_no` varchar(100) DEFAULT NULL COMMENT '挂车车牌号', `escort_name` varchar(100) DEFAULT NULL COMMENT '押运人', `escort_phone` varchar(50) DEFAULT NULL COMMENT '押运人手机号', diff --git a/doc/sql/transport/blade_waybill_non_road_task_fields_20260812.sql b/doc/sql/transport/blade_waybill_non_road_task_fields_20260812.sql new file mode 100644 index 0000000..39f51f6 --- /dev/null +++ b/doc/sql/transport/blade_waybill_non_road_task_fields_20260812.sql @@ -0,0 +1,4 @@ +ALTER TABLE `blade_waybill` + ADD COLUMN `captain_name` varchar(20) DEFAULT NULL COMMENT '船长' AFTER `vehicle_no`, + ADD COLUMN `cabin_no` varchar(30) DEFAULT NULL COMMENT '舱位' AFTER `captain_name`, + ADD COLUMN `container_no` varchar(30) DEFAULT NULL COMMENT '箱号' AFTER `cabin_no`;