diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/VoucherImage.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/VoucherImage.java
new file mode 100644
index 0000000..101fe2f
--- /dev/null
+++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/VoucherImage.java
@@ -0,0 +1,35 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ */
+package org.springblade.transport.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * 凭证图片明细。
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("blade_voucher_image")
+@Schema(description = "凭证图片明细")
+public class VoucherImage extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ private Long voucherId;
+ private String voucherBatchNo;
+ private Long waybillId;
+ private String waybillNo;
+ private String plateNo;
+ private String imageName;
+ private String objectKey;
+ private Integer matched;
+}
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 656e041..cbd2b07 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
@@ -229,6 +229,9 @@ public class Waybill extends TenantEntity {
@Schema(description = "过程节点")
private String processJson;
+ @Schema(description = "路线信息")
+ private String routeJson;
+
@Schema(description = "费用信息")
private String freightJson;
diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProcessConfigVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProcessConfigVO.java
index 4b267a0..424a568 100644
--- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProcessConfigVO.java
+++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProcessConfigVO.java
@@ -62,5 +62,8 @@ public class ProcessConfigVO extends ProcessConfig {
@Schema(description = "状态名称")
private String statusName;
+ @TableField(exist = false)
+ @Schema(description = "当前运单是否有关联凭证")
+ private Boolean hasRelatedVoucher;
}
diff --git a/blade-service/blade-transport/pom.xml b/blade-service/blade-transport/pom.xml
index c8853b4..852de9a 100644
--- a/blade-service/blade-transport/pom.xml
+++ b/blade-service/blade-transport/pom.xml
@@ -39,6 +39,14 @@
org.springblade
blade-system-api
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
+ io.minio
+ minio
+
diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/config/VoucherImportRabbitConfig.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/config/VoucherImportRabbitConfig.java
new file mode 100644
index 0000000..e784e56
--- /dev/null
+++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/config/VoucherImportRabbitConfig.java
@@ -0,0 +1,39 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ */
+package org.springblade.transport.config;
+
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.DirectExchange;
+import org.springframework.amqp.core.Queue;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 凭证导入消息队列配置。
+ * RabbitMQ 连接参数由 Nacos 的 spring.rabbitmq 配置提供。
+ */
+@Configuration
+public class VoucherImportRabbitConfig {
+
+ public static final String EXCHANGE = "tms.voucher.import.exchange";
+ public static final String QUEUE = "tms.voucher.import.queue";
+ public static final String ROUTING_KEY = "tms.voucher.import";
+
+ @Bean
+ public DirectExchange voucherImportExchange() {
+ return new DirectExchange(EXCHANGE, true, false);
+ }
+
+ @Bean
+ public Queue voucherImportQueue() {
+ return new Queue(QUEUE, true);
+ }
+
+ @Bean
+ public Binding voucherImportBinding(Queue voucherImportQueue, DirectExchange voucherImportExchange) {
+ return BindingBuilder.bind(voucherImportQueue).to(voucherImportExchange).with(ROUTING_KEY);
+ }
+}
diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/config/VoucherMinioConfig.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/config/VoucherMinioConfig.java
new file mode 100644
index 0000000..5c0545b
--- /dev/null
+++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/config/VoucherMinioConfig.java
@@ -0,0 +1,26 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ */
+package org.springblade.transport.config;
+
+import io.minio.MinioClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 凭证图片 MinIO 客户端配置。
+ * 连接参数由 Nacos 的 file.storage.minio 配置提供。
+ */
+@Configuration
+public class VoucherMinioConfig {
+
+ @Bean
+ public MinioClient voucherMinioClient(
+ @Value("${file.storage.minio.endpoint:${minio.endpoint:}}") String endpoint,
+ @Value("${file.storage.minio.access-key-id:${minio.access-key:}}") String accessKey,
+ @Value("${file.storage.minio.access-key-secret:${minio.secret-key:}}") String secretKey) {
+ return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
+ }
+}
diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ProcessConfigController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ProcessConfigController.java
index 12d2d3f..1bf3097 100644
--- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ProcessConfigController.java
+++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ProcessConfigController.java
@@ -24,11 +24,13 @@ package org.springblade.transport.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.minio.GetPresignedObjectUrlArgs;
+import io.minio.MinioClient;
+import io.minio.http.Method;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition;
@@ -38,10 +40,13 @@ import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.transport.excel.ProcessConfigExcel;
+import org.springblade.transport.mapper.VoucherImageMapper;
import org.springblade.transport.pojo.entity.ProcessConfig;
+import org.springblade.transport.pojo.entity.VoucherImage;
import org.springblade.transport.pojo.vo.BusinessRemoveResultVO;
import org.springblade.transport.pojo.vo.ProcessConfigVO;
import org.springblade.transport.service.IProcessConfigService;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -50,7 +55,10 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
/**
* 过程配置 控制器
@@ -58,19 +66,64 @@ import java.util.List;
* @author Chill
*/
@RestController
-@AllArgsConstructor
@PreAuth(menu = "process_config")
@RequestMapping("/process-config")
@Tag(name = "过程配置", description = "过程配置")
public class ProcessConfigController extends BladeController {
private final IProcessConfigService processConfigService;
+ private final VoucherImageMapper voucherImageMapper;
+ private final MinioClient minioClient;
+ @Value("${file.storage.minio.bucket-name:${minio.bucket-name:}}")
+ private String minioBucketName;
+
+ public ProcessConfigController(IProcessConfigService processConfigService, VoucherImageMapper voucherImageMapper,
+ MinioClient minioClient) {
+ this.processConfigService = processConfigService;
+ this.voucherImageMapper = voucherImageMapper;
+ this.minioClient = minioClient;
+ }
@GetMapping("/detail")
@ApiOperationSupport(order = 1)
@Operation(summary = "详情", description = "传入id")
- public R detail(@Parameter(description = "主键", required = true) @RequestParam Long id) {
- return R.data(processConfigService.detail(id));
+ public R detail(@Parameter(description = "主键", required = true) @RequestParam Long id,
+ @Parameter(description = "运单主键") @RequestParam(required = false) Long waybillId) {
+ ProcessConfigVO detail = processConfigService.detail(id);
+ detail.setHasRelatedVoucher(waybillId != null && voucherImageMapper.selectCount(
+ new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper()
+ .eq(VoucherImage::getWaybillId, waybillId)
+ .eq(VoucherImage::getMatched, 1)) > 0);
+ return R.data(detail);
+ }
+
+ @GetMapping("/voucher-images")
+ @ApiOperationSupport(order = 2)
+ @Operation(summary = "查询运单已关联凭证图片")
+ public R>> voucherImages(
+ @Parameter(description = "运单主键", required = true) @RequestParam Long waybillId) {
+ List