From 63c2f7ed1ee1c04221acfcd1fc8b4d7f50f64758 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com>
Date: Mon, 12 Oct 2026 16:52:39 +0800
Subject: [PATCH] =?UTF-8?q?:feat:=20=E5=90=88=E5=90=8C=E9=99=84=E4=BB=B6?=
=?UTF-8?q?=E6=8C=82=E8=BD=BD=E6=8C=89=20eopCdraft=20=E6=9E=9A=E4=B8=BE?=
=?UTF-8?q?=E5=88=86=E7=B1=BB=EF=BC=88fdEntityKey=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- HcsSyncConstant 新增 CONTRACT_ATTACH_KEY_SPECIAL/SEAL/OTHER(eopCdraftSpecial/eopCdraftSign/eopCdraftOther)
- 转传接口返回 HcsAttachmentRefDTO(fdId+fdEntityKey+fdFileName),替代纯 fdId 列表
- 合同链路:主文件 approved=true 挂 eopCdraftSign、其它附件挂 eopCdraftOther、特批说明挂 eopCdraftSpecial
- buildDraftParam 直接消费引用列表统一补 fdBindType=ADD;特批付款/履约记录/收票单/开票登记四个挂载点改为在返回引用上补各自字段,行为不变
---
.../transport/constant/HcsSyncConstant.java | 47 ++++++--
.../support/hcs/HcsAttachmentSupport.java | 106 ++++++++++++------
.../support/hcs/HcsContractSyncSupport.java | 103 ++++++++---------
.../support/hcs/HcsInvoiceRegSyncSupport.java | 10 +-
.../support/hcs/HcsPerfRecordSyncSupport.java | 28 ++---
.../hcs/HcsReceiptBillSyncSupport.java | 34 ++----
.../support/hcs/HcsSpecPaySyncSupport.java | 29 ++---
...026-09-27-桂物合同合规系统HCS接入技术设计.md | 4 +-
8 files changed, 192 insertions(+), 169 deletions(-)
diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsSyncConstant.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsSyncConstant.java
index 7eed4fed..6e4da84b 100644
--- a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsSyncConstant.java
+++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsSyncConstant.java
@@ -180,6 +180,28 @@ public final class HcsSyncConstant {
*/
public static final String ATTACHMENT_TYPE_SPEC_EXPLANATION = "特批说明";
+ /**
+ * 附件类型:用印附件(双章归档文件,取值沿用 ContractManageServiceImpl#FILE_TYPE_SEAL_ARCHIVE)
+ */
+ public static final String ATTACHMENT_TYPE_SEAL = "双章归档文件";
+
+ // ==================== 合同附件挂载 fdEntityKey(eopCdraft 附件面板字段 key,C103-1) ====================
+
+ /**
+ * 合同附件字段 key:特批附件
+ */
+ public static final String CONTRACT_ATTACH_KEY_SPECIAL = "eopCdraftSpecial";
+
+ /**
+ * 合同附件字段 key:用印附件
+ */
+ public static final String CONTRACT_ATTACH_KEY_SEAL = "eopCdraftSign";
+
+ /**
+ * 合同附件字段 key:其他附件(含合同主文件)
+ */
+ public static final String CONTRACT_ATTACH_KEY_OTHER = "eopCdraftOther";
+
/**
* 特批审核挂起节点展示名(currentNode,特批发起后挂起展示,结果回传后恢复)
*/
@@ -202,16 +224,6 @@ public final class HcsSyncConstant {
*/
public static final String MASTER_CACHE_CURRENCIES = "blade:third:hcs:master:currencies";
- /**
- * 附件映射缓存 key 前缀(hcs:att:{attachmentKey},TMS 附件元数据键 → 合规附件ID)
- */
- public static final String ATTACHMENT_CACHE_KEY_PREFIX = "blade:third:hcs:att:";
-
- /**
- * 附件映射缓存 TTL(天),重复上传仅浪费存储无业务风险,故不做持久化映射表(设计文档 §6)
- */
- public static final long ATTACHMENT_CACHE_TTL_DAYS = 7L;
-
/**
* 推送任务分布式锁 key 前缀(多实例部署防重扫,完整 key = 前缀 + 业务类型,任务间互不阻塞)
*/
@@ -227,6 +239,21 @@ public final class HcsSyncConstant {
*/
public static final long PUSH_SINGLE_LOCK_TTL_SECONDS = 120L;
+ /**
+ * hcs_sync_msg 字段安全截断长度(列宽 varchar(512),留余量防远程错误报文超长导致落库失败)
+ */
+ public static final int SYNC_MSG_MAX_LENGTH = 500;
+
+ /**
+ * 截断超长的推送结果/失败原因(如 Feign 异常携带的远程 404 响应体),防止 Data too long 落库失败
+ */
+ public static String truncateMsg(String message) {
+ if (message == null) {
+ return null;
+ }
+ return message.length() > SYNC_MSG_MAX_LENGTH ? message.substring(0, SYNC_MSG_MAX_LENGTH) : message;
+ }
+
private HcsSyncConstant() {
}
}
diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsAttachmentSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsAttachmentSupport.java
index 4e1351ca..8e63c988 100644
--- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsAttachmentSupport.java
+++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsAttachmentSupport.java
@@ -26,19 +26,21 @@
package org.springblade.transport.support.hcs;
import cn.hutool.http.HttpUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.tool.jackson.JsonUtil;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.hcs.config.HcsProperties;
-import org.springblade.hcs.constant.HcsConstant;
import org.springblade.hcs.dto.HcsAttachmentDownloadDTO;
+import org.springblade.hcs.dto.HcsAttachmentRefDTO;
import org.springblade.hcs.dto.HcsAttachmentVO;
import org.springblade.hcs.dto.HcsResult;
import org.springblade.hcs.exception.HcsException;
import org.springblade.hcs.feign.IHcsClient;
import org.springblade.transport.constant.HcsSyncConstant;
+import org.springblade.transport.mapper.HcsAttachmentSyncMapper;
+import org.springblade.transport.pojo.entity.HcsAttachmentSync;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@@ -48,7 +50,7 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.time.Duration;
+import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -59,12 +61,12 @@ import java.util.Objects;
*
* 流程:解析单据附件 JSON 元素(去重键照 ContractManage#attachmentKey 惯例)→
* 按元数据 URL 从文件服务拉取流(基址可配 attachment.file-download-base)→
- * C103-2 上传取得合规附件ID → Redis 映射缓存(blade:third:hcs:att:{attachmentKey},TTL 7 天),
- * 未命中重传(重复上传仅浪费存储,无业务风险,故不做持久化映射表)。
- * 任一附件转传失败 → 抛出异常由整单推送失败进补偿重试。
+ * C103-2 上传取得合规附件ID → 落映射同步表(blade_hcs_attachment_sync,照金蝶附件同步表设计:
+ * biz_type+biz_id+attachment_key 唯一,转传前查命中即复用,仅落成功记录)。
+ * 任一附件转传失败 → 抛出异常由整单推送失败进补偿重试(失败原因落单据 hcs_sync_msg)。
*
- * TODO 待联调确认(§9-U8):v4 的 C103-1 入参未定义附件字段,合同附件向 HCS 的挂载方式待合规方确认,
- * 本组件先建设通用转传能力并将合规附件ID 缓存备用,确认后按其要求挂载。
+ * 合同链路挂载字段 fdEntityKey(v4 枚举):主文件 approved=true → eopCdraftSign(用印)、
+ * 其它附件 → eopCdraftOther、特批说明 → eopCdraftSpecial(C103-8 特批链路)。
*
* @author Chill
*/
@@ -80,48 +82,52 @@ public class HcsAttachmentSupport {
private final IHcsClient hcsClient;
private final HcsProperties hcsProperties;
- private final BladeRedis bladeRedis;
+ private final HcsAttachmentSyncMapper hcsAttachmentSyncMapper;
/**
- * 解析单据附件 JSON 并转传,返回合规附件ID 列表(保持行序)
+ * 解析单据附件 JSON 并转传,返回合规附件引用列表(保持行序)
*
+ * @param bizType 业务单据类型(HcsSyncConstant.BIZ_TYPE_*)
+ * @param bizId 业务单据id
* @param attachmentsJson 附件元数据 JSON 数组
* @param operatorLoginName 操作人登录名(C103-2 fdLoginName)
- * @return 合规附件ID 列表
+ * @return 合规附件引用列表(fdId + fdEntityKey)
*/
- public List transferAttachments(String attachmentsJson, String operatorLoginName) {
+ public List transferAttachments(String bizType, Long bizId, String attachmentsJson, String operatorLoginName) {
if (StringUtil.isBlank(attachmentsJson)) {
return List.of();
}
List