From a739211d6f7774516b166d898153206936d10b4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 22:22:36 +0800 Subject: [PATCH 001/124] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=A1=82?= =?UTF-8?q?=E7=89=A9=E5=90=88=E5=90=8C=E5=90=88=E8=A7=84=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=EF=BC=88HCS=EF=BC=89=E6=8E=A5=E5=85=A5P0=E9=AA=A8=E6=9E=B6?= =?UTF-8?q?=EF=BC=88blade-hcs-api=E6=A8=A1=E5=9D=97=EF=BC=9AFeign/?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E6=8B=A6=E6=88=AA=E5=99=A8/=E4=BB=A4?= =?UTF-8?q?=E7=89=8C=E6=9C=8D=E5=8A=A1/24=E6=8E=A5=E5=8F=A3DTO/=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E5=B7=A5=E5=85=B7=EF=BC=8C=E9=99=84Nacos=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=AE=B5=E4=B8=8E=E4=B8=9A=E5=8A=A1=E8=A1=A8=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E5=AD=97=E6=AE=B5=E7=BB=84SQL=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blade-third-party-api/blade-hcs-api/pom.xml | 38 ++ .../hcs/config/HcsFeignClientConfig.java | 75 ++++ .../springblade/hcs/config/HcsProperties.java | 255 +++++++++++++ .../ThirdPartyHcsAutoConfiguration.java | 41 +++ .../springblade/hcs/constant/HcsConstant.java | 79 ++++ .../hcs/dto/HcsAttachmentDownloadDTO.java | 50 +++ .../hcs/dto/HcsAttachmentRefDTO.java | 70 ++++ .../springblade/hcs/dto/HcsAttachmentVO.java | 50 +++ .../hcs/dto/HcsBpmOperationDTO.java | 54 +++ .../springblade/hcs/dto/HcsCategoryVO.java | 62 ++++ .../hcs/dto/HcsContractDetailQueryDTO.java | 56 +++ .../hcs/dto/HcsContractDraftDTO.java | 66 ++++ .../hcs/dto/HcsContractDraftVO.java | 50 +++ .../hcs/dto/HcsContractFieldJsonDTO.java | 57 +++ .../springblade/hcs/dto/HcsContractVO.java | 62 ++++ .../hcs/dto/HcsCreditCheckDTO.java | 55 +++ .../springblade/hcs/dto/HcsCreditCheckVO.java | 69 ++++ .../springblade/hcs/dto/HcsCurrencyVO.java | 78 ++++ .../hcs/dto/HcsExeplanStageDTO.java | 93 +++++ .../hcs/dto/HcsExeplanStageVO.java | 97 +++++ .../hcs/dto/HcsExeplanSyncDTO.java | 74 ++++ .../org/springblade/hcs/dto/HcsExeplanVO.java | 55 +++ .../springblade/hcs/dto/HcsFormSaveVO.java | 58 +++ .../java/org/springblade/hcs/dto/HcsIdVO.java | 50 +++ .../hcs/dto/HcsInvoiceRegAddDTO.java | 103 ++++++ .../hcs/dto/HcsInvoiceRegUpdateDTO.java | 53 +++ .../springblade/hcs/dto/HcsInvoiceRegVO.java | 127 +++++++ .../springblade/hcs/dto/HcsMechanismsDTO.java | 51 +++ .../springblade/hcs/dto/HcsPageQueryDTO.java | 75 ++++ .../org/springblade/hcs/dto/HcsPageVO.java | 62 ++++ .../hcs/dto/HcsPerfRecordFormDataDTO.java | 66 ++++ .../hcs/dto/HcsPerfRecordPropsDTO.java | 110 ++++++ .../hcs/dto/HcsPerfRecordSaveDTO.java | 61 ++++ .../springblade/hcs/dto/HcsProjectAddDTO.java | 66 ++++ .../hcs/dto/HcsProjectFormDataDTO.java | 54 +++ .../hcs/dto/HcsProjectPropsDTO.java | 149 ++++++++ .../hcs/dto/HcsProjectUpdateDTO.java | 50 +++ .../org/springblade/hcs/dto/HcsProjectVO.java | 60 ++++ .../hcs/dto/HcsReceiptBillFormDataDTO.java | 54 +++ .../hcs/dto/HcsReceiptBillPropsDTO.java | 105 ++++++ .../hcs/dto/HcsReceiptBillSaveDTO.java | 67 ++++ .../org/springblade/hcs/dto/HcsRefVO.java | 66 ++++ .../org/springblade/hcs/dto/HcsResult.java | 78 ++++ .../springblade/hcs/dto/HcsRiskQueryDTO.java | 50 +++ .../org/springblade/hcs/dto/HcsRiskVO.java | 62 ++++ .../springblade/hcs/dto/HcsSaveOptionDTO.java | 50 +++ .../org/springblade/hcs/dto/HcsSignerDTO.java | 64 ++++ .../hcs/dto/HcsSpecPayFormDataDTO.java | 58 +++ .../hcs/dto/HcsSpecPayPropsDTO.java | 148 ++++++++ .../hcs/dto/HcsSpecPaySaveDTO.java | 66 ++++ .../springblade/hcs/dto/HcsTemplateVO.java | 93 +++++ .../org/springblade/hcs/dto/HcsTokenVO.java | 63 ++++ .../org/springblade/hcs/dto/HcsUserRefVO.java | 66 ++++ .../springblade/hcs/dto/HcsXformFieldDTO.java | 64 ++++ .../hcs/exception/HcsException.java | 42 +++ .../org/springblade/hcs/feign/IHcsClient.java | 338 ++++++++++++++++++ .../hcs/interceptor/HcsAuthInterceptor.java | 99 +++++ .../hcs/token/HcsTokenService.java | 140 ++++++++ .../org/springblade/hcs/util/HcsPageUtil.java | 102 ++++++ blade-third-party-api/pom.xml | 1 + doc/nacos/third-party-api.yaml | 80 +++++ .../blade_hcs_sync_fields_20260927.sql | 191 ++++++++++ 62 files changed, 4928 insertions(+) create mode 100644 blade-third-party-api/blade-hcs-api/pom.xml create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/ThirdPartyHcsAutoConfiguration.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentDownloadDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentRefDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsBpmOperationDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCategoryVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailQueryDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCreditCheckDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCreditCheckVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCurrencyVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanSyncDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsFormSaveVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsIdVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegAddDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegUpdateDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsMechanismsDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPageQueryDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPageVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordFormDataDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordSaveDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectAddDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectFormDataDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectUpdateDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillFormDataDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillPropsDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillSaveDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRefVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsResult.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRiskQueryDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRiskVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSaveOptionDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPayFormDataDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPayPropsDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPaySaveDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTemplateVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsUserRefVO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/exception/HcsException.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/util/HcsPageUtil.java create mode 100644 doc/sql/transport/blade_hcs_sync_fields_20260927.sql diff --git a/blade-third-party-api/blade-hcs-api/pom.xml b/blade-third-party-api/blade-hcs-api/pom.xml new file mode 100644 index 00000000..f5885238 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + org.springblade + blade-third-party-api + ${revision} + + + blade-hcs-api + ${project.artifactId} + jar + BladeX 合同合规系统(HCS)API 契约模块 + + + + org.springblade + blade-starter-redis + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java new file mode 100644 index 00000000..bf241369 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java @@ -0,0 +1,75 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.config; + +import feign.Request; +import feign.RequestInterceptor; +import org.springblade.hcs.interceptor.HcsAuthInterceptor; +import org.springblade.hcs.token.HcsTokenService; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.context.annotation.Bean; + +import java.util.concurrent.TimeUnit; + +/** + * 合同合规系统(HCS)Feign 客户端配置 + *

+ * 仅通过 {@link org.springframework.cloud.openfeign.FeignClient#configuration} 引用,避免拦截器全局生效。 + * 按 D7 约定不配置 Retryer:写接口重试会造成 HCS 重复建单,重试职责归扫描任务(hcs_retry_count 补偿)。 + * + * @author Chill + */ +public class HcsFeignClientConfig { + + @Bean + public RequestInterceptor bladeFeignRequestInterceptor() { + // 空实现覆盖全局 BladeFeignRequestInterceptor,防止其覆盖 HCS 的认证凭据 + return template -> { + }; + } + + /** + * HCS 认证拦截器。以 ObjectProvider 惰性持有令牌服务, + * 避免 Feign 客户端构建(需拦截器)与令牌服务(依赖 Feign 客户端取令牌)之间的构造期循环依赖 + */ + @Bean + public RequestInterceptor hcsAuthInterceptor(HcsProperties properties, ObjectProvider tokenServiceProvider) { + return new HcsAuthInterceptor(properties, tokenServiceProvider); + } + + @Bean + public feign.Logger.Level feignLoggerLevel() { + return feign.Logger.Level.FULL; + } + + /** + * 超时:connect 10s / read 60s(照 BfiFeignClientConfig,D7) + */ + @Bean + public Request.Options options() { + return new Request.Options(10, TimeUnit.SECONDS, 60, TimeUnit.SECONDS, true); + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java new file mode 100644 index 00000000..a753f6b4 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -0,0 +1,255 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.config; + +import lombok.Data; +import org.springblade.hcs.constant.HcsConstant; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.HashMap; +import java.util.Map; + +/** + * 合同合规系统(HCS)配置类 + *

+ * Nacos 配置段见 third-party-api.yaml 的 thirdParty.hcs 节点: + * 注解前缀按 Spring Boot 规范使用横线小写形式 third-party.hcs(照 BfiProperties 惯例), + * YAML 中的驼峰键 thirdParty.hcs.* 经宽松绑定归一后等价生效。 + * + * @author Chill + */ +@Data +@ConfigurationProperties(prefix = "third-party.hcs") +public class HcsProperties { + /** + * 合同合规系统(HCS)接口基础地址,直连可配(网关/iPaaS 部署时改此处,代码不感知) + */ + private String baseUrl; + /** + * 认证方式:oauth2(默认,URL 追加 access_token)| basic(Authorization 请求头),切换不改代码 + */ + private String authType = HcsConstant.AUTH_TYPE_OAUTH2; + /** + * OAuth2 应用 appKey + */ + private String appKey; + /** + * OAuth2 应用 appSecret + */ + private String appSecret; + /** + * Basic 认证用户名 + */ + private String basicUsername; + /** + * Basic 认证密码 + */ + private String basicPassword; + /** + * 来源系统标识(fd_sources,D14 约定值 TMS) + */ + private String srcSystem = "TMS"; + /** + * 推送任务配置(扫描首推/补偿) + */ + private Push push = new Push(); + /** + * 项目立项(C102)配置 + */ + private Project project = new Project(); + /** + * 合同(C103)配置 + */ + private Contract contract = new Contract(); + /** + * 履约规则(C103-9)配置 + */ + private ExeStage exeStage = new ExeStage(); + /** + * 客商风险校验(C101-1)配置 + */ + private Risk risk = new Risk(); + /** + * 额度校验(C106-1)配置 + */ + private Credit credit = new Credit(); + /** + * 结算付款特批(C106-3/4)配置 + */ + private SpecPay specPay = new SpecPay(); + /** + * 开票登记(C111)配置 + */ + private Invoice invoice = new Invoice(); + /** + * 收票单(C109)配置 + */ + private ReceiptBill receiptBill = new ReceiptBill(); + /** + * 附件转传(C103-2)配置 + */ + private Attachment attachment = new Attachment(); + + @Data + public static class Push { + /** + * 推送任务总开关(默认关,灰度打开) + */ + private boolean syncEnabled = false; + /** + * 扫描调度 cron,默认每 5 分钟 + */ + private String cron = "0 */5 * * * ?"; + /** + * 每类单据单轮扫描批量 + */ + private int batchSize = 50; + /** + * 推送失败自动重试上限,超限仅人工重推 + */ + private int maxRetry = 5; + } + + @Data + public static class Project { + /** + * 立项 bpmOperation.templateCode(环境相关值,§9-U9,待合规方提供) + */ + private String templateCode = ""; + } + + @Data + public static class Contract { + /** + * TMS 合同类别 -> HCS 模板ID(fdTemplateId,§9-U7 待合规方提供模板清单) + */ + private Map templateMapping = new HashMap<>(); + /** + * TMS 结算方式 -> 付款|收款(fdSettlementType,§9-U3 字典映射待联调) + */ + private Map settlementTypeMapping = new HashMap<>(); + /** + * TMS 币种码 -> HCS 币种名称(照金蝶 RMB->CNY 映射惯例) + */ + private Map currencyNameMapping = new HashMap<>(Map.of("RMB", "人民币")); + /** + * 合同 fdSepcailContract 固定 false(D15,配置项预留) + */ + private boolean specialContractEnabled = false; + /** + * 合同推送前是否强制客商风险校验 + */ + private boolean requireRiskCheck = true; + } + + @Data + public static class ExeStage { + /** + * 履约规则金额类型默认值(fdFundType) + */ + private String fundType = "byAmount"; + } + + @Data + public static class Risk { + /** + * 合同推送前风险校验开关 + */ + private boolean checkOnContract = true; + /** + * 付款提交前风险校验开关 + */ + private boolean checkOnPayment = true; + /** + * 黑名单是否阻断(合同置 failed / 付款提交拦截) + */ + private boolean blockBlacklist = true; + } + + @Data + public static class Credit { + /** + * 付款提交校验是否要求合同已推送合规(hcs_fd_id 存在) + */ + private boolean requireContractSynced = true; + } + + @Data + public static class SpecPay { + /** + * 特批单据状态(fd_doc_status,示例 10,§9-U3 待联调) + */ + private String docStatus = "10"; + /** + * 付款用途字典值(fd_payment_purpose,§9-U3 待联调后配置) + */ + private String paymentPurpose = ""; + /** + * 付款性质字典值(fd_payment_nature,§9-U3 待联调后配置) + */ + private String paymentNature = ""; + /** + * 付款类型字典值(fd_payment_type,§9-U3 待联调后配置) + */ + private String paymentType = ""; + } + + @Data + public static class Invoice { + /** + * TMS 发票类型 -> HCS 发票类型字典值(§9-U3 待联调后配置) + */ + private Map invoiceTypeMapping = new HashMap<>(); + /** + * TMS 币种码 -> HCS 币种 fdId(经 C103-12 币种表缓存取值,§9-U3 待联调后配置) + */ + private Map currencyIdMapping = new HashMap<>(); + /** + * 开票登记款项性质默认值(fdFundNature) + */ + private String fundNatureDefault = "progress"; + } + + @Data + public static class ReceiptBill { + /** + * TMS 发票类型 -> HCS 收票发票类型字典值(§9-U3 待联调后配置) + */ + private Map invoiceTypeMapping = new HashMap<>(); + } + + @Data + public static class Attachment { + /** + * 附件转传总开关 + */ + private boolean transferEnabled = true; + /** + * TMS 文件服务下载基址(拉取附件流用) + */ + private String fileDownloadBase = ""; + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/ThirdPartyHcsAutoConfiguration.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/ThirdPartyHcsAutoConfiguration.java new file mode 100644 index 00000000..1331c36a --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/ThirdPartyHcsAutoConfiguration.java @@ -0,0 +1,41 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 第三方API 合同合规系统(HCS)配置类 + * + * @author Chill + */ +@ComponentScan("org.springblade.hcs") +@EnableConfigurationProperties(HcsProperties.class) +@Configuration +public class ThirdPartyHcsAutoConfiguration { +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java new file mode 100644 index 00000000..a8fd786c --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java @@ -0,0 +1,79 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.constant; + +/** + * 合同合规系统(HCS)常量类 + * + * @author Chill + */ +public class HcsConstant { + + /** + * 接口调用成功 messageKey(统一出参 code,业务成败以 success 字段为准) + */ + public static final String SUCCESS_CODE = "return.optSuccess"; + + /** + * 认证方式:OAuth2(默认,URL 追加 access_token) + */ + public static final String AUTH_TYPE_OAUTH2 = "oauth2"; + + /** + * 认证方式:Basic(Authorization 请求头) + */ + public static final String AUTH_TYPE_BASIC = "basic"; + + /** + * 网关认证请求头名称 + */ + public static final String HEADER_AUTHORIZATION = "Authorization"; + + /** + * Basic 认证请求头前缀 + */ + public static final String HEADER_BASIC_PREFIX = "Basic "; + + /** + * OAuth2 access_token 追加到业务请求 URL 的参数名 + */ + public static final String QUERY_ACCESS_TOKEN = "access_token"; + + /** + * HCS access_token 缓存 key(照 BFI 令牌缓存命名惯例) + */ + public static final String HCS_TOKEN_CACHE_KEY = "blade:third:hcs:token"; + + /** + * token 提前失效缓冲时长(毫秒),防止刚好过期(照 BFI 120s 缓冲) + */ + public static final long TOKEN_EXPIRE_BUFFER_MILLIS = 120_000L; + + /** + * getToken 接口默认路径片段,拦截器据此跳过令牌追加(避免给取令牌请求再带 access_token) + */ + public static final String GET_TOKEN_PATH = "/authapi/getToken"; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentDownloadDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentDownloadDTO.java new file mode 100644 index 00000000..95c56a68 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentDownloadDTO.java @@ -0,0 +1,50 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-5 附件下载入参(对账/排查备用) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsAttachmentDownloadDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 附件ID + */ + private String fdId; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentRefDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentRefDTO.java new file mode 100644 index 00000000..65a5d05e --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentRefDTO.java @@ -0,0 +1,70 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)附件引用项(附件先经 C103-2 上传取得 fdId,再经 mechanisms.attachment[] 引用) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsAttachmentRefDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 附件ID(附件上传接口返回) + */ + private String fdId; + /** + * 附件名称(不含扩展名) + */ + private String fdFileName; + /** + * 附件扩展名 + */ + private String fdFileExtName; + /** + * 附件完整文件名 + */ + private String fullName; + /** + * 附件绑定的表单字段 key:特批 fd_spc_approval_attach、履约记录 fd_plan_att、收票单 fd_attach + */ + private String fdEntityKey; + /** + * 绑定类型:仅发起类接口传 ADD,更新类接口不传 + */ + private String fdBindType; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentVO.java new file mode 100644 index 00000000..6b8db430 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsAttachmentVO.java @@ -0,0 +1,50 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-2 附件上传出参 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsAttachmentVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 附件ID(调用方必须持久化/缓存映射,供各业务接口引用) + */ + private String fdId; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsBpmOperationDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsBpmOperationDTO.java new file mode 100644 index 00000000..50512898 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsBpmOperationDTO.java @@ -0,0 +1,54 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C102-1 项目立项新建 流程操作入参 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsBpmOperationDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 操作类型:固定 drafter_submit(以起草人身份直接提交流程) + */ + private String operationType; + /** + * 立项表单模板编码(环境相关值,配置 thirdParty.hcs.project.template-code,§9-U9) + */ + private String templateCode; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCategoryVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCategoryVO.java new file mode 100644 index 00000000..a477400e --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCategoryVO.java @@ -0,0 +1,62 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-7 合同分类列表出参行(fdParent 可组装分类树) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsCategoryVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分类ID + */ + private String fdId; + /** + * 分类名称(查询条件 fdName.$contains) + */ + private String fdName; + /** + * 上级分类 + */ + private HcsRefVO fdParent; + /** + * 状态:enable / disable + */ + private String fdStatus; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailQueryDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailQueryDTO.java new file mode 100644 index 00000000..6075cf10 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailQueryDTO.java @@ -0,0 +1,56 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-4 合同详情入参(fdId 与 fdNumber 二选一) + *

+ * TODO 待联调确认:出参 data 结构 v4 未定义,对账功能联调后以实际返回为准(设计文档 §5.9)。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsContractDetailQueryDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 合同ID + */ + private String fdId; + /** + * 合同编号 + */ + private String fdNumber; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java new file mode 100644 index 00000000..8f0f98a6 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java @@ -0,0 +1,66 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-1 合同发起入参(C103-11 合同更新入参结构相同,复用本 DTO) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsContractDraftDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 合同模板ID(C103-6 模板列表获取,配置 template-mapping,§9-U7) + */ + private String fdTemplateId; + /** + * 外部系统标识(fd_sources,约定值 TMS,配置 thirdParty.hcs.src-system) + */ + private String fdOuterSystem; + /** + * 操作人登录名 + */ + private String fdLoginName; + /** + * 保存类型:submit(提交) + */ + private String saveType; + /** + * 合同字段(模板字段 + 签署方) + */ + private HcsContractFieldJsonDTO fdFieldJson; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftVO.java new file mode 100644 index 00000000..60d815e9 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftVO.java @@ -0,0 +1,50 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-1 合同发起出参(fdContractId 必须持久化,用于合同更新、履约规则同步、额度校验等) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsContractDraftVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 合同ID(回填 TMS blade_contract_manage.hcs_fd_id) + */ + private String fdContractId; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java new file mode 100644 index 00000000..702bcbea --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java @@ -0,0 +1,57 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 合同合规系统(HCS)C103-1 合同发起 fdFieldJson 节点(C103-1 新建 / C103-11 更新共用) + *

+ * §9-U8 待联调确认:v4 未定义合同附件传递字段,附件挂载方式待合规方确认后补充。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsContractFieldJsonDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 模板字段值列表 + */ + private List xformFields; + /** + * 签署方(相对方)列表 + */ + private List signer; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractVO.java new file mode 100644 index 00000000..f3285515 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractVO.java @@ -0,0 +1,62 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-3 合同信息列表出参行(判重与对账回查,按 columns 返回) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsContractVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 合同ID + */ + private String fdId; + /** + * 合同标题(判重条件 fdNumber 关联核对) + */ + private String fdSubject; + /** + * 合同编号(判重条件,§9-U4 查询能力联调确认) + */ + private String fdNumber; + /** + * 合同分类层级ID + */ + private String fdCateHierarchyId; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCreditCheckDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCreditCheckDTO.java new file mode 100644 index 00000000..c014ed49 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCreditCheckDTO.java @@ -0,0 +1,55 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 合同合规系统(HCS)C106-1 项目/合同额度校验入参 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsCreditCheckDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 合同ID(必填,HCS 合同ID blade_contract_manage.hcs_fd_id) + */ + private String fdContractId; + /** + * 申请金额(必填,元) + */ + private BigDecimal fdApplyAmount; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCreditCheckVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCreditCheckVO.java new file mode 100644 index 00000000..51f2e437 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCreditCheckVO.java @@ -0,0 +1,69 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 合同合规系统(HCS)C106-1 项目/合同额度校验出参 + *

+ * 注意:超额时外层 success 仍为 true,必须以 fdIsCredit 为准;超额不拦截提交,转入特批链路(D15/R2-Q2)。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsCreditCheckVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 额度是否通过:true 通过 / false 超额(必看字段) + */ + private Boolean fdIsCredit; + /** + * 合同ID + */ + private String fdContractId; + /** + * 合同金额 + */ + private BigDecimal fdContractAmount; + /** + * 已付金额 + */ + private BigDecimal fdPayedAmount; + /** + * 超额原因说明(回填 hcs_credit_msg) + */ + private String fdMessage; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCurrencyVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCurrencyVO.java new file mode 100644 index 00000000..09d2a3fe --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCurrencyVO.java @@ -0,0 +1,78 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-12 合同币种列表出参行(开票登记 fdCurrencyId、履约计划币种取自本接口) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsCurrencyVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 币种ID(currency-id-mapping 目标值) + */ + private String fdId; + /** + * 币种中文名(查询条件 fdCName.$contains) + */ + private String fdCName; + /** + * 币种简称 + */ + private String fdSName; + /** + * 币种英文名(如 CNY) + */ + private String fdEName; + /** + * 币种编码 + */ + private String fdNumber; + /** + * 币种符号 + */ + private String fdSymbol; + /** + * 状态:enable / disable + */ + private String fdStatus; + /** + * 是否本位币 + */ + private Boolean fdIsStandardCurrency; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageDTO.java new file mode 100644 index 00000000..1f6246c3 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageDTO.java @@ -0,0 +1,93 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 合同合规系统(HCS)C103-9(新) 履约规则同步 行级操作项(数据源 blade_contract_exe_stage,ADR-0002) + *

+ * 新增行可不带 fdId;更新/删除行必须带 fdId(合规阶段ID,回填自首次同步返回)。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsExeplanStageDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 阶段项ID(行级 update/delete 必传,取 blade_contract_exe_stage.hcs_stage_fd_id) + */ + private String fdId; + /** + * 行级操作:add / update / delete + */ + private String fdEopExeplanOperateType; + /** + * 履约类型:payment=付款 / collection=收款 + */ + private String fdPerformType; + /** + * 款项性质:prepayment=预付款 / progress=进度款 / acceptance=验收款 / retention=质保金 + */ + private String fdFundNature; + /** + * 开票规则(如 payFirst) + */ + private String fdInvoiceRule; + /** + * 账期 + */ + private Integer fdInvoiceCycle; + /** + * 计划金额(元) + */ + private BigDecimal fdFundAmount; + /** + * 资金日期(毫秒时间戳) + */ + private Long fdFundDate; + /** + * 金额类型(默认 byAmount 按金额,配置 thirdParty.hcs.exe-stage.fund-type) + */ + private String fdFundType; + /** + * 是否完成 + */ + private Boolean fdIsFinish; + /** + * 扩展内容 JSON 字符串(固定 "{}") + */ + private String fdExtendContent; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageVO.java new file mode 100644 index 00000000..325b6081 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageVO.java @@ -0,0 +1,97 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 合同合规系统(HCS)C103-9(新) 履约规则同步出参-变更阶段行 + *

+ * 合规返回的阶段 fdId 必须持久化(回填 blade_contract_exe_stage.hcs_stage_fd_id),后续行更新/删除全靠它。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsExeplanStageVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 阶段项ID(必须持久化) + */ + private String fdId; + /** + * 阶段唯一标识 + */ + private String fdUniqueId; + /** + * 计划金额 + */ + private BigDecimal fdPlanFundAmount; + /** + * 实际金额 + */ + private BigDecimal fdActualFundAmount; + /** + * 履约类型:payment / collection + */ + private String fdPerformType; + /** + * 款项性质 + */ + private String fdFundNature; + /** + * 开票规则 + */ + private String fdInvoiceRule; + /** + * 账期 + */ + private Integer fdInvoiceCycle; + /** + * 计划金额 + */ + private BigDecimal fdFundAmount; + /** + * 资金日期(毫秒时间戳) + */ + private Long fdFundDate; + /** + * 金额类型 + */ + private String fdFundType; + /** + * 扩展内容 JSON 字符串 + */ + private String fdExtendContent; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanSyncDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanSyncDTO.java new file mode 100644 index 00000000..d8946967 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanSyncDTO.java @@ -0,0 +1,74 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 合同合规系统(HCS)C103-9(新) 合同履约规则同步入参(支持整批增删改) + *

+ * fdContractId 传 HCS 合同ID(blade_contract_manage.hcs_fd_id,非 TMS 主键); + * fdExeplanId 已同步过则传(首次同步返回后持久化到 blade_contract_manage.hcs_exeplan_id)。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsExeplanSyncDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 合同ID(HCS 合同ID) + */ + private String fdContractId; + /** + * 外部系统标识(fd_sources,约定值 TMS) + */ + private String fdOuterSystem; + /** + * 操作人登录名 + */ + private String fdLoginName; + /** + * 计划整体操作类型(如 add,随场景) + */ + private String fdEopExeplanOperateType; + /** + * 履约计划ID(已同步过则传) + */ + private String fdExeplanId; + /** + * 行级操作列表 + */ + private List fdStages; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanVO.java new file mode 100644 index 00000000..973ff964 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanVO.java @@ -0,0 +1,55 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 合同合规系统(HCS)C103-9(新) 履约规则同步出参(fdExeplanId 与变更阶段 fdId 均须持久化) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsExeplanVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 履约计划ID(回填 blade_contract_manage.hcs_exeplan_id) + */ + private String fdExeplanId; + /** + * 本次变更的阶段列表(按行回填 hcs_stage_fd_id) + */ + private List fdChangeStages; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsFormSaveVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsFormSaveVO.java new file mode 100644 index 00000000..ae17ae93 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsFormSaveVO.java @@ -0,0 +1,58 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)流程单据新建返回结果(C102-1 项目立项、C106-3 特批发起、C108-1 履约记录新建、C109-1 收票单新建出参) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsFormSaveVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 单据主键ID(调用方必须持久化,供后续更新使用) + */ + private String fdId; + /** + * 表单模板ID + */ + private String fdXFormId; + /** + * 单据查看页面路径 + */ + private String docViewUrl; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsIdVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsIdVO.java new file mode 100644 index 00000000..1f51c6aa --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsIdVO.java @@ -0,0 +1,50 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)单据ID返回结果(新建类接口出参 data 仅含 fdId 的场景:C103-2/C111-2/C111-3 等) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsIdVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 单据ID(调用方必须持久化,供后续更新/删除/关联使用) + */ + private String fdId; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegAddDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegAddDTO.java new file mode 100644 index 00000000..e1d90bf1 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegAddDTO.java @@ -0,0 +1,103 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 合同合规系统(HCS)C111-2 新增开票登记入参 + *

+ * 校验:fdContractNumber(须在合规本地存在)与 fdCurrencyId 必填; + * 附件通过 fdAttIds(C103-2 附件上传返回的ID数组)引用。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsInvoiceRegAddDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 单据编号(开票申请单号,同租户唯一,判重候选键) + */ + private String fdNumber; + /** + * 登记日期(毫秒时间戳) + */ + private Long fdRegisterDate; + /** + * 合同编号(必填,经应收结算链路回溯,§9-U10) + */ + private String fdContractNumber; + /** + * 发票类型(字典映射 invoice-type-mapping,§9-U3) + */ + private String fdInvoiceType; + /** + * 结算币种ID(必填,currency-id-mapping,§9-U3) + */ + private String fdCurrencyId; + /** + * 开票方(销方 issuerName) + */ + private String fdInvoiceParty; + /** + * 款项性质(默认 progress,配置 invoice.fund-nature-default) + */ + private String fdFundNature; + /** + * 开票金额(含税) + */ + private BigDecimal fdInvoiceAmount; + /** + * 备注 + */ + private String fdRemark; + /** + * 状态:0=已开票,1=已作废(新增固定 0) + */ + private Integer fdStatus; + /** + * 第三方创建人编码(申请人工号) + */ + private String fdThirdCreatorCode; + /** + * 第三方创建部门编码(申请部门编码) + */ + private String fdThirdCreatorDeptCode; + /** + * 附件ID列表(C103-2 附件上传返回) + */ + private List fdAttIds; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegUpdateDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegUpdateDTO.java new file mode 100644 index 00000000..44465dfb --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegUpdateDTO.java @@ -0,0 +1,53 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 合同合规系统(HCS)C111-3 更新开票登记入参(金蝶开票完成后回填票据日期/状态) + *

+ * fdId 必填(C111-2 新增返回,持久化于 hcs_fd_id),其余可选;作废传 fdStatus=1。 + * + * @author Chill + */ +@Data +@EqualsAndHashCode(callSuper = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsInvoiceRegUpdateDTO extends HcsInvoiceRegAddDTO { + @Serial + private static final long serialVersionUID = 1L; + /** + * 开票登记ID(必填,C111-2 新增返回,持久化于 hcs_fd_id) + */ + private String fdId; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegVO.java new file mode 100644 index 00000000..202e8fc9 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegVO.java @@ -0,0 +1,127 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 合同合规系统(HCS)C111-1 查询开票登记列表出参行(判重条件 fdNumber,§9-U4 查询能力联调确认) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsInvoiceRegVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 主键ID + */ + private String fdId; + /** + * 单据编号(TMS 开票申请单号) + */ + private String fdNumber; + /** + * 登记日期(毫秒时间戳) + */ + private Long fdRegisterDate; + /** + * 票据日期(毫秒时间戳,金蝶开票完成后回填) + */ + private Long fdBillDate; + /** + * 合同 + */ + private HcsRefVO fdContract; + /** + * 合同编号 + */ + private String fdContractNumber; + /** + * 发票类型 + */ + private String fdInvoiceType; + /** + * 结算币种(币种ID) + */ + private String fdCurrencyId; + /** + * 开票方 + */ + private String fdInvoiceParty; + /** + * 款项性质(prepayment/progress/acceptance/retention) + */ + private String fdFundNature; + /** + * 开票金额(含税) + */ + private BigDecimal fdInvoiceAmount; + /** + * 备注 + */ + private String fdRemark; + /** + * 状态:0=已开票,1=已作废 + */ + private Integer fdStatus; + /** + * 数据来源(如 erp) + */ + private String fdDataSource; + /** + * 创建人 + */ + private HcsRefVO fdCreator; + /** + * 创建人部门 + */ + private HcsRefVO fdCreatorDept; + /** + * 创建时间(毫秒时间戳) + */ + private Long fdCreateTime; + /** + * 第三方创建人编码 + */ + private String fdThirdCreatorCode; + /** + * 第三方创建部门编码 + */ + private String fdThirdCreatorDeptCode; + /** + * 发起主体(合同关联的发起主体名称) + */ + private String fdInitiator; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsMechanismsDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsMechanismsDTO.java new file mode 100644 index 00000000..b2c1fc8c --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsMechanismsDTO.java @@ -0,0 +1,51 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 合同合规系统(HCS)附件挂载容器(C106 特批 / C108 履约记录 / C109 收票单的 mechanisms 节点) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsMechanismsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 附件列表(fdId 来自 C103-2 附件上传接口) + */ + private List attachment; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPageQueryDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPageQueryDTO.java new file mode 100644 index 00000000..15a2a201 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPageQueryDTO.java @@ -0,0 +1,75 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * 合同合规系统(HCS)通用分页查询入参(§1.5 分页与查询约定,各查询接口通用) + *

+ * 注意:C102-3 项目立项查询的 columns/sorts 用下划线字段名(fd_id/fd_num/fd_pro_name/fd_create_time), + * 其余查询接口出入参均为驼峰;出参 content 均为驼峰字段。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsPageQueryDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 查询返回的字段列表(视接口必填) + */ + private List columns; + /** + * 查询条件,空对象表示无条件;支持操作符,如 {"fdName": {"$contains": "xx"}}(包含匹配) + */ + private Map conditions; + /** + * 分页偏移量(必填,从 0 开始) + */ + private Integer offset; + /** + * 每页条数(必填) + */ + private Integer pageSize; + /** + * 排序条件,如 {"fdCreateTime": "desc"} + */ + private Map sorts; + /** + * 当前操作人(C102-3 项目立项查询需携带,其余查询接口按需) + */ + private HcsUserRefVO curUser; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPageVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPageVO.java new file mode 100644 index 00000000..14b4cbbb --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPageVO.java @@ -0,0 +1,62 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 合同合规系统(HCS)分页查询返回结果(位于统一出参 data 内) + * + * @param 数据行类型 + * @author Chill + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsPageVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 数据列表 + */ + private List content; + /** + * 分页偏移量(从 0 开始) + */ + private Integer offset; + /** + * 每页条数 + */ + private Integer pageSize; + /** + * 总条数 + */ + private Integer totalSize; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordFormDataDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordFormDataDTO.java new file mode 100644 index 00000000..16f41bbe --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordFormDataDTO.java @@ -0,0 +1,66 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C108-1/C108-2 履约记录 formData 节点 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsPerfRecordFormDataDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 履约记录ID(C108-2 更新必填,取 C108-1 新建返回的 data.fdId) + */ + private String fdId; + /** + * 履约记录业务字段 + */ + private HcsPerfRecordPropsDTO dynamicProps; + /** + * 单据主题 + */ + private String fdDocSubject; + /** + * 单据状态(示例 10) + */ + private String fdDocStatus; + /** + * 表单模板ID(环境值,§9-U9) + */ + private String fdXformId; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java new file mode 100644 index 00000000..799bb389 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java @@ -0,0 +1,110 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C108-1/C108-2 履约记录 dynamicProps 业务字段(字段名按接口文档下划线原样传值) + *

+ * 注意:fd_paln_type 为接口文档原文拼写(plan 的笔误,必须沿用原拼写,否则字段无法识别); + * 金额字段为字符串传值。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsPerfRecordPropsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 申请金额(字符串传值) + */ + @JsonProperty("fd_apply_amount") + private String fdApplyAmount; + /** + * 实际金额(字符串传值,实际付款推进时更新) + */ + @JsonProperty("fd_fact_amount") + private String fdFactAmount; + /** + * 申请编号 + */ + @JsonProperty("fd_apply_no") + private String fdApplyNo; + /** + * 计划日期(毫秒时间戳) + */ + @JsonProperty("fd_plan_date") + private Long fdPlanDate; + /** + * 计划类型(原文拼写 fd_paln_type,paymentType) + */ + @JsonProperty("fd_paln_type") + private String fdPalnType; + /** + * 性质(款项性质,取关联履约规则行/结算性质) + */ + @JsonProperty("fd_property") + private String fdProperty; + /** + * 版本ID + */ + @JsonProperty("fd_version") + private String fdVersion; + /** + * 表单模板ID(环境值 fd_xform_id,§9-U9) + */ + @JsonProperty("fd_xform_id") + private String fdXformId; + /** + * 来源履约计划项ID(关联履约阶段 hcs_stage_fd_id,无关联则不传) + */ + @JsonProperty("fd_id") + private String fdId; + /** + * 合同ID(HCS 合同ID) + */ + @JsonProperty("fd_contract_id") + private String fdContractId; + /** + * 附件不可下载 + */ + @JsonProperty("fd_att_no_download") + private Boolean fdAttNoDownload; + /** + * 草稿不可编辑打印 + */ + @JsonProperty("fd_draft_no_edit_prints") + private Boolean fdDraftNoEditPrints; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordSaveDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordSaveDTO.java new file mode 100644 index 00000000..362d8539 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordSaveDTO.java @@ -0,0 +1,61 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C108-1 履约记录新建入参(C108-2 更新入参结构相同,复用本 DTO) + *

+ * 更新时 formData.fdId 必填(新增返回的ID,持久化于 hcs_perf_fd_id),另可传 dynamicProps.fd_contract_id 指定合同; + * 更新响应无 data,以 success 判断结果。附件经 mechanisms.attachment[] 绑定,fdEntityKey=fd_plan_att。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsPerfRecordSaveDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 当前操作人 {fdLoginName}(必填) + */ + private HcsUserRefVO curUser; + /** + * 履约记录表单数据 + */ + private HcsPerfRecordFormDataDTO formData; + /** + * 附件挂载 + */ + private HcsMechanismsDTO mechanisms; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectAddDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectAddDTO.java new file mode 100644 index 00000000..090c421c --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectAddDTO.java @@ -0,0 +1,66 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C102-1 项目立项新建入参 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsProjectAddDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 流程操作(operationType=drafter_submit、templateCode 环境值) + */ + private HcsBpmOperationDTO bpmOperation; + /** + * 是否校验权限(接口调用传 false) + */ + private Boolean checkAuth; + /** + * 当前操作人 {fdLoginName} + */ + private HcsUserRefVO curUser; + /** + * 项目表单数据 + */ + private HcsProjectFormDataDTO formData; + /** + * 保存选项(saveDraft=false 直接提交) + */ + private HcsSaveOptionDTO saveOption; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectFormDataDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectFormDataDTO.java new file mode 100644 index 00000000..b635d2f8 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectFormDataDTO.java @@ -0,0 +1,54 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)项目立项 formData 节点(C102-1 新建 / C102-2 更新共用;更新时 fdId 必填) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsProjectFormDataDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 项目立项单ID(C102-1 新建返回,C102-2 更新必填) + */ + private String fdId; + /** + * 项目业务字段 + */ + private HcsProjectPropsDTO dynamicProps; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java new file mode 100644 index 00000000..e63ed1b4 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java @@ -0,0 +1,149 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 合同合规系统(HCS)项目立项 dynamicProps 业务字段(C102-1 新建 / C102-2 更新共用,字段名按接口文档下划线原样传值) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsProjectPropsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 项目名称 + */ + @JsonProperty("fd_pro_name") + private String fdProName; + /** + * 项目简称 + */ + @JsonProperty("fd_pro_simple_name") + private String fdProSimpleName; + /** + * 创建单位 {fdId, fdName}(HCS 组织 fdId 与 TMS 不同源,先传名称,§9-U2) + */ + @JsonProperty("fd_creator_unit") + private HcsRefVO fdCreatorUnit; + /** + * 项目负责人 {fdLoginName} + */ + @JsonProperty("fd_head") + private HcsUserRefVO fdHead; + /** + * 结算类型(字典值,映射配置待联调,§9-U3) + */ + @JsonProperty("fd_settlement_type") + private String fdSettlementType; + /** + * 计划保证金(TMS 万元 × 10000 转元,变更映射语义联调确认) + */ + @JsonProperty("fd_pro_plan_deposit") + private BigDecimal fdProPlanDeposit; + /** + * 是否自营项目(一期默认 "1",联调确认) + */ + @JsonProperty("fd_is_self_pro") + private String fdIsSelfPro; + /** + * 项目收入目标(一期不传,联调确认) + */ + @JsonProperty("fd_pro_income_goal") + private BigDecimal fdProIncomeGoal; + /** + * 承接部门 {fdId, fdName}(先传名称,§9-U2) + */ + @JsonProperty("fd_taker_dept") + private HcsRefVO fdTakerDept; + /** + * 承接人 {fdLoginName} + */ + @JsonProperty("fd_taker") + private HcsUserRefVO fdTaker; + /** + * 付款额度(TMS 万元 × 10000 转元) + */ + @JsonProperty("fd_pay_limit") + private BigDecimal fdPayLimit; + /** + * 开票额度(TMS 万元 × 10000 转元) + */ + @JsonProperty("fd_out_invoice_limit") + private BigDecimal fdOutInvoiceLimit; + /** + * 项目建设内容 + */ + @JsonProperty("fd_pro_content") + private String fdProContent; + /** + * 是否可用(固定 true) + */ + @JsonProperty("fd_is_available") + private Boolean fdIsAvailable; + /** + * 项目编号(必填,判重候选键) + */ + @JsonProperty("fd_num") + private String fdNum; + /** + * 可用单位列表 [{fdId, fdName}](同创建单位先传名称) + */ + @JsonProperty("fd_avail_units") + private List fdAvailUnits; + /** + * 金蝶同步状态(固定 "1") + */ + @JsonProperty("fd_kingdee_sync_status") + private String fdKingdeeSyncStatus; + /** + * 来源标识(fd_sources,约定值 TMS,配置 thirdParty.hcs.src-system,D14) + */ + @JsonProperty("fd_sources") + private String fdSources; + /** + * 来源系统主键 ID(存 TMS 业务单据主键,D14) + */ + @JsonProperty("fd_kingdee_id") + private String fdKingdeeId; + /** + * 创建人 {fdLoginName} + */ + @JsonProperty("fd_creator") + private HcsUserRefVO fdCreator; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectUpdateDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectUpdateDTO.java new file mode 100644 index 00000000..f830a2e6 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectUpdateDTO.java @@ -0,0 +1,50 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 合同合规系统(HCS)C102-2 项目立项更新入参 + *

+ * 入参结构与新建一致(去掉 bpmOperation/saveOption),formData.fdId 必填(新建返回的项目ID); + * 响应无 data,以 success 判断结果。 + * + * @author Chill + */ +@Data +@EqualsAndHashCode(callSuper = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsProjectUpdateDTO extends HcsProjectAddDTO { + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectVO.java new file mode 100644 index 00000000..edfc4f41 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectVO.java @@ -0,0 +1,60 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C102-3 项目立项查询出参行 + *

+ * 注意:本接口入参 columns/sorts 用下划线字段名(fd_id/fd_num/fd_pro_name),出参 content 为驼峰。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsProjectVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 项目立项单ID + */ + private String fdId; + /** + * 项目编号(判重条件 fd_num) + */ + private String fdNum; + /** + * 项目名称 + */ + private String fdProName; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillFormDataDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillFormDataDTO.java new file mode 100644 index 00000000..50fea9bd --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillFormDataDTO.java @@ -0,0 +1,54 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C109-1/C109-2 收票单 formData 节点(更新时文档状态无需传递) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsReceiptBillFormDataDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 收票单业务字段 + */ + private HcsReceiptBillPropsDTO dynamicProps; + /** + * 单据主题(更新接口不传) + */ + private String fdDocSubject; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillPropsDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillPropsDTO.java new file mode 100644 index 00000000..2f5c6256 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillPropsDTO.java @@ -0,0 +1,105 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 合同合规系统(HCS)C109-1/C109-2 收票单 dynamicProps 业务字段(字段名按接口文档下划线原样传值) + *

+ * §9-U11 待联调确认:fd_ap_bill_src_subject 关联结算付款单的编号体系(应付单号键)。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsReceiptBillPropsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 发票号码 + */ + @JsonProperty("fd_invoice_code") + private String fdInvoiceCode; + /** + * 开票/收票日期(YYYY-MM-DD 字符串,非毫秒时间戳) + */ + @JsonProperty("fd_bill_date") + private String fdBillDate; + /** + * 开票方(销方,供应商名称或编号) + */ + @JsonProperty("fd_invoicer") + private String fdInvoicer; + /** + * 收票方(购方,收票单位名称或编号) + */ + @JsonProperty("fd_buyer") + private String fdBuyer; + /** + * 价税合计金额 + */ + @JsonProperty("fd_invoice_amt_tax_incl") + private BigDecimal fdInvoiceAmtTaxIncl; + /** + * 税率(小数,如 0.13,TMS 13 ÷ 100) + */ + @JsonProperty("fd_tax_rate") + private BigDecimal fdTaxRate; + /** + * 发票类型(字典值,配置 receipt-bill.invoice-type-mapping,§9-U3) + */ + @JsonProperty("fd_invoice_type") + private String fdInvoiceType; + /** + * 合同主题(或合同编号/ID,应付结算链路回溯或人工补录,D13) + */ + @JsonProperty("fd_contract_subject") + private String fdContractSubject; + /** + * 合同编号(应付结算链路回溯或人工补录,D13) + */ + @JsonProperty("fd_contract_no") + private String fdContractNo; + /** + * 关联结算付款单主题(或编号/ID,收票认领应付单号,§9-U11) + */ + @JsonProperty("fd_ap_bill_src_subject") + private String fdApBillSrcSubject; + /** + * 备注 + */ + @JsonProperty("fd_remark") + private String fdRemark; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillSaveDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillSaveDTO.java new file mode 100644 index 00000000..830b7edf --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsReceiptBillSaveDTO.java @@ -0,0 +1,67 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C109-1 收票单新建入参(C109-2 更新入参结构相同,复用本 DTO) + *

+ * fdId 为收票单主键:新建不传;更新必填(新建返回 data.data.fdId,持久化于 hcs_fd_id), + * 更新一般只传变更字段、文档状态无需传递。 + * 新建成功返回双层嵌套 data.data.{fdId, fdXFormId, docViewUrl}。 + * 附件(发票扫描件)经 mechanisms.attachment[] 绑定:fdEntityKey=fd_attach、发起带 fdBindType=ADD。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsReceiptBillSaveDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 收票单主键(新建不传,更新必填) + */ + private String fdId; + /** + * 操作人登录名(必填) + */ + private String fdLoginName; + /** + * 收票单表单数据 + */ + private HcsReceiptBillFormDataDTO formData; + /** + * 附件挂载 + */ + private HcsMechanismsDTO mechanisms; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRefVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRefVO.java new file mode 100644 index 00000000..92cd5185 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRefVO.java @@ -0,0 +1,66 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)引用对象(组织/部门/合同等统一 {fdId, fdName} 引用) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsRefVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 引用记录ID + */ + private String fdId; + /** + * 引用记录名称 + */ + private String fdName; + + /** + * 仅按名称引用(HCS 组织 fdId 与 TMS 不同源,§9-U2,先传名称) + * + * @param fdName 名称 + * @return 引用对象 + */ + public static HcsRefVO ofName(String fdName) { + HcsRefVO ref = new HcsRefVO(); + ref.setFdName(fdName); + return ref; + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsResult.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsResult.java new file mode 100644 index 00000000..50645b9a --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsResult.java @@ -0,0 +1,78 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)统一返回结果 + *

+ * 业务成败以 success 字段为准(code 仅为成功/错误 messageKey)。 + * 结算付款特批(C106-3/4)与收票单(C109-1/2)的 data 内层又包一层同结构包装, + * 取业务数据用 data.data,即 {@code HcsResult>}。 + * + * @param 响应数据类型 + * @author Chill + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsResult implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 是否成功(必看字段,业务成败以此为准) + */ + private Boolean success; + /** + * 成功/错误的 messageKey,成功为 return.optSuccess + */ + private String code; + /** + * 成功/错误的提示信息 + */ + private String msg; + /** + * 返回数据对象,结构以各接口为准 + */ + private T data; + /** + * 链路追踪 ID,排查问题时提供给合同合规系统 + */ + private String traceId; + + /** + * 是否调用成功 + * + * @return true-成功 + */ + public boolean isSuccess() { + return Boolean.TRUE.equals(success); + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRiskQueryDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRiskQueryDTO.java new file mode 100644 index 00000000..d5ed92c2 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRiskQueryDTO.java @@ -0,0 +1,50 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C101-1 客商获取相对方风险等级入参 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsRiskQueryDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 客商编号(必填;用客商哪个编码待联调确认,§9-U6) + */ + private String fdNumber; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRiskVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRiskVO.java new file mode 100644 index 00000000..8a88b2c7 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsRiskVO.java @@ -0,0 +1,62 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C101-1 客商获取相对方风险等级出参(结果留痕 blade_hcs_check_log 与合同 hcs_risk_* 字段) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsRiskVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 相对方ID + */ + private String fdId; + /** + * 客商编号 + */ + private String fdNumber; + /** + * 黑名单状态(示例 no) + */ + private String fdBlackStatus; + /** + * 风险等级(示例 "1") + */ + private String fdRiskLevel; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSaveOptionDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSaveOptionDTO.java new file mode 100644 index 00000000..f39bbaba --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSaveOptionDTO.java @@ -0,0 +1,50 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C102-1 项目立项新建 保存选项入参 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsSaveOptionDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * false 直接提交,true 仅存草稿(TMS 推送固定 false) + */ + private Boolean saveDraft; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java new file mode 100644 index 00000000..4badd703 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java @@ -0,0 +1,64 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-1 合同发起 signer 签署方(相对方)入参项 + *

+ * §9-U6 待联调确认:fdNumber(相对方编号体系)与 fdType(inner/外部)判定规则。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsSignerDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 相对方名称(TMS 甲乙方名称) + */ + private String fdName; + /** + * 相对方编号(按名称反查 CustomerArchive 编码,反查不到留空,§9-U6) + */ + private String fdNumber; + /** + * 单位类型:inner 表示内部单位(判定规则联调确认,§9-U6) + */ + private String fdType; + /** + * 签署地位:甲 / 乙 + */ + private String fdStanding; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPayFormDataDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPayFormDataDTO.java new file mode 100644 index 00000000..74415c31 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPayFormDataDTO.java @@ -0,0 +1,58 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C106-3/C106-4 结算付款特批 formData 节点 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsSpecPayFormDataDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 特批业务字段 + */ + private HcsSpecPayPropsDTO dynamicProps; + /** + * 表单层单据主题 + */ + private String fdDocSubject; + /** + * 表单层单据状态(配置 spec-pay.doc-status,示例 10) + */ + private String fdDocStatus; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPayPropsDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPayPropsDTO.java new file mode 100644 index 00000000..d2ddbce8 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPayPropsDTO.java @@ -0,0 +1,148 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 合同合规系统(HCS)C106-3/C106-4 结算付款特批 dynamicProps 业务字段(字段名按接口文档下划线原样传值) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsSpecPayPropsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 合同(必填,传 HCS 合同ID,非名称) + */ + @JsonProperty("fd_contract_name") + private String fdContractName; + /** + * 合同编号 + */ + @JsonProperty("fd_contract_no") + private String fdContractNo; + /** + * 收款账户名 + */ + @JsonProperty("fd_receive_account_name") + private String fdReceiveAccountName; + /** + * 收款账号 + */ + @JsonProperty("fd_receive_account") + private String fdReceiveAccount; + /** + * 开户行 + */ + @JsonProperty("fd_bank_name") + private String fdBankName; + /** + * 收款人 + */ + @JsonProperty("fd_payee") + private String fdPayee; + /** + * 付款人 + */ + @JsonProperty("fd_payer") + private String fdPayer; + /** + * 付款金额 + */ + @JsonProperty("fd_pay_amount") + private BigDecimal fdPayAmount; + /** + * 合计金额 + */ + @JsonProperty("fd_total_amount") + private BigDecimal fdTotalAmount; + /** + * 结算币种(名称,如"人民币",映射配置 currency-name-mapping) + */ + @JsonProperty("fd_settle_currency") + private String fdSettleCurrency; + /** + * 付款用途(字典值,配置 spec-pay.payment-purpose,§9-U3) + */ + @JsonProperty("fd_payment_purpose") + private String fdPaymentPurpose; + /** + * 付款性质(字典值,配置 spec-pay.payment-nature,§9-U3) + */ + @JsonProperty("fd_payment_nature") + private String fdPaymentNature; + /** + * 付款类型(字典值,配置 spec-pay.payment-type,§9-U3) + */ + @JsonProperty("fd_payment_type") + private String fdPaymentType; + /** + * 单据编号(TMS 付款单号,来源付款单标识) + */ + @JsonProperty("fd_doc_no") + private String fdDocNo; + /** + * 单据主题("结算付款特批-" + 付款单号) + */ + @JsonProperty("fd_doc_subject") + private String fdDocSubject; + /** + * 单据状态(配置 spec-pay.doc-status,示例 10) + */ + @JsonProperty("fd_doc_status") + private String fdDocStatus; + /** + * 事由 + */ + @JsonProperty("fd_reason") + private String fdReason; + /** + * 补充说明 + */ + @JsonProperty("fd_supplement_note") + private String fdSupplementNote; + /** + * 来源付款单ID(存 TMS 付款申请主键,D14) + */ + @JsonProperty("fd_id") + private String fdId; + /** + * 特批附件字段标识(固定 fd_spc_approval_attach) + */ + @JsonProperty("fd_spc_approval_attach") + private String fdSpcApprovalAttach; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPaySaveDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPaySaveDTO.java new file mode 100644 index 00000000..a184785d --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPaySaveDTO.java @@ -0,0 +1,66 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C106-3 结算付款特批流程发起入参(C106-4 更新入参结构相同,复用本 DTO) + *

+ * fdId 为结算付款流程ID:发起不传;更新必填(发起返回 data.data.fdId,持久化于 hcs_spec_fd_id)。 + * 附件经 mechanisms.attachment[] 绑定:发起时带 fdBindType=ADD,更新时不带。 + * 发起成功返回双层嵌套 data.data.{fdId, fdXFormId, docViewUrl};更新内层无业务数据,以内层 success 判断。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsSpecPaySaveDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 结算付款流程ID(发起不传,更新必填) + */ + private String fdId; + /** + * 操作人登录名(必填) + */ + private String fdLoginName; + /** + * 特批表单数据 + */ + private HcsSpecPayFormDataDTO formData; + /** + * 附件挂载 + */ + private HcsMechanismsDTO mechanisms; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTemplateVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTemplateVO.java new file mode 100644 index 00000000..c0270741 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTemplateVO.java @@ -0,0 +1,93 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-6 合同模板列表出参行(fdTemplateId 供 C103-1 合同发起使用) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsTemplateVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 模板ID + */ + private String fdId; + /** + * 模板名称 + */ + private String fdName; + /** + * 模板状态(如 draft) + */ + private String fdStatus; + /** + * 合同性质(如 standard) + */ + private String fdContractCharacter; + /** + * 创建时间(毫秒时间戳) + */ + private Long fdCreateTime; + /** + * 创建人 + */ + private HcsRefVO fdCreator; + /** + * 创建部门 + */ + private HcsRefVO fdCreatorDept; + /** + * 模板扩展属性(含中文名) + */ + private HcsTemplatePropsVO dynamicProps; + + /** + * 合同模板扩展属性 + */ + @Data + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonIgnoreProperties(ignoreUnknown = true) + public static class HcsTemplatePropsVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 模板中文名(template-mapping 校验用) + */ + private String fdNameCn; + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java new file mode 100644 index 00000000..211bd6df --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java @@ -0,0 +1,63 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)OAuth2 取令牌返回结果(GET /authapi/getToken) + *

+ * TODO 待联调确认:v4 文档未给出本接口响应字段示例,字段名按通用 OAuth2 惯例预置, + * 联调时以实际返回为准(设计文档 §3.2)。 + * + * @author Chill + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsTokenVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 访问令牌,调用业务接口时追加到 URL 参数 access_token + */ + @JsonProperty("access_token") + private String accessToken; + /** + * 令牌类型 + */ + @JsonProperty("token_type") + private String tokenType; + /** + * 令牌有效期(毫秒) + */ + @JsonProperty("expires_in") + private Long expiresIn; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsUserRefVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsUserRefVO.java new file mode 100644 index 00000000..ffb482a2 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsUserRefVO.java @@ -0,0 +1,66 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)人员引用对象(人员引用可只传 {fdLoginName},§9-U2 登录名同源性待联调确认) + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsUserRefVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户名(可为空) + */ + private String fdName; + /** + * 登录名 + */ + private String fdLoginName; + + /** + * 仅按登录名引用 + * + * @param fdLoginName 登录名 + * @return 人员引用对象 + */ + public static HcsUserRefVO ofLoginName(String fdLoginName) { + HcsUserRefVO ref = new HcsUserRefVO(); + ref.setFdLoginName(fdLoginName); + return ref; + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java new file mode 100644 index 00000000..6f0d71c2 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java @@ -0,0 +1,64 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-1 合同发起 xformFields 模板字段项(按"字段名+值"逐项传模板字段) + *

+ * 金额/日期等值均以字符串传递;时间字段需带 fdType=timestamp(如 SIGN_DATE、fdEstimateStartTime)。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsXformFieldDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 模板字段名(如 fdNumber、fdSubject、fdAmount、SIGN_DATE) + */ + private String name; + /** + * 模板字段标签(字段中文名,如"合同编号") + */ + private String label; + /** + * 字段值(字符串传值) + */ + private String value; + /** + * 字段类型标记:时间字段传 timestamp + */ + private String fdType; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/exception/HcsException.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/exception/HcsException.java new file mode 100644 index 00000000..03091db3 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/exception/HcsException.java @@ -0,0 +1,42 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.exception; + +/** + * 合同合规系统(HCS)接口异常 + * + * @author Chill + */ +public class HcsException extends RuntimeException { + + public HcsException(String message) { + super(message); + } + + public HcsException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java new file mode 100644 index 00000000..7b4a0eb7 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java @@ -0,0 +1,338 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.feign; + +import feign.Response; +import org.springblade.hcs.config.HcsFeignClientConfig; +import org.springblade.hcs.dto.HcsAttachmentDownloadDTO; +import org.springblade.hcs.dto.HcsAttachmentVO; +import org.springblade.hcs.dto.HcsCategoryVO; +import org.springblade.hcs.dto.HcsContractDetailQueryDTO; +import org.springblade.hcs.dto.HcsContractDraftDTO; +import org.springblade.hcs.dto.HcsContractDraftVO; +import org.springblade.hcs.dto.HcsContractVO; +import org.springblade.hcs.dto.HcsCreditCheckDTO; +import org.springblade.hcs.dto.HcsCreditCheckVO; +import org.springblade.hcs.dto.HcsCurrencyVO; +import org.springblade.hcs.dto.HcsExeplanSyncDTO; +import org.springblade.hcs.dto.HcsExeplanVO; +import org.springblade.hcs.dto.HcsFormSaveVO; +import org.springblade.hcs.dto.HcsIdVO; +import org.springblade.hcs.dto.HcsInvoiceRegAddDTO; +import org.springblade.hcs.dto.HcsInvoiceRegUpdateDTO; +import org.springblade.hcs.dto.HcsInvoiceRegVO; +import org.springblade.hcs.dto.HcsPageQueryDTO; +import org.springblade.hcs.dto.HcsPageVO; +import org.springblade.hcs.dto.HcsPerfRecordSaveDTO; +import org.springblade.hcs.dto.HcsProjectAddDTO; +import org.springblade.hcs.dto.HcsProjectUpdateDTO; +import org.springblade.hcs.dto.HcsProjectVO; +import org.springblade.hcs.dto.HcsReceiptBillSaveDTO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.dto.HcsRiskQueryDTO; +import org.springblade.hcs.dto.HcsRiskVO; +import org.springblade.hcs.dto.HcsSpecPaySaveDTO; +import org.springblade.hcs.dto.HcsTemplateVO; +import org.springblade.hcs.dto.HcsTokenVO; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +/** + * 合同合规系统(HCS)接口(一期 24 个业务接口 + OAuth2 取令牌,D4) + *

+ * 除附件上传(multipart/form-data)、附件下载(文件流)外均为 POST + application/json(UTF-8)。 + * 业务成败以统一出参 {@link HcsResult#isSuccess()} 为准; + * C106-3/4、C109-1/2 的业务数据在双层嵌套 data.data 中。 + * + * @author Chill + */ +@FeignClient(name = "HCS", url = "${thirdParty.hcs.baseUrl}", configuration = HcsFeignClientConfig.class) +public interface IHcsClient { + + String GET_TOKEN_URL = "${thirdParty.hcs.getTokenUrl:/authapi/getToken}"; + String PROJECT_ADD_URL = "${thirdParty.hcs.projectAddUrl:/openapi/sys-modeling/apis/data/km-project1/V1/projectApproval/add}"; + String PROJECT_UPDATE_URL = "${thirdParty.hcs.projectUpdateUrl:/openapi/sys-modeling/apis/data/km-project1/V1/projectApproval/update}"; + String PROJECT_LIST_URL = "${thirdParty.hcs.projectListUrl:/openapi/sys-modeling/apis/data/km-project1/V1/projectApproval/list}"; + String RELATIVE_RISK_URL = "${thirdParty.hcs.relativeRiskUrl:/openapi/eop-base/eopBaseRelativeOpen/getRelativeRisk}"; + String CONTRACT_DRAFT_URL = "${thirdParty.hcs.contractDraftUrl:/openapi/eop-cdraft/eopCdraftMainOpen/draft}"; + String CONTRACT_UPDATE_URL = "${thirdParty.hcs.contractUpdateUrl:/openapi/eop-cdraft/eopCdraftMainOpen/updateDraft}"; + String CONTRACT_LIST_URL = "${thirdParty.hcs.contractListUrl:/openapi/eop-data/eopDataContractOpen/list}"; + String CONTRACT_DETAIL_URL = "${thirdParty.hcs.contractDetailUrl:/openapi/eop-data/eopDataContractOpen/detail}"; + String EXEPLAN_ADD_URL = "${thirdParty.hcs.exeplanAddUrl:/openapi/eop-exeplan/eopExeplanMainOpen/add}"; + String TEMPLATE_LIST_URL = "${thirdParty.hcs.templateListUrl:/openapi/eop-cdraft/eopCdraftTemplateOpen/list}"; + String CATEGORY_LIST_URL = "${thirdParty.hcs.categoryListUrl:/openapi/eop-base/eopBaseContractCategoryOpen/list}"; + String CURRENCY_LIST_URL = "${thirdParty.hcs.currencyListUrl:/openapi/eop-base/eopBaseCurrencyOpen/list}"; + String ATTACHMENT_UPLOAD_URL = "${thirdParty.hcs.attachmentUploadUrl:/openapi/sys-attach/fileStream/upload}"; + String ATTACHMENT_DOWNLOAD_URL = "${thirdParty.hcs.attachmentDownloadUrl:/openapi/sys-attach/fileStream/download}"; + String CREDIT_CHECK_URL = "${thirdParty.hcs.creditCheckUrl:/openapi/eop-cdraft/lcode/ext-cdraft/extEopCdraftMainOpen/contractCreditCheck}"; + String SPEC_PAY_ADD_URL = "${thirdParty.hcs.specPayAddUrl:/openapi/sys-modeling/lcode/ext-pay-receive/extPayReceiveOpenService/addSpecApplyPay}"; + String SPEC_PAY_UPDATE_URL = "${thirdParty.hcs.specPayUpdateUrl:/openapi/sys-modeling/lcode/ext-pay-receive/extPayReceiveOpenService/updateSpecApplyPay}"; + String PERF_RECORD_ADD_URL = "${thirdParty.hcs.perfRecordAddUrl:/openapi/sys-modeling/apis/data/km-pay-receive/V1/dataSync/add}"; + String PERF_RECORD_UPDATE_URL = "${thirdParty.hcs.perfRecordUpdateUrl:/openapi/sys-modeling/apis/data/km-pay-receive/V1/dataSync/update}"; + String RECEIPT_BILL_ADD_URL = "${thirdParty.hcs.receiptBillAddUrl:/openapi/sys-modeling/lcode/ext-invoice-receive/extInvoiceReceiveOpenService/addReceiveBill}"; + String RECEIPT_BILL_UPDATE_URL = "${thirdParty.hcs.receiptBillUpdateUrl:/openapi/sys-modeling/lcode/ext-invoice-receive/extInvoiceReceiveOpenService/updateReceiveBill}"; + String INVOICE_REG_LIST_URL = "${thirdParty.hcs.invoiceRegListUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/list}"; + String INVOICE_REG_ADD_URL = "${thirdParty.hcs.invoiceRegAddUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/add}"; + String INVOICE_REG_UPDATE_URL = "${thirdParty.hcs.invoiceRegUpdateUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/update}"; + + /** + * OAuth2 获取令牌(appKey/appSecret 走 URL 参数,D2) + * + * @param appKey 应用 appKey + * @param appSecret 应用 appSecret + * @return 令牌信息 + */ + @GetMapping(GET_TOKEN_URL) + HcsResult getToken(@RequestParam("appKey") String appKey, @RequestParam("appSecret") String appSecret); + + /** + * C102-1 项目立项新建 + * + * @param param 请求参数 + * @return 项目 fdId / fdXFormId / docViewUrl + */ + @PostMapping(PROJECT_ADD_URL) + HcsResult projectAdd(@RequestBody HcsProjectAddDTO param); + + /** + * C102-2 项目立项更新(响应无 data,以 success 判断) + * + * @param param 请求参数(formData.fdId 必填) + * @return 统一出参 + */ + @PostMapping(PROJECT_UPDATE_URL) + HcsResult projectUpdate(@RequestBody HcsProjectUpdateDTO param); + + /** + * C102-3 项目立项查询(columns/sorts 用下划线字段名,出参驼峰) + * + * @param param 分页查询参数 + * @return 项目立项分页数据 + */ + @PostMapping(PROJECT_LIST_URL) + HcsResult> projectList(@RequestBody HcsPageQueryDTO param); + + /** + * C101-1 客商获取相对方风险等级 + * + * @param param 请求参数 + * @return 相对方风险信息 + */ + @PostMapping(RELATIVE_RISK_URL) + HcsResult getRelativeRisk(@RequestBody HcsRiskQueryDTO param); + + /** + * C103-1 合同发起传输(合同新建) + * + * @param param 请求参数 + * @return 合同 fdContractId(必须持久化) + */ + @PostMapping(CONTRACT_DRAFT_URL) + HcsResult contractDraft(@RequestBody HcsContractDraftDTO param); + + /** + * C103-11 合同信息更新(入参同发起,响应无 data,§9-U5 定位已有合同方式待联调) + * + * @param param 请求参数 + * @return 统一出参 + */ + @PostMapping(CONTRACT_UPDATE_URL) + HcsResult contractUpdate(@RequestBody HcsContractDraftDTO param); + + /** + * C103-3 合同信息列表(判重与对账回查,§9-U4 查询能力联调确认) + * + * @param param 分页查询参数 + * @return 合同分页数据 + */ + @PostMapping(CONTRACT_LIST_URL) + HcsResult> contractList(@RequestBody HcsPageQueryDTO param); + + /** + * C103-4 合同详情(fdId 与 fdNumber 二选一) + *

+ * TODO 待联调确认:出参 data 结构 v4 未定义,暂以对象承接,联调后补充(设计文档 §5.9) + * + * @param param 请求参数 + * @return 合同详情(结构待联调确认) + */ + @PostMapping(CONTRACT_DETAIL_URL) + HcsResult contractDetail(@RequestBody HcsContractDetailQueryDTO param); + + /** + * C103-9(新) 合同履约规则同步(行级增删改,与废弃旧接口同路径不同入参,务必用本新版结构) + * + * @param param 请求参数 + * @return fdExeplanId 与变更阶段 fdId(均须持久化) + */ + @PostMapping(EXEPLAN_ADD_URL) + HcsResult exeplanAdd(@RequestBody HcsExeplanSyncDTO param); + + /** + * C103-6 合同模板列表获取(fdTemplateId 供合同发起使用) + * + * @param param 分页查询参数 + * @return 合同模板分页数据 + */ + @PostMapping(TEMPLATE_LIST_URL) + HcsResult> templateList(@RequestBody HcsPageQueryDTO param); + + /** + * C103-7 合同分类列表查询 + * + * @param param 分页查询参数 + * @return 合同分类分页数据 + */ + @PostMapping(CATEGORY_LIST_URL) + HcsResult> categoryList(@RequestBody HcsPageQueryDTO param); + + /** + * C103-12 合同币种列表查询(开票登记 fdCurrencyId、履约计划币种取自本接口) + * + * @param param 分页查询参数 + * @return 币种分页数据 + */ + @PostMapping(CURRENCY_LIST_URL) + HcsResult> currencyList(@RequestBody HcsPageQueryDTO param); + + /** + * C103-2 合同附件上传(multipart/form-data,返回附件 fdId 供各业务接口引用) + * + * @param fdFile 附件文件 + * @param fdAnonymous 是否匿名(true/false) + * @param fdLoginName 操作人登录名 + * @return 附件 fdId + */ + @PostMapping(value = ATTACHMENT_UPLOAD_URL, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + HcsResult uploadAttachment(@RequestPart("fdFile") MultipartFile fdFile, + @RequestParam(value = "fdAnonymous", required = false) String fdAnonymous, + @RequestParam(value = "fdLoginName", required = false) String fdLoginName); + + /** + * C103-5 合同附件下载(对账/排查备用,返回文件流,非 JSON 包装) + * + * @param param 请求参数 + * @return 文件流响应 + */ + @PostMapping(ATTACHMENT_DOWNLOAD_URL) + Response downloadAttachment(@RequestBody HcsAttachmentDownloadDTO param); + + /** + * C106-1 项目/合同额度校验(超额时 success 仍为 true,必须以 data.fdIsCredit 为准) + * + * @param param 请求参数 + * @return 额度校验结果 + */ + @PostMapping(CREDIT_CHECK_URL) + HcsResult contractCreditCheck(@RequestBody HcsCreditCheckDTO param); + + /** + * C106-3 结算付款特批流程发起(业务数据在双层嵌套 data.data) + * + * @param param 请求参数 + * @return data.data.{fdId, fdXFormId, docViewUrl}(fdId 为特批流程ID,更新必传) + */ + @PostMapping(SPEC_PAY_ADD_URL) + HcsResult> addSpecApplyPay(@RequestBody HcsSpecPaySaveDTO param); + + /** + * C106-4 结算付款特批流程更新(顶层 fdId 必填,内层无业务数据,以内层 success 判断) + * + * @param param 请求参数 + * @return 双层出参 + */ + @PostMapping(SPEC_PAY_UPDATE_URL) + HcsResult> updateSpecApplyPay(@RequestBody HcsSpecPaySaveDTO param); + + /** + * C108-1 履约记录新建 + * + * @param param 请求参数 + * @return 履约记录 fdId(必须持久化) + */ + @PostMapping(PERF_RECORD_ADD_URL) + HcsResult perfRecordAdd(@RequestBody HcsPerfRecordSaveDTO param); + + /** + * C108-2 履约记录更新(formData.fdId 必填,响应无 data,success=true 即成功) + * + * @param param 请求参数 + * @return 统一出参 + */ + @PostMapping(PERF_RECORD_UPDATE_URL) + HcsResult perfRecordUpdate(@RequestBody HcsPerfRecordSaveDTO param); + + /** + * C109-1 收票单新建(业务数据在双层嵌套 data.data) + * + * @param param 请求参数 + * @return data.data.{fdId, fdXFormId, docViewUrl}(fdId 为收票单主键,更新必传) + */ + @PostMapping(RECEIPT_BILL_ADD_URL) + HcsResult> addReceiveBill(@RequestBody HcsReceiptBillSaveDTO param); + + /** + * C109-2 收票单更新(顶层 fdId 必填,只传变更字段,文档状态无需传递) + * + * @param param 请求参数 + * @return 双层出参 + */ + @PostMapping(RECEIPT_BILL_UPDATE_URL) + HcsResult> updateReceiveBill(@RequestBody HcsReceiptBillSaveDTO param); + + /** + * C111-1 查询开票登记列表(判重与对账回查,§9-U4 查询能力联调确认) + * + * @param param 分页查询参数 + * @return 开票登记分页数据 + */ + @PostMapping(INVOICE_REG_LIST_URL) + HcsResult> invoiceRegistrationList(@RequestBody HcsPageQueryDTO param); + + /** + * C111-2 新增开票登记 + * + * @param param 请求参数 + * @return 开票登记 fdId(必须持久化) + */ + @PostMapping(INVOICE_REG_ADD_URL) + HcsResult invoiceRegistrationAdd(@RequestBody HcsInvoiceRegAddDTO param); + + /** + * C111-3 更新开票登记(fdId 必填,金蝶开票完成后回填票据日期/状态) + * + * @param param 请求参数 + * @return 开票登记 fdId + */ + @PostMapping(INVOICE_REG_UPDATE_URL) + HcsResult invoiceRegistrationUpdate(@RequestBody HcsInvoiceRegUpdateDTO param); +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java new file mode 100644 index 00000000..ade05035 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java @@ -0,0 +1,99 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.interceptor; + +import feign.RequestInterceptor; +import feign.RequestTemplate; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.constant.HcsConstant; +import org.springblade.hcs.token.HcsTokenService; +import org.springframework.beans.factory.ObjectProvider; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +/** + * 合同合规系统(HCS)请求拦截器,按配置的认证方式注入凭据(D2,两种实现并存、切换不改代码) + *

    + *
  • oauth2(默认):GET /authapi/getToken 取令牌后,把 access_token 追加到业务请求 URL;
  • + *
  • basic:注入 Authorization: Basic base64(user:password) 请求头。
  • + *
+ * 取令牌请求本身不追加 access_token(路径守卫 + 空令牌守卫双重防护)。 + * + * @author Chill + */ +@Slf4j +@RequiredArgsConstructor +public class HcsAuthInterceptor implements RequestInterceptor { + + private final HcsProperties properties; + + /** + * 惰性持有令牌服务,打破 Feign 客户端与令牌服务的构造期循环依赖 + */ + private final ObjectProvider tokenServiceProvider; + + @Override + public void apply(RequestTemplate template) { + if (HcsConstant.AUTH_TYPE_BASIC.equals(properties.getAuthType())) { + applyBasicAuth(template); + return; + } + applyOAuth2Token(template); + } + + /** + * Basic 认证:注入 Authorization 请求头(凭据走 Nacos + 环境变量注入) + */ + private void applyBasicAuth(RequestTemplate template) { + if (StringUtil.isBlank(properties.getBasicUsername()) || StringUtil.isBlank(properties.getBasicPassword())) { + log.warn("HCS Basic 认证凭据未配置(thirdParty.hcs.basic-username/basic-password),请求 {} 将无认证头", template.path()); + return; + } + String credentials = properties.getBasicUsername() + ":" + properties.getBasicPassword(); + String encoded = Base64.getEncoder().encodeToString(credentials.getBytes(StandardCharsets.UTF_8)); + template.header(HcsConstant.HEADER_AUTHORIZATION, HcsConstant.HEADER_BASIC_PREFIX + encoded); + } + + /** + * OAuth2 认证:业务请求 URL 追加 access_token 参数 + */ + private void applyOAuth2Token(RequestTemplate template) { + // 取令牌请求本身不再追加 access_token + if (template.path() != null && template.path().contains(HcsConstant.GET_TOKEN_PATH)) { + return; + } + String accessToken = tokenServiceProvider.getObject().getAccessToken(); + if (StringUtil.isBlank(accessToken)) { + log.warn("HCS access_token 为空,请求 {} 未追加令牌参数", template.path()); + return; + } + template.query(HcsConstant.QUERY_ACCESS_TOKEN, accessToken); + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java new file mode 100644 index 00000000..fddfca29 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java @@ -0,0 +1,140 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.token; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.constant.HcsConstant; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.dto.HcsTokenVO; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.util.Objects; + +/** + * 合同合规系统(HCS)OAuth2 令牌服务(D2,照 BfiServiceImpl 惯例) + *

+ * GET /authapi/getToken(appKey/appSecret)→ access_token 存 Redis + * (key {@link HcsConstant#HCS_TOKEN_CACHE_KEY},过期前留 120s 缓冲)。 + * 业务调用统一经 {@link #getAccessToken()} 取缓存令牌; + * 401 时调用 {@link #refreshAccessToken()} 强制刷新一次后重放(D7,重试职责归扫描任务,此处仅刷新令牌)。 + * auth-type=basic 时不走本服务,由拦截器注入 Basic 认证头。 + * + * @author Chill + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class HcsTokenService { + + private final HcsProperties properties; + private final IHcsClient client; + private final BladeRedis bladeRedis; + + /** + * 获取访问令牌:Redis 命中直接返回,未命中远端取令牌并缓存 + * + * @return access_token + */ + public String getAccessToken() { + String token = bladeRedis.get(HcsConstant.HCS_TOKEN_CACHE_KEY); + if (StringUtil.isNotBlank(token)) { + return token; + } + return requestToken(); + } + + /** + * 强制刷新访问令牌(401 时调用一次并重放请求) + * + * @return 新 access_token + */ + public String refreshAccessToken() { + log.info("强制刷新HCS令牌,清除本地缓存"); + bladeRedis.del(HcsConstant.HCS_TOKEN_CACHE_KEY); + return requestToken(); + } + + /** + * 远端取令牌并缓存 + * + * @return access_token + */ + private String requestToken() { + if (StringUtil.isBlank(properties.getAppKey()) || StringUtil.isBlank(properties.getAppSecret())) { + throw new HcsException("获取HCS令牌失败,appKey/appSecret 未配置(thirdParty.hcs.app-key/app-secret)"); + } + long start = System.currentTimeMillis(); + log.info("调用HCS接口 获取令牌开始"); + HcsResult result = client.getToken(properties.getAppKey(), properties.getAppSecret()); + log.info("调用HCS接口 获取令牌结束 耗时:{}ms,success:{}", System.currentTimeMillis() - start, result.isSuccess()); + if (result == null || !result.isSuccess()) { + log.error("调用HCS接口 获取令牌失败响应:{}", result == null ? "无响应" : String.format("code=%s, msg=%s, traceId=%s", + result.getCode(), result.getMsg(), result.getTraceId())); + throw new HcsException("调用HCS接口获取令牌异常 " + (result == null ? "响应为空" : result.getMsg())); + } + HcsTokenVO tokenVO = result.getData(); + if (tokenVO == null || StringUtil.isBlank(tokenVO.getAccessToken())) { + log.error("调用HCS接口 获取令牌返回数据为空"); + throw new HcsException("调用HCS接口获取令牌异常,返回数据为空"); + } + cacheToken(tokenVO); + return tokenVO.getAccessToken(); + } + + /** + * 缓存令牌,按 expires_in 毫秒数设置提前失效时间 + *

+ * TODO 待联调确认:v4 未给出 getToken 响应字段示例,expires_in 字段名与单位以实际返回为准(设计文档 §3.2) + * + * @param tokenVO 令牌信息 + */ + private void cacheToken(HcsTokenVO tokenVO) { + if (tokenVO.getExpiresIn() == null || tokenVO.getExpiresIn() <= HcsConstant.TOKEN_EXPIRE_BUFFER_MILLIS) { + log.warn("HCS令牌未返回有效期或有效期不足缓冲时长,本次不缓存"); + return; + } + // 过期时间 - 缓冲时长,防止刚好过期 + long expireMillis = tokenVO.getExpiresIn() - HcsConstant.TOKEN_EXPIRE_BUFFER_MILLIS; + bladeRedis.getValueOps().setIfAbsent(HcsConstant.HCS_TOKEN_CACHE_KEY, tokenVO.getAccessToken(), Duration.ofMillis(expireMillis)); + log.info("HCS令牌已缓存,有效期 {}ms(含 {}ms 提前失效缓冲)", expireMillis, HcsConstant.TOKEN_EXPIRE_BUFFER_MILLIS); + } + + /** + * 令牌缓存是否命中(诊断用) + * + * @return true-缓存存在 + */ + public boolean isTokenCached() { + return StringUtil.isNotBlank(Objects.toString(bladeRedis.get(HcsConstant.HCS_TOKEN_CACHE_KEY), null)); + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/util/HcsPageUtil.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/util/HcsPageUtil.java new file mode 100644 index 00000000..7039edeb --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/util/HcsPageUtil.java @@ -0,0 +1,102 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.util; + +import org.springblade.core.tool.utils.Func; +import org.springblade.hcs.dto.HcsPageVO; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.IntFunction; + +/** + * 合同合规系统(HCS)分页查询通用翻页工具(照 BfiUtil 惯例) + *

+ * HCS 分页以 offset(从 0 开始)+ pageSize 位移,适用于所有返回 {@link HcsPageVO} 的查询接口 + * (C102-3 项目立项查询、C103-3 合同列表、C103-6/7/12 主数据列表、C111-1 开票登记列表等): + *

{@code
+ * List rows = HcsPageUtil.queryAllPages(offset -> {
+ * 	query.setOffset(offset);
+ * 	query.setPageSize(pageSize);
+ * 	return hcsClient.projectList(query).getData();
+ * });
+ * }
+ * + * @author Chill + */ +public class HcsPageUtil { + + /** + * 分页查询默认最大页数保护,防止 HCS 侧 totalSize 异常时死循环 + */ + public static final int DEFAULT_MAX_PAGES = 50; + + private HcsPageUtil() { + } + + /** + * HCS 分页查询通用翻页,自动翻页汇总全量数据行(默认最大页数保护) + * + * @param pageFetcher 偏移量 -> 分页结果,lambda 内负责设置 offset(必要时含页大小)并调用接口 + * @param 数据行类型 + * @return 全量数据行 + */ + public static List queryAllPages(IntFunction> pageFetcher) { + return queryAllPages(pageFetcher, DEFAULT_MAX_PAGES); + } + + /** + * HCS 分页查询通用翻页,自动翻页汇总全量数据行 + *

+ * 终止条件:返回页为空、数据行为空、数据行不满一页(按返回 pageSize 判断)、已取满 totalSize、超出最大页数保护 + * + * @param pageFetcher 偏移量 -> 分页结果,lambda 内负责设置 offset(必要时含页大小)并调用接口 + * @param maxPages 最大页数保护 + * @param 数据行类型 + * @return 全量数据行 + */ + public static List queryAllPages(IntFunction> pageFetcher, int maxPages) { + List rows = new ArrayList<>(); + int offset = 0; + for (int pageNo = 1; pageNo <= maxPages; pageNo++) { + HcsPageVO page = pageFetcher.apply(offset); + if (page == null || Func.isEmpty(page.getContent())) { + break; + } + rows.addAll(page.getContent()); + // 已取满总数时无需继续翻页 + if (page.getTotalSize() != null && rows.size() >= page.getTotalSize()) { + break; + } + // 末页数据不满一页时无需继续翻页(返回 pageSize 为空时依赖 totalSize 与最大页数保护) + if (page.getPageSize() != null && page.getContent().size() < page.getPageSize()) { + break; + } + offset += page.getContent().size(); + } + return rows; + } +} diff --git a/blade-third-party-api/pom.xml b/blade-third-party-api/pom.xml index d0a0b444..4b2ed3c0 100644 --- a/blade-third-party-api/pom.xml +++ b/blade-third-party-api/pom.xml @@ -20,6 +20,7 @@ blade-track-api blade-wechat-api blade-bfi-api + blade-hcs-api pom BladeX 第三方API集合 diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index d5f1b4de..2345de68 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -64,3 +64,83 @@ thirdParty: syncEnabled: ${BFI_PAY_RESULT_SYNC_ENABLED:false} # 调度 cron,默认每10分钟 cron: ${BFI_PAY_RESULT_CRON:0 */10 * * * ?} + hcs: + # 合同合规系统(HCS)开放接口地址,直连可配(网关/iPaaS 部署时改此处,代码不感知) + base-url: ${HCS_BASE_URL:http://127.0.0.1:8050} + # 认证方式:oauth2(默认,URL 追加 access_token)| basic(Authorization 请求头),切换不改代码 + auth-type: ${HCS_AUTH_TYPE:oauth2} + # OAuth2 应用 appKey + app-key: ${HCS_APP_KEY:} + # OAuth2 应用 appSecret,敏感值通过环境变量注入 + app-secret: ${HCS_APP_SECRET:} + # Basic 认证用户名/密码(auth-type=basic 时生效) + basic-username: ${HCS_BASIC_USER:} + basic-password: ${HCS_BASIC_PASSWORD:} + # 来源系统标识(fd_sources,约定值 TMS) + src-system: ${HCS_SRC_SYSTEM:TMS} + # 推送任务(扫描首推/补偿,P1 接线) + push: + # 总开关(默认关,灰度打开) + sync-enabled: ${HCS_PUSH_SYNC_ENABLED:false} + # 扫描调度 cron,默认每5分钟 + cron: ${HCS_PUSH_CRON:0 */5 * * * ?} + # 每类单据单轮扫描批量 + batch-size: ${HCS_PUSH_BATCH_SIZE:50} + # 推送失败自动重试上限,超限仅人工重推 + max-retry: ${HCS_PUSH_MAX_RETRY:5} + # 项目立项(C102) + project: + # 立项 bpmOperation.templateCode(环境相关值,§9-U9 待合规方提供) + template-code: ${HCS_PROJECT_TEMPLATE_CODE:} + # 合同(C103-1/11) + contract: + # TMS 合同类别 -> HCS 模板ID(§9-U7 待合规方提供模板清单) + template-mapping: {} + # TMS 结算方式 -> 付款|收款(§9-U3 字典映射待联调) + settlement-type-mapping: {} + # TMS 币种码 -> HCS 币种名称(照金蝶 RMB->CNY 映射惯例) + currency-name-mapping: {"RMB": "人民币"} + # 合同 fdSepcailContract 固定 false(D15,配置项预留) + special-contract-enabled: ${HCS_CONTRACT_SPECIAL_ENABLED:false} + # 合同推送前是否强制客商风险校验 + require-risk-check: ${HCS_CONTRACT_REQUIRE_RISK_CHECK:true} + # 履约规则(C103-9) + exe-stage: + # 金额类型默认值(fdFundType) + fund-type: ${HCS_EXE_STAGE_FUND_TYPE:byAmount} + # 客商风险校验(C101-1) + risk: + check-on-contract: ${HCS_RISK_CHECK_ON_CONTRACT:true} + check-on-payment: ${HCS_RISK_CHECK_ON_PAYMENT:true} + # 黑名单是否阻断(合同置 failed / 付款提交拦截) + block-blacklist: ${HCS_RISK_BLOCK_BLACKLIST:true} + # 额度校验(C106-1) + credit: + # 付款提交校验是否要求合同已推送合规 + require-contract-synced: ${HCS_CREDIT_REQUIRE_CONTRACT_SYNCED:true} + # 结算付款特批(C106-3/4) + spec-pay: + # 单据状态(示例 10) + doc-status: ${HCS_SPEC_PAY_DOC_STATUS:10} + # 付款用途/性质/类型字典值(§9-U3 待联调后配置) + payment-purpose: ${HCS_SPEC_PAY_PAYMENT_PURPOSE:} + payment-nature: ${HCS_SPEC_PAY_PAYMENT_NATURE:} + payment-type: ${HCS_SPEC_PAY_PAYMENT_TYPE:} + # 开票登记(C111) + invoice: + # TMS 发票类型 -> HCS 发票类型字典值(§9-U3 待联调后配置) + invoice-type-mapping: {"electronic_normal": "", "electronic_special": ""} + # TMS 币种码 -> HCS 币种 fdId(经 C103-12 币种表缓存取值,§9-U3 待联调后配置) + currency-id-mapping: {"RMB": ""} + # 款项性质默认值(fdFundNature) + fund-nature-default: ${HCS_INVOICE_FUND_NATURE_DEFAULT:progress} + # 收票单(C109) + receipt-bill: + # TMS 发票类型 -> HCS 收票发票类型字典值(§9-U3 待联调后配置) + invoice-type-mapping: {} + # 附件转传(C103-2) + attachment: + # 附件转传总开关 + transfer-enabled: ${HCS_ATTACHMENT_TRANSFER_ENABLED:true} + # TMS 文件服务下载基址(拉取附件流用) + file-download-base: ${HCS_ATTACHMENT_FILE_DOWNLOAD_BASE:} diff --git a/doc/sql/transport/blade_hcs_sync_fields_20260927.sql b/doc/sql/transport/blade_hcs_sync_fields_20260927.sql new file mode 100644 index 00000000..02d53bd9 --- /dev/null +++ b/doc/sql/transport/blade_hcs_sync_fields_20260927.sql @@ -0,0 +1,191 @@ +-- 桂物合同合规系统(HCS)接入:业务表统一集成字段组(设计文档 §4,P0)。 +-- blade_project_apply / blade_contract_manage / blade_payment_application / +-- blade_invoice_application / blade_invoice_receipt 统一追加 hcs_* 五列; +-- 后续阶段按 §8 排期再追加各场景扩展字段(履约计划ID、风险留痕、特批字段组等)。 +-- 通过 information_schema 判断字段是否存在,可重复执行。 +SET @db_name = DATABASE(); + +-- ==================== blade_project_apply(C102 立项回填) ==================== + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_project_apply' AND column_name = 'hcs_fd_id'), + 'SELECT 1', + 'ALTER TABLE blade_project_apply ADD COLUMN hcs_fd_id varchar(64) DEFAULT NULL COMMENT ''合规系统单据ID(fdId/fdContractId)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_project_apply' AND column_name = 'hcs_sync_status'), + 'SELECT 1', + 'ALTER TABLE blade_project_apply ADD COLUMN hcs_sync_status varchar(16) DEFAULT ''unsynced'' COMMENT ''同步状态 unsynced/synced/failed''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_project_apply' AND column_name = 'hcs_retry_count'), + 'SELECT 1', + 'ALTER TABLE blade_project_apply ADD COLUMN hcs_retry_count int DEFAULT 0 COMMENT ''推送失败重试次数''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_project_apply' AND column_name = 'hcs_sync_time'), + 'SELECT 1', + 'ALTER TABLE blade_project_apply ADD COLUMN hcs_sync_time datetime DEFAULT NULL COMMENT ''最近同步时间''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_project_apply' AND column_name = 'hcs_sync_msg'), + 'SELECT 1', + 'ALTER TABLE blade_project_apply ADD COLUMN hcs_sync_msg varchar(512) DEFAULT NULL COMMENT ''最近同步结果信息/失败原因''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- ==================== blade_contract_manage(C103 合同回填) ==================== + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_fd_id'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_fd_id varchar(64) DEFAULT NULL COMMENT ''合规系统单据ID(fdId/fdContractId)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_sync_status'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_sync_status varchar(16) DEFAULT ''unsynced'' COMMENT ''同步状态 unsynced/synced/failed''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_retry_count'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_retry_count int DEFAULT 0 COMMENT ''推送失败重试次数''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_sync_time'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_sync_time datetime DEFAULT NULL COMMENT ''最近同步时间''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_sync_msg'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_sync_msg varchar(512) DEFAULT NULL COMMENT ''最近同步结果信息/失败原因''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- ==================== blade_payment_application(C106 额度/特批、C108 履约记录) ==================== + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_payment_application' AND column_name = 'hcs_fd_id'), + 'SELECT 1', + 'ALTER TABLE blade_payment_application ADD COLUMN hcs_fd_id varchar(64) DEFAULT NULL COMMENT ''合规系统单据ID(fdId/fdContractId)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_payment_application' AND column_name = 'hcs_sync_status'), + 'SELECT 1', + 'ALTER TABLE blade_payment_application ADD COLUMN hcs_sync_status varchar(16) DEFAULT ''unsynced'' COMMENT ''同步状态 unsynced/synced/failed''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_payment_application' AND column_name = 'hcs_retry_count'), + 'SELECT 1', + 'ALTER TABLE blade_payment_application ADD COLUMN hcs_retry_count int DEFAULT 0 COMMENT ''推送失败重试次数''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_payment_application' AND column_name = 'hcs_sync_time'), + 'SELECT 1', + 'ALTER TABLE blade_payment_application ADD COLUMN hcs_sync_time datetime DEFAULT NULL COMMENT ''最近同步时间''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_payment_application' AND column_name = 'hcs_sync_msg'), + 'SELECT 1', + 'ALTER TABLE blade_payment_application ADD COLUMN hcs_sync_msg varchar(512) DEFAULT NULL COMMENT ''最近同步结果信息/失败原因''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- ==================== blade_invoice_application(C111 开票登记回填) ==================== + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_invoice_application' AND column_name = 'hcs_fd_id'), + 'SELECT 1', + 'ALTER TABLE blade_invoice_application ADD COLUMN hcs_fd_id varchar(64) DEFAULT NULL COMMENT ''合规系统单据ID(fdId/fdContractId)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_invoice_application' AND column_name = 'hcs_sync_status'), + 'SELECT 1', + 'ALTER TABLE blade_invoice_application ADD COLUMN hcs_sync_status varchar(16) DEFAULT ''unsynced'' COMMENT ''同步状态 unsynced/synced/failed''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_invoice_application' AND column_name = 'hcs_retry_count'), + 'SELECT 1', + 'ALTER TABLE blade_invoice_application ADD COLUMN hcs_retry_count int DEFAULT 0 COMMENT ''推送失败重试次数''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_invoice_application' AND column_name = 'hcs_sync_time'), + 'SELECT 1', + 'ALTER TABLE blade_invoice_application ADD COLUMN hcs_sync_time datetime DEFAULT NULL COMMENT ''最近同步时间''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_invoice_application' AND column_name = 'hcs_sync_msg'), + 'SELECT 1', + 'ALTER TABLE blade_invoice_application ADD COLUMN hcs_sync_msg varchar(512) DEFAULT NULL COMMENT ''最近同步结果信息/失败原因''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- ==================== blade_invoice_receipt(C109 收票单回填) ==================== + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_invoice_receipt' AND column_name = 'hcs_fd_id'), + 'SELECT 1', + 'ALTER TABLE blade_invoice_receipt ADD COLUMN hcs_fd_id varchar(64) DEFAULT NULL COMMENT ''合规系统单据ID(fdId/fdContractId)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_invoice_receipt' AND column_name = 'hcs_sync_status'), + 'SELECT 1', + 'ALTER TABLE blade_invoice_receipt ADD COLUMN hcs_sync_status varchar(16) DEFAULT ''unsynced'' COMMENT ''同步状态 unsynced/synced/failed''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_invoice_receipt' AND column_name = 'hcs_retry_count'), + 'SELECT 1', + 'ALTER TABLE blade_invoice_receipt ADD COLUMN hcs_retry_count int DEFAULT 0 COMMENT ''推送失败重试次数''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_invoice_receipt' AND column_name = 'hcs_sync_time'), + 'SELECT 1', + 'ALTER TABLE blade_invoice_receipt ADD COLUMN hcs_sync_time datetime DEFAULT NULL COMMENT ''最近同步时间''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_invoice_receipt' AND column_name = 'hcs_sync_msg'), + 'SELECT 1', + 'ALTER TABLE blade_invoice_receipt ADD COLUMN hcs_sync_msg varchar(512) DEFAULT NULL COMMENT ''最近同步结果信息/失败原因''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; From cc9e01cff498367b62a78b3189e15239f549094f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 22:41:04 +0800 Subject: [PATCH 002/124] =?UTF-8?q?feat:=20HCS=E7=AB=8B=E9=A1=B9=E4=B8=8E?= =?UTF-8?q?=E5=90=88=E5=90=8C=E6=95=B0=E6=8D=AE=E5=B1=82=EF=BC=88=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E5=90=88=E8=A7=84=E5=AD=97=E6=AE=B5=E7=BB=84/?= =?UTF-8?q?=E5=90=88=E5=90=8C=E9=A3=8E=E9=99=A9=E7=95=99=E7=97=95=E5=AD=97?= =?UTF-8?q?=E6=AE=B5/=E6=A0=A1=E9=AA=8C=E7=95=99=E7=97=95=E8=A1=A8/transpo?= =?UTF-8?q?rt=E6=8E=A5=E5=85=A5hcs-api=E4=BE=9D=E8=B5=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/pojo/entity/ContractManage.java | 29 +++++ .../pojo/entity/HcsContractCheckLog.java | 79 ++++++++++++ .../transport/pojo/entity/ProjectApply.java | 17 +++ blade-service/blade-transport/pom.xml | 4 + .../transport/constant/HcsSyncConstant.java | 121 ++++++++++++++++++ .../mapper/HcsContractCheckLogMapper.java | 40 ++++++ .../blade_hcs_contract_fields_20260927.sql | 55 ++++++++ pom.xml | 5 + 8 files changed, 350 insertions(+) create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractCheckLog.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsSyncConstant.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsContractCheckLogMapper.java create mode 100644 doc/sql/transport/blade_hcs_contract_fields_20260927.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java index d56fec74..7398b13f 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java @@ -209,4 +209,33 @@ public class ContractManage extends TenantEntity { @Schema(description = "备注") private String remark; + @Schema(description = "合规系统单据ID(fdContractId)") + private String hcsFdId; + + @Schema(description = "合规同步状态 unsynced/synced/failed") + private String hcsSyncStatus; + + @Schema(description = "合规推送失败重试次数") + @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) + private Integer hcsRetryCount; + + @Schema(description = "合规最近同步时间") + private LocalDateTime hcsSyncTime; + + @Schema(description = "合规最近同步结果信息/失败原因") + @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) + private String hcsSyncMsg; + + @Schema(description = "合规履约计划ID(C103-9 返回 fdExeplanId)") + private String hcsExeplanId; + + @Schema(description = "合规客商风险等级(C101-1,甲方/乙方取高)") + private String hcsRiskLevel; + + @Schema(description = "合规客商黑名单状态(C101-1,甲方/乙方取是)") + private String hcsBlackStatus; + + @Schema(description = "合规风险校验时间") + private LocalDateTime hcsRiskTime; + } diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractCheckLog.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractCheckLog.java new file mode 100644 index 00000000..f7815ad9 --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractCheckLog.java @@ -0,0 +1,79 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.pojo.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * HCS 风险/额度校验留痕实体类(照 ops 日志惯例,仅插入不改) + * + * @author Chill + */ +@Data +@TableName("blade_hcs_check_log") +@Schema(description = "HCS 风险/额度校验留痕") +public class HcsContractCheckLog implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + @Schema(description = "租户ID") + private String tenantId; + + @Schema(description = "业务类型 project/contract/payment") + private String bizType; + + @Schema(description = "业务单据ID") + private Long bizId; + + @Schema(description = "校验类型 risk=客商风险/credit=额度") + private String checkType; + + @Schema(description = "校验结果 pass=通过/fail=不通过/skip=跳过") + private String result; + + @Schema(description = "校验说明") + private String msg; + + @Schema(description = "合规系统链路追踪ID") + private String traceId; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ProjectApply.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ProjectApply.java index 5526da8e..410884ef 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ProjectApply.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ProjectApply.java @@ -198,4 +198,21 @@ public class ProjectApply extends TenantEntity { @Schema(description = "作废原因") private String voidReason; + @Schema(description = "合规系统单据ID(fdId)") + private String hcsFdId; + + @Schema(description = "合规同步状态 unsynced/synced/failed") + private String hcsSyncStatus; + + @Schema(description = "合规推送失败重试次数") + @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) + private Integer hcsRetryCount; + + @Schema(description = "合规最近同步时间") + private LocalDateTime hcsSyncTime; + + @Schema(description = "合规最近同步结果信息/失败原因") + @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) + private String hcsSyncMsg; + } diff --git a/blade-service/blade-transport/pom.xml b/blade-service/blade-transport/pom.xml index b9ed58c8..2443ce7a 100644 --- a/blade-service/blade-transport/pom.xml +++ b/blade-service/blade-transport/pom.xml @@ -51,6 +51,10 @@ org.springblade blade-bfi-api + + org.springblade + blade-hcs-api + org.springframework.boot spring-boot-starter-amqp 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 new file mode 100644 index 00000000..ad7238fb --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsSyncConstant.java @@ -0,0 +1,121 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.constant; + +/** + * HCS(合同合规系统)同步常量(TMS 业务侧) + *

+ * 命名照 {@link KingdeeBfiConstant} 惯例;与客户端模块 org.springblade.hcs.constant.HcsConstant 区分。 + * + * @author Chill + */ +public final class HcsSyncConstant { + + /** + * 同步状态:待同步 + */ + public static final String HCS_STATUS_UNSYNCED = "unsynced"; + + /** + * 同步状态:已同步 + */ + public static final String HCS_STATUS_SYNCED = "synced"; + + /** + * 同步状态:同步失败 + */ + public static final String HCS_STATUS_FAILED = "failed"; + + /** + * 推送业务类型:项目立项(C102) + */ + public static final String BIZ_TYPE_PROJECT = "project"; + + /** + * 推送业务类型:合同(C103) + */ + public static final String BIZ_TYPE_CONTRACT = "contract"; + + /** + * 校验类型:客商风险(C101-1) + */ + public static final String CHECK_TYPE_RISK = "risk"; + + /** + * 校验类型:额度(C106-1,P3 付款链使用) + */ + public static final String CHECK_TYPE_CREDIT = "credit"; + + /** + * 校验结果:通过 + */ + public static final String CHECK_RESULT_PASS = "pass"; + + /** + * 校验结果:不通过(黑名单) + */ + public static final String CHECK_RESULT_FAIL = "fail"; + + /** + * 校验结果:跳过(客商编号反查不到等) + */ + public static final String CHECK_RESULT_SKIP = "skip"; + + // ==================== Redis 缓存 key(照 BFI blade:third: 前缀惯例) ==================== + + /** + * 主数据缓存:合同模板列表 + */ + public static final String MASTER_CACHE_TEMPLATES = "blade:third:hcs:master:templates"; + + /** + * 主数据缓存:合同分类列表 + */ + public static final String MASTER_CACHE_CATEGORIES = "blade:third:hcs:master:categories"; + + /** + * 主数据缓存:币种列表 + */ + 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(多实例部署防重扫) + */ + public static final String PUSH_TASK_LOCK_KEY = "blade:third:hcs:push:task:lock"; + + private HcsSyncConstant() { + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsContractCheckLogMapper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsContractCheckLogMapper.java new file mode 100644 index 00000000..74bca5c8 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsContractCheckLogMapper.java @@ -0,0 +1,40 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springblade.transport.pojo.entity.HcsContractCheckLog; + +/** + * HCS 风险/额度校验留痕 Mapper + * + * @author Chill + */ +@Mapper +public interface HcsContractCheckLogMapper extends BaseMapper { + +} diff --git a/doc/sql/transport/blade_hcs_contract_fields_20260927.sql b/doc/sql/transport/blade_hcs_contract_fields_20260927.sql new file mode 100644 index 00000000..ec6854b5 --- /dev/null +++ b/doc/sql/transport/blade_hcs_contract_fields_20260927.sql @@ -0,0 +1,55 @@ +-- 桂物合同合规系统(HCS)接入:合同扩展字段与校验留痕表(设计文档 §4,P1)。 +-- blade_contract_manage 追加履约计划ID与风险留痕字段;新建 blade_hcs_check_log 校验留痕表。 +-- 通过 information_schema 判断字段/表是否存在,可重复执行。 +SET @db_name = DATABASE(); + +-- ==================== blade_contract_manage 扩展字段(C103 回填、履约计划ID、风险留痕) ==================== + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_exeplan_id'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_exeplan_id varchar(64) DEFAULT NULL COMMENT ''合规履约计划ID(C103-9 返回 fdExeplanId)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_risk_level'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_risk_level varchar(8) DEFAULT NULL COMMENT ''合规客商风险等级(C101-1,甲方/乙方取高)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_black_status'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_black_status varchar(8) DEFAULT NULL COMMENT ''合规客商黑名单状态(C101-1,甲方/乙方取是)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_risk_time'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_risk_time datetime DEFAULT NULL COMMENT ''合规风险校验时间''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- ==================== blade_hcs_check_log 校验留痕表(照 ops 日志惯例) ==================== + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = @db_name AND table_name = 'blade_hcs_check_log'), + 'SELECT 1', + 'CREATE TABLE blade_hcs_check_log ( + id bigint NOT NULL COMMENT ''主键'', + tenant_id varchar(12) DEFAULT ''000000'' COMMENT ''租户ID'', + biz_type varchar(32) DEFAULT NULL COMMENT ''业务类型 project/contract/payment'', + biz_id bigint DEFAULT NULL COMMENT ''业务单据ID'', + check_type varchar(16) DEFAULT NULL COMMENT ''校验类型 risk=客商风险/credit=额度'', + result varchar(16) DEFAULT NULL COMMENT ''校验结果 pass=通过/fail=不通过/skip=跳过'', + msg varchar(512) DEFAULT NULL COMMENT ''校验说明'', + trace_id varchar(64) DEFAULT NULL COMMENT ''合规系统链路追踪ID'', + create_time datetime DEFAULT NULL COMMENT ''创建时间'', + PRIMARY KEY (id), + KEY idx_hcs_check_log_biz (biz_type, biz_id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=''HCS 风险/额度校验留痕''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; diff --git a/pom.xml b/pom.xml index f064dd95..650240cc 100644 --- a/pom.xml +++ b/pom.xml @@ -159,6 +159,11 @@ blade-bfi-api ${revision} + + org.springblade + blade-hcs-api + ${revision} + org.springblade blade-wechat-api From 2cf71afeb48a70dba3bdc601633772494197a3d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 22:43:48 +0800 Subject: [PATCH 003/124] =?UTF-8?q?feat:=20HCS=E6=8E=A8=E9=80=81=E9=9B=B6?= =?UTF-8?q?=E5=9F=8B=E7=82=B9=E6=8E=A5=E7=BA=BF=EF=BC=88=E7=AB=8B=E9=A1=B9?= =?UTF-8?q?/=E5=90=88=E5=90=8C=E5=AE=A1=E6=89=B9=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E4=B8=8EMK=E5=9B=9E=E8=B0=83=E7=BB=9F=E4=B8=80=E7=BD=AEhcs=5Fs?= =?UTF-8?q?ync=5Fstatus=3Dunsynced=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/springblade/transport/mk/MkProcessBizHandlers.java | 5 +++++ .../transport/service/impl/ContractManageServiceImpl.java | 3 +++ .../transport/service/impl/ProjectApplyServiceImpl.java | 3 +++ 3 files changed, 11 insertions(+) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java index b5456cf4..6c9bce09 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java @@ -14,6 +14,7 @@ import org.springblade.transport.service.ICustomerArchiveService; import org.springblade.transport.service.IFormalSettlementService; import org.springblade.transport.service.IPaymentApplicationService; import org.springblade.transport.service.IPreSettlementService; +import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.service.IProjectApplyService; import org.springblade.transport.service.IWaybillService; import org.springframework.stereotype.Component; @@ -112,6 +113,8 @@ public final class MkProcessBizHandlers { entity.setCurrentNode("审核通过"); entity.setCurrentProcessor(MkProcessNodeHelper.text(processorName, "系统")); entity.setApprovedTime(LocalDateTime.now()); + // HCS 推送零埋点:MK 审批回调仅置待同步状态,与 /approve 入口收敛于同一权威状态(ADR-0001) + entity.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); return service.updateById(entity); } @@ -180,6 +183,8 @@ public final class MkProcessBizHandlers { entity.setApprovalStatus(change ? "change_approved" : "approved"); entity.setCurrentNode("审核通过"); entity.setCurrentProcessor(MkProcessNodeHelper.text(processorName, "系统")); + // HCS 推送零埋点:MK 审批回调仅置待同步状态,与 /approve 入口收敛于同一权威状态(ADR-0001) + entity.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); return service.updateById(entity); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java index aa08bff9..b6cf8840 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java @@ -33,6 +33,7 @@ import org.springblade.core.tool.jackson.JsonUtil; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.Func; import org.springblade.system.cache.UserCache; +import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.excel.ContractManageExcel; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.pojo.entity.ContractManage; @@ -214,6 +215,8 @@ public class ContractManageServiceImpl extends BaseServiceImpl Date: Sun, 27 Sep 2026 22:47:40 +0800 Subject: [PATCH 004/124] =?UTF-8?q?feat:=20HCS=E4=B8=BB=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E4=B8=8E=E9=99=84=E4=BB=B6=E8=BD=AC=E4=BC=A0?= =?UTF-8?q?=E6=94=AF=E6=92=91=EF=BC=88C103-6/7/12=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E5=B8=81=E7=A7=8D=E7=BC=93=E5=AD=98=E3=80=81?= =?UTF-8?q?C103-2=E9=99=84=E4=BB=B6=E8=BD=AC=E4=BC=A0=E4=B8=8E=E5=90=88?= =?UTF-8?q?=E8=A7=84=E9=99=84=E4=BB=B6ID=E6=98=A0=E5=B0=84=E7=BC=93?= =?UTF-8?q?=E5=AD=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsAttachmentSupport.java | 290 ++++++++++++++++++ .../support/hcs/HcsMasterDataSupport.java | 206 +++++++++++++ .../springblade/hcs/config/HcsProperties.java | 12 + doc/nacos/third-party-api.yaml | 4 + 4 files changed, 512 insertions(+) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsAttachmentSupport.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsMasterDataSupport.java 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 new file mode 100644 index 00000000..e505f910 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsAttachmentSupport.java @@ -0,0 +1,290 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import cn.hutool.http.HttpUtil; +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.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.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * HCS 附件转传支撑组件(C103-2 multipart 上传,设计文档 §6) + *

+ * 流程:解析单据附件 JSON 元素(去重键照 ContractManage#attachmentKey 惯例)→ + * 按元数据 URL 从文件服务拉取流(基址可配 attachment.file-download-base)→ + * C103-2 上传取得合规附件ID → Redis 映射缓存(blade:third:hcs:att:{attachmentKey},TTL 7 天), + * 未命中重传(重复上传仅浪费存储,无业务风险,故不做持久化映射表)。 + * 任一附件转传失败 → 抛出异常由整单推送失败进补偿重试。 + *

+ * TODO 待联调确认(§9-U8):v4 的 C103-1 入参未定义附件字段,合同附件向 HCS 的挂载方式待合规方确认, + * 本组件先建设通用转传能力并将合规附件ID 缓存备用,确认后按其要求挂载。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsAttachmentSupport { + + /** + * 附件元数据去重键候选字段(照 ContractManage#attachmentKey 既有惯例) + */ + private static final List KEY_FIELDS = List.of("url", "link", "fileUrl", "downloadUrl", "uid", "originalName", "name"); + + private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; + private final BladeRedis bladeRedis; + + /** + * 解析单据附件 JSON 并转传,返回合规附件ID 列表(保持行序) + * + * @param attachmentsJson 附件元数据 JSON 数组 + * @param operatorLoginName 操作人登录名(C103-2 fdLoginName) + * @return 合规附件ID 列表 + */ + public List transferAttachments(String attachmentsJson, String operatorLoginName) { + if (StringUtil.isBlank(attachmentsJson)) { + return List.of(); + } + List> attachments = parseJsonArray(attachmentsJson); + List attachmentFdIds = new ArrayList<>(); + for (Map attachment : attachments) { + attachmentFdIds.add(transferOne(attachment, operatorLoginName)); + } + return attachmentFdIds; + } + + /** + * 解析合同主文件 JSON(仅 approved=true 的文件)与其它附件 JSON 并转传 + * + * @param contractFileJson 合同主文件 JSON + * @param attachmentsJson 其它附件 JSON + * @param operatorLoginName 操作人登录名 + * @return 合规附件ID 列表 + */ + public List transferContractAttachments(String contractFileJson, String attachmentsJson, String operatorLoginName) { + List> attachments = new ArrayList<>(); + for (Map file : parseJsonArray(contractFileJson)) { + if (isApproved(file)) { + attachments.add(file); + } + } + attachments.addAll(parseJsonArray(attachmentsJson)); + List attachmentFdIds = new ArrayList<>(); + for (Map attachment : attachments) { + attachmentFdIds.add(transferOne(attachment, operatorLoginName)); + } + return attachmentFdIds; + } + + /** + * 转传单个附件:映射缓存命中直接返回,未命中下载上传后写缓存 + */ + private String transferOne(Map attachment, String operatorLoginName) { + String attachmentKey = attachmentKey(attachment); + String cacheKey = HcsSyncConstant.ATTACHMENT_CACHE_KEY_PREFIX + attachmentKey; + String cachedFdId = bladeRedis.get(cacheKey); + if (StringUtil.isNotBlank(cachedFdId)) { + return cachedFdId; + } + String url = resolveUrl(attachment); + if (StringUtil.isBlank(url)) { + throw new HcsException("HCS附件转传失败,附件元数据缺少下载地址(attachmentKey=" + attachmentKey + ")"); + } + byte[] fileBytes = downloadFile(url); + String fileName = resolveFileName(attachment, url); + log.info("HCS附件转传开始:{},大小 {} 字节", fileName, fileBytes.length); + HcsResult result = hcsClient.uploadAttachment( + new InMemoryMultipartFile("fdFile", fileName, fileBytes), "false", operatorLoginName); + if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdId())) { + log.error("HCS附件转传失败响应:{}", result == null ? "无响应" : String.format("code=%s, msg=%s, traceId=%s", + result.getCode(), result.getMsg(), result.getTraceId())); + throw new HcsException("HCS附件转传失败:" + (result == null ? "响应为空" : result.getMsg())); + } + String attachmentFdId = result.getData().getFdId(); + bladeRedis.getValueOps().setIfAbsent(cacheKey, attachmentFdId, Duration.ofDays(HcsSyncConstant.ATTACHMENT_CACHE_TTL_DAYS)); + log.info("HCS附件转传完成:{} → 合规附件ID {}", fileName, attachmentFdId); + return attachmentFdId; + } + + /** + * 按元数据 URL 从文件服务拉取流:完整 URL 直接下载,相对路径拼可配基址 + */ + private byte[] downloadFile(String url) { + String target = url; + if (!url.startsWith("http://") && !url.startsWith("https://")) { + String base = hcsProperties.getAttachment().getFileDownloadBase(); + if (StringUtil.isBlank(base)) { + throw new HcsException("HCS附件转传失败,文件服务下载基址未配置(thirdParty.hcs.attachment.file-download-base)"); + } + target = base + url; + } + try { + return HttpUtil.downloadBytes(target); + } catch (Exception exception) { + log.error("HCS附件转传下载失败:{}", target, exception); + throw new HcsException("HCS附件转传下载失败:" + target, exception); + } + } + + /** + * 附件元数据去重键(url|link|fileUrl|downloadUrl|uid|originalName|name 依次取首个非空) + */ + private String attachmentKey(Map attachment) { + for (String field : KEY_FIELDS) { + Object value = attachment.get(field); + if (value != null && !String.valueOf(value).isBlank()) { + return field + ":" + value; + } + } + return String.valueOf(attachment); + } + + /** + * 提取附件下载地址 + */ + private String resolveUrl(Map attachment) { + for (String field : List.of("url", "link", "fileUrl", "downloadUrl", "path")) { + Object value = attachment.get(field); + if (value != null && !String.valueOf(value).isBlank()) { + return String.valueOf(value).trim(); + } + } + return null; + } + + /** + * 提取附件文件名(name/originalName 优先,缺失时取 URL 末段) + */ + private String resolveFileName(Map attachment, String url) { + for (String field : List.of("name", "originalName", "fileName")) { + Object value = attachment.get(field); + if (value != null && !String.valueOf(value).isBlank()) { + return String.valueOf(value); + } + } + String lastSegment = url.substring(url.lastIndexOf('/') + 1); + return StringUtil.isBlank(lastSegment) ? "hcs-attachment" : lastSegment; + } + + /** + * 主文件审批标记判定(照 ContractManage#isAttachmentApproved 惯例) + */ + private boolean isApproved(Map attachment) { + Object approved = attachment.get("approved"); + if (approved == null) { + return false; + } + return Boolean.TRUE.equals(approved) || Objects.equals(approved, 1) + || "1".equals(String.valueOf(approved)) || "true".equalsIgnoreCase(String.valueOf(approved)); + } + + /** + * 解析 JSON 数组(照 ContractManage#parseJsonArray 惯例,异常返回空列表) + */ + private List> parseJsonArray(String json) { + if (StringUtil.isBlank(json)) { + return List.of(); + } + try { + return JsonUtil.parse(json, List.class); + } catch (Exception exception) { + log.warn("HCS附件元数据解析失败,按无附件处理:{}", json); + return List.of(); + } + } + + /** + * 内存 MultipartFile(下载字节流转传 C103-2 用) + */ + private record InMemoryMultipartFile(String name, String originalFilename, byte[] bytes) implements MultipartFile { + + @Override + public String getName() { + return name; + } + + @Override + public String getOriginalFilename() { + return originalFilename; + } + + @Override + public String getContentType() { + return MediaType.APPLICATION_OCTET_STREAM_VALUE; + } + + @Override + public boolean isEmpty() { + return bytes == null || bytes.length == 0; + } + + @Override + public long getSize() { + return bytes == null ? 0 : bytes.length; + } + + @Override + public byte[] getBytes() { + return bytes; + } + + @Override + public InputStream getInputStream() { + return new ByteArrayInputStream(bytes); + } + + @Override + public void transferTo(File dest) throws IOException { + try (FileOutputStream outputStream = new FileOutputStream(dest)) { + outputStream.write(bytes); + } + } + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsMasterDataSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsMasterDataSupport.java new file mode 100644 index 00000000..d09c6836 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsMasterDataSupport.java @@ -0,0 +1,206 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsCategoryVO; +import org.springblade.hcs.dto.HcsCurrencyVO; +import org.springblade.hcs.dto.HcsPageQueryDTO; +import org.springblade.hcs.dto.HcsPageVO; +import org.springblade.hcs.dto.HcsTemplateVO; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springblade.hcs.util.HcsPageUtil; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.util.List; +import java.util.Map; + +/** + * HCS 主数据缓存支撑组件(C103-6 模板 / C103-7 分类 / C103-12 币种,设计文档 §5.9) + *

+ * 启动/首次使用时拉取并缓存(Redis,照 BFI token 缓存惯例,TTL 可配 master-data.ttl-minutes): + * 模板列表供 template-mapping 校验,币种表供 currency-id-mapping 取值。 + * 提供管理端"刷新缓存"入口(HcsSyncController)。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsMasterDataSupport { + + /** + * 主数据分页拉取页大小 + */ + private static final int PAGE_SIZE = 200; + + private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; + private final BladeRedis bladeRedis; + + /** + * 获取合同模板列表(缓存优先,未命中全量拉取) + */ + public List getTemplates() { + List cached = readCache(HcsSyncConstant.MASTER_CACHE_TEMPLATES, HcsTemplateVO.class); + if (cached != null) { + return cached; + } + return loadTemplates(); + } + + /** + * 获取合同分类列表(缓存优先,未命中全量拉取) + */ + public List getCategories() { + List cached = readCache(HcsSyncConstant.MASTER_CACHE_CATEGORIES, HcsCategoryVO.class); + if (cached != null) { + return cached; + } + return loadCategories(); + } + + /** + * 获取币种列表(缓存优先,未命中全量拉取) + */ + public List getCurrencies() { + List cached = readCache(HcsSyncConstant.MASTER_CACHE_CURRENCIES, HcsCurrencyVO.class); + if (cached != null) { + return cached; + } + return loadCurrencies(); + } + + /** + * 强制刷新三类主数据缓存(管理端入口),并对 template-mapping 做存在性校验 + * + * @return 刷新结果汇总 + */ + public String refreshAll() { + int templateCount = loadTemplates().size(); + int categoryCount = loadCategories().size(); + int currencyCount = loadCurrencies().size(); + validateTemplateMapping(); + String summary = String.format("HCS主数据缓存已刷新:模板 %d 条、分类 %d 条、币种 %d 条", templateCount, categoryCount, currencyCount); + log.info(summary); + return summary; + } + + /** + * 全量拉取合同模板并缓存 + */ + private List loadTemplates() { + HcsPageQueryDTO query = baseQuery(); + List rows = HcsPageUtil.queryAllPages(offset -> { + query.setOffset(offset); + return hcsClient.templateList(query).getData(); + }); + writeCache(HcsSyncConstant.MASTER_CACHE_TEMPLATES, rows); + log.info("HCS合同模板列表已缓存,共 {} 条", rows.size()); + return rows; + } + + /** + * 全量拉取合同分类并缓存 + */ + private List loadCategories() { + HcsPageQueryDTO query = baseQuery(); + List rows = HcsPageUtil.queryAllPages(offset -> { + query.setOffset(offset); + return hcsClient.categoryList(query).getData(); + }); + writeCache(HcsSyncConstant.MASTER_CACHE_CATEGORIES, rows); + log.info("HCS合同分类列表已缓存,共 {} 条", rows.size()); + return rows; + } + + /** + * 全量拉取币种并缓存 + */ + private List loadCurrencies() { + HcsPageQueryDTO query = baseQuery(); + List rows = HcsPageUtil.queryAllPages(offset -> { + query.setOffset(offset); + return hcsClient.currencyList(query).getData(); + }); + writeCache(HcsSyncConstant.MASTER_CACHE_CURRENCIES, rows); + log.info("HCS币种列表已缓存,共 {} 条", rows.size()); + return rows; + } + + /** + * 校验 contract.template-mapping 中的模板ID是否存在于 HCS 模板列表(§9-U7,仅告警不阻断) + */ + private void validateTemplateMapping() { + Map mapping = hcsProperties.getContract().getTemplateMapping(); + if (mapping.isEmpty()) { + log.warn("HCS合同模板映射(thirdParty.hcs.contract.template-mapping)未配置,合同推送将失败(§9-U7 待合规方提供模板ID清单)"); + return; + } + List templateIds = getTemplates().stream().map(HcsTemplateVO::getFdId).toList(); + mapping.forEach((category, templateId) -> { + if (StringUtil.isNotBlank(templateId) && !templateIds.contains(templateId)) { + log.warn("HCS合同模板映射校验告警:合同类别 [{}] 映射的模板ID [{}] 不在合规模板列表中", category, templateId); + } + }); + } + + /** + * 分页查询基础参数(columns 必填) + */ + private HcsPageQueryDTO baseQuery() { + HcsPageQueryDTO query = new HcsPageQueryDTO(); + query.setPageSize(PAGE_SIZE); + return query; + } + + /** + * 读缓存(JSON 字符串反序列化) + */ + private List readCache(String cacheKey, Class itemType) { + String json = bladeRedis.get(cacheKey); + if (StringUtil.isBlank(json)) { + return null; + } + return JSONUtil.toList(json, itemType); + } + + /** + * 写缓存(JSON 字符串 + 可配 TTL) + */ + private void writeCache(String cacheKey, List rows) { + bladeRedis.getValueOps().setIfAbsent(cacheKey, JSONUtil.toJsonStr(rows), + Duration.ofMinutes(hcsProperties.getMasterData().getTtlMinutes())); + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index a753f6b4..93f2fefb 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -112,6 +112,10 @@ public class HcsProperties { * 附件转传(C103-2)配置 */ private Attachment attachment = new Attachment(); + /** + * 主数据缓存(C103-6/7/12)配置 + */ + private MasterData masterData = new MasterData(); @Data public static class Push { @@ -252,4 +256,12 @@ public class HcsProperties { */ private String fileDownloadBase = ""; } + + @Data + public static class MasterData { + /** + * 模板/分类/币种列表缓存时长(分钟),启动/首次使用时拉取并缓存(设计文档 §5.9) + */ + private int ttlMinutes = 120; + } } diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 2345de68..db3628d9 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -144,3 +144,7 @@ thirdParty: transfer-enabled: ${HCS_ATTACHMENT_TRANSFER_ENABLED:true} # TMS 文件服务下载基址(拉取附件流用) file-download-base: ${HCS_ATTACHMENT_FILE_DOWNLOAD_BASE:} + # 主数据缓存(C103-6/7/12,启动/首次使用时拉取并缓存) + master-data: + # 缓存时长(分钟) + ttl-minutes: ${HCS_MASTER_DATA_TTL_MINUTES:120} From c34a5b5bc53fd82e3505a34059487a27a3ba1075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 22:51:42 +0800 Subject: [PATCH 005/124] =?UTF-8?q?feat:=20HCS=E9=A1=B9=E7=9B=AE=E7=AB=8B?= =?UTF-8?q?=E9=A1=B9=E5=90=8C=E6=AD=A5=E6=94=AF=E6=92=91=EF=BC=88C102-3?= =?UTF-8?q?=E5=88=A4=E9=87=8D/C102-1=E6=96=B0=E5=BB=BA/C102-2=E6=9B=B4?= =?UTF-8?q?=E6=96=B0/=E5=90=88=E8=A7=84fdId=E5=9B=9E=E5=A1=AB=E4=B8=8E?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E8=A1=A5=E5=81=BF=E5=9B=9E=E5=86=99=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsProjectSyncSupport.java | 309 ++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java new file mode 100644 index 00000000..6a162c95 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -0,0 +1,309 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsBpmOperationDTO; +import org.springblade.hcs.dto.HcsPageQueryDTO; +import org.springblade.hcs.dto.HcsPageVO; +import org.springblade.hcs.dto.HcsProjectAddDTO; +import org.springblade.hcs.dto.HcsProjectFormDataDTO; +import org.springblade.hcs.dto.HcsProjectPropsDTO; +import org.springblade.hcs.dto.HcsProjectUpdateDTO; +import org.springblade.hcs.dto.HcsProjectVO; +import org.springblade.hcs.dto.HcsRefVO; +import org.springblade.hcs.dto.HcsFormSaveVO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.dto.HcsSaveOptionDTO; +import org.springblade.hcs.dto.HcsUserRefVO; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springblade.system.cache.UserCache; +import org.springblade.system.pojo.entity.User; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ProjectApplyMapper; +import org.springblade.transport.pojo.entity.ProjectApply; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * HCS 项目立项(C102)同步支撑组件(设计文档 §5.1) + *

+ * 触发与链路:审批通过(approved)→ C102-1 新建;变更审批通过(change_approved,hcs_fd_id 已存在)→ C102-2 更新。 + * 推送前判重:C102-3 conditions={"fd_num": projectCode},命中则直接回填 fdId 置 synced(跳过新建,§9-U4 查询能力联调确认)。 + * 失败不在此回写,由调用方(HcsPushTask/手动端点)统一 {@link #markFailed} 落 failed 状态进补偿重试。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsProjectSyncSupport { + + /** + * TMS 万元 → HCS 元换算倍率 + */ + private static final BigDecimal WAN_TO_YUAN = BigDecimal.valueOf(10000); + + private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; + private final ProjectApplyMapper projectApplyMapper; + + /** + * 推送项目立项到 HCS:判重 → 新建(C102-1)/ 更新(C102-2)→ 回填合规 fdId 置 synced + * + * @param projectApply 项目立项单(approvalStatus 须为 approved/change_approved) + * @return 推送结果描述(供任务汇总与 hcs_sync_msg 落库) + */ + public String pushProject(ProjectApply projectApply) { + // 首推先判重(C102-3),命中直接回填跳过新建;已有合规ID(变更单)走更新 + if (StringUtil.isBlank(projectApply.getHcsFdId())) { + String existFdId = findExistFdId(projectApply); + if (StringUtil.isNotBlank(existFdId)) { + markSynced(projectApply, existFdId, "判重命中,回填已有合规项目ID"); + return "判重命中,回填已有合规项目ID"; + } + String fdId = addProject(projectApply); + markSynced(projectApply, fdId, "C102-1 项目立项新建成功"); + return "C102-1 项目立项新建成功"; + } + updateProject(projectApply); + markSynced(projectApply, projectApply.getHcsFdId(), "C102-2 项目立项更新成功"); + return "C102-2 项目立项更新成功"; + } + + /** + * C102-1 项目立项新建,返回合规项目 fdId + */ + private String addProject(ProjectApply projectApply) { + String operatorLoginName = requireLoginName(projectApply, "C102-1"); + HcsProjectAddDTO param = new HcsProjectAddDTO(); + + HcsBpmOperationDTO bpmOperation = new HcsBpmOperationDTO(); + // 操作类型:固定 drafter_submit(以起草人身份直接提交流程) + bpmOperation.setOperationType("drafter_submit"); + // 【必填】立项表单模板编码:配置 thirdParty.hcs.project.template-code(环境值,§9-U9) + bpmOperation.setTemplateCode(requireTemplateCode()); + param.setBpmOperation(bpmOperation); + // 是否校验权限:接口调用固定 false + param.setCheckAuth(false); + // 【必填】当前操作人:项目经办人登录名(§9-U2 登录名同源性联调确认) + param.setCurUser(HcsUserRefVO.ofLoginName(operatorLoginName)); + param.setFormData(buildFormData(projectApply, null)); + HcsSaveOptionDTO saveOption = new HcsSaveOptionDTO(); + // saveDraft=false 直接提交 + saveOption.setSaveDraft(false); + param.setSaveOption(saveOption); + + log.info("HCS项目立项推送开始:{}(C102-1 新建)", projectApply.getProjectCode()); + HcsResult result = hcsClient.projectAdd(param); + if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdId())) { + log.error("HCS项目立项新建失败响应:{},projectCode={}", result == null ? "无响应" : result.getMsg(), projectApply.getProjectCode()); + throw new HcsException("C102-1 项目立项新建失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return result.getData().getFdId(); + } + + /** + * C102-2 项目立项更新(入参同新建,去掉 bpmOperation/saveOption,formData.fdId 必填) + */ + private void updateProject(ProjectApply projectApply) { + String operatorLoginName = requireLoginName(projectApply, "C102-2"); + HcsProjectUpdateDTO param = new HcsProjectUpdateDTO(); + // 是否校验权限:接口调用固定 false + param.setCheckAuth(false); + // 【必填】当前操作人:项目经办人登录名 + param.setCurUser(HcsUserRefVO.ofLoginName(operatorLoginName)); + // 更新必须携带合规项目 fdId + param.setFormData(buildFormData(projectApply, projectApply.getHcsFdId())); + + log.info("HCS项目立项推送开始:{}(C102-2 更新)", projectApply.getProjectCode()); + HcsResult result = hcsClient.projectUpdate(param); + if (result == null || !result.isSuccess()) { + log.error("HCS项目立项更新失败响应:{},projectCode={}", result == null ? "无响应" : result.getMsg(), projectApply.getProjectCode()); + throw new HcsException("C102-2 项目立项更新失败:" + (result == null ? "响应为空" : result.getMsg())); + } + } + + /** + * 组装项目立项 formData(新建/更新共用,字段标注照 §3.4 规范,映射表见设计文档 §5.1) + */ + private HcsProjectFormDataDTO buildFormData(ProjectApply projectApply, String fdId) { + HcsProjectFormDataDTO formData = new HcsProjectFormDataDTO(); + // 合规项目 fdId(C102-2 更新必填,C102-1 不传) + formData.setFdId(fdId); + HcsProjectPropsDTO props = new HcsProjectPropsDTO(); + // 【必填】项目名称:ProjectApply.projectName + props.setFdProName(projectApply.getProjectName()); + // 项目简称:ProjectApply.projectShortName + props.setFdProSimpleName(projectApply.getProjectShortName()); + // 【必填】项目编号:ProjectApply.projectCode(判重候选键) + props.setFdNum(projectApply.getProjectCode()); + // 创建单位:TMS 开题部门名称(HCS 组织 fdId 与 TMS 不同源,先传名称,§9-U2) + props.setFdCreatorUnit(HcsRefVO.ofName(projectApply.getBusinessDeptName())); + // 项目负责人:负责人登录名 {fdLoginName}(§9-U2) + props.setFdHead(resolveUserRef(projectApply.getPrincipalUserId())); + // 承接部门:TMS 承接部门名称(同 fd_creator_unit 先传名称) + props.setFdTakerDept(HcsRefVO.ofName(projectApply.getUndertakeDeptName())); + // 承接人:项目经办人登录名 {fdLoginName} + props.setFdTaker(resolveUserRef(projectApply.getHandlerUserId())); + // 付款额度:TMS fundLimit(万元)× 10000 转 HCS 元 + props.setFdPayLimit(toYuan(projectApply.getFundLimit())); + // 开票额度:TMS receivableLimit(万元)× 10000 转 HCS 元 + props.setFdOutInvoiceLimit(toYuan(projectApply.getReceivableLimit())); + // 项目建设内容:ProjectApply.situationRemark + props.setFdProContent(projectApply.getSituationRemark()); + // 是否可用:固定 true + props.setFdIsAvailable(true); + // 可用单位列表:与创建单位一致,先传名称 + props.setFdAvailUnits(List.of(HcsRefVO.ofName(projectApply.getBusinessDeptName()))); + // 结算类型:TMS settlementMode 原值(字典映射待联调,§9-U3) + props.setFdSettlementType(projectApply.getSettlementMode()); + // 计划保证金:TMS fundDemand(万元)× 10000 转 HCS 元(变更映射曾名"履约保证金",语义联调确认) + props.setFdProPlanDeposit(toYuan(projectApply.getFundDemand())); + // 是否自营项目:一期固定 "1"(联调确认) + props.setFdIsSelfPro("1"); + // TODO 待确认:项目收入目标 fd_pro_income_goal,TMS 无直接对应字段,一期不传(§5.1) + // 金蝶同步状态:固定 "1" + props.setFdKingdeeSyncStatus("1"); + // 来源标识:fd_sources,配置 thirdParty.hcs.src-system(约定值 TMS,D14) + props.setFdSources(hcsProperties.getSrcSystem()); + // 来源系统主键 ID:TMS 项目立项单主键(D14,对账/幂等候选键) + props.setFdKingdeeId(String.valueOf(projectApply.getId())); + // 创建人:项目经办人登录名(扫描推送无登录上下文,取单据承办人,§9-U2) + props.setFdCreator(resolveUserRef(projectApply.getHandlerUserId())); + formData.setDynamicProps(props); + return formData; + } + + /** + * C102-3 项目立项查询判重(conditions={"fd_num": projectCode},§9-U4 查询能力联调确认) + */ + private String findExistFdId(ProjectApply projectApply) { + HcsPageQueryDTO query = new HcsPageQueryDTO(); + // C102-3 入参 columns 用下划线字段名 + query.setColumns(List.of("fd_id", "fd_num")); + // 判重条件:项目编号精确匹配 + query.setConditions(Map.of("fd_num", Objects.toString(projectApply.getProjectCode(), ""))); + query.setOffset(0); + query.setPageSize(10); + query.setSorts(Map.of("fd_create_time", "desc")); + // 查询需携带当前操作人(复用单据承办人登录名) + query.setCurUser(HcsUserRefVO.ofLoginName(requireLoginName(projectApply, "C102-3"))); + HcsResult> result = hcsClient.projectList(query); + if (result == null || !result.isSuccess()) { + log.error("HCS项目立项判重查询失败响应:{},projectCode={}", result == null ? "无响应" : result.getMsg(), projectApply.getProjectCode()); + throw new HcsException("C102-3 项目立项判重查询失败:" + (result == null ? "响应为空" : result.getMsg())); + } + HcsPageVO page = result.getData(); + if (page == null || page.getContent() == null || page.getContent().isEmpty()) { + return null; + } + return page.getContent().get(0).getFdId(); + } + + /** + * 回填合规 fdId 并置 synced + */ + public void markSynced(ProjectApply projectApply, String fdId, String message) { + projectApply.setHcsFdId(fdId); + projectApply.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); + projectApply.setHcsRetryCount(0); + projectApply.setHcsSyncTime(LocalDateTime.now()); + projectApply.setHcsSyncMsg(message); + projectApplyMapper.updateById(projectApply); + log.info("HCS项目立项推送成功:projectCode={},fdId={},{}", projectApply.getProjectCode(), fdId, message); + } + + /** + * 推送失败回写:failed + 重试次数+1 + 失败原因(供扫描任务按 hcs_retry_count < max-retry 自动补偿) + */ + public void markFailed(ProjectApply projectApply, String message) { + projectApply.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); + projectApply.setHcsRetryCount(projectApply.getHcsRetryCount() == null ? 1 : projectApply.getHcsRetryCount() + 1); + projectApply.setHcsSyncTime(LocalDateTime.now()); + projectApply.setHcsSyncMsg(message); + projectApplyMapper.updateById(projectApply); + log.error("HCS项目立项推送失败:projectCode={},retryCount={},{}", projectApply.getProjectCode(), projectApply.getHcsRetryCount(), message); + } + + /** + * 立项表单模板编码(未配置直接失败,提示配置项,§9-U9) + */ + private String requireTemplateCode() { + String templateCode = hcsProperties.getProject().getTemplateCode(); + if (StringUtil.isBlank(templateCode)) { + throw new HcsException("HCS项目立项推送失败,立项表单模板编码未配置(thirdParty.hcs.project.template-code,§9-U9)"); + } + return templateCode; + } + + /** + * 项目经办人登录名(curUser 必填,解析不到直接失败并提示) + */ + private String requireLoginName(ProjectApply projectApply, String scene) { + String loginName = resolveLoginName(projectApply.getHandlerUserId()); + if (StringUtil.isBlank(loginName)) { + throw new HcsException("HCS项目立项推送失败(" + scene + "),经办人登录名解析不到(handlerUserId=" + projectApply.getHandlerUserId() + ",§9-U2)"); + } + return loginName; + } + + /** + * 按用户ID 解析登录名引用(查不到返回 null,调用方按字段必填性兜底) + */ + private HcsUserRefVO resolveUserRef(Long userId) { + String loginName = resolveLoginName(userId); + return StringUtil.isBlank(loginName) ? null : HcsUserRefVO.ofLoginName(loginName); + } + + /** + * 按用户ID 解析登录名(UserCache 惯例) + */ + private String resolveLoginName(Long userId) { + if (userId == null) { + return null; + } + User user = UserCache.getUser(userId); + return user == null ? null : user.getAccount(); + } + + /** + * TMS 万元 → HCS 元 + */ + private BigDecimal toYuan(BigDecimal wanAmount) { + return wanAmount == null ? null : wanAmount.multiply(WAN_TO_YUAN); + } +} From 75bbd829c7068450e475163c2b6aafaee53fee69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 22:54:45 +0800 Subject: [PATCH 006/124] =?UTF-8?q?feat:=20HCS=E5=90=88=E5=90=8C=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=94=AF=E6=92=91=EF=BC=88C101-1=E9=A3=8E=E9=99=A9?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E7=95=99=E7=97=95/C103-3=E5=88=A4=E9=87=8D/C?= =?UTF-8?q?103-2=E9=99=84=E4=BB=B6=E8=BD=AC=E4=BC=A0/C103-1=E5=8F=91?= =?UTF-8?q?=E8=B5=B7=E4=B8=8EC103-11=E6=9B=B4=E6=96=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsContractSyncSupport.java | 487 ++++++++++++++++++ 1 file changed, 487 insertions(+) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java new file mode 100644 index 00000000..734f0e3d --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -0,0 +1,487 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsContractDraftDTO; +import org.springblade.hcs.dto.HcsContractDraftVO; +import org.springblade.hcs.dto.HcsContractFieldJsonDTO; +import org.springblade.hcs.dto.HcsContractVO; +import org.springblade.hcs.dto.HcsPageQueryDTO; +import org.springblade.hcs.dto.HcsPageVO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.dto.HcsRiskQueryDTO; +import org.springblade.hcs.dto.HcsRiskVO; +import org.springblade.hcs.dto.HcsSignerDTO; +import org.springblade.hcs.dto.HcsUserRefVO; +import org.springblade.hcs.dto.HcsXformFieldDTO; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springblade.system.cache.UserCache; +import org.springblade.system.pojo.entity.User; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.CustomerArchiveMapper; +import org.springblade.transport.mapper.HcsContractCheckLogMapper; +import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.CustomerArchive; +import org.springblade.transport.pojo.entity.HcsContractCheckLog; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * HCS 合同同步支撑组件(C103-1 发起 / C103-11 更新,设计文档 §5.2) + *

+ * 扫描任务按序执行:① 客商风险校验(可配开关,黑名单阻断)→ ② 附件转传(挂载点待 §9-U8 确认,先转传缓存)→ + * ③ C103-3 判重(§9-U4 查询能力联调确认)→ ④ C103-1 起草 / 变更单 C103-11 更新(§9-U5 定位方式待联调)→ + * ⑤ 履约规则 C103-9(P2 接线)。 + * 结果留痕:风险校验写 blade_hcs_check_log 与合同 hcs_risk_* 字段;推送结果回填 hcs_fd_id/hcs_sync_status。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsContractSyncSupport { + + /** + * 合同金额等 xformFields 值一律字符串传值 + */ + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + /** + * C101-1 黑名单状态取值(示例 no 表示非黑名单,§9-U3 字典值联调确认) + */ + private static final String BLACK_STATUS_YES = "yes"; + + private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; + private final ContractManageMapper contractManageMapper; + private final CustomerArchiveMapper customerArchiveMapper; + private final HcsContractCheckLogMapper hcsContractCheckLogMapper; + private final HcsAttachmentSupport hcsAttachmentSupport; + + /** + * 推送合同到 HCS:风险校验 → 附件转传 → 判重 → 起草/更新 → 回填合规 fdId 置 synced + * + * @param contractManage 合同单(approvalStatus 须为 approved/change_approved) + * @return 推送结果描述(供任务汇总与 hcs_sync_msg 落库) + */ + public String pushContract(ContractManage contractManage) { + // ① 客商风险校验(可配开关),黑名单且 block-blacklist=true 时阻断推送 + if (hcsProperties.getContract().isRequireRiskCheck()) { + checkRelativeRisk(contractManage); + } + // ② 附件转传(先转传并缓存合规附件ID,C103-1 挂载方式待 §9-U8 确认后接线) + transferAttachmentsIfEnabled(contractManage); + // ③④ 首推判重后起草(C103-1);已有合规ID(变更单)走更新(C103-11) + if (StringUtil.isBlank(contractManage.getHcsFdId())) { + String existFdId = findExistFdId(contractManage); + if (StringUtil.isNotBlank(existFdId)) { + markSynced(contractManage, existFdId, "判重命中,回填已有合规合同ID"); + return "判重命中,回填已有合规合同ID"; + } + String fdContractId = draftContract(contractManage); + // TODO 待联调(P2):履约规则 C103-9 行级同步随合同链路执行(§5.3,依赖 blade_contract_exe_stage 表) + markSynced(contractManage, fdContractId, "C103-1 合同发起成功"); + return "C103-1 合同发起成功"; + } + updateContract(contractManage); + markSynced(contractManage, contractManage.getHcsFdId(), "C103-11 合同更新成功"); + return "C103-11 合同更新成功"; + } + + /** + * C101-1 客商风险校验:甲乙双方各查一次,留痕 check_log 与合同 hcs_risk_* 字段,黑名单阻断 + */ + private void checkRelativeRisk(ContractManage contractManage) { + RiskResult riskPartyA = queryRisk(contractManage, "甲方", contractManage.getPartyA()); + RiskResult riskPartyB = queryRisk(contractManage, "乙方", contractManage.getPartyB()); + // 风险等级:甲乙双方取先查到的非空值(无法量化比较,留痕双方原始值,联调后细化) + String riskLevel = StringUtil.isNotBlank(riskPartyA.riskLevel()) ? riskPartyA.riskLevel() : riskPartyB.riskLevel(); + // 黑名单状态:任一方黑名单即为是 + boolean blacklist = riskPartyA.blacklist() || riskPartyB.blacklist(); + contractManage.setHcsRiskLevel(riskLevel); + contractManage.setHcsBlackStatus(blacklist ? BLACK_STATUS_YES : "no"); + contractManage.setHcsRiskTime(LocalDateTime.now()); + contractManageMapper.updateById(contractManage); + log.info("HCS合同风险校验完成:contractNo={},甲方[{}={}/{}],乙方[{}={}/{}]", + contractManage.getContractNo(), contractManage.getPartyA(), riskPartyA.blackStatus(), riskPartyA.riskLevel(), + contractManage.getPartyB(), riskPartyB.blackStatus(), riskPartyB.riskLevel()); + if (blacklist && hcsProperties.getRisk().isBlockBlacklist()) { + String message = "客商黑名单,禁止推送(甲方[" + riskPartyA.blackStatus() + "]乙方[" + riskPartyB.blackStatus() + "])"; + log.error("HCS合同推送被风险校验阻断:contractNo={},{}", contractManage.getContractNo(), message); + throw new HcsException(message); + } + } + + /** + * 查询单方客商风险:按名称反查客商编号(§9-U6 编码体系联调确认),反查不到记 skip 留痕不阻断 + */ + private RiskResult queryRisk(ContractManage contractManage, String standing, String partyName) { + String customerCode = queryCustomerCode(partyName); + if (StringUtil.isBlank(customerCode)) { + writeCheckLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, + standing + "方[" + partyName + "]反查不到客商编号,跳过风险校验(§9-U6)", null); + return new RiskResult(null, null, false); + } + HcsRiskQueryDTO param = new HcsRiskQueryDTO(); + // 【必填】客商编号:按甲乙方名称反查 CustomerArchive 客商编码(§9-U6) + param.setFdNumber(customerCode); + HcsResult result = hcsClient.getRelativeRisk(param); + if (result == null || !result.isSuccess()) { + log.error("HCS客商风险查询失败响应:{},contractNo={},standing={},fdNumber={}", + result == null ? "无响应" : result.getMsg(), contractManage.getContractNo(), standing, customerCode); + throw new HcsException("C101-1 客商风险查询失败:" + (result == null ? "响应为空" : result.getMsg())); + } + HcsRiskVO risk = result.getData(); + String blackStatus = risk == null ? null : risk.getFdBlackStatus(); + String riskLevel = risk == null ? null : risk.getFdRiskLevel(); + boolean blacklist = BLACK_STATUS_YES.equalsIgnoreCase(blackStatus); + writeCheckLog(contractManage, blacklist ? HcsSyncConstant.CHECK_RESULT_FAIL : HcsSyncConstant.CHECK_RESULT_PASS, + standing + "方[" + partyName + "]黑名单=" + blackStatus + ",风险等级=" + riskLevel, result.getTraceId()); + return new RiskResult(blackStatus, riskLevel, blacklist); + } + + /** + * C103-3 合同列表判重(conditions={"fdNumber": contractNo},§9-U4 查询能力联调确认) + */ + private String findExistFdId(ContractManage contractManage) { + HcsPageQueryDTO query = new HcsPageQueryDTO(); + query.setColumns(List.of("fdId", "fdNumber")); + // 判重条件:合同编号精确匹配 + query.setConditions(Map.of("fdNumber", Objects.toString(contractManage.getContractNo(), ""))); + query.setOffset(0); + query.setPageSize(10); + HcsResult> result = hcsClient.contractList(query); + if (result == null || !result.isSuccess()) { + log.error("HCS合同判重查询失败响应:{},contractNo={}", result == null ? "无响应" : result.getMsg(), contractManage.getContractNo()); + throw new HcsException("C103-3 合同判重查询失败:" + (result == null ? "响应为空" : result.getMsg())); + } + HcsPageVO page = result.getData(); + if (page == null || page.getContent() == null || page.getContent().isEmpty()) { + return null; + } + return page.getContent().get(0).getFdId(); + } + + /** + * C103-1 合同发起,返回合规合同 fdContractId + */ + private String draftContract(ContractManage contractManage) { + HcsContractDraftDTO param = buildDraftParam(contractManage); + log.info("HCS合同推送开始:{}(C103-1 发起)", contractManage.getContractNo()); + HcsResult result = hcsClient.contractDraft(param); + return validateDraftResult(contractManage, result); + } + + /** + * C103-11 合同更新(入参同发起;TODO 待联调(§9-U5):HCS 侧如何定位已有合同 v4 未说明) + */ + private void updateContract(ContractManage contractManage) { + HcsContractDraftDTO param = buildDraftParam(contractManage); + log.info("HCS合同推送开始:{}(C103-11 更新,§9-U5 定位方式待联调)", contractManage.getContractNo()); + HcsResult result = hcsClient.contractUpdate(param); + if (result == null || !result.isSuccess()) { + log.error("HCS合同更新失败响应:{},contractNo={}", result == null ? "无响应" : result.getMsg(), contractManage.getContractNo()); + throw new HcsException("C103-11 合同更新失败:" + (result == null ? "响应为空" : result.getMsg())); + } + } + + /** + * 组装 C103-1/C103-11 入参(字段标注照 §3.4 规范,映射表见设计文档 §5.2) + */ + private HcsContractDraftDTO buildDraftParam(ContractManage contractManage) { + HcsContractDraftDTO param = new HcsContractDraftDTO(); + // 【必填】合同模板ID:template-mapping[contractCategory](§9-U7 待合规方提供模板ID清单) + param.setFdTemplateId(requireTemplateId(contractManage)); + // 【必填】外部系统标识:fd_sources,配置 thirdParty.hcs.src-system(D14) + param.setFdOuterSystem(hcsProperties.getSrcSystem()); + // 【必填】操作人登录名:合同承办人登录名(§9-U2) + param.setFdLoginName(requireLoginName(contractManage)); + // 【必填】保存类型:submit(提交) + param.setSaveType("submit"); + HcsContractFieldJsonDTO fieldJson = new HcsContractFieldJsonDTO(); + fieldJson.setXformFields(buildXformFields(contractManage)); + // 相对方(签署方):甲方/乙方,编号按名称反查 CustomerArchive(§9-U6) + fieldJson.setSigner(buildSigners(contractManage)); + param.setFdFieldJson(fieldJson); + return param; + } + + /** + * xformFields 模板字段(字段名/中文名取自《桂物合同集成接口逻辑梳理》§5.1 合同字段说明) + */ + private List buildXformFields(ContractManage contractManage) { + List fields = new ArrayList<>(); + // 【必填】合同编号:ContractManage.contractNo + fields.add(field("fdNumber", "合同编号", contractManage.getContractNo())); + fields.add(field("CONTRACT_NO", "合同编号", contractManage.getContractNo())); + // 【必填】合同标题:ContractManage.contractName + fields.add(field("fdSubject", "合同标题", contractManage.getContractName())); + fields.add(field("CONTRACT_NAME", "合同名称", contractManage.getContractName())); + // 【必填】合同金额:contractAmount(字符串传值) + fields.add(field("fdAmount", "合同金额", toPlainString(contractManage.getContractAmount()))); + fields.add(field("AMOUNT", "合同金额", toPlainString(contractManage.getContractAmount()))); + // 币种:TMS 结算币种经 currency-name-mapping 映射(默认 RMB→人民币,照金蝶惯例) + fields.add(field("fdCurrencyId", "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); + fields.add(field("CURRENCY", "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); + // 合同结算类型:settlement-type-mapping[settlementMode](映射到"付款/收款"待联调,§9-U3,未配置不传) + String settlementType = hcsProperties.getContract().getSettlementTypeMapping().get(contractManage.getSettlementMode()); + if (StringUtil.isNotBlank(settlementType)) { + fields.add(field("fdSettlementType", "合同结算类型", settlementType)); + } else { + log.warn("HCS合同结算类型映射缺失:settlementMode=[{}] 不在 contract.settlement-type-mapping,fdSettlementType 不传(§9-U3)", contractManage.getSettlementMode()); + } + // 特批流程:fdSepcailContract 固定 false(原文拼写笔误必须沿用,D15,配置项预留) + fields.add(field("fdSepcailContract", "特批流程", hcsProperties.getContract().isSpecialContractEnabled() ? "true" : "false")); + // 合同类型:ContractManage.contractCategory + fields.add(field("CONTRACT_TYPE", "合同类型", contractManage.getContractCategory())); + // 甲方名称/乙方名称:TMS 存名称字符串 + fields.add(field("PARTY_A", "甲方名称", contractManage.getPartyA())); + fields.add(field("PARTY_B", "乙方名称", contractManage.getPartyB())); + // 【必填】签订日期:signDate(fdType=timestamp) + fields.add(timestampField("SIGN_DATE", "签订日期", contractManage.getSignDate())); + // 预计开始/结束时间:startDate/endDate(fdType=timestamp) + fields.add(timestampField("fdEstimateStartTime", "预计开始时间", contractManage.getStartDate())); + fields.add(timestampField("fdEstimateEndTime", "预计结束时间", contractManage.getEndDate())); + // 创建时间:createTime(fdType=timestamp) + fields.add(timestampField("CREATE_TIME", "创建时间", contractManage.getCreateTime())); + fields.add(timestampField("fdCreateTime", "创建时间", contractManage.getCreateTime())); + // 同步时间:推送时刻(fdType=timestamp) + fields.add(timestampField("fd_syn_time", "同步时间", LocalDateTime.now())); + // 承办人名称:handlerUserName + fields.add(field("CREATE_USER_NAME", "承办人名称", contractManage.getHandlerUserName())); + // TODO 待确认:合同状态 CONTRACT_STATUS,TMS 无直接对应,是否必传联调确认(§9-U3),一期不传 + return fields; + } + + /** + * signer 相对方(签署方):甲/乙双方,fdType(inner/外部)判定规则待联调(§9-U6)暂不传 + */ + private List buildSigners(ContractManage contractManage) { + List signers = new ArrayList<>(); + // 甲方相对方:fdStanding=甲,编号按名称反查(反查不到留空,§9-U6) + signers.add(signer("甲", contractManage.getPartyA())); + // 乙方相对方:fdStanding=乙 + signers.add(signer("乙", contractManage.getPartyB())); + return signers; + } + + /** + * 单个相对方 + */ + private HcsSignerDTO signer(String fdStanding, String partyName) { + HcsSignerDTO signer = new HcsSignerDTO(); + // 签署地位:甲 / 乙 + signer.setFdStanding(fdStanding); + // 相对方名称:TMS 甲乙方名称 + signer.setFdName(partyName); + // 相对方编号:按名称反查 CustomerArchive 客商编码,反查不到留空(§9-U6) + signer.setFdNumber(queryCustomerCode(partyName)); + return signer; + } + + /** + * 附件转传(可配开关):合同主文件 approved=true + 其它附件,合规附件ID 走映射缓存 + */ + private void transferAttachmentsIfEnabled(ContractManage contractManage) { + if (!hcsProperties.getAttachment().isTransferEnabled()) { + return; + } + List attachmentFdIds = hcsAttachmentSupport.transferContractAttachments( + contractManage.getContractFileJson(), contractManage.getAttachmentsJson(), requireLoginName(contractManage)); + // TODO 待联调(§9-U8):C103-1 未定义附件字段,转传后的合规附件ID 暂存映射缓存,挂载方式确认后接线 + log.info("HCS合同附件转传完成:contractNo={},共 {} 个附件(挂载点待 §9-U8 确认)", contractManage.getContractNo(), attachmentFdIds.size()); + } + + /** + * 校验 C103-1 返回并取合同 fdContractId(必须持久化) + */ + private String validateDraftResult(ContractManage contractManage, HcsResult result) { + if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdContractId())) { + log.error("HCS合同发起失败响应:{},contractNo={}", result == null ? "无响应" : result.getMsg(), contractManage.getContractNo()); + throw new HcsException("C103-1 合同发起失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return result.getData().getFdContractId(); + } + + /** + * 回填合规 fdId 并置 synced + */ + public void markSynced(ContractManage contractManage, String fdId, String message) { + contractManage.setHcsFdId(fdId); + contractManage.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); + contractManage.setHcsRetryCount(0); + contractManage.setHcsSyncTime(LocalDateTime.now()); + contractManage.setHcsSyncMsg(message); + contractManageMapper.updateById(contractManage); + log.info("HCS合同推送成功:contractNo={},fdContractId={},{}", contractManage.getContractNo(), fdId, message); + } + + /** + * 推送失败回写:failed + 重试次数+1 + 失败原因 + */ + public void markFailed(ContractManage contractManage, String message) { + contractManage.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); + contractManage.setHcsRetryCount(contractManage.getHcsRetryCount() == null ? 1 : contractManage.getHcsRetryCount() + 1); + contractManage.setHcsSyncTime(LocalDateTime.now()); + contractManage.setHcsSyncMsg(message); + contractManageMapper.updateById(contractManage); + log.error("HCS合同推送失败:contractNo={},retryCount={},{}", contractManage.getContractNo(), contractManage.getHcsRetryCount(), message); + } + + /** + * 模板映射(template-mapping[contractCategory],未配置/无映射直接失败提示,§9-U7) + */ + private String requireTemplateId(ContractManage contractManage) { + Map mapping = hcsProperties.getContract().getTemplateMapping(); + String templateId = mapping.get(contractManage.getContractCategory()); + if (StringUtil.isBlank(templateId)) { + throw new HcsException("HCS合同推送失败,合同类别 [" + contractManage.getContractCategory() + + "] 未配置合规模板ID(thirdParty.hcs.contract.template-mapping,§9-U7)"); + } + return templateId; + } + + /** + * 合同承办人登录名(fdLoginName 必填) + */ + private String requireLoginName(ContractManage contractManage) { + if (contractManage.getHandlerUserId() == null) { + throw new HcsException("HCS合同推送失败,合同承办人未维护(contractNo=" + contractManage.getContractNo() + ")"); + } + User user = UserCache.getUser(contractManage.getHandlerUserId()); + if (user == null || StringUtil.isBlank(user.getAccount())) { + throw new HcsException("HCS合同推送失败,承办人登录名解析不到(handlerUserId=" + contractManage.getHandlerUserId() + ",§9-U2)"); + } + return user.getAccount(); + } + + /** + * 按名称反查客商编码(照 KingdeeApBillSyncSupport#queryCustomerCode 惯例,查不到返回 null) + */ + private String queryCustomerCode(String partyName) { + if (StringUtil.isBlank(partyName)) { + return null; + } + CustomerArchive customerArchive = customerArchiveMapper.selectOne(Wrappers.lambdaQuery() + .and(wrapper -> wrapper.eq(CustomerArchive::getFullName, partyName).or().eq(CustomerArchive::getShortName, partyName)) + .eq(CustomerArchive::getIsDeleted, 0) + .last("limit 1")); + return customerArchive == null ? null : customerArchive.getCustomerCode(); + } + + /** + * 币种名称映射:currency-name-mapping 命中取映射值,未命中传原值并告警(§9-U3) + */ + private String mapCurrencyName(String currency) { + if (StringUtil.isBlank(currency)) { + return null; + } + return hcsProperties.getContract().getCurrencyNameMapping().getOrDefault(currency, currency); + } + + /** + * 普通模板字段(字符串传值) + */ + private HcsXformFieldDTO field(String name, String label, String value) { + HcsXformFieldDTO field = new HcsXformFieldDTO(); + field.setName(name); + field.setLabel(label); + field.setValue(value); + return field; + } + + /** + * 时间模板字段(fdType=timestamp,日期传 yyyy-MM-dd,时间传 yyyy-MM-dd HH:mm:ss) + */ + private HcsXformFieldDTO timestampField(String name, String label, Object value) { + if (value == null) { + return field(name, label, null); + } + String text; + if (value instanceof LocalDate localDate) { + text = localDate.format(DATE_FORMATTER); + } else if (value instanceof LocalDateTime localDateTime) { + text = localDateTime.format(DATETIME_FORMATTER); + } else { + // BaseEntity.createTime 为 Date 类型 + text = DATETIME_FORMATTER.format(((java.util.Date) value).toInstant() + .atZone(java.time.ZoneId.systemDefault()).toLocalDateTime()); + } + HcsXformFieldDTO field = field(name, label, text); + // 时间字段需带 fdType=timestamp + field.setFdType("timestamp"); + return field; + } + + /** + * 金额字符串(空值安全) + */ + private String toPlainString(BigDecimal amount) { + return amount == null ? null : amount.toPlainString(); + } + + /** + * 风险校验留痕(blade_hcs_check_log,异常不影响主流程) + */ + private void writeCheckLog(ContractManage contractManage, String result, String msg, String traceId) { + try { + HcsContractCheckLog checkLog = new HcsContractCheckLog(); + checkLog.setTenantId(contractManage.getTenantId()); + checkLog.setBizType(HcsSyncConstant.BIZ_TYPE_CONTRACT); + checkLog.setBizId(contractManage.getId()); + checkLog.setCheckType(HcsSyncConstant.CHECK_TYPE_RISK); + checkLog.setResult(result); + checkLog.setMsg(msg); + checkLog.setTraceId(traceId); + checkLog.setCreateTime(LocalDateTime.now()); + hcsContractCheckLogMapper.insert(checkLog); + } catch (Exception exception) { + log.error("HCS风险校验留痕写入失败:contractNo={}", contractManage.getContractNo(), exception); + } + } + + /** + * 单方风险查询结果 + */ + private record RiskResult(String blackStatus, String riskLevel, boolean blacklist) { + } +} From eaab17b2200c407d5ed7cc02bab345d6f1f025a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 22:58:12 +0800 Subject: [PATCH 007/124] =?UTF-8?q?feat:=20HCS=E6=8E=A8=E9=80=81=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E4=B8=8E=E6=89=8B=E5=8A=A8=E7=AB=AF=E7=82=B9=EF=BC=88?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E6=89=AB=E6=8F=8F=E9=A6=96=E6=8E=A8/?= =?UTF-8?q?=E8=A1=A5=E5=81=BF+=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81?= =?UTF-8?q?=E3=80=81=E5=8D=95=E6=9D=A1=E9=87=8D=E6=8E=A8/=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=8E=A8=E9=80=81/=E4=B8=BB=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E7=AB=AF=E7=82=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HcsSyncController.java | 106 +++++++++++ .../support/hcs/HcsContractSyncSupport.java | 27 +++ .../support/hcs/HcsProjectSyncSupport.java | 27 +++ .../transport/task/HcsPushTask.java | 178 ++++++++++++++++++ 4 files changed, 338 insertions(+) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java new file mode 100644 index 00000000..8392512f --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -0,0 +1,106 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.controller; + +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.api.R; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.support.hcs.HcsContractSyncSupport; +import org.springblade.transport.support.hcs.HcsMasterDataSupport; +import org.springblade.transport.support.hcs.HcsProjectSyncSupport; +import org.springblade.transport.task.HcsPushTask; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * HCS 合规推送端点(设计文档 §5.0 手动入口) + *

+ * 前端列表页"推送合规/重推"按钮(照"同步金蝶"按钮模式): + * 单条重推重置 hcs_sync_status=unsynced 并清零重试计数后立即推送;批量端点复用定时扫描逻辑。 + * 排查推送问题以 hcs_sync_status/hcs_sync_msg 为准,不以审批日志为准(ADR-0001)。 + * + * @author Chill + */ +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping("hcs") +@Tag(name = "HCS合规推送", description = "HCS合规推送端点") +public class HcsSyncController { + + private final HcsPushTask hcsPushTask; + private final HcsProjectSyncSupport hcsProjectSyncSupport; + private final HcsContractSyncSupport hcsContractSyncSupport; + private final HcsMasterDataSupport hcsMasterDataSupport; + + /** + * 单条重推(bizType:project=项目立项 / contract=合同) + */ + @PostMapping("/sync/{bizType}/{id}") + @ApiOperationSupport(order = 1) + @Operation(summary = "单条推送/重推合规", description = "重置待同步状态后立即推送,bizType:project=项目立项、contract=合同") + public R repush(@Parameter(description = "业务类型", required = true) @PathVariable String bizType, + @Parameter(description = "单据ID", required = true) @PathVariable Long id) { + String result = switch (bizType) { + case HcsSyncConstant.BIZ_TYPE_PROJECT -> hcsProjectSyncSupport.repushProject(id); + case HcsSyncConstant.BIZ_TYPE_CONTRACT -> hcsContractSyncSupport.repushContract(id); + default -> throw new IllegalArgumentException("不支持的HCS推送业务类型:" + bizType); + }; + return R.data(result); + } + + /** + * 批量推送(bizType:project=项目立项 / contract=合同;复用定时扫描逻辑,单轮批量上限 push.batch-size) + */ + @PostMapping("/sync/{bizType}") + @ApiOperationSupport(order = 2) + @Operation(summary = "批量推送合规", description = "扫描待同步/待补偿单据推送一轮,bizType:project=项目立项、contract=合同") + public R pushBatch(@Parameter(description = "业务类型", required = true) @PathVariable String bizType) { + String result = switch (bizType) { + case HcsSyncConstant.BIZ_TYPE_PROJECT -> hcsPushTask.pushUnsyncedProjects(); + case HcsSyncConstant.BIZ_TYPE_CONTRACT -> hcsPushTask.pushUnsyncedContracts(); + default -> throw new IllegalArgumentException("不支持的HCS推送业务类型:" + bizType); + }; + return R.data(result); + } + + /** + * 刷新主数据缓存(C103-6 模板 / C103-7 分类 / C103-12 币种) + */ + @PostMapping("/master-data/refresh") + @ApiOperationSupport(order = 3) + @Operation(summary = "刷新HCS主数据缓存", description = "全量重拉模板/分类/币种列表并缓存,同时校验模板映射配置") + public R refreshMasterData() { + return R.data(hcsMasterDataSupport.refreshAll()); + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 734f0e3d..4b06fcf8 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -28,6 +28,7 @@ package org.springblade.transport.support.hcs; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsContractDraftDTO; @@ -342,6 +343,32 @@ public class HcsContractSyncSupport { return result.getData().getFdContractId(); } + /** + * 单条手动重推:重置为待同步并清零重试计数后立即推送(页面"推送合规/重推"按钮入口) + * + * @param id 合同单ID + * @return 推送结果描述 + */ + public String repushContract(Long id) { + ContractManage contractManage = contractManageMapper.selectById(id); + if (contractManage == null) { + throw new ServiceException("合同单不存在:" + id); + } + if (!List.of("approved", "change_approved").contains(contractManage.getApprovalStatus())) { + throw new ServiceException("仅审批通过的合同可推送合规(当前状态:" + contractManage.getApprovalStatus() + ")"); + } + contractManage.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); + contractManage.setHcsRetryCount(0); + contractManageMapper.updateById(contractManage); + try { + return pushContract(contractManage); + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "推送异常" : exception.getMessage(); + markFailed(contractManage, message); + throw new ServiceException("HCS合同推送失败:" + message); + } + } + /** * 回填合规 fdId 并置 synced */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index 6a162c95..52aefe9e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -28,6 +28,7 @@ package org.springblade.transport.support.hcs; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsBpmOperationDTO; @@ -234,6 +235,32 @@ public class HcsProjectSyncSupport { return page.getContent().get(0).getFdId(); } + /** + * 单条手动重推:重置为待同步并清零重试计数后立即推送(页面"推送合规/重推"按钮入口) + * + * @param id 项目立项单ID + * @return 推送结果描述 + */ + public String repushProject(Long id) { + ProjectApply projectApply = projectApplyMapper.selectById(id); + if (projectApply == null) { + throw new ServiceException("项目立项单不存在:" + id); + } + if (!List.of("approved", "change_approved").contains(projectApply.getApprovalStatus())) { + throw new ServiceException("仅审批通过的项目立项可推送合规(当前状态:" + projectApply.getApprovalStatus() + ")"); + } + projectApply.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); + projectApply.setHcsRetryCount(0); + projectApplyMapper.updateById(projectApply); + try { + return pushProject(projectApply); + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "推送异常" : exception.getMessage(); + markFailed(projectApply, message); + throw new ServiceException("HCS项目立项推送失败:" + message); + } + } + /** * 回填合规 fdId 并置 synced */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java new file mode 100644 index 00000000..896a3d21 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java @@ -0,0 +1,178 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.task; + +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.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.ProjectApplyMapper; +import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.ProjectApply; +import org.springblade.transport.support.hcs.HcsContractSyncSupport; +import org.springblade.transport.support.hcs.HcsProjectSyncSupport; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.util.List; +import java.util.UUID; + +/** + * HCS 合规推送定时扫描任务(设计文档 §5.0,ADR-0001) + *

+ * 审批代码零埋点:扫描只认 approvalStatus=approved/change_approved 且 hcs_sync_status=unsynced/failed(重试未超限), + * 与审批入口(/approve、MK 回调)无关;失败落 failed 由下轮扫描自动补偿,超限仅人工重推(D7)。 + * 任务顺序:项目 → 合同(内含风险校验→附件转传→C103-1→履约规则 P2 接线)。 + * 多实例部署时以 Redis 分布式锁防重扫(照既有 BladeRedis 用法,单实例部署行为与既有金蝶任务一致)。 + * 扫描与推送逻辑收敛在 pushUnsyncedProjects/pushUnsyncedContracts,供手动端点(HcsSyncController)复用。 + *

+ * 调度配置(Nacos thirdParty.hcs.push.*):sync-enabled 总开关(默认关,灰度打开)、cron、batch-size、max-retry。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsPushTask { + + /** + * 分布式锁 TTL(秒):须小于 cron 间隔(默认 5 分钟)且大于单轮预期执行时长,实例崩溃后锁自动过期 + */ + private static final long PUSH_TASK_LOCK_TTL_SECONDS = 240L; + + /** + * 审批通过状态集合(含变更通过) + */ + private static final List APPROVED_STATUSES = List.of("approved", "change_approved"); + + private final HcsProperties hcsProperties; + private final ProjectApplyMapper projectApplyMapper; + private final ContractManageMapper contractManageMapper; + private final HcsProjectSyncSupport hcsProjectSyncSupport; + private final HcsContractSyncSupport hcsContractSyncSupport; + private final BladeRedis bladeRedis; + + /** + * HCS 推送任务开关,默认关闭(灰度打开) + */ + @Value("${thirdParty.hcs.push.sync-enabled:false}") + private boolean syncEnabled; + + /** + * HCS 推送调度,默认每 5 分钟(准实时首推) + */ + @Scheduled(cron = "${thirdParty.hcs.push.cron:0 */5 * * * ?}") + public void pushHcs() { + if (!syncEnabled) { + return; + } + // 多实例部署防重扫:setIfAbsent 抢锁,持有值比对后释放 + String lockHolder = UUID.randomUUID().toString(); + Boolean locked = bladeRedis.getValueOps() + .setIfAbsent(HcsSyncConstant.PUSH_TASK_LOCK_KEY, lockHolder, Duration.ofSeconds(PUSH_TASK_LOCK_TTL_SECONDS)); + if (!Boolean.TRUE.equals(locked)) { + log.info("HCS推送任务其他实例执行中,本轮跳过"); + return; + } + try { + // 任务顺序(设计文档 §5.0):项目 → 合同;两类互不影响 + log.info("定时推送HCS项目立项:{}", pushUnsyncedProjects()); + log.info("定时推送HCS合同:{}", pushUnsyncedContracts()); + } finally { + if (lockHolder.equals(bladeRedis.get(HcsSyncConstant.PUSH_TASK_LOCK_KEY))) { + bladeRedis.del(HcsSyncConstant.PUSH_TASK_LOCK_KEY); + } + } + } + + /** + * 扫描并推送待同步/待补偿的项目立项(C102),返回结果汇总 + * + * @return 汇总描述 + */ + public String pushUnsyncedProjects() { + int maxRetry = hcsProperties.getPush().getMaxRetry(); + List projectList = projectApplyMapper.selectList(Wrappers.lambdaQuery() + .in(ProjectApply::getApprovalStatus, APPROVED_STATUSES) + .in(ProjectApply::getHcsSyncStatus, List.of(HcsSyncConstant.HCS_STATUS_UNSYNCED, HcsSyncConstant.HCS_STATUS_FAILED)) + .and(wrapper -> wrapper.isNull(ProjectApply::getHcsRetryCount).or().lt(ProjectApply::getHcsRetryCount, maxRetry)) + .last("limit " + hcsProperties.getPush().getBatchSize())); + int successCount = 0; + int failCount = 0; + for (ProjectApply projectApply : projectList) { + try { + hcsProjectSyncSupport.pushProject(projectApply); + successCount++; + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "推送异常" : exception.getMessage(); + hcsProjectSyncSupport.markFailed(projectApply, message); + failCount++; + } + } + String summary = String.format("扫描 %d 条,成功 %d 条,失败 %d 条(重试上限 %d)", projectList.size(), successCount, failCount, maxRetry); + if (failCount > 0) { + log.warn("HCS项目立项推送存在失败:{}", summary); + } + return summary; + } + + /** + * 扫描并推送待同步/待补偿的合同(C103),返回结果汇总 + * + * @return 汇总描述 + */ + public String pushUnsyncedContracts() { + int maxRetry = hcsProperties.getPush().getMaxRetry(); + List contractList = contractManageMapper.selectList(Wrappers.lambdaQuery() + .in(ContractManage::getApprovalStatus, APPROVED_STATUSES) + .in(ContractManage::getHcsSyncStatus, List.of(HcsSyncConstant.HCS_STATUS_UNSYNCED, HcsSyncConstant.HCS_STATUS_FAILED)) + .and(wrapper -> wrapper.isNull(ContractManage::getHcsRetryCount).or().lt(ContractManage::getHcsRetryCount, maxRetry)) + .last("limit " + hcsProperties.getPush().getBatchSize())); + int successCount = 0; + int failCount = 0; + for (ContractManage contractManage : contractList) { + try { + hcsContractSyncSupport.pushContract(contractManage); + successCount++; + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "推送异常" : exception.getMessage(); + hcsContractSyncSupport.markFailed(contractManage, message); + failCount++; + } + } + String summary = String.format("扫描 %d 条,成功 %d 条,失败 %d 条(重试上限 %d)", contractList.size(), successCount, failCount, maxRetry); + if (failCount > 0) { + log.warn("HCS合同推送存在失败:{}", summary); + } + return summary; + } +} From 892035ee6ff68d0cffdbbc44140c4accf85f57d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 23:27:29 +0800 Subject: [PATCH 008/124] =?UTF-8?q?feat:=20HCS=E5=B1=A5=E7=BA=A6=E8=A7=84?= =?UTF-8?q?=E5=88=99=E6=95=B0=E6=8D=AE=E5=B1=82=E4=B8=8E=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E7=BB=B4=E6=8A=A4=EF=BC=88blade=5Fcontract=5Fexe=5Fstage?= =?UTF-8?q?=E8=A1=A8/=E8=A1=8C=E7=BA=A7=E5=B7=AE=E5=BC=82=E6=A0=87?= =?UTF-8?q?=E8=AE=B0=E7=BB=B4=E6=8A=A4=E6=8E=A5=E5=8F=A3/=E5=90=88?= =?UTF-8?q?=E5=90=8C=E5=AE=A1=E6=89=B9=E7=BD=AE=E8=A1=8C=E5=BE=85=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/entity/HcsContractExeStage.java | 101 ++++++++++++ .../ContractExeStageController.java | 91 +++++++++++ .../mapper/HcsContractExeStageMapper.java | 53 ++++++ .../service/IContractExeStageService.java | 64 ++++++++ .../impl/ContractExeStageServiceImpl.java | 154 ++++++++++++++++++ .../impl/ContractManageServiceImpl.java | 13 ++ .../blade_hcs_exe_stage_20260927.sql | 36 ++++ 7 files changed, 512 insertions(+) create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractExeStage.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractExeStageController.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsContractExeStageMapper.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java create mode 100644 doc/sql/transport/blade_hcs_exe_stage_20260927.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractExeStage.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractExeStage.java new file mode 100644 index 00000000..95bdb385 --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractExeStage.java @@ -0,0 +1,101 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.pojo.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +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; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 合同履约规则实体类(HCS 履约阶段,设计文档 §4.1,ADR-0002) + *

+ * 合同维度的资金计划阶段,C103-9 行级同步的数据源:合同审批通过置 row_op=add, + * 后续编辑按行差异置 add/update/delete,由扫描任务随合同链路同步; + * 合规返回的阶段ID 必须持久化(hcsStageFdId),行更新/删除全靠它。 + * + * @author Chill + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("blade_contract_exe_stage") +@Schema(description = "合同履约规则(HCS 履约阶段)") +public class HcsContractExeStage extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + @JsonSerialize(using = ToStringSerializer.class) + @Schema(description = "合同ID") + private Long contractId; + + @Schema(description = "履约类型 payment=付款/collection=收款") + private String performType; + + @Schema(description = "款项性质 prepayment/progress/acceptance/retention") + private String fundNature; + + @Schema(description = "计划金额(元)") + private BigDecimal fundAmount; + + @Schema(description = "计划资金日期") + private LocalDateTime fundDate; + + @Schema(description = "开票规则(如 payFirst)") + private String invoiceRule; + + @Schema(description = "账期") + private Integer invoiceCycle; + + @Schema(description = "金额类型") + private String fundType; + + @Schema(description = "是否完成") + private Integer isFinish; + + @Schema(description = "行级同步操作 none/add/update/delete") + private String rowOp; + + @Schema(description = "合规阶段ID(C103-9 返回,update/delete 必用)") + private String hcsStageFdId; + + @Schema(description = "同步状态 unsynced/synced/failed") + private String hcsSyncStatus; + + @Schema(description = "同步结果信息/失败原因") + @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) + private String hcsSyncMsg; + +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractExeStageController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractExeStageController.java new file mode 100644 index 00000000..17eae220 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractExeStageController.java @@ -0,0 +1,91 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.controller; + +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springblade.core.tool.api.R; +import org.springblade.transport.pojo.entity.HcsContractExeStage; +import org.springblade.transport.service.IContractExeStageService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 合同履约规则维护端点(合同表单"履约规则"页签,设计文档 §4.1,ADR-0002) + *

+ * 行级差异(add/update/delete)由本端点落库标记,行级同步由扫描任务随合同链路调 C103-9 完成; + * 行删除为软删+标记,不可物理删除。 + * + * @author Chill + */ +@RestController +@AllArgsConstructor +@RequestMapping("contract-exe-stage") +@Tag(name = "合同履约规则", description = "合同履约规则维护(HCS 履约阶段同步数据源)") +public class ContractExeStageController { + + private final IContractExeStageService contractExeStageService; + + /** + * 按合同查询履约规则行 + */ + @GetMapping("/list") + @ApiOperationSupport(order = 1) + @Operation(summary = "按合同查询履约规则", description = "传入合同ID,返回规则行列表") + public R> list(@Parameter(description = "合同ID", required = true) @RequestParam Long contractId) { + return R.data(contractExeStageService.listByContractId(contractId)); + } + + /** + * 保存履约规则行(整批提交,按行差异置同步标记) + */ + @PostMapping("/submit") + @ApiOperationSupport(order = 2) + @Operation(summary = "保存履约规则", description = "传入合同ID与规则行列表,新行/未同步行标记 add、已同步行标记 update") + public R submit(@Parameter(description = "合同ID", required = true) @RequestParam Long contractId, + @RequestBody List rows) { + return R.status(contractExeStageService.submitRows(contractId, rows)); + } + + /** + * 删除履约规则行(软删+标记,已同步行待 C103-9 上报删除) + */ + @PostMapping("/remove") + @ApiOperationSupport(order = 3) + @Operation(summary = "删除履约规则行", description = "传入规则行ID,软删并标记 delete 待同步") + public R remove(@Parameter(description = "规则行ID", required = true) @RequestParam Long id) { + return R.status(contractExeStageService.removeRow(id)); + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsContractExeStageMapper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsContractExeStageMapper.java new file mode 100644 index 00000000..c2021347 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsContractExeStageMapper.java @@ -0,0 +1,53 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.springblade.transport.pojo.entity.HcsContractExeStage; + +import java.util.List; + +/** + * 合同履约规则 Mapper + * + * @author Chill + */ +@Mapper +public interface HcsContractExeStageMapper extends BaseMapper { + + /** + * 查询合同的待同步行(含软删行:C103-9 的 delete 行已逻辑删除但须随行级同步上报, + * 原生 SQL 绕过 @TableLogic 过滤) + * + * @param contractId 合同ID + * @return 行级同步操作非 none 的规则行 + */ + @Select("select * from blade_contract_exe_stage where contract_id = #{contractId} and row_op <> 'none' order by id") + List selectSyncRows(@Param("contractId") Long contractId); +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java new file mode 100644 index 00000000..15133197 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java @@ -0,0 +1,64 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.service; + +import org.springblade.core.mp.base.BaseService; +import org.springblade.transport.pojo.entity.HcsContractExeStage; + +import java.util.List; + +/** + * 合同履约规则 服务接口 + * + * @author Chill + */ +public interface IContractExeStageService extends BaseService { + + /** + * 按合同查询履约规则行(表单维护用,不含软删行) + * + * @param contractId 合同ID + * @return 规则行列表 + */ + List listByContractId(Long contractId); + + /** + * 保存合同履约规则行(按行差异置同步标记:新行/未同步行 add,已同步行 update) + * + * @param contractId 合同ID + * @param rows 规则行 + * @return 保存结果 + */ + boolean submitRows(Long contractId, List rows); + + /** + * 删除履约规则行(软删+标记:已同步行置 row_op=delete 待 C103-9 上报;未同步行直接软删) + * + * @param id 规则行ID + * @return 删除结果 + */ + boolean removeRow(Long id); +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java new file mode 100644 index 00000000..08f0cc06 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java @@ -0,0 +1,154 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.HcsContractExeStageMapper; +import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.HcsContractExeStage; +import org.springblade.transport.service.IContractExeStageService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 合同履约规则 服务实现类(设计文档 §4.1,ADR-0002) + *

+ * 行级差异标记:新行/未同步行 add;已同步行编辑 update;已同步行删除 delete(软删+标记,不可物理删除)。 + * 行级同步由扫描任务随合同链路调 C103-9 完成(HcsExeStageSyncSupport)。 + * + * @author Chill + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ContractExeStageServiceImpl extends BaseServiceImpl implements IContractExeStageService { + + /** + * 行级同步操作:无 + */ + private static final String ROW_OP_NONE = "none"; + + private final ContractManageMapper contractManageMapper; + private final HcsProperties hcsProperties; + + @Override + public List listByContractId(Long contractId) { + return list(Wrappers.lambdaQuery() + .eq(HcsContractExeStage::getContractId, contractId) + .orderByAsc(HcsContractExeStage::getId)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean submitRows(Long contractId, List rows) { + ContractManage contractManage = contractManageMapper.selectById(contractId); + if (contractManage == null) { + throw new ServiceException("合同不存在:" + contractId); + } + if (Func.isEmpty(rows)) { + throw new ServiceException("履约规则行不能为空"); + } + for (HcsContractExeStage row : rows) { + validateRow(row); + row.setContractId(contractId); + if (row.getId() == null) { + // 新行:待随合同链路首推(row_op=add) + row.setRowOp("add"); + row.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); + row.setHcsSyncMsg("待随合同链路同步(C103-9)"); + row.setFundType(StringUtil.isBlank(row.getFundType()) ? hcsProperties.getExeStage().getFundType() : row.getFundType()); + row.setIsFinish(row.getIsFinish() == null ? 0 : row.getIsFinish()); + save(row); + } else { + HcsContractExeStage existing = getById(row.getId()); + if (existing == null || !contractId.equals(existing.getContractId())) { + throw new ServiceException("履约规则行不属于该合同:" + row.getId()); + } + // 已同步行编辑 → update;未同步行保持 add + String rowOp = StringUtil.isBlank(existing.getHcsStageFdId()) ? "add" : "update"; + existing.setPerformType(row.getPerformType()); + existing.setFundNature(row.getFundNature()); + existing.setFundAmount(row.getFundAmount()); + existing.setFundDate(row.getFundDate()); + existing.setInvoiceRule(row.getInvoiceRule()); + existing.setInvoiceCycle(row.getInvoiceCycle()); + existing.setFundType(StringUtil.isBlank(row.getFundType()) ? hcsProperties.getExeStage().getFundType() : row.getFundType()); + existing.setIsFinish(row.getIsFinish() == null ? 0 : row.getIsFinish()); + existing.setRowOp(rowOp); + existing.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); + existing.setHcsSyncMsg("待随合同链路同步(C103-9 " + rowOp + ")"); + updateById(existing); + } + } + log.info("合同履约规则保存:contractId={},共 {} 行", contractId, rows.size()); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean removeRow(Long id) { + HcsContractExeStage row = getById(id); + if (row == null) { + throw new ServiceException("履约规则行不存在:" + id); + } + if (StringUtil.isNotBlank(row.getHcsStageFdId())) { + // 已同步行:软删+标记 delete,由 C103-9 凭合规阶段ID 上报删除(ADR-0002,不可物理删除) + row.setRowOp("delete"); + row.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); + row.setHcsSyncMsg("待随合同链路同步(C103-9 delete)"); + updateById(row); + } + removeById(id); + log.info("合同履约规则行删除:id={},contractId={},rowOp={}", id, row.getContractId(), row.getRowOp()); + return true; + } + + /** + * 行字段校验 + */ + private void validateRow(HcsContractExeStage row) { + if (StringUtil.isBlank(row.getPerformType())) { + throw new ServiceException("履约类型不能为空(payment/collection)"); + } + if (!List.of("payment", "collection").contains(row.getPerformType())) { + throw new ServiceException("履约类型非法:" + row.getPerformType()); + } + if (row.getFundAmount() != null && row.getFundAmount().signum() < 0) { + throw new ServiceException("计划金额不能为负数"); + } + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java index b6cf8840..41cc4285 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java @@ -25,6 +25,8 @@ package org.springblade.transport.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; @@ -36,7 +38,9 @@ import org.springblade.system.cache.UserCache; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.excel.ContractManageExcel; import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.HcsContractExeStageMapper; import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.HcsContractExeStage; import org.springblade.transport.pojo.vo.ContractManageVO; import org.springblade.transport.service.IContractManageService; import org.springblade.transport.support.TransportBusinessSupport; @@ -62,9 +66,13 @@ import java.util.Set; * * @author Chill */ +@Slf4j @Service +@RequiredArgsConstructor public class ContractManageServiceImpl extends BaseServiceImpl implements IContractManageService { + private final HcsContractExeStageMapper hcsContractExeStageMapper; + private static final String STAGE_DRAFT = "draft"; private static final String STAGE_TEMPORARY = "temporary"; private static final String STAGE_FORMAL = "formal"; @@ -217,6 +225,11 @@ public class ContractManageServiceImpl extends BaseServiceImpllambdaUpdate() + .eq(HcsContractExeStage::getContractId, contractManage.getId()) + .isNull(HcsContractExeStage::getHcsStageFdId) + .set(HcsContractExeStage::getRowOp, "add")); return updateById(contractManage); } diff --git a/doc/sql/transport/blade_hcs_exe_stage_20260927.sql b/doc/sql/transport/blade_hcs_exe_stage_20260927.sql new file mode 100644 index 00000000..97b3b811 --- /dev/null +++ b/doc/sql/transport/blade_hcs_exe_stage_20260927.sql @@ -0,0 +1,36 @@ +-- 桂物合同合规系统(HCS)接入:履约规则表(设计文档 §4.1,ADR-0002,P2)。 +-- 合同维度资金计划阶段,C103-9 行级同步的数据源;行删除为软删+标记,不可物理删除。 +-- 通过 information_schema 判断表是否存在,可重复执行。 +SET @db_name = DATABASE(); + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = @db_name AND table_name = 'blade_contract_exe_stage'), + 'SELECT 1', + 'CREATE TABLE blade_contract_exe_stage ( + id bigint NOT NULL COMMENT ''主键'', + contract_id bigint NOT NULL COMMENT ''合同ID(blade_contract_manage.id)'', + perform_type varchar(16) NOT NULL COMMENT ''履约类型 payment=付款/collection=收款'', + fund_nature varchar(16) DEFAULT NULL COMMENT ''款项性质 prepayment/progress/acceptance/retention'', + fund_amount decimal(18,2) DEFAULT NULL COMMENT ''计划金额(元)'', + fund_date datetime DEFAULT NULL COMMENT ''计划资金日期'', + invoice_rule varchar(16) DEFAULT NULL COMMENT ''开票规则(如 payFirst)'', + invoice_cycle int DEFAULT NULL COMMENT ''账期'', + fund_type varchar(16) DEFAULT ''byAmount'' COMMENT ''金额类型'', + is_finish tinyint DEFAULT 0 COMMENT ''是否完成'', + row_op varchar(8) DEFAULT ''none'' COMMENT ''行级同步操作 none/add/update/delete'', + hcs_stage_fd_id varchar(64) DEFAULT NULL COMMENT ''合规阶段ID(C103-9 返回,update/delete 必用)'', + hcs_sync_status varchar(16) DEFAULT ''unsynced'' COMMENT ''同步状态 unsynced/synced/failed'', + hcs_sync_msg varchar(512) DEFAULT NULL COMMENT ''同步结果信息/失败原因'', + tenant_id varchar(12) DEFAULT ''000000'' COMMENT ''租户ID'', + create_user bigint DEFAULT NULL COMMENT ''创建人'', + create_dept bigint DEFAULT NULL COMMENT ''创建部门'', + create_time datetime DEFAULT NULL COMMENT ''创建时间'', + update_user bigint DEFAULT NULL COMMENT ''更新人'', + update_time datetime DEFAULT NULL COMMENT ''更新时间'', + status int DEFAULT 1 COMMENT ''业务状态'', + is_deleted int DEFAULT 0 COMMENT ''是否已删除'', + PRIMARY KEY (id), + KEY idx_hcs_exe_stage_contract (contract_id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=''合同履约规则(HCS 履约阶段)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; From d147ef82091425c3fb26477eac0131d1f49f595f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 23:35:20 +0800 Subject: [PATCH 009/124] =?UTF-8?q?feat:=20HCS=E5=B1=A5=E7=BA=A6=E8=A7=84?= =?UTF-8?q?=E5=88=99C103-9=E8=A1=8C=E7=BA=A7=E5=90=8C=E6=AD=A5=EF=BC=88?= =?UTF-8?q?=E9=9A=8F=E5=90=88=E5=90=8C=E9=93=BE=E8=B7=AF=E6=89=A7=E8=A1=8C?= =?UTF-8?q?/=E8=A1=8C=E7=BA=A7=E5=A2=9E=E5=88=A0=E6=94=B9=E8=81=9A?= =?UTF-8?q?=E5=90=88/=E5=B1=A5=E7=BA=A6=E8=AE=A1=E5=88=92ID=E4=B8=8E?= =?UTF-8?q?=E9=98=B6=E6=AE=B5fdId=E5=9B=9E=E5=A1=AB=E6=8C=81=E4=B9=85?= =?UTF-8?q?=E5=8C=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsContractSyncSupport.java | 25 +- .../support/hcs/HcsExeStageSyncSupport.java | 271 ++++++++++++++++++ .../transport/task/HcsPushTask.java | 2 +- 3 files changed, 288 insertions(+), 10 deletions(-) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 4b06fcf8..471f5004 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -70,7 +70,7 @@ import java.util.Objects; *

* 扫描任务按序执行:① 客商风险校验(可配开关,黑名单阻断)→ ② 附件转传(挂载点待 §9-U8 确认,先转传缓存)→ * ③ C103-3 判重(§9-U4 查询能力联调确认)→ ④ C103-1 起草 / 变更单 C103-11 更新(§9-U5 定位方式待联调)→ - * ⑤ 履约规则 C103-9(P2 接线)。 + * ⑤ 履约规则 C103-9 行级同步({@link HcsExeStageSyncSupport})。 * 结果留痕:风险校验写 blade_hcs_check_log 与合同 hcs_risk_* 字段;推送结果回填 hcs_fd_id/hcs_sync_status。 * * @author Chill @@ -97,6 +97,7 @@ public class HcsContractSyncSupport { private final CustomerArchiveMapper customerArchiveMapper; private final HcsContractCheckLogMapper hcsContractCheckLogMapper; private final HcsAttachmentSupport hcsAttachmentSupport; + private final HcsExeStageSyncSupport hcsExeStageSyncSupport; /** * 推送合同到 HCS:风险校验 → 附件转传 → 判重 → 起草/更新 → 回填合规 fdId 置 synced @@ -112,20 +113,26 @@ public class HcsContractSyncSupport { // ② 附件转传(先转传并缓存合规附件ID,C103-1 挂载方式待 §9-U8 确认后接线) transferAttachmentsIfEnabled(contractManage); // ③④ 首推判重后起草(C103-1);已有合规ID(变更单)走更新(C103-11) + String resultMessage; if (StringUtil.isBlank(contractManage.getHcsFdId())) { String existFdId = findExistFdId(contractManage); if (StringUtil.isNotBlank(existFdId)) { markSynced(contractManage, existFdId, "判重命中,回填已有合规合同ID"); - return "判重命中,回填已有合规合同ID"; + resultMessage = "判重命中,回填已有合规合同ID"; + } else { + String fdContractId = draftContract(contractManage); + // 先持久化合规合同ID(调用方必须保存),履约规则同步失败时下轮凭其走更新补偿 + markSynced(contractManage, fdContractId, "C103-1 合同发起成功"); + resultMessage = "C103-1 合同发起成功"; } - String fdContractId = draftContract(contractManage); - // TODO 待联调(P2):履约规则 C103-9 行级同步随合同链路执行(§5.3,依赖 blade_contract_exe_stage 表) - markSynced(contractManage, fdContractId, "C103-1 合同发起成功"); - return "C103-1 合同发起成功"; + } else { + updateContract(contractManage); + markSynced(contractManage, contractManage.getHcsFdId(), "C103-11 合同更新成功"); + resultMessage = "C103-11 合同更新成功"; } - updateContract(contractManage); - markSynced(contractManage, contractManage.getHcsFdId(), "C103-11 合同更新成功"); - return "C103-11 合同更新成功"; + // ⑤ 履约规则 C103-9 行级同步(随合同链路,§5.3;失败抛出由任务落 failed,下轮凭 hcs_fd_id 走更新补偿) + String exeStageResult = hcsExeStageSyncSupport.syncExeStages(contractManage); + return resultMessage + ";" + exeStageResult; } /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java new file mode 100644 index 00000000..301c385c --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java @@ -0,0 +1,271 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsExeplanStageDTO; +import org.springblade.hcs.dto.HcsExeplanStageVO; +import org.springblade.hcs.dto.HcsExeplanSyncDTO; +import org.springblade.hcs.dto.HcsExeplanVO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springblade.system.cache.UserCache; +import org.springblade.system.pojo.entity.User; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.HcsContractExeStageMapper; +import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.HcsContractExeStage; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * HCS 履约规则同步支撑组件(C103-9 新版行级同步,设计文档 §5.3,ADR-0002) + *

+ * 随合同推送链路执行(合同须已同步、hcs_fd_id 存在):聚合 row_op 非 none 的规则行 + * (add 行不带 fdId,update/delete 行必须带合规阶段ID),整体 fdEopExeplanOperateType + * 首次为 add、后续为 update;返回的 fdExeplanId 回填 blade_contract_manage.hcs_exeplan_id, + * 变更阶段 fdId 按行回填 hcs_stage_fd_id(合规返回的 fdId 必须持久化,后续行更新/删除全靠它)。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsExeStageSyncSupport { + + /** + * 行级扩展内容固定空 JSON + */ + private static final String EXTEND_CONTENT_EMPTY = "{}"; + + private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; + private final ContractManageMapper contractManageMapper; + private final HcsContractExeStageMapper hcsContractExeStageMapper; + + /** + * 同步合同履约规则到 HCS(C103-9),成功后回填 fdExeplanId 与各阶段 fdId 并清除行级操作标记 + * + * @param contractManage 合同(须已同步,hcs_fd_id 非空) + * @return 同步结果描述(无待同步行时返回提示) + */ + public String syncExeStages(ContractManage contractManage) { + if (StringUtil.isBlank(contractManage.getHcsFdId())) { + throw new HcsException("C103-9 履约规则同步失败,合同尚未推送合规(contractNo=" + contractManage.getContractNo() + ")"); + } + // 含软删行:delete 行已逻辑删除但须凭合规阶段ID 上报(原生 SQL 绕过逻辑删除过滤) + List pendingRows = hcsContractExeStageMapper.selectSyncRows(contractManage.getId()); + if (pendingRows.isEmpty()) { + return "履约规则无待同步行"; + } + HcsExeplanSyncDTO param = buildSyncParam(contractManage, pendingRows); + log.info("HCS履约规则同步开始:contractNo={},整体操作 {},{} 行", contractManage.getContractNo(), + param.getFdEopExeplanOperateType(), pendingRows.size()); + HcsResult result = hcsClient.exeplanAdd(param); + if (result == null || !result.isSuccess() || result.getData() == null) { + log.error("HCS履约规则同步失败响应:{},contractNo={}", result == null ? "无响应" : result.getMsg(), contractManage.getContractNo()); + throw new HcsException("C103-9 履约规则同步失败:" + (result == null ? "响应为空" : result.getMsg())); + } + HcsExeplanVO exeplan = result.getData(); + backfill(contractManage, pendingRows, param.getFdStages(), exeplan); + return String.format("C103-9 履约规则同步成功(%s,%d 行)", param.getFdEopExeplanOperateType(), pendingRows.size()); + } + + /** + * 组装 C103-9 入参(字段标注照 §3.4 规范,映射见设计文档 §5.3) + */ + private HcsExeplanSyncDTO buildSyncParam(ContractManage contractManage, List pendingRows) { + HcsExeplanSyncDTO param = new HcsExeplanSyncDTO(); + // 【必填】合同ID:HCS 合同ID(blade_contract_manage.hcs_fd_id,非 TMS 主键) + param.setFdContractId(contractManage.getHcsFdId()); + // 【必填】外部系统标识:fd_sources,配置 thirdParty.hcs.src-system(D14) + param.setFdOuterSystem(hcsProperties.getSrcSystem()); + // 【必填】操作人登录名:合同承办人登录名(§9-U2) + param.setFdLoginName(requireLoginName(contractManage)); + // 【必填】计划整体操作类型:首次同步 add,已同步过(有履约计划ID)update + param.setFdEopExeplanOperateType(StringUtil.isBlank(contractManage.getHcsExeplanId()) ? "add" : "update"); + // 履约计划ID:已同步过则传(回填自首次同步返回) + param.setFdExeplanId(contractManage.getHcsExeplanId()); + List stages = new ArrayList<>(); + for (HcsContractExeStage row : pendingRows) { + HcsExeplanStageDTO stage = new HcsExeplanStageDTO(); + // 阶段项ID:行级 update/delete 必传(取 hcs_stage_fd_id),add 行不带 + if (!"add".equals(row.getRowOp())) { + stage.setFdId(row.getHcsStageFdId()); + } + // 【必填】行级操作:add / update / delete + stage.setFdEopExeplanOperateType(row.getRowOp()); + // 【必填】履约类型:payment=付款 / collection=收款 + stage.setFdPerformType(row.getPerformType()); + // 款项性质:prepayment/progress/acceptance/retention + stage.setFdFundNature(row.getFundNature()); + // 计划金额(元) + stage.setFdFundAmount(row.getFundAmount()); + // 资金日期(毫秒时间戳) + stage.setFdFundDate(toMillis(row.getFundDate())); + // 开票规则(如 payFirst) + stage.setFdInvoiceRule(row.getInvoiceRule()); + // 账期 + stage.setFdInvoiceCycle(row.getInvoiceCycle()); + // 金额类型:行维护值,空取配置 thirdParty.hcs.exe-stage.fund-type(默认 byAmount) + stage.setFdFundType(StringUtil.isBlank(row.getFundType()) ? hcsProperties.getExeStage().getFundType() : row.getFundType()); + // 是否完成 + stage.setFdIsFinish(row.getIsFinish() != null && row.getIsFinish() > 0); + // 扩展内容 JSON 字符串:固定 "{}" + stage.setFdExtendContent(EXTEND_CONTENT_EMPTY); + stages.add(stage); + } + param.setFdStages(stages); + return param; + } + + /** + * 回填:fdExeplanId → 合同 hcs_exeplan_id;变更阶段 fdId 按行回填 hcs_stage_fd_id 并清除行级操作标记 + *

+ * TODO 待联调确认:fdChangeStages 与请求行的对应关系 v4 未明确,优先按请求行序对应(首次全 add 场景), + * 行数不一致时按业务属性组合键匹配,仍匹配不到的 add 行保持待同步(下轮重试)。 + */ + private void backfill(ContractManage contractManage, List pendingRows, + List requestStages, HcsExeplanVO exeplan) { + // 履约计划ID 回填(后续行更新/删除依赖,必须持久化) + if (StringUtil.isNotBlank(exeplan.getFdExeplanId()) + && !exeplan.getFdExeplanId().equals(contractManage.getHcsExeplanId())) { + contractManage.setHcsExeplanId(exeplan.getFdExeplanId()); + } + backfillExeplanId(contractManage); + List changeStages = exeplan.getFdChangeStages() == null ? List.of() : exeplan.getFdChangeStages(); + // 行数一致时按请求行序一一对应;不一致时按业务属性组合键匹配 + boolean positional = changeStages.size() == requestStages.size(); + Map byAttribute = positional ? Map.of() : mapByAttribute(changeStages); + int addRowCount = 0; + int unmatchedCount = 0; + for (int index = 0; index < pendingRows.size(); index++) { + HcsContractExeStage row = pendingRows.get(index); + String stageFdId = row.getHcsStageFdId(); + if ("add".equals(row.getRowOp())) { + addRowCount++; + HcsExeplanStageVO matched = positional ? changeStages.get(index) : byAttribute.get(attributeKey(requestStages.get(index))); + stageFdId = matched == null ? null : matched.getFdId(); + if (StringUtil.isBlank(stageFdId)) { + unmatchedCount++; + } + } + markRowSynced(row, stageFdId); + } + log.info("HCS履约规则阶段ID回填完成:contractNo={},add {} 行,未匹配 {} 行(模式:{})", + contractManage.getContractNo(), addRowCount, unmatchedCount, positional ? "行序对应" : "属性匹配"); + } + + /** + * 行同步成功回写:回填合规阶段ID、清除行级操作标记并置 synced + */ + private void markRowSynced(HcsContractExeStage row, String stageFdId) { + if (StringUtil.isNotBlank(stageFdId)) { + row.setHcsStageFdId(stageFdId); + } else if ("add".equals(row.getRowOp())) { + // add 行未取得阶段ID:保持待同步,下轮重试(ADR-0002:阶段ID 必须持久化) + row.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); + row.setHcsSyncMsg("C103-9 返回阶段ID未能匹配,待重试"); + hcsContractExeStageMapper.updateById(row); + log.warn("HCS履约规则 add 行未匹配到返回阶段ID:rowId={},contractId={}", row.getId(), row.getContractId()); + return; + } + row.setRowOp("none"); + row.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); + row.setHcsSyncMsg("C103-9 同步成功"); + hcsContractExeStageMapper.updateById(row); + } + + /** + * 按业务属性组合键索引返回阶段(行数不一致时的兜底匹配) + */ + private Map mapByAttribute(List changeStages) { + Map byAttribute = new HashMap<>(); + for (HcsExeplanStageVO stage : changeStages) { + byAttribute.putIfAbsent(String.join("|", Objects.toString(stage.getFdPerformType(), ""), + Objects.toString(stage.getFdFundNature(), ""), + Objects.toString(stage.getFdFundAmount(), ""), + Objects.toString(stage.getFdFundDate(), "")), stage); + } + return byAttribute; + } + + /** + * 请求行的业务属性组合键 + */ + private String attributeKey(HcsExeplanStageDTO stage) { + return String.join("|", Objects.toString(stage.getFdPerformType(), ""), + Objects.toString(stage.getFdFundNature(), ""), + Objects.toString(stage.getFdFundAmount(), ""), + Objects.toString(stage.getFdFundDate(), "")); + } + + /** + * 合同履约计划ID 回写(fdExeplanId 必须持久化;失败仅告警不阻断行回填,下轮同步会再次携带) + */ + private void backfillExeplanId(ContractManage contractManage) { + try { + contractManageMapper.updateById(contractManage); + log.info("HCS履约计划ID已回填:contractNo={},fdExeplanId={}", contractManage.getContractNo(), contractManage.getHcsExeplanId()); + } catch (Exception exception) { + log.error("HCS履约计划ID回写失败:contractNo={}", contractManage.getContractNo(), exception); + } + } + + /** + * 合同承办人登录名(fdLoginName 必填) + */ + private String requireLoginName(ContractManage contractManage) { + if (contractManage.getHandlerUserId() == null) { + throw new HcsException("C103-9 履约规则同步失败,合同承办人未维护(contractNo=" + contractManage.getContractNo() + ")"); + } + User user = UserCache.getUser(contractManage.getHandlerUserId()); + if (user == null || StringUtil.isBlank(user.getAccount())) { + throw new HcsException("C103-9 履约规则同步失败,承办人登录名解析不到(§9-U2)"); + } + return user.getAccount(); + } + + /** + * LocalDateTime → 毫秒时间戳 + */ + private Long toMillis(LocalDateTime localDateTime) { + return localDateTime == null ? null : localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java index 896a3d21..6d35899c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java @@ -51,7 +51,7 @@ import java.util.UUID; *

* 审批代码零埋点:扫描只认 approvalStatus=approved/change_approved 且 hcs_sync_status=unsynced/failed(重试未超限), * 与审批入口(/approve、MK 回调)无关;失败落 failed 由下轮扫描自动补偿,超限仅人工重推(D7)。 - * 任务顺序:项目 → 合同(内含风险校验→附件转传→C103-1→履约规则 P2 接线)。 + * 任务顺序:项目 → 合同(内含风险校验→附件转传→C103-1→履约规则 C103-9 行级同步)。 * 多实例部署时以 Redis 分布式锁防重扫(照既有 BladeRedis 用法,单实例部署行为与既有金蝶任务一致)。 * 扫描与推送逻辑收敛在 pushUnsyncedProjects/pushUnsyncedContracts,供手动端点(HcsSyncController)复用。 *

From 594773d7c7b345f9f1faad6a5d8826821e792d91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 23:38:55 +0800 Subject: [PATCH 010/124] =?UTF-8?q?feat:=20HCS=E4=BB=98=E6=AC=BE=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E6=95=B0=E6=8D=AE=E5=B1=82=E4=B8=8E=E9=9B=B6=E5=9F=8B?= =?UTF-8?q?=E7=82=B9=E6=8E=A5=E7=BA=BF=EF=BC=88=E7=89=B9=E6=89=B9=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=BB=84/=E5=B1=A5=E7=BA=A6=E8=AE=B0=E5=BD=95ID?= =?UTF-8?q?=E5=AD=97=E6=AE=B5/=E5=AE=A1=E6=89=B9=E4=B8=8E=E4=BB=98?= =?UTF-8?q?=E6=AC=BE=E6=8E=A8=E8=BF=9B=E7=BD=AE=E5=BE=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/entity/PaymentApplication.java | 23 +++++++++ .../transport/constant/HcsSyncConstant.java | 49 +++++++++++++++++++ .../transport/mk/MkProcessBizHandlers.java | 2 + .../impl/PaymentApplicationServiceImpl.java | 7 +++ .../blade_hcs_payment_fields_20260927.sql | 48 ++++++++++++++++++ 5 files changed, 129 insertions(+) create mode 100644 doc/sql/transport/blade_hcs_payment_fields_20260927.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/PaymentApplication.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/PaymentApplication.java index 45ab1f4c..e4021397 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/PaymentApplication.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/PaymentApplication.java @@ -33,6 +33,7 @@ import org.springblade.core.tenant.mp.TenantEntity; import java.io.Serial; import java.math.BigDecimal; import java.time.LocalDate; +import java.time.LocalDateTime; /** 付款申请实体。 @author Chill */ @Data @@ -120,4 +121,26 @@ public class PaymentApplication extends TenantEntity { private String attachmentsJson; /** 备注 */ private String remark; + /** 合规系统单据ID(fdId) */ + private String hcsFdId; + /** 合规同步状态:unsynced 待同步 / synced 已同步 / failed 同步失败 */ + private String hcsSyncStatus; + /** 合规推送失败重试次数 */ + private Integer hcsRetryCount; + /** 合规最近同步时间 */ + private LocalDateTime hcsSyncTime; + /** 合规最近同步结果信息/失败原因 */ + private String hcsSyncMsg; + /** 额度校验结果:pass 通过 / over 超额(C106-1) */ + private String hcsCreditStatus; + /** 额度校验说明(超额原因 fdMessage) */ + private String hcsCreditMsg; + /** 额度校验时间 */ + private LocalDateTime hcsCreditTime; + /** 结算付款特批流程ID(C106-3 返回,C106-4 必传) */ + private String hcsSpecFdId; + /** 特批状态:none/need/pushing/processing/approved/rejected */ + private String hcsSpecStatus; + /** 履约记录ID(C108-1 返回,C108-2 更新必传) */ + private String hcsPerfFdId; } 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 ad7238fb..6e128731 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 @@ -59,6 +59,11 @@ public final class HcsSyncConstant { */ public static final String BIZ_TYPE_CONTRACT = "contract"; + /** + * 推送业务类型:付款申请(C106 特批 / C108 履约记录) + */ + public static final String BIZ_TYPE_PAYMENT = "payment"; + /** * 校验类型:客商风险(C101-1) */ @@ -84,6 +89,50 @@ public final class HcsSyncConstant { */ public static final String CHECK_RESULT_SKIP = "skip"; + // ==================== 额度校验结果(C106-1,D15) ==================== + + /** + * 额度校验通过 + */ + public static final String CREDIT_STATUS_PASS = "pass"; + + /** + * 额度校验超额(不拦截提交,转入特批链路) + */ + public static final String CREDIT_STATUS_OVER = "over"; + + // ==================== 特批状态(hcs_spec_status,D15) ==================== + + /** + * 特批状态:无需特批 + */ + public static final String SPEC_STATUS_NONE = "none"; + + /** + * 特批状态:待特批(额度超额标记,扫描任务据此发起 C106-3) + */ + public static final String SPEC_STATUS_NEED = "need"; + + /** + * 特批状态:发起中 + */ + public static final String SPEC_STATUS_PUSHING = "pushing"; + + /** + * 特批状态:特批中(C106-3 已发起,结果人工确认,§9-U1) + */ + public static final String SPEC_STATUS_PROCESSING = "processing"; + + /** + * 特批状态:特批通过(人工确认) + */ + public static final String SPEC_STATUS_APPROVED = "approved"; + + /** + * 特批状态:特批驳回(人工确认) + */ + public static final String SPEC_STATUS_REJECTED = "rejected"; + // ==================== Redis 缓存 key(照 BFI blade:third: 前缀惯例) ==================== /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java index 6c9bce09..d82c820f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java @@ -426,6 +426,8 @@ public final class MkProcessBizHandlers { entity.setApprovalStatus("approved"); entity.setCurrentNode("审核通过"); entity.setCurrentProcessor(MkProcessNodeHelper.text(processorName, "系统")); + // HCS 推送零埋点:MK 审批回调仅置待同步状态,与 /approve 入口收敛于同一权威状态(ADR-0001) + entity.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); return service.updateById(entity); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java index 38ea696e..0ca877da 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java @@ -47,6 +47,7 @@ import org.springblade.thirdparty.bfi.pojo.vo.BfiPayApplyVO; import org.springblade.thirdparty.bfi.pojo.vo.BfiPayBillVO; import org.springblade.thirdparty.bfi.service.IBfiService; import org.springblade.thirdparty.bfi.util.BfiUtil; +import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.constant.KingdeeBfiConstant; import org.springblade.transport.constant.TransportBusiConstant; import org.springblade.transport.mapper.BillLedgerMapper; @@ -350,6 +351,8 @@ private final CustomerReceiptAccountMapper receiptAccountMapper; if (!TransportBusiConstant.REVIEWING.equals(entity.getApprovalStatus())) throw new ServiceException("仅审批中的付款申请允许审核"); if (isBillPayment(entity.getPaymentMethod())) useBillBalance(entity); entity.setApprovalStatus(TransportBusiConstant.APPROVED); entity.setCurrentNode("审批通过"); entity.setCurrentProcessor(AuthUtil.getUserName()); + // HCS 推送零埋点:审批通过仅置待同步状态,扫描任务据此推特批(如需)与履约记录(ADR-0001) + entity.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); updateById(entity); refreshFormalSettlement(entity); } @@ -611,6 +614,10 @@ private final CustomerReceiptAccountMapper receiptAccountMapper; } else if (KingdeeBfiConstant.KINGDEE_STATUS_PAID.equals(kingdeeStatus)) { entity.setPaidAmount(money(entity.getAppliedAmount()).setScale(2, RoundingMode.HALF_UP)); } + // HCS 履约记录推进:实际付款变化后置待同步,扫描任务凭 hcs_perf_fd_id 走 C108-2 更新(D11) + if (entity.getHcsPerfFdId() != null) { + entity.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); + } updateById(entity); if (KingdeeBfiConstant.KINGDEE_STATUS_PAID.equals(kingdeeStatus)) { // 付款完成:联动履约付款数据(预结算预付记录、正式结算付款记录) diff --git a/doc/sql/transport/blade_hcs_payment_fields_20260927.sql b/doc/sql/transport/blade_hcs_payment_fields_20260927.sql new file mode 100644 index 00000000..5de893b4 --- /dev/null +++ b/doc/sql/transport/blade_hcs_payment_fields_20260927.sql @@ -0,0 +1,48 @@ +-- 桂物合同合规系统(HCS)接入:付款申请特批字段组与履约记录字段(设计文档 §4,P3)。 +-- blade_payment_application 追加额度校验结果、特批流程ID/状态、履约记录ID 字段。 +-- 通过 information_schema 判断字段是否存在,可重复执行。 +SET @db_name = DATABASE(); + +-- ==================== blade_payment_application 扩展字段(C106-1 结果、C106-3/4 特批、C108 履约记录) ==================== + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_payment_application' AND column_name = 'hcs_credit_status'), + 'SELECT 1', + 'ALTER TABLE blade_payment_application ADD COLUMN hcs_credit_status varchar(16) DEFAULT NULL COMMENT ''额度校验结果 pass=通过/over=超额(C106-1)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_payment_application' AND column_name = 'hcs_credit_msg'), + 'SELECT 1', + 'ALTER TABLE blade_payment_application ADD COLUMN hcs_credit_msg varchar(512) DEFAULT NULL COMMENT ''额度校验说明(超额原因 fdMessage)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_payment_application' AND column_name = 'hcs_credit_time'), + 'SELECT 1', + 'ALTER TABLE blade_payment_application ADD COLUMN hcs_credit_time datetime DEFAULT NULL COMMENT ''额度校验时间''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_payment_application' AND column_name = 'hcs_spec_fd_id'), + 'SELECT 1', + 'ALTER TABLE blade_payment_application ADD COLUMN hcs_spec_fd_id varchar(64) DEFAULT NULL COMMENT ''结算付款特批流程ID(C106-3 返回,C106-4 必传)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_payment_application' AND column_name = 'hcs_spec_status'), + 'SELECT 1', + 'ALTER TABLE blade_payment_application ADD COLUMN hcs_spec_status varchar(16) DEFAULT ''none'' COMMENT ''特批状态 none/need/pushing/processing/approved/rejected''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_payment_application' AND column_name = 'hcs_perf_fd_id'), + 'SELECT 1', + 'ALTER TABLE blade_payment_application ADD COLUMN hcs_perf_fd_id varchar(64) DEFAULT NULL COMMENT ''履约记录ID(C108-1 返回,C108-2 更新必传)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; From cb54b569cd2a34ad8ef56fc442334e001d8d1472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 23:41:56 +0800 Subject: [PATCH 011/124] =?UTF-8?q?feat:=20HCS=E4=BB=98=E6=AC=BE=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E5=90=8C=E6=AD=A5=E6=A0=A1=E9=AA=8C=EF=BC=88C101-1?= =?UTF-8?q?=E5=AE=A2=E5=95=86=E9=A3=8E=E9=99=A9=E9=BB=91=E5=90=8D=E5=8D=95?= =?UTF-8?q?=E9=98=BB=E6=96=AD/C106-1=E9=A2=9D=E5=BA=A6=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E8=B6=85=E9=A2=9D=E8=BD=AC=E7=89=B9=E6=89=B9/=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E7=95=99=E7=97=95check=5Flog=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PaymentApplicationServiceImpl.java | 4 + .../support/hcs/HcsCreditCheckSupport.java | 203 ++++++++++++++++++ 2 files changed, 207 insertions(+) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java index 0ca877da..a52fcc28 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java @@ -95,6 +95,7 @@ import org.springblade.transport.service.IFormalSettlementService; import org.springblade.transport.service.IPaymentApplicationService; import org.springblade.transport.service.KingdeeSyncContext; import org.springblade.transport.support.KingdeeApBillSyncSupport; +import org.springblade.transport.support.hcs.HcsCreditCheckSupport; import org.springblade.transport.wrapper.PaymentApplicationWrapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -145,6 +146,7 @@ private final CustomerReceiptAccountMapper receiptAccountMapper; private final IBfiService bfiService; private final KingdeeApBillSyncSupport kingdeeApBillSyncSupport; private final BfiProperties bfiProperties; + private final HcsCreditCheckSupport hcsCreditCheckSupport; @Override public IPage selectPage(IPage page, PaymentApplicationVO query) { @@ -323,6 +325,8 @@ private final CustomerReceiptAccountMapper receiptAccountMapper; validateProjectAdvanceContract(entity); validateSelectedBill(entity, false); validateQuota(entity); + // HCS 提交同步校验(事务内查询类同步,D15/R2-Q3):C101-1 风险(黑名单阻断)+ C106-1 额度(超额转特批) + hcsCreditCheckSupport.checkOnSubmit(entity); entity.setApprovalStatus(TransportBusiConstant.REVIEWING); entity.setCurrentNode("财务审核"); entity.setCurrentProcessor(AuthUtil.getUserName()); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java new file mode 100644 index 00000000..42605ab7 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java @@ -0,0 +1,203 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsCreditCheckDTO; +import org.springblade.hcs.dto.HcsCreditCheckVO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.dto.HcsRiskQueryDTO; +import org.springblade.hcs.dto.HcsRiskVO; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.CustomerArchiveMapper; +import org.springblade.transport.mapper.HcsContractCheckLogMapper; +import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.CustomerArchive; +import org.springblade.transport.pojo.entity.HcsContractCheckLog; +import org.springblade.transport.pojo.entity.PaymentApplication; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Objects; + +/** + * HCS 付款提交校验支撑组件(C101-1 客商风险 + C106-1 额度校验,设计文档 §5.4,D15/R2-Q3) + *

+ * 付款申请提交(submit)事务内同步调用(查询类同步): + * ① C101-1 按收款方客商编号查风险,黑名单且 block-blacklist=true 时阻断提交; + * ② C106-1 校验申请金额是否超出合同额度,超额不拦截提交,置 hcs_credit_status=over 并标记 + * hcs_spec_status=need 转特批链路(D15/R2-Q2)。 + * 校验依赖合同已推送(hcs_fd_id 存在),未推送时按 credit.require-contract-synced 配置阻断或跳过。 + * 结果留痕 blade_hcs_check_log(biz_type=payment)。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsCreditCheckSupport { + + /** + * C101-1 黑名单状态取值(示例 no 表示非黑名单,§9-U3 字典值联调确认) + */ + private static final String BLACK_STATUS_YES = "yes"; + + private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; + private final ContractManageMapper contractManageMapper; + private final CustomerArchiveMapper customerArchiveMapper; + private final HcsContractCheckLogMapper hcsContractCheckLogMapper; + + /** + * 付款提交同步校验入口(submit 事务内调用,校验结果字段随提交一并落库) + * + * @param payment 付款申请单(须含合同与收款方信息) + */ + public void checkOnSubmit(PaymentApplication payment) { + // ① 客商风险校验(可配开关),黑名单阻断提交 + if (hcsProperties.getRisk().isCheckOnPayment()) { + checkRelativeRisk(payment); + } + // ② 额度校验(超额不拦截,转特批) + checkCredit(payment); + } + + /** + * C101-1 收款方客商风险校验:黑名单且 block-blacklist=true 时阻断提交 + */ + private void checkRelativeRisk(PaymentApplication payment) { + String customerCode = queryCustomerCode(payment.getPayeeName()); + if (StringUtil.isBlank(customerCode)) { + writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_RISK, HcsSyncConstant.CHECK_RESULT_SKIP, + "收款方[" + payment.getPayeeName() + "]反查不到客商编号,跳过风险校验(§9-U6)", null); + log.warn("HCS付款提交风险校验跳过:paymentNo={},收款方反查不到客商编号", payment.getPaymentNo()); + return; + } + HcsRiskQueryDTO param = new HcsRiskQueryDTO(); + // 【必填】客商编号:按收款方名称反查 CustomerArchive 客商编码(用哪个编码待联调,§9-U6) + param.setFdNumber(customerCode); + HcsResult result = hcsClient.getRelativeRisk(param); + if (result == null || !result.isSuccess()) { + log.error("HCS客商风险查询失败响应:{},paymentNo={},fdNumber={}", + result == null ? "无响应" : result.getMsg(), payment.getPaymentNo(), customerCode); + throw new HcsException("C101-1 客商风险查询失败:" + (result == null ? "响应为空" : result.getMsg())); + } + HcsRiskVO risk = result.getData(); + String blackStatus = risk == null ? null : risk.getFdBlackStatus(); + boolean blacklist = BLACK_STATUS_YES.equalsIgnoreCase(blackStatus); + writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_RISK, blacklist ? HcsSyncConstant.CHECK_RESULT_FAIL : HcsSyncConstant.CHECK_RESULT_PASS, + "收款方[" + payment.getPayeeName() + "]黑名单=" + blackStatus + ",风险等级=" + (risk == null ? null : risk.getFdRiskLevel()), + result.getTraceId()); + if (blacklist && hcsProperties.getRisk().isBlockBlacklist()) { + log.error("HCS付款提交被风险校验阻断:paymentNo={},收款方[{}]黑名单", payment.getPaymentNo(), payment.getPayeeName()); + throw new ServiceException("收款方客商黑名单,禁止提交付款申请"); + } + } + + /** + * C106-1 额度校验:通过置 pass;超额置 over 并标记待特批(不拦截提交,D15/R2-Q2) + */ + private void checkCredit(PaymentApplication payment) { + ContractManage contractManage = payment.getContractId() == null ? null : contractManageMapper.selectById(payment.getContractId()); + if (contractManage == null || StringUtil.isBlank(contractManage.getHcsFdId())) { + if (hcsProperties.getCredit().isRequireContractSynced()) { + throw new ServiceException("关联合同尚未推送合规,无法校验额度(paymentNo=" + payment.getPaymentNo() + ")"); + } + log.warn("HCS付款提交额度校验跳过:paymentNo={},合同未推送合规(require-contract-synced=false)", payment.getPaymentNo()); + writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_CREDIT, HcsSyncConstant.CHECK_RESULT_SKIP, "合同未推送合规,跳过额度校验", null); + return; + } + HcsCreditCheckDTO param = new HcsCreditCheckDTO(); + // 【必填】合同ID:HCS 合同ID(blade_contract_manage.hcs_fd_id) + param.setFdContractId(contractManage.getHcsFdId()); + // 【必填】申请金额:PaymentApplication.appliedAmount(元) + param.setFdApplyAmount(payment.getAppliedAmount() == null ? BigDecimal.ZERO : payment.getAppliedAmount()); + HcsResult result = hcsClient.contractCreditCheck(param); + if (result == null || !result.isSuccess()) { + log.error("HCS额度校验失败响应:{},paymentNo={}", result == null ? "无响应" : result.getMsg(), payment.getPaymentNo()); + throw new HcsException("C106-1 额度校验失败:" + (result == null ? "响应为空" : result.getMsg())); + } + HcsCreditCheckVO credit = result.getData(); + payment.setHcsCreditTime(LocalDateTime.now()); + if (credit != null && Boolean.TRUE.equals(credit.getFdIsCredit())) { + // 额度通过:正常提交 + payment.setHcsCreditStatus(HcsSyncConstant.CREDIT_STATUS_PASS); + payment.setHcsCreditMsg(null); + writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_CREDIT, HcsSyncConstant.CHECK_RESULT_PASS, "额度校验通过", result.getTraceId()); + return; + } + // 超额:success 仍为 true,必须以 fdIsCredit 为准;不拦截提交,转入特批链路 + String message = credit == null ? "响应数据为空" : credit.getFdMessage(); + payment.setHcsCreditStatus(HcsSyncConstant.CREDIT_STATUS_OVER); + payment.setHcsCreditMsg(message); + payment.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_NEED); + writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_CREDIT, HcsSyncConstant.CHECK_RESULT_FAIL, "额度超额:" + message, result.getTraceId()); + log.warn("HCS付款提交额度超额(转特批):paymentNo={},{}", payment.getPaymentNo(), message); + } + + /** + * 按名称反查客商编码(照 KingdeeApBillSyncSupport#queryCustomerCode 惯例,查不到返回 null) + */ + private String queryCustomerCode(String customerName) { + if (StringUtil.isBlank(customerName)) { + return null; + } + CustomerArchive customerArchive = customerArchiveMapper.selectOne(Wrappers.lambdaQuery() + .and(wrapper -> wrapper.eq(CustomerArchive::getFullName, customerName).or().eq(CustomerArchive::getShortName, customerName)) + .eq(CustomerArchive::getIsDeleted, 0) + .last("limit 1")); + return customerArchive == null ? null : customerArchive.getCustomerCode(); + } + + /** + * 校验留痕(blade_hcs_check_log,异常不影响主流程) + */ + private void writeCheckLog(PaymentApplication payment, String checkType, String result, String msg, String traceId) { + try { + HcsContractCheckLog checkLog = new HcsContractCheckLog(); + checkLog.setTenantId(payment.getTenantId()); + checkLog.setBizType(HcsSyncConstant.BIZ_TYPE_PAYMENT); + checkLog.setBizId(payment.getId()); + checkLog.setCheckType(checkType); + checkLog.setResult(result); + checkLog.setMsg(msg); + checkLog.setTraceId(traceId); + checkLog.setCreateTime(LocalDateTime.now()); + hcsContractCheckLogMapper.insert(checkLog); + } catch (Exception exception) { + log.error("HCS付款校验留痕写入失败:paymentNo={}", payment.getPaymentNo(), exception); + } + } +} From d6561dda17ccd2f4318501d90dbe2be15620a752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 23:47:36 +0800 Subject: [PATCH 012/124] =?UTF-8?q?feat:=20HCS=E4=BB=98=E6=AC=BE=E9=93=BE?= =?UTF-8?q?=E6=8E=A8=E9=80=81=EF=BC=88C106-3/4=E7=BB=93=E7=AE=97=E4=BB=98?= =?UTF-8?q?=E6=AC=BE=E7=89=B9=E6=89=B9/C108-1/2=E5=B1=A5=E7=BA=A6=E8=AE=B0?= =?UTF-8?q?=E5=BD=95/=E6=89=AB=E6=8F=8F=E7=BC=96=E6=8E=92=E4=B8=8E?= =?UTF-8?q?=E6=89=8B=E5=8A=A8=E7=AB=AF=E7=82=B9/=E7=89=B9=E6=89=B9?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E4=BA=BA=E5=B7=A5=E7=A1=AE=E8=AE=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HcsSyncController.java | 26 +- .../support/hcs/HcsPaymentSyncSupport.java | 156 ++++++++++++ .../support/hcs/HcsPerfRecordSyncSupport.java | 230 ++++++++++++++++++ .../support/hcs/HcsSpecPaySyncSupport.java | 229 +++++++++++++++++ .../transport/task/HcsPushTask.java | 43 +++- .../springblade/hcs/config/HcsProperties.java | 12 + doc/nacos/third-party-api.yaml | 4 + 7 files changed, 692 insertions(+), 8 deletions(-) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 8392512f..f10871d1 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -34,11 +34,13 @@ import lombok.extern.slf4j.Slf4j; import org.springblade.core.tool.api.R; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.support.hcs.HcsContractSyncSupport; +import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; import org.springblade.transport.support.hcs.HcsMasterDataSupport; import org.springblade.transport.support.hcs.HcsProjectSyncSupport; import org.springblade.transport.task.HcsPushTask; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -61,44 +63,58 @@ public class HcsSyncController { private final HcsPushTask hcsPushTask; private final HcsProjectSyncSupport hcsProjectSyncSupport; private final HcsContractSyncSupport hcsContractSyncSupport; + private final HcsPaymentSyncSupport hcsPaymentSyncSupport; private final HcsMasterDataSupport hcsMasterDataSupport; /** - * 单条重推(bizType:project=项目立项 / contract=合同) + * 单条重推(bizType:project=项目立项 / contract=合同 / payment=付款申请) */ @PostMapping("/sync/{bizType}/{id}") @ApiOperationSupport(order = 1) - @Operation(summary = "单条推送/重推合规", description = "重置待同步状态后立即推送,bizType:project=项目立项、contract=合同") + @Operation(summary = "单条推送/重推合规", description = "重置待同步状态后立即推送,bizType:project=项目立项、contract=合同、payment=付款申请") public R repush(@Parameter(description = "业务类型", required = true) @PathVariable String bizType, @Parameter(description = "单据ID", required = true) @PathVariable Long id) { String result = switch (bizType) { case HcsSyncConstant.BIZ_TYPE_PROJECT -> hcsProjectSyncSupport.repushProject(id); case HcsSyncConstant.BIZ_TYPE_CONTRACT -> hcsContractSyncSupport.repushContract(id); + case HcsSyncConstant.BIZ_TYPE_PAYMENT -> hcsPaymentSyncSupport.repushPayment(id); default -> throw new IllegalArgumentException("不支持的HCS推送业务类型:" + bizType); }; return R.data(result); } /** - * 批量推送(bizType:project=项目立项 / contract=合同;复用定时扫描逻辑,单轮批量上限 push.batch-size) + * 批量推送(bizType:project=项目立项 / contract=合同 / payment=付款申请;复用定时扫描逻辑,单轮批量上限 push.batch-size) */ @PostMapping("/sync/{bizType}") @ApiOperationSupport(order = 2) - @Operation(summary = "批量推送合规", description = "扫描待同步/待补偿单据推送一轮,bizType:project=项目立项、contract=合同") + @Operation(summary = "批量推送合规", description = "扫描待同步/待补偿单据推送一轮,bizType:project=项目立项、contract=合同、payment=付款申请") public R pushBatch(@Parameter(description = "业务类型", required = true) @PathVariable String bizType) { String result = switch (bizType) { case HcsSyncConstant.BIZ_TYPE_PROJECT -> hcsPushTask.pushUnsyncedProjects(); case HcsSyncConstant.BIZ_TYPE_CONTRACT -> hcsPushTask.pushUnsyncedContracts(); + case HcsSyncConstant.BIZ_TYPE_PAYMENT -> hcsPushTask.pushUnsyncedPayments(); default -> throw new IllegalArgumentException("不支持的HCS推送业务类型:" + bizType); }; return R.data(result); } + /** + * 特批结果人工确认(§9-U1 过渡方案:v4 无结果查询/回调接口) + */ + @PostMapping("/spec-pay/confirm") + @ApiOperationSupport(order = 3) + @Operation(summary = "特批结果人工确认", description = "传入付款申请ID与结果(approved/rejected),仅特批中(processing)允许确认") + public R confirmSpecResult(@Parameter(description = "付款申请ID", required = true) @RequestParam Long id, + @Parameter(description = "确认结果 approved/rejected", required = true) @RequestParam String result) { + return R.data(hcsPaymentSyncSupport.confirmSpecResult(id, result)); + } + /** * 刷新主数据缓存(C103-6 模板 / C103-7 分类 / C103-12 币种) */ @PostMapping("/master-data/refresh") - @ApiOperationSupport(order = 3) + @ApiOperationSupport(order = 4) @Operation(summary = "刷新HCS主数据缓存", description = "全量重拉模板/分类/币种列表并缓存,同时校验模板映射配置") public R refreshMasterData() { return R.data(hcsMasterDataSupport.refreshAll()); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java new file mode 100644 index 00000000..8fbb1062 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java @@ -0,0 +1,156 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.PaymentApplicationMapper; +import org.springblade.transport.pojo.entity.PaymentApplication; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * HCS 付款链推送编排支撑组件(结算付款特批 C106-3/4 + 履约记录 C108-1/2,设计文档 §5.0/§5.5/§5.6) + *

+ * 编排顺序:特批(额度超额标记 need 时发起)→ 履约记录(审批通过新建 / 实际付款推进更新)。 + * 特批流程ID 与履约记录ID 在各自 Support 内即时持久化;整体同步状态(hcs_sync_status)由本组件统一回写。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsPaymentSyncSupport { + + /** + * 审批通过状态集合 + */ + private static final List APPROVED_STATUSES = List.of("approved"); + + private final PaymentApplicationMapper paymentApplicationMapper; + private final HcsSpecPaySyncSupport hcsSpecPaySyncSupport; + private final HcsPerfRecordSyncSupport hcsPerfRecordSyncSupport; + + /** + * 推送付款申请到 HCS:特批(如需)→ 履约记录(新建/更新)→ 回填整体同步状态 + * + * @param payment 付款申请单(approvalStatus=approved) + * @return 推送结果描述 + */ + public String pushPayment(PaymentApplication payment) { + StringBuilder result = new StringBuilder(); + // ① 结算付款特批:提交时额度超额(hcs_spec_status=need)且未发起时发起 C106-3 + if (HcsSyncConstant.SPEC_STATUS_NEED.equals(payment.getHcsSpecStatus())) { + result.append(hcsSpecPaySyncSupport.pushSpecPay(payment)); + } + // ② 履约记录:审批通过新建 C108-1 / 实际付款推进更新 C108-2 + if (result.length() > 0) { + result.append(";"); + } + result.append(hcsPerfRecordSyncSupport.pushPerfRecord(payment)); + markSynced(payment, result.toString()); + return result.toString(); + } + + /** + * 单条手动重推:重置为待同步并清零重试计数后立即推送(页面"推送合规/重推"按钮入口) + * + * @param id 付款申请单ID + * @return 推送结果描述 + */ + public String repushPayment(Long id) { + PaymentApplication payment = paymentApplicationMapper.selectById(id); + if (payment == null) { + throw new ServiceException("付款申请单不存在:" + id); + } + if (!APPROVED_STATUSES.contains(payment.getApprovalStatus())) { + throw new ServiceException("仅审批通过的付款申请可推送合规(当前状态:" + payment.getApprovalStatus() + ")"); + } + payment.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); + payment.setHcsRetryCount(0); + paymentApplicationMapper.updateById(payment); + try { + return pushPayment(payment); + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "推送异常" : exception.getMessage(); + markFailed(payment, message); + throw new ServiceException("HCS付款申请推送失败:" + message); + } + } + + /** + * 特批结果人工确认(§9-U1 过渡方案:v4 无结果查询/回调接口) + * + * @param id 付款申请单ID + * @param result confirmed approved / rejected + * @return 确认结果描述 + */ + public String confirmSpecResult(Long id, String result) { + PaymentApplication payment = paymentApplicationMapper.selectById(id); + if (payment == null) { + throw new ServiceException("付款申请单不存在:" + id); + } + if (!List.of(HcsSyncConstant.SPEC_STATUS_APPROVED, HcsSyncConstant.SPEC_STATUS_REJECTED).contains(result)) { + throw new ServiceException("特批结果仅支持 approved/rejected"); + } + if (!HcsSyncConstant.SPEC_STATUS_PROCESSING.equals(payment.getHcsSpecStatus())) { + throw new ServiceException("仅特批中的付款申请允许确认结果(当前状态:" + payment.getHcsSpecStatus() + ")"); + } + payment.setHcsSpecStatus(result); + paymentApplicationMapper.updateById(payment); + log.info("HCS特批结果人工确认:paymentNo={},specFdId={},结果={}", payment.getPaymentNo(), payment.getHcsSpecFdId(), result); + return "特批结果已确认:" + result; + } + + /** + * 回填整体同步状态置 synced + */ + public void markSynced(PaymentApplication payment, String message) { + payment.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); + payment.setHcsRetryCount(0); + payment.setHcsSyncTime(LocalDateTime.now()); + payment.setHcsSyncMsg(message); + paymentApplicationMapper.updateById(payment); + log.info("HCS付款申请推送成功:paymentNo={},{}", payment.getPaymentNo(), message); + } + + /** + * 推送失败回写:failed + 重试次数+1 + 失败原因 + */ + public void markFailed(PaymentApplication payment, String message) { + payment.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); + payment.setHcsRetryCount(payment.getHcsRetryCount() == null ? 1 : payment.getHcsRetryCount() + 1); + payment.setHcsSyncTime(LocalDateTime.now()); + payment.setHcsSyncMsg(message); + paymentApplicationMapper.updateById(payment); + log.error("HCS付款申请推送失败:paymentNo={},retryCount={},{}", payment.getPaymentNo(), payment.getHcsRetryCount(), message); + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java new file mode 100644 index 00000000..1019a314 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java @@ -0,0 +1,230 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsAttachmentRefDTO; +import org.springblade.hcs.dto.HcsMechanismsDTO; +import org.springblade.hcs.dto.HcsPerfRecordFormDataDTO; +import org.springblade.hcs.dto.HcsPerfRecordPropsDTO; +import org.springblade.hcs.dto.HcsPerfRecordSaveDTO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.dto.HcsFormSaveVO; +import org.springblade.hcs.dto.HcsUserRefVO; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springblade.system.cache.UserCache; +import org.springblade.system.pojo.entity.User; +import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.HcsContractExeStageMapper; +import org.springblade.transport.mapper.PaymentApplicationMapper; +import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.HcsContractExeStage; +import org.springblade.transport.pojo.entity.PaymentApplication; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.List; + +/** + * HCS 履约记录同步支撑组件(C108-1 新建 / C108-2 更新,设计文档 §5.6,D11) + *

+ * 付款申请为主线:审批通过 → C108-1 新增(返回 fdId 回填 hcs_perf_fd_id); + * 实际付款推进(paidAmount 变化置待同步)→ C108-2 更新(formData.fdId=hcs_perf_fd_id 必填,响应无 data)。 + * 关联履约阶段:按合同+付款类型匹配已同步的履约规则行(付款/收款执行与计划阶段对应), + * 无关联则不传 fd_id(§5.6)。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsPerfRecordSyncSupport { + + /** + * 履约记录附件字段标识 + */ + private static final String PERF_ATTACH_ENTITY_KEY = "fd_plan_att"; + + private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; + private final ContractManageMapper contractManageMapper; + private final HcsContractExeStageMapper hcsContractExeStageMapper; + private final PaymentApplicationMapper paymentApplicationMapper; + private final HcsAttachmentSupport hcsAttachmentSupport; + + /** + * 推送履约记录:无记录ID 走 C108-1 新增,有记录ID 走 C108-2 更新;记录ID 立即持久化 + * + * @param payment 付款申请单(approvalStatus=approved) + * @return 推送结果描述 + */ + public String pushPerfRecord(PaymentApplication payment) { + String operatorLoginName = resolveLoginName(payment); + if (StringUtil.isBlank(payment.getHcsPerfFdId())) { + HcsPerfRecordSaveDTO param = buildAddParam(payment, operatorLoginName); + log.info("HCS履约记录新建开始:paymentNo={}", payment.getPaymentNo()); + HcsResult result = hcsClient.perfRecordAdd(param); + if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdId())) { + log.error("HCS履约记录新建失败响应:{},paymentNo={}", result == null ? "无响应" : result.getMsg(), payment.getPaymentNo()); + throw new HcsException("C108-1 履约记录新建失败:" + (result == null ? "响应为空" : result.getMsg())); + } + // 履约记录ID 立即持久化(调用方必须保存) + payment.setHcsPerfFdId(result.getData().getFdId()); + paymentApplicationMapper.updateById(payment); + log.info("HCS履约记录新建成功:paymentNo={},perfFdId={}", payment.getPaymentNo(), payment.getHcsPerfFdId()); + return "C108-1 履约记录新建成功"; + } + // C108-2 更新:formData.fdId 必填,响应无 data,success=true 即成功 + HcsPerfRecordSaveDTO param = buildUpdateParam(payment, operatorLoginName); + log.info("HCS履约记录更新开始:paymentNo={},perfFdId={}", payment.getPaymentNo(), payment.getHcsPerfFdId()); + HcsResult result = hcsClient.perfRecordUpdate(param); + if (result == null || !result.isSuccess()) { + log.error("HCS履约记录更新失败响应:{},paymentNo={}", result == null ? "无响应" : result.getMsg(), payment.getPaymentNo()); + throw new HcsException("C108-2 履约记录更新失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return "C108-2 履约记录更新成功"; + } + + /** + * C108-1 新建入参(字段标注照 §3.4 规范,映射见设计文档 §5.6) + */ + private HcsPerfRecordSaveDTO buildAddParam(PaymentApplication payment, String operatorLoginName) { + HcsPerfRecordSaveDTO param = new HcsPerfRecordSaveDTO(); + // 【必填】当前操作人 {fdLoginName}(付款申请创建人,§9-U2) + param.setCurUser(HcsUserRefVO.ofLoginName(operatorLoginName)); + param.setFormData(buildFormData(payment)); + // 附件挂载:attachmentsJson 转传,fdEntityKey=fd_plan_att + param.setMechanisms(buildMechanisms(payment, operatorLoginName)); + return param; + } + + /** + * C108-2 更新入参:formData.fdId 必填,传实际金额与合同ID + */ + private HcsPerfRecordSaveDTO buildUpdateParam(PaymentApplication payment, String operatorLoginName) { + HcsPerfRecordSaveDTO param = new HcsPerfRecordSaveDTO(); + param.setCurUser(HcsUserRefVO.ofLoginName(operatorLoginName)); + HcsPerfRecordFormDataDTO formData = buildFormData(payment); + // 【必填】履约记录ID(C108-1 新建返回) + formData.setFdId(payment.getHcsPerfFdId()); + param.setFormData(formData); + return param; + } + + /** + * 履约记录 formData(新建/更新共用) + */ + private HcsPerfRecordFormDataDTO buildFormData(PaymentApplication payment) { + ContractManage contractManage = payment.getContractId() == null ? null : contractManageMapper.selectById(payment.getContractId()); + HcsContractExeStage stageRow = findPaymentStageRow(payment); + HcsPerfRecordFormDataDTO formData = new HcsPerfRecordFormDataDTO(); + HcsPerfRecordPropsDTO props = new HcsPerfRecordPropsDTO(); + // 申请金额:appliedAmount(接口按字符串传值) + props.setFdApplyAmount(payment.getAppliedAmount() == null ? null : payment.getAppliedAmount().toPlainString()); + // 实际金额:paidAmount(实际付款推进后更新) + props.setFdFactAmount(payment.getPaidAmount() == null ? null : payment.getPaidAmount().toPlainString()); + // 申请编号:付款申请单号(接口文档 §8.3 字段) + props.setFdApplyNo(payment.getPaymentNo()); + // 计划日期:applyDate(毫秒时间戳) + props.setFdPlanDate(toMillis(payment.getApplyDate())); + // 计划类型:paymentType(原文拼写 fd_paln_type 必须沿用) + props.setFdPalnType(payment.getPaymentType()); + // 性质:款项性质取关联履约规则行的款项性质(无关联不传) + props.setFdProperty(stageRow == null ? null : stageRow.getFundNature()); + // 来源履约计划项ID:关联履约阶段 hcs_stage_fd_id(无关联则不传,§5.6) + props.setFdId(stageRow == null ? null : stageRow.getHcsStageFdId()); + // 合同ID:HCS 合同ID(合同未推送时不传) + props.setFdContractId(contractManage == null ? null : contractManage.getHcsFdId()); + // 表单模板ID:配置 perf-record.xform-id(环境值,§9-U9,未配置不传) + props.setFdXformId(StringUtil.isBlank(hcsProperties.getPerfRecord().getXformId()) ? null : hcsProperties.getPerfRecord().getXformId()); + formData.setDynamicProps(props); + return formData; + } + + /** + * 履约记录附件挂载(无附件或开关关闭返回 null) + */ + private HcsMechanismsDTO buildMechanisms(PaymentApplication payment, String operatorLoginName) { + if (!hcsProperties.getAttachment().isTransferEnabled() || StringUtil.isBlank(payment.getAttachmentsJson())) { + return null; + } + List attachmentFdIds = hcsAttachmentSupport.transferAttachments(payment.getAttachmentsJson(), operatorLoginName); + if (attachmentFdIds.isEmpty()) { + return null; + } + HcsMechanismsDTO mechanisms = new HcsMechanismsDTO(); + mechanisms.setAttachment(attachmentFdIds.stream().map(fdId -> { + HcsAttachmentRefDTO attachment = new HcsAttachmentRefDTO(); + // 附件ID(C103-2 转传返回) + attachment.setFdId(fdId); + // 履约记录附件字段标识 + attachment.setFdEntityKey(PERF_ATTACH_ENTITY_KEY); + return attachment; + }).toList()); + return mechanisms; + } + + /** + * 匹配合同的付款履约规则行(perform_type=payment 且已同步,取第一条) + */ + private HcsContractExeStage findPaymentStageRow(PaymentApplication payment) { + if (payment.getContractId() == null) { + return null; + } + return hcsContractExeStageMapper.selectOne(Wrappers.lambdaQuery() + .eq(HcsContractExeStage::getContractId, payment.getContractId()) + .eq(HcsContractExeStage::getPerformType, "payment") + .isNotNull(HcsContractExeStage::getHcsStageFdId) + .last("limit 1")); + } + + /** + * 操作人登录名(付款申请创建人,§9-U2) + */ + private String resolveLoginName(PaymentApplication payment) { + if (payment.getCreateUser() == null) { + throw new HcsException("C108 履约记录推送失败,付款申请创建人未维护(paymentNo=" + payment.getPaymentNo() + ")"); + } + User user = UserCache.getUser(payment.getCreateUser()); + if (user == null || StringUtil.isBlank(user.getAccount())) { + throw new HcsException("C108 履约记录推送失败,创建人登录名解析不到(createUser=" + payment.getCreateUser() + ")"); + } + return user.getAccount(); + } + + /** + * LocalDate → 毫秒时间戳 + */ + private Long toMillis(LocalDate localDate) { + return localDate == null ? null : localDate.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java new file mode 100644 index 00000000..990490e6 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java @@ -0,0 +1,229 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsAttachmentRefDTO; +import org.springblade.hcs.dto.HcsMechanismsDTO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.dto.HcsFormSaveVO; +import org.springblade.hcs.dto.HcsSpecPayFormDataDTO; +import org.springblade.hcs.dto.HcsSpecPayPropsDTO; +import org.springblade.hcs.dto.HcsSpecPaySaveDTO; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springblade.system.cache.UserCache; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.system.pojo.entity.User; +import org.springblade.transport.mapper.PaymentApplicationMapper; +import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.PaymentApplication; +import org.springblade.transport.mapper.ContractManageMapper; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * HCS 结算付款特批同步支撑组件(C106-3 发起 / C106-4 更新,设计文档 §5.5) + *

+ * 触发:付款申请审批通过且 hcs_spec_status=need(提交时额度超额标记)→ 扫描任务发起 C106-3, + * 返回 data.data.fdId(双层嵌套)→ hcs_spec_fd_id,状态置 processing; + * 单据变更且特批流程存在时走 C106-4(顶层 fdId=hcs_spec_fd_id,附件不带 fdBindType)。 + * 特批结果:v4 无结果查询/回调接口,approved/rejected 一期由页面人工确认(§9-U1)。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsSpecPaySyncSupport { + + /** + * 特批附件字段标识 + */ + private static final String SPEC_ATTACH_ENTITY_KEY = "fd_spc_approval_attach"; + + private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; + private final ContractManageMapper contractManageMapper; + private final PaymentApplicationMapper paymentApplicationMapper; + private final HcsAttachmentSupport hcsAttachmentSupport; + + /** + * 推送结算付款特批:未发起走 C106-3,已发起走 C106-4;流程ID 与状态立即持久化 + * + * @param payment 付款申请单(hcs_spec_status=need) + * @return 推送结果描述 + */ + public String pushSpecPay(PaymentApplication payment) { + String operatorLoginName = resolveLoginName(payment); + HcsSpecPaySaveDTO param = buildSpecPayParam(payment, operatorLoginName); + if (StringUtil.isBlank(payment.getHcsSpecFdId())) { + // C106-3 发起:返回双层嵌套 data.data.fdId + log.info("HCS结算付款特批发起开始:paymentNo={}", payment.getPaymentNo()); + HcsResult> result = hcsClient.addSpecApplyPay(param); + String specFdId = extractNestedFdId(payment, result); + payment.setHcsSpecFdId(specFdId); + payment.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_PROCESSING); + paymentApplicationMapper.updateById(payment); + log.info("HCS结算付款特批发起成功:paymentNo={},specFdId={}", payment.getPaymentNo(), specFdId); + return "C106-3 特批发起成功"; + } + // C106-4 更新:顶层 fdId 必填,内层无业务数据,以内层 success 判断 + log.info("HCS结算付款特批更新开始:paymentNo={},specFdId={}", payment.getPaymentNo(), payment.getHcsSpecFdId()); + HcsResult> result = hcsClient.updateSpecApplyPay(param); + if (result == null || !result.isSuccess()) { + log.error("HCS结算付款特批更新失败响应:{},paymentNo={}", result == null ? "无响应" : result.getMsg(), payment.getPaymentNo()); + throw new HcsException("C106-4 特批更新失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return "C106-4 特批更新成功"; + } + + /** + * 组装 C106-3/C106-4 入参(字段标注照 §3.4 规范,映射表见设计文档 §5.5) + */ + private HcsSpecPaySaveDTO buildSpecPayParam(PaymentApplication payment, String operatorLoginName) { + ContractManage contractManage = payment.getContractId() == null ? null : contractManageMapper.selectById(payment.getContractId()); + HcsSpecPaySaveDTO param = new HcsSpecPaySaveDTO(); + // 结算付款流程ID:发起不传,更新必填(C106-4 顶层 fdId) + param.setFdId(payment.getHcsSpecFdId()); + // 【必填】操作人登录名:付款申请创建人登录名(§9-U2) + param.setFdLoginName(operatorLoginName); + HcsSpecPayFormDataDTO formData = new HcsSpecPayFormDataDTO(); + HcsSpecPayPropsDTO props = new HcsSpecPayPropsDTO(); + // 【必填】合同:传合规合同ID(blade_contract_manage.hcs_fd_id,非名称) + props.setFdContractName(requireContractFdId(payment, contractManage)); + // 合同编号 + props.setFdContractNo(payment.getContractNo()); + // 单据编号:付款申请单号(来源付款单标识) + props.setFdDocNo(payment.getPaymentNo()); + // 单据主题:"结算付款特批-" + 付款单号 + props.setFdDocSubject("结算付款特批-" + payment.getPaymentNo()); + // 来源付款单ID:付款申请单号(§5.5 映射表) + props.setFdId(payment.getPaymentNo()); + // 付款金额:appliedAmount + props.setFdPayAmount(payment.getAppliedAmount()); + // 合计金额:settlementAmount + props.setFdTotalAmount(payment.getSettlementAmount() == null ? BigDecimal.ZERO : payment.getSettlementAmount()); + // 付款人 / 收款人 + props.setFdPayer(payment.getPayerName()); + props.setFdPayee(payment.getPayeeName()); + // 收款账户名 / 收款账号 / 开户行 + props.setFdReceiveAccountName(payment.getReceiptAccountName()); + props.setFdReceiveAccount(payment.getBankAccount()); + props.setFdBankName(payment.getBankName()); + // 结算币种:TMS 无币种字段,按 currency-name-mapping 默认值(人民币) + props.setFdSettleCurrency(hcsProperties.getContract().getCurrencyNameMapping().getOrDefault("RMB", "人民币")); + // 付款用途 / 付款性质 / 付款类型:字典值配置(§9-U3 待联调后配置) + props.setFdPaymentPurpose(hcsProperties.getSpecPay().getPaymentPurpose()); + props.setFdPaymentNature(hcsProperties.getSpecPay().getPaymentNature()); + props.setFdPaymentType(hcsProperties.getSpecPay().getPaymentType()); + // 事由 / 补充说明:remark + props.setFdReason(payment.getRemark()); + props.setFdSupplementNote(payment.getRemark()); + // 单据状态:配置 spec-pay.doc-status(示例 10) + props.setFdDocStatus(hcsProperties.getSpecPay().getDocStatus()); + // 特批附件字段标识:固定 fd_spc_approval_attach + props.setFdSpcApprovalAttach(SPEC_ATTACH_ENTITY_KEY); + formData.setDynamicProps(props); + // 表单层单据主题 + formData.setFdDocSubject("结算付款特批-" + payment.getPaymentNo()); + // 表单层单据状态:配置 spec-pay.doc-status + formData.setFdDocStatus(hcsProperties.getSpecPay().getDocStatus()); + param.setFormData(formData); + // 附件挂载:attachmentsJson 经 C103-2 转传,特批附件 fdEntityKey=fd_spc_approval_attach, + // 发起带 fdBindType=ADD,更新不带 + param.setMechanisms(buildMechanisms(payment, operatorLoginName)); + return param; + } + + /** + * 特批附件挂载(附件转传开关关闭或无附件时返回 null) + */ + private HcsMechanismsDTO buildMechanisms(PaymentApplication payment, String operatorLoginName) { + if (!hcsProperties.getAttachment().isTransferEnabled() || StringUtil.isBlank(payment.getAttachmentsJson())) { + return null; + } + List attachmentFdIds = hcsAttachmentSupport.transferAttachments(payment.getAttachmentsJson(), operatorLoginName); + if (attachmentFdIds.isEmpty()) { + return null; + } + HcsMechanismsDTO mechanisms = new HcsMechanismsDTO(); + boolean add = StringUtil.isBlank(payment.getHcsSpecFdId()); + mechanisms.setAttachment(attachmentFdIds.stream().map(fdId -> { + HcsAttachmentRefDTO attachment = new HcsAttachmentRefDTO(); + // 附件ID(C103-2 转传返回) + attachment.setFdId(fdId); + // 特批附件字段标识 + attachment.setFdEntityKey(SPEC_ATTACH_ENTITY_KEY); + // 绑定类型:仅发起传 ADD + attachment.setFdBindType(add ? "ADD" : null); + return attachment; + }).toList()); + return mechanisms; + } + + /** + * 解析 C106-3 双层嵌套返回 data.data.fdId + */ + private String extractNestedFdId(PaymentApplication payment, HcsResult> result) { + if (result == null || !result.isSuccess() || result.getData() == null || !result.getData().isSuccess() + || result.getData().getData() == null || StringUtil.isBlank(result.getData().getData().getFdId())) { + log.error("HCS结算付款特批发起失败响应:{},paymentNo={}", result == null ? "无响应" : result.getMsg(), payment.getPaymentNo()); + throw new HcsException("C106-3 特批发起失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return result.getData().getData().getFdId(); + } + + /** + * 合规合同ID(fd_contract_name 必填,合同未推送时失败提示) + */ + private String requireContractFdId(PaymentApplication payment, ContractManage contractManage) { + if (contractManage == null || StringUtil.isBlank(contractManage.getHcsFdId())) { + throw new HcsException("C106 特批推送失败,关联合同尚未推送合规(paymentNo=" + payment.getPaymentNo() + ")"); + } + return contractManage.getHcsFdId(); + } + + /** + * 操作人登录名(付款申请创建人,§9-U2) + */ + private String resolveLoginName(PaymentApplication payment) { + if (payment.getCreateUser() == null) { + throw new HcsException("C106 特批推送失败,付款申请创建人未维护(paymentNo=" + payment.getPaymentNo() + ")"); + } + User user = UserCache.getUser(payment.getCreateUser()); + if (user == null || StringUtil.isBlank(user.getAccount())) { + throw new HcsException("C106 特批推送失败,创建人登录名解析不到(createUser=" + payment.getCreateUser() + ")"); + } + return user.getAccount(); + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java index 6d35899c..dc6fcbf5 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java @@ -33,10 +33,13 @@ import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.mapper.ProjectApplyMapper; import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.PaymentApplication; import org.springblade.transport.pojo.entity.ProjectApply; import org.springblade.transport.support.hcs.HcsContractSyncSupport; +import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; import org.springblade.transport.support.hcs.HcsProjectSyncSupport; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; @@ -51,9 +54,9 @@ import java.util.UUID; *

* 审批代码零埋点:扫描只认 approvalStatus=approved/change_approved 且 hcs_sync_status=unsynced/failed(重试未超限), * 与审批入口(/approve、MK 回调)无关;失败落 failed 由下轮扫描自动补偿,超限仅人工重推(D7)。 - * 任务顺序:项目 → 合同(内含风险校验→附件转传→C103-1→履约规则 C103-9 行级同步)。 + * 任务顺序:项目 → 合同(内含风险校验→附件转传→C103-1→履约规则 C103-9 行级同步)→ 付款特批/履约记录。 * 多实例部署时以 Redis 分布式锁防重扫(照既有 BladeRedis 用法,单实例部署行为与既有金蝶任务一致)。 - * 扫描与推送逻辑收敛在 pushUnsyncedProjects/pushUnsyncedContracts,供手动端点(HcsSyncController)复用。 + * 扫描与推送逻辑收敛在 pushUnsyncedProjects/pushUnsyncedContracts/pushUnsyncedPayments,供手动端点(HcsSyncController)复用。 *

* 调度配置(Nacos thirdParty.hcs.push.*):sync-enabled 总开关(默认关,灰度打开)、cron、batch-size、max-retry。 * @@ -77,8 +80,10 @@ public class HcsPushTask { private final HcsProperties hcsProperties; private final ProjectApplyMapper projectApplyMapper; private final ContractManageMapper contractManageMapper; + private final PaymentApplicationMapper paymentApplicationMapper; private final HcsProjectSyncSupport hcsProjectSyncSupport; private final HcsContractSyncSupport hcsContractSyncSupport; + private final HcsPaymentSyncSupport hcsPaymentSyncSupport; private final BladeRedis bladeRedis; /** @@ -104,9 +109,10 @@ public class HcsPushTask { return; } try { - // 任务顺序(设计文档 §5.0):项目 → 合同;两类互不影响 + // 任务顺序(设计文档 §5.0):项目 → 合同 → 付款;各类互不影响 log.info("定时推送HCS项目立项:{}", pushUnsyncedProjects()); log.info("定时推送HCS合同:{}", pushUnsyncedContracts()); + log.info("定时推送HCS付款链:{}", pushUnsyncedPayments()); } finally { if (lockHolder.equals(bladeRedis.get(HcsSyncConstant.PUSH_TASK_LOCK_KEY))) { bladeRedis.del(HcsSyncConstant.PUSH_TASK_LOCK_KEY); @@ -175,4 +181,35 @@ public class HcsPushTask { } return summary; } + + /** + * 扫描并推送待同步/待补偿的付款申请(C106 特批 + C108 履约记录),返回结果汇总 + * + * @return 汇总描述 + */ + public String pushUnsyncedPayments() { + int maxRetry = hcsProperties.getPush().getMaxRetry(); + List paymentList = paymentApplicationMapper.selectList(Wrappers.lambdaQuery() + .eq(PaymentApplication::getApprovalStatus, "approved") + .in(PaymentApplication::getHcsSyncStatus, List.of(HcsSyncConstant.HCS_STATUS_UNSYNCED, HcsSyncConstant.HCS_STATUS_FAILED)) + .and(wrapper -> wrapper.isNull(PaymentApplication::getHcsRetryCount).or().lt(PaymentApplication::getHcsRetryCount, maxRetry)) + .last("limit " + hcsProperties.getPush().getBatchSize())); + int successCount = 0; + int failCount = 0; + for (PaymentApplication payment : paymentList) { + try { + hcsPaymentSyncSupport.pushPayment(payment); + successCount++; + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "推送异常" : exception.getMessage(); + hcsPaymentSyncSupport.markFailed(payment, message); + failCount++; + } + } + String summary = String.format("扫描 %d 条,成功 %d 条,失败 %d 条(重试上限 %d)", paymentList.size(), successCount, failCount, maxRetry); + if (failCount > 0) { + log.warn("HCS付款链推送存在失败:{}", summary); + } + return summary; + } } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 93f2fefb..3963b0d8 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -100,6 +100,10 @@ public class HcsProperties { * 结算付款特批(C106-3/4)配置 */ private SpecPay specPay = new SpecPay(); + /** + * 履约记录(C108-1/2)配置 + */ + private PerfRecord perfRecord = new PerfRecord(); /** * 开票登记(C111)配置 */ @@ -245,6 +249,14 @@ public class HcsProperties { private Map invoiceTypeMapping = new HashMap<>(); } + @Data + public static class PerfRecord { + /** + * 履约记录表单模板ID(fd_xform_id,环境相关值,§9-U9 待合规方提供) + */ + private String xformId = ""; + } + @Data public static class Attachment { /** diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index db3628d9..d25cd9ad 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -138,6 +138,10 @@ thirdParty: receipt-bill: # TMS 发票类型 -> HCS 收票发票类型字典值(§9-U3 待联调后配置) invoice-type-mapping: {} + # 履约记录(C108-1/2) + perf-record: + # 表单模板ID(fd_xform_id,环境相关值,§9-U9 待合规方提供) + xform-id: ${HCS_PERF_RECORD_XFORM_ID:} # 附件转传(C103-2) attachment: # 附件转传总开关 From 165c22c2d7dace7aba2937323d97c29bd6fbed76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 23:51:07 +0800 Subject: [PATCH 013/124] =?UTF-8?q?feat:=20HCS=E5=BC=80=E7=A5=A8=E6=94=B6?= =?UTF-8?q?=E7=A5=A8=E6=95=B0=E6=8D=AE=E5=B1=82=E4=B8=8E=E9=9B=B6=E5=9F=8B?= =?UTF-8?q?=E7=82=B9=E6=8E=A5=E7=BA=BF=EF=BC=88=E5=AE=9E=E4=BD=93=E5=90=88?= =?UTF-8?q?=E8=A7=84=E5=AD=97=E6=AE=B5=E7=BB=84/=E6=94=B6=E7=A5=A8?= =?UTF-8?q?=E5=90=88=E5=90=8C=E8=A1=A5=E5=BD=95=E5=AD=97=E6=AE=B5/?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E4=B8=8E=E9=87=91=E8=9D=B6=E5=BC=80=E7=A5=A8?= =?UTF-8?q?=E5=9B=9E=E5=86=99=E7=BD=AE=E5=BE=85=E5=90=8C=E6=AD=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/entity/InvoiceApplication.java | 10 ++++++++++ .../transport/pojo/entity/InvoiceReceipt.java | 14 ++++++++++++++ .../impl/InvoiceApplicationServiceImpl.java | 7 +++++++ .../impl/InvoiceReceiptServiceImpl.java | 5 +++++ .../blade_hcs_receipt_fields_20260927.sql | 18 ++++++++++++++++++ 5 files changed, 54 insertions(+) create mode 100644 doc/sql/transport/blade_hcs_receipt_fields_20260927.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceApplication.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceApplication.java index 960cb23d..48ae4d6e 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceApplication.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceApplication.java @@ -179,4 +179,14 @@ public class InvoiceApplication extends TenantEntity { * 作废原因,驳回时记录驳回原因 */ private String voidReason; + /** 合规系统单据ID(fdId) */ + private String hcsFdId; + /** 合规同步状态:unsynced 待同步 / synced 已同步 / failed 同步失败 */ + private String hcsSyncStatus; + /** 合规推送失败重试次数 */ + private Integer hcsRetryCount; + /** 合规最近同步时间 */ + private LocalDateTime hcsSyncTime; + /** 合规最近同步结果信息/失败原因 */ + private String hcsSyncMsg; } diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceReceipt.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceReceipt.java index 0843525b..143c27d1 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceReceipt.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceReceipt.java @@ -176,4 +176,18 @@ public class InvoiceReceipt extends TenantEntity { * 作废原因 */ private String voidReason; + /** 合规系统单据ID(fdId) */ + private String hcsFdId; + /** 合规同步状态:unsynced 待同步 / synced 已同步 / failed 同步失败 */ + private String hcsSyncStatus; + /** 合规推送失败重试次数 */ + private Integer hcsRetryCount; + /** 合规最近同步时间 */ + private LocalDateTime hcsSyncTime; + /** 合规最近同步结果信息/失败原因 */ + private String hcsSyncMsg; + /** 合规推送合同ID(应付结算回溯不到时人工补录,D13) */ + private Long hcsContractId; + /** 合规推送合同编号(应付结算回溯不到时人工补录,D13) */ + private String hcsContractNo; } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceApplicationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceApplicationServiceImpl.java index e27d0c3c..baf49500 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceApplicationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceApplicationServiceImpl.java @@ -52,6 +52,7 @@ import org.springblade.thirdparty.bfi.pojo.vo.BfiOpenApiResultVO; import org.springblade.thirdparty.bfi.pojo.vo.BfiPageVO; import org.springblade.thirdparty.bfi.service.IBfiService; import org.springblade.transport.config.BfiProperties; +import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.constant.KingdeeBfiConstant; import org.springblade.transport.constant.TransportBusiConstant; import org.springblade.transport.mapper.ContractManageMapper; @@ -886,6 +887,8 @@ public class InvoiceApplicationServiceImpl extends BaseServiceImpl Date: Sun, 27 Sep 2026 23:57:38 +0800 Subject: [PATCH 014/124] =?UTF-8?q?feat:=20HCS=E5=BC=80=E7=A5=A8=E7=99=BB?= =?UTF-8?q?=E8=AE=B0=E5=90=8C=E6=AD=A5=E6=94=AF=E6=92=91=EF=BC=88C111-1?= =?UTF-8?q?=E5=88=A4=E9=87=8D/C111-2=E6=96=B0=E5=A2=9E/C111-3=E7=A5=A8?= =?UTF-8?q?=E6=8D=AE=E6=97=A5=E6=9C=9F=E5=9B=9E=E5=A1=AB/=E5=BA=94?= =?UTF-8?q?=E6=94=B6=E7=BB=93=E7=AE=97=E9=93=BE=E8=B7=AF=E5=90=88=E5=90=8C?= =?UTF-8?q?=E5=9B=9E=E6=BA=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsInvoiceRegSyncSupport.java | 334 ++++++++++++++++++ .../hcs/dto/HcsInvoiceRegUpdateDTO.java | 4 + 2 files changed, 338 insertions(+) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java new file mode 100644 index 00000000..f4ca4d03 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java @@ -0,0 +1,334 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsIdVO; +import org.springblade.hcs.dto.HcsInvoiceRegAddDTO; +import org.springblade.hcs.dto.HcsInvoiceRegUpdateDTO; +import org.springblade.hcs.dto.HcsPageQueryDTO; +import org.springblade.hcs.dto.HcsPageVO; +import org.springblade.hcs.dto.HcsInvoiceRegVO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springblade.transport.constant.KingdeeBfiConstant; +import org.springblade.system.cache.SysCache; +import org.springblade.system.cache.UserCache; +import org.springblade.system.pojo.entity.Dept; +import org.springblade.system.pojo.entity.User; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.InvoiceApplicationInvoiceMapper; +import org.springblade.transport.mapper.InvoiceApplicationMapper; +import org.springblade.transport.mapper.InvoiceApplicationSettlementMapper; +import org.springblade.transport.mapper.FormalSettlementMapper; +import org.springblade.transport.pojo.entity.FormalSettlement; +import org.springblade.transport.pojo.entity.InvoiceApplication; +import org.springblade.transport.pojo.entity.InvoiceApplicationInvoice; +import org.springblade.transport.pojo.entity.InvoiceApplicationSettlement; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * HCS 开票登记同步支撑组件(C111-1 查询判重 / C111-2 新增 / C111-3 更新,设计文档 §5.7,D12) + *

+ * 审批通过即推 C111-2(票据日期空);金蝶开票完成(kingdeeStatus=invoiced,由金蝶结果回写置待同步) + * → C111-3 回填 fdBillDate/fdStatus。判重 C111-1 conditions={"fdNumber": applicationNo}(§9-U4 联调确认)。 + * fdContractNumber 缺口:InvoiceApplication 无合同字段,经应收结算关联表回溯合同编号(§9-U10,回溯不到失败提示)。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsInvoiceRegSyncSupport { + + private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; + private final InvoiceApplicationMapper invoiceApplicationMapper; + private final InvoiceApplicationSettlementMapper invoiceApplicationSettlementMapper; + private final InvoiceApplicationInvoiceMapper invoiceApplicationInvoiceMapper; + private final FormalSettlementMapper formalSettlementMapper; + private final HcsAttachmentSupport hcsAttachmentSupport; + + /** + * 推送开票登记:无合规ID 走判重+C111-2 新增(金蝶已开票完成时紧接着 C111-3),有合规ID 走 C111-3 + * + * @param application 开票申请单(approvalStatus=approved) + * @return 推送结果描述 + */ + public String pushInvoiceRegistration(InvoiceApplication application) { + if (StringUtil.isBlank(application.getHcsFdId())) { + String existFdId = findExistFdId(application); + if (StringUtil.isNotBlank(existFdId)) { + markSynced(application, existFdId, "判重命中,回填已有合规开票登记ID"); + return "判重命中,回填已有合规开票登记ID"; + } + String fdId = addInvoiceRegistration(application); + // 开票登记ID 立即持久化(调用方必须保存) + markSynced(application, fdId, "C111-2 开票登记新增成功"); + String result = "C111-2 开票登记新增成功"; + // 金蝶已开票完成(新增前回写竞态):紧接着回填票据日期 + if (KingdeeBfiConstant.KINGDEE_STATUS_INVOICED.equals(application.getKingdeeStatus())) { + result += ";" + updateInvoiceRegistration(application); + } + return result; + } + String result = updateInvoiceRegistration(application); + markSynced(application, application.getHcsFdId(), "C111-3 开票登记更新成功"); + return result; + } + + /** + * 单条手动重推:重置为待同步并清零重试计数后立即推送 + * + * @param id 开票申请单ID + * @return 推送结果描述 + */ + public String repushInvoiceRegistration(Long id) { + InvoiceApplication application = invoiceApplicationMapper.selectById(id); + if (application == null) { + throw new ServiceException("开票申请单不存在:" + id); + } + if (!"approved".equals(application.getApprovalStatus())) { + throw new ServiceException("仅审批通过的开票申请可推送合规(当前状态:" + application.getApprovalStatus() + ")"); + } + application.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); + application.setHcsRetryCount(0); + invoiceApplicationMapper.updateById(application); + try { + return pushInvoiceRegistration(application); + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "推送异常" : exception.getMessage(); + markFailed(application, message); + throw new ServiceException("HCS开票登记推送失败:" + message); + } + } + + /** + * C111-2 新增开票登记,返回合规 fdId(字段标注照 §3.4 规范,映射见设计文档 §5.7) + */ + private String addInvoiceRegistration(InvoiceApplication application) { + HcsInvoiceRegAddDTO param = new HcsInvoiceRegAddDTO(); + // 单据编号:开票申请单号(同租户唯一,判重候选键) + param.setFdNumber(application.getApplicationNo()); + // 登记日期:applicationDate(毫秒时间戳) + param.setFdRegisterDate(toMillis(application.getApplicationDate())); + // 【必填】合同编号:经应收结算链路回溯(§9-U10 关联字段确认后细化) + param.setFdContractNumber(requireContractNumber(application)); + // 发票类型:invoice-type-mapping 字典映射(§9-U3,未配置不传) + param.setFdInvoiceType(hcsProperties.getInvoice().getInvoiceTypeMapping().get(application.getInvoiceType())); + if (param.getFdInvoiceType() == null) { + log.warn("HCS开票登记发票类型映射缺失:invoiceType=[{}] 不在 invoice.invoice-type-mapping,fdInvoiceType 不传(§9-U3)", + application.getInvoiceType()); + } + // 【必填】结算币种:currency-id-mapping(TMS 币种码 → HCS 币种fdId,经 C103-12 缓存取值) + param.setFdCurrencyId(requireCurrencyId(application)); + // 开票方(销方):issuerName + param.setFdInvoiceParty(application.getIssuerName()); + // 款项性质:配置 invoice.fund-nature-default(默认 progress) + param.setFdFundNature(hcsProperties.getInvoice().getFundNatureDefault()); + // 开票金额(含税):invoiceAmount + param.setFdInvoiceAmount(application.getInvoiceAmount()); + // 备注:remark + param.setFdRemark(application.getRemark()); + // 状态:新增固定 0(已开票) + param.setFdStatus(0); + // 第三方创建人编码:申请人工号(User.code) + param.setFdThirdCreatorCode(resolveCreatorCode(application)); + // 第三方创建部门编码:申请人部门编码 + param.setFdThirdCreatorDeptCode(resolveDeptCode(application)); + // 附件ID列表:attachmentsJson 经 C103-2 转传 + if (hcsProperties.getAttachment().isTransferEnabled() && StringUtil.isNotBlank(application.getAttachmentsJson())) { + param.setFdAttIds(hcsAttachmentSupport.transferAttachments(application.getAttachmentsJson(), resolveCreatorCode(application))); + } + log.info("HCS开票登记新增开始:applicationNo={}", application.getApplicationNo()); + HcsResult result = hcsClient.invoiceRegistrationAdd(param); + if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdId())) { + log.error("HCS开票登记新增失败响应:{},applicationNo={}", result == null ? "无响应" : result.getMsg(), application.getApplicationNo()); + throw new HcsException("C111-2 开票登记新增失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return result.getData().getFdId(); + } + + /** + * C111-3 更新开票登记:回填票据日期与状态(金蝶开票完成后) + */ + private String updateInvoiceRegistration(InvoiceApplication application) { + HcsInvoiceRegUpdateDTO param = new HcsInvoiceRegUpdateDTO(); + // 【必填】开票登记ID(C111-2 新增返回) + param.setFdId(application.getHcsFdId()); + // 票据日期:金蝶回写发票的最新开票日期(无发票记录取回写时间,待联调确认口径) + param.setFdBillDate(latestInvoiceDate(application)); + // 状态:0 已开票 + param.setFdStatus(0); + log.info("HCS开票登记更新开始:applicationNo={},fdId={}", application.getApplicationNo(), application.getHcsFdId()); + HcsResult result = hcsClient.invoiceRegistrationUpdate(param); + if (result == null || !result.isSuccess()) { + log.error("HCS开票登记更新失败响应:{},applicationNo={}", result == null ? "无响应" : result.getMsg(), application.getApplicationNo()); + throw new HcsException("C111-3 开票登记更新失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return "C111-3 开票登记更新成功"; + } + + /** + * C111-1 开票登记列表判重(conditions={"fdNumber": applicationNo},§9-U4 查询能力联调确认) + */ + private String findExistFdId(InvoiceApplication application) { + HcsPageQueryDTO query = new HcsPageQueryDTO(); + query.setColumns(List.of("fdId", "fdNumber")); + // 判重条件:单据编号精确匹配 + query.setConditions(Map.of("fdNumber", Objects.toString(application.getApplicationNo(), ""))); + query.setOffset(0); + query.setPageSize(10); + HcsResult> result = hcsClient.invoiceRegistrationList(query); + if (result == null || !result.isSuccess()) { + log.error("HCS开票登记判重查询失败响应:{},applicationNo={}", result == null ? "无响应" : result.getMsg(), application.getApplicationNo()); + throw new HcsException("C111-1 开票登记判重查询失败:" + (result == null ? "响应为空" : result.getMsg())); + } + HcsPageVO page = result.getData(); + if (page == null || page.getContent() == null || page.getContent().isEmpty()) { + return null; + } + return page.getContent().get(0).getFdId(); + } + + /** + * 应收结算链路回溯合同编号:开票申请 → 应收结算关联 → 正式结算单合同编号(§9-U10) + */ + private String requireContractNumber(InvoiceApplication application) { + InvoiceApplicationSettlement relation = invoiceApplicationSettlementMapper.selectOne(Wrappers.lambdaQuery() + .eq(InvoiceApplicationSettlement::getInvoiceApplicationId, application.getId()) + .last("limit 1")); + if (relation != null && relation.getFormalSettlementId() != null) { + FormalSettlement settlement = formalSettlementMapper.selectById(relation.getFormalSettlementId()); + if (settlement != null && StringUtil.isNotBlank(settlement.getContractNo())) { + return settlement.getContractNo(); + } + } + throw new HcsException("C111 开票登记推送失败,应收结算链路回溯不到合同编号(applicationNo=" + application.getApplicationNo() + + ",§9-U10 待确认关联字段)"); + } + + /** + * 结算币种ID(currency-id-mapping,必填;TMS 无币种字段按 RMB 取映射) + */ + private String requireCurrencyId(InvoiceApplication application) { + String currencyFdId = hcsProperties.getInvoice().getCurrencyIdMapping().get("RMB"); + if (StringUtil.isBlank(currencyFdId)) { + throw new HcsException("C111 开票登记推送失败,币种ID 映射未配置(invoice.currency-id-mapping RMB,§9-U3)"); + } + return currencyFdId; + } + + /** + * 金蝶回写发票的最新开票日期(毫秒),无发票记录取金蝶回写时间 + */ + private Long latestInvoiceDate(InvoiceApplication application) { + InvoiceApplicationInvoice invoice = invoiceApplicationInvoiceMapper.selectOne(Wrappers.lambdaQuery() + .eq(InvoiceApplicationInvoice::getInvoiceApplicationId, application.getId()) + .orderByDesc(InvoiceApplicationInvoice::getInvoiceDate) + .last("limit 1")); + LocalDateTime invoiceDate = invoice != null && invoice.getInvoiceDate() != null + ? invoice.getInvoiceDate() : application.getSyncedTime(); + return toMillis(invoiceDate); + } + + /** + * 回填整体同步状态置 synced + */ + public void markSynced(InvoiceApplication application, String fdId, String message) { + application.setHcsFdId(fdId); + application.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); + application.setHcsRetryCount(0); + application.setHcsSyncTime(LocalDateTime.now()); + application.setHcsSyncMsg(message); + invoiceApplicationMapper.updateById(application); + log.info("HCS开票登记推送成功:applicationNo={},fdId={},{}", application.getApplicationNo(), fdId, message); + } + + /** + * 推送失败回写:failed + 重试次数+1 + 失败原因 + */ + public void markFailed(InvoiceApplication application, String message) { + application.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); + application.setHcsRetryCount(application.getHcsRetryCount() == null ? 1 : application.getHcsRetryCount() + 1); + application.setHcsSyncTime(LocalDateTime.now()); + application.setHcsSyncMsg(message); + invoiceApplicationMapper.updateById(application); + log.error("HCS开票登记推送失败:applicationNo={},retryCount={},{}", application.getApplicationNo(), application.getHcsRetryCount(), message); + } + + /** + * 申请人工号(User.code,fdThirdCreatorCode) + */ + private String resolveCreatorCode(InvoiceApplication application) { + User user = application.getCreateUser() == null ? null : UserCache.getUser(application.getCreateUser()); + return user == null ? null : user.getCode(); + } + + /** + * 申请人部门编码(fdThirdCreatorDeptCode) + */ + private String resolveDeptCode(InvoiceApplication application) { + User user = application.getCreateUser() == null ? null : UserCache.getUser(application.getCreateUser()); + if (user == null) { + return null; + } + // 用户冗余部门编码优先(可能逗号分隔,取第一个) + if (StringUtil.isNotBlank(user.getDeptCodes())) { + return user.getDeptCodes().split(",")[0].trim(); + } + Long deptId = Func.toLong(user.getDeptId() == null ? null : user.getDeptId().split(",")[0].trim()); + Dept dept = deptId == null ? null : SysCache.getDept(deptId); + return dept == null ? null : dept.getDeptCode(); + } + + /** + * LocalDateTime/LocalDate → 毫秒时间戳 + */ + private Long toMillis(LocalDateTime localDateTime) { + return localDateTime == null ? null : localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } + + /** + * LocalDate → 毫秒时间戳 + */ + private Long toMillis(java.time.LocalDate localDate) { + return localDate == null ? null : localDate.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegUpdateDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegUpdateDTO.java index 44465dfb..0795fe05 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegUpdateDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegUpdateDTO.java @@ -50,4 +50,8 @@ public class HcsInvoiceRegUpdateDTO extends HcsInvoiceRegAddDTO { * 开票登记ID(必填,C111-2 新增返回,持久化于 hcs_fd_id) */ private String fdId; + /** + * 票据日期(毫秒时间戳,金蝶开票完成后回填) + */ + private Long fdBillDate; } From 12e2825e55ad434c55026d88f178498c39895532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 23:57:43 +0800 Subject: [PATCH 015/124] =?UTF-8?q?feat:=20HCS=E6=94=B6=E7=A5=A8=E5=8D=95?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=B8=8E=E4=BB=BB=E5=8A=A1=E7=AB=AF=E7=82=B9?= =?UTF-8?q?=E6=8E=A5=E7=BA=BF=EF=BC=88C109-1/2=E5=90=AB=E5=90=88=E5=90=8C?= =?UTF-8?q?=E5=9B=9E=E6=BA=AF=E4=B8=8E=E4=BA=BA=E5=B7=A5=E8=A1=A5=E5=BD=95?= =?UTF-8?q?/=E6=89=AB=E6=8F=8F=E7=BC=96=E6=8E=92=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E5=BC=80=E7=A5=A8=E6=94=B6=E7=A5=A8/=E9=87=8D=E6=8E=A8?= =?UTF-8?q?=E7=AB=AF=E7=82=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/constant/HcsSyncConstant.java | 10 + .../controller/HcsSyncController.java | 2 + .../hcs/HcsReceiptBillSyncSupport.java | 311 ++++++++++++++++++ .../transport/task/HcsPushTask.java | 77 ++++- 4 files changed, 399 insertions(+), 1 deletion(-) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java 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 6e128731..8515dabd 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 @@ -64,6 +64,16 @@ public final class HcsSyncConstant { */ public static final String BIZ_TYPE_PAYMENT = "payment"; + /** + * 推送业务类型:开票申请(C111 开票登记) + */ + public static final String BIZ_TYPE_INVOICE_APPLICATION = "invoice-application"; + + /** + * 推送业务类型:收票单(C109) + */ + public static final String BIZ_TYPE_INVOICE_RECEIPT = "invoice-receipt"; + /** * 校验类型:客商风险(C101-1) */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index f10871d1..d04ff7a7 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -34,7 +34,9 @@ import lombok.extern.slf4j.Slf4j; import org.springblade.core.tool.api.R; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.support.hcs.HcsContractSyncSupport; +import org.springblade.transport.support.hcs.HcsInvoiceRegSyncSupport; import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; +import org.springblade.transport.support.hcs.HcsReceiptBillSyncSupport; import org.springblade.transport.support.hcs.HcsMasterDataSupport; import org.springblade.transport.support.hcs.HcsProjectSyncSupport; import org.springblade.transport.task.HcsPushTask; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java new file mode 100644 index 00000000..e070a97e --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java @@ -0,0 +1,311 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsAttachmentRefDTO; +import org.springblade.hcs.dto.HcsFormSaveVO; +import org.springblade.hcs.dto.HcsMechanismsDTO; +import org.springblade.hcs.dto.HcsReceiptBillFormDataDTO; +import org.springblade.hcs.dto.HcsReceiptBillPropsDTO; +import org.springblade.hcs.dto.HcsReceiptBillSaveDTO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springblade.system.cache.UserCache; +import org.springblade.system.pojo.entity.User; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.FormalSettlementMapper; +import org.springblade.transport.mapper.InvoiceReceiptMapper; +import org.springblade.transport.mapper.InvoiceReceiptSettlementMapper; +import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.FormalSettlement; +import org.springblade.transport.pojo.entity.InvoiceReceipt; +import org.springblade.transport.pojo.entity.InvoiceReceiptSettlement; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + +/** + * HCS 收票单同步支撑组件(C109-1 新建 / C109-2 更新,设计文档 §5.8,D13) + *

+ * 审批通过 → C109-1;票据变更 → C109-2(顶层 fdId=hcs_fd_id 必填,只传变更字段、不带文档状态; + * v4 无作废字段,作废推送待联调确认)。合同关联:应付结算链路回溯(收票 → 应收/应付结算关联 → 结算单合同), + * 回溯不到时取页面人工补录的 hcs_contract_id/hcs_contract_no(D13)。 + * fd_ap_bill_src_subject(认领应付单号键)待联调(§9-U11),一期不传。 + * 返回双层嵌套 data.data.fdId → hcs_fd_id。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsReceiptBillSyncSupport { + + /** + * 收票单附件字段标识 + */ + private static final String RECEIPT_ATTACH_ENTITY_KEY = "fd_attach"; + + /** + * 收票日期格式(fd_bill_date 为 YYYY-MM-DD 字符串,非毫秒时间戳) + */ + private static final DateTimeFormatter BILL_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; + private final InvoiceReceiptMapper invoiceReceiptMapper; + private final InvoiceReceiptSettlementMapper invoiceReceiptSettlementMapper; + private final FormalSettlementMapper formalSettlementMapper; + private final ContractManageMapper contractManageMapper; + private final HcsAttachmentSupport hcsAttachmentSupport; + + /** + * 推送收票单:无合规ID 走 C109-1 新建,有合规ID 走 C109-2 更新;整体状态由调用方回写 + * + * @param invoiceReceipt 收票单(approvalStatus=approved) + * @return 推送结果描述 + */ + public String pushReceiptBill(InvoiceReceipt invoiceReceipt) { + String operatorLoginName = resolveLoginName(invoiceReceipt); + if (StringUtil.isBlank(invoiceReceipt.getHcsFdId())) { + HcsReceiptBillSaveDTO param = buildSaveParam(invoiceReceipt, operatorLoginName, true); + log.info("HCS收票单新建开始:invoiceNo={}", invoiceReceipt.getInvoiceNo()); + HcsResult> result = hcsClient.addReceiveBill(param); + String fdId = extractNestedFdId(invoiceReceipt, result); + // 收票单ID 立即持久化(调用方必须保存) + invoiceReceipt.setHcsFdId(fdId); + invoiceReceiptMapper.updateById(invoiceReceipt); + log.info("HCS收票单新建成功:invoiceNo={},fdId={}", invoiceReceipt.getInvoiceNo(), fdId); + return "C109-1 收票单新建成功"; + } + // C109-2 更新:顶层 fdId 必填,只传变更字段、不带文档状态 + HcsReceiptBillSaveDTO param = buildSaveParam(invoiceReceipt, operatorLoginName, false); + log.info("HCS收票单更新开始:invoiceNo={},fdId={}", invoiceReceipt.getInvoiceNo(), invoiceReceipt.getHcsFdId()); + HcsResult> result = hcsClient.updateReceiveBill(param); + if (result == null || !result.isSuccess()) { + log.error("HCS收票单更新失败响应:{},invoiceNo={}", result == null ? "无响应" : result.getMsg(), invoiceReceipt.getInvoiceNo()); + throw new HcsException("C109-2 收票单更新失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return "C109-2 收票单更新成功"; + } + + /** + * 单条手动重推:重置为待同步并清零重试计数后立即推送 + * + * @param id 收票单ID + * @return 推送结果描述 + */ + public String repushReceiptBill(Long id) { + InvoiceReceipt invoiceReceipt = invoiceReceiptMapper.selectById(id); + if (invoiceReceipt == null) { + throw new ServiceException("收票单不存在:" + id); + } + if (!"approved".equals(invoiceReceipt.getApprovalStatus())) { + throw new ServiceException("仅审批通过的收票单可推送合规(当前状态:" + invoiceReceipt.getApprovalStatus() + ")"); + } + invoiceReceipt.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); + invoiceReceipt.setHcsRetryCount(0); + invoiceReceiptMapper.updateById(invoiceReceipt); + try { + return pushReceiptBill(invoiceReceipt); + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "推送异常" : exception.getMessage(); + markFailed(invoiceReceipt, message); + throw new ServiceException("HCS收票单推送失败:" + message); + } + } + + /** + * 组装 C109-1/C109-2 入参(字段标注照 §3.4 规范,映射表见设计文档 §5.8) + */ + private HcsReceiptBillSaveDTO buildSaveParam(InvoiceReceipt invoiceReceipt, String operatorLoginName, boolean add) { + HcsReceiptBillSaveDTO param = new HcsReceiptBillSaveDTO(); + // 收票单主键:新建不传,更新必填(顶层 fdId) + param.setFdId(invoiceReceipt.getHcsFdId()); + // 【必填】操作人登录名:收票单创建人登录名(§9-U2) + param.setFdLoginName(operatorLoginName); + HcsReceiptBillFormDataDTO formData = new HcsReceiptBillFormDataDTO(); + HcsReceiptBillPropsDTO props = new HcsReceiptBillPropsDTO(); + // 发票号码:invoiceNo + props.setFdInvoiceCode(invoiceReceipt.getInvoiceNo()); + // 开票/收票日期:invoiceDate(YYYY-MM-DD 字符串) + props.setFdBillDate(formatBillDate(invoiceReceipt.getInvoiceDate())); + // 开票方(销方):issuerName + props.setFdInvoicer(invoiceReceipt.getIssuerName()); + // 收票方(购方):receiverName + props.setFdBuyer(invoiceReceipt.getReceiverName()); + // 价税合计金额:invoiceAmount + props.setFdInvoiceAmtTaxIncl(invoiceReceipt.getInvoiceAmount()); + // 税率(小数):TMS taxRate(如 13)÷ 100 → 0.13 + props.setFdTaxRate(toTaxRate(invoiceReceipt.getTaxRate())); + // 发票类型:receipt-bill.invoice-type-mapping 字典映射(§9-U3,未配置不传) + props.setFdInvoiceType(hcsProperties.getReceiptBill().getInvoiceTypeMapping().get(invoiceReceipt.getInvoiceType())); + // 合同主题/编号:应付结算链路回溯,回溯不到取人工补录(D13) + ContractReference contractReference = resolveContract(invoiceReceipt); + props.setFdContractSubject(contractReference.subject()); + props.setFdContractNo(contractReference.contractNo()); + // TODO 待联调(§9-U11):fd_ap_bill_src_subject 关联结算付款单的编号体系(应付单号键)v4 未明确,一期不传 + // 备注:remark + props.setFdRemark(invoiceReceipt.getRemark()); + formData.setDynamicProps(props); + param.setFormData(formData); + // 附件挂载(发票扫描件):fdEntityKey=fd_attach,发起带 fdBindType=ADD,更新不带 + if (hcsProperties.getAttachment().isTransferEnabled() && StringUtil.isNotBlank(invoiceReceipt.getAttachmentsJson())) { + List attachmentFdIds = hcsAttachmentSupport.transferAttachments(invoiceReceipt.getAttachmentsJson(), operatorLoginName); + if (!attachmentFdIds.isEmpty()) { + HcsMechanismsDTO mechanisms = new HcsMechanismsDTO(); + mechanisms.setAttachment(attachmentFdIds.stream().map(fdId -> { + HcsAttachmentRefDTO attachment = new HcsAttachmentRefDTO(); + // 附件ID(C103-2 转传返回) + attachment.setFdId(fdId); + // 收票单附件字段标识 + attachment.setFdEntityKey(RECEIPT_ATTACH_ENTITY_KEY); + // 绑定类型:仅发起传 ADD + attachment.setFdBindType(add ? "ADD" : null); + return attachment; + }).toList()); + param.setMechanisms(mechanisms); + } + } + return param; + } + + /** + * 解析 C109-1 双层嵌套返回 data.data.fdId + */ + private String extractNestedFdId(InvoiceReceipt invoiceReceipt, HcsResult> result) { + if (result == null || !result.isSuccess() || result.getData() == null || !result.getData().isSuccess() + || result.getData().getData() == null || StringUtil.isBlank(result.getData().getData().getFdId())) { + log.error("HCS收票单新建失败响应:{},invoiceNo={}", result == null ? "无响应" : result.getMsg(), invoiceReceipt.getInvoiceNo()); + throw new HcsException("C109-1 收票单新建失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return result.getData().getData().getFdId(); + } + + /** + * 合同引用解析:收票 → 应收结算关联 → 结算单合同 → 合同已推送传合规ID,否则传人工补录值(D13) + */ + private ContractReference resolveContract(InvoiceReceipt invoiceReceipt) { + // ① 人工补录兜底优先可直接用;先走链路回溯 + InvoiceReceiptSettlement relation = invoiceReceiptSettlementMapper.selectOne(Wrappers.lambdaQuery() + .eq(InvoiceReceiptSettlement::getInvoiceReceiptId, invoiceReceipt.getId()) + .last("limit 1")); + if (relation != null && relation.getFormalSettlementId() != null) { + FormalSettlement settlement = formalSettlementMapper.selectById(relation.getFormalSettlementId()); + if (settlement != null && settlement.getContractId() != null) { + ContractManage contractManage = contractManageMapper.selectById(settlement.getContractId()); + if (contractManage != null) { + // 合同已推送传合规合同ID(fd_contract_subject 支持 ID 引用),编号传 TMS 合同编号 + String subject = StringUtil.isNotBlank(contractManage.getHcsFdId()) ? contractManage.getHcsFdId() : contractManage.getContractName(); + return new ContractReference(subject, contractManage.getContractNo()); + } + } + } + // ② 回溯不到:页面人工补录(hcs_contract_id/hcs_contract_no,D13) + if (invoiceReceipt.getHcsContractId() != null) { + ContractManage contractManage = contractManageMapper.selectById(invoiceReceipt.getHcsContractId()); + if (contractManage != null) { + String subject = StringUtil.isNotBlank(contractManage.getHcsFdId()) ? contractManage.getHcsFdId() : contractManage.getContractName(); + return new ContractReference(subject, StringUtil.isNotBlank(invoiceReceipt.getHcsContractNo()) ? invoiceReceipt.getHcsContractNo() : contractManage.getContractNo()); + } + } + if (StringUtil.isNotBlank(invoiceReceipt.getHcsContractNo())) { + return new ContractReference(null, invoiceReceipt.getHcsContractNo()); + } + log.warn("HCS收票单合同关联缺失:invoiceNo={},应付结算回溯与人工补录均为空,fd_contract_* 不传", invoiceReceipt.getInvoiceNo()); + return new ContractReference(null, null); + } + + /** + * 回填整体同步状态置 synced + */ + public void markSynced(InvoiceReceipt invoiceReceipt, String message) { + invoiceReceipt.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); + invoiceReceipt.setHcsRetryCount(0); + invoiceReceipt.setHcsSyncTime(LocalDateTime.now()); + invoiceReceipt.setHcsSyncMsg(message); + invoiceReceiptMapper.updateById(invoiceReceipt); + log.info("HCS收票单推送成功:invoiceNo={},{}", invoiceReceipt.getInvoiceNo(), message); + } + + /** + * 推送失败回写:failed + 重试次数+1 + 失败原因 + */ + public void markFailed(InvoiceReceipt invoiceReceipt, String message) { + invoiceReceipt.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); + invoiceReceipt.setHcsRetryCount(invoiceReceipt.getHcsRetryCount() == null ? 1 : invoiceReceipt.getHcsRetryCount() + 1); + invoiceReceipt.setHcsSyncTime(LocalDateTime.now()); + invoiceReceipt.setHcsSyncMsg(message); + invoiceReceiptMapper.updateById(invoiceReceipt); + log.error("HCS收票单推送失败:invoiceNo={},retryCount={},{}", invoiceReceipt.getInvoiceNo(), invoiceReceipt.getHcsRetryCount(), message); + } + + /** + * 操作人登录名(收票单创建人,§9-U2) + */ + private String resolveLoginName(InvoiceReceipt invoiceReceipt) { + if (invoiceReceipt.getCreateUser() == null) { + throw new HcsException("C109 收票单推送失败,收票单创建人未维护(invoiceNo=" + invoiceReceipt.getInvoiceNo() + ")"); + } + User user = UserCache.getUser(invoiceReceipt.getCreateUser()); + if (user == null || StringUtil.isBlank(user.getAccount())) { + throw new HcsException("C109 收票单推送失败,创建人登录名解析不到(createUser=" + invoiceReceipt.getCreateUser() + ")"); + } + return user.getAccount(); + } + + /** + * 收票日期格式化(fd_bill_date 为 YYYY-MM-DD 字符串) + */ + private String formatBillDate(LocalDate invoiceDate) { + return invoiceDate == null ? null : invoiceDate.format(BILL_DATE_FORMATTER); + } + + /** + * 税率换算:TMS 整数值(如 13)÷ 100 → 小数(0.13) + */ + private BigDecimal toTaxRate(BigDecimal taxRate) { + return taxRate == null ? null : taxRate.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP); + } + + /** + * 合同引用(fd_contract_subject / fd_contract_no) + */ + private record ContractReference(String subject, String contractNo) { + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java index dc6fcbf5..74f1b422 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java @@ -33,14 +33,20 @@ import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.InvoiceApplicationMapper; +import org.springblade.transport.mapper.InvoiceReceiptMapper; import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.mapper.ProjectApplyMapper; import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.InvoiceApplication; +import org.springblade.transport.pojo.entity.InvoiceReceipt; import org.springblade.transport.pojo.entity.PaymentApplication; import org.springblade.transport.pojo.entity.ProjectApply; import org.springblade.transport.support.hcs.HcsContractSyncSupport; +import org.springblade.transport.support.hcs.HcsInvoiceRegSyncSupport; import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; import org.springblade.transport.support.hcs.HcsProjectSyncSupport; +import org.springblade.transport.support.hcs.HcsReceiptBillSyncSupport; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -81,9 +87,13 @@ public class HcsPushTask { private final ProjectApplyMapper projectApplyMapper; private final ContractManageMapper contractManageMapper; private final PaymentApplicationMapper paymentApplicationMapper; + private final InvoiceApplicationMapper invoiceApplicationMapper; + private final InvoiceReceiptMapper invoiceReceiptMapper; private final HcsProjectSyncSupport hcsProjectSyncSupport; private final HcsContractSyncSupport hcsContractSyncSupport; private final HcsPaymentSyncSupport hcsPaymentSyncSupport; + private final HcsInvoiceRegSyncSupport hcsInvoiceRegSyncSupport; + private final HcsReceiptBillSyncSupport hcsReceiptBillSyncSupport; private final BladeRedis bladeRedis; /** @@ -109,10 +119,12 @@ public class HcsPushTask { return; } try { - // 任务顺序(设计文档 §5.0):项目 → 合同 → 付款;各类互不影响 + // 任务顺序(设计文档 §5.0):项目 → 合同 → 付款 → 开票 → 收票;各类互不影响 log.info("定时推送HCS项目立项:{}", pushUnsyncedProjects()); log.info("定时推送HCS合同:{}", pushUnsyncedContracts()); log.info("定时推送HCS付款链:{}", pushUnsyncedPayments()); + log.info("定时推送HCS开票登记:{}", pushUnsyncedInvoiceApplications()); + log.info("定时推送HCS收票单:{}", pushUnsyncedInvoiceReceipts()); } finally { if (lockHolder.equals(bladeRedis.get(HcsSyncConstant.PUSH_TASK_LOCK_KEY))) { bladeRedis.del(HcsSyncConstant.PUSH_TASK_LOCK_KEY); @@ -212,4 +224,67 @@ public class HcsPushTask { } return summary; } + + /** + * 扫描并推送待同步/待补偿的开票申请(C111 开票登记,含金蝶开票完成后回填),返回结果汇总 + * + * @return 汇总描述 + */ + public String pushUnsyncedInvoiceApplications() { + int maxRetry = hcsProperties.getPush().getMaxRetry(); + List applicationList = invoiceApplicationMapper.selectList(Wrappers.lambdaQuery() + .eq(InvoiceApplication::getApprovalStatus, "approved") + .in(InvoiceApplication::getHcsSyncStatus, List.of(HcsSyncConstant.HCS_STATUS_UNSYNCED, HcsSyncConstant.HCS_STATUS_FAILED)) + .and(wrapper -> wrapper.isNull(InvoiceApplication::getHcsRetryCount).or().lt(InvoiceApplication::getHcsRetryCount, maxRetry)) + .last("limit " + hcsProperties.getPush().getBatchSize())); + int successCount = 0; + int failCount = 0; + for (InvoiceApplication application : applicationList) { + try { + hcsInvoiceRegSyncSupport.pushInvoiceRegistration(application); + successCount++; + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "推送异常" : exception.getMessage(); + hcsInvoiceRegSyncSupport.markFailed(application, message); + failCount++; + } + } + String summary = String.format("扫描 %d 条,成功 %d 条,失败 %d 条(重试上限 %d)", applicationList.size(), successCount, failCount, maxRetry); + if (failCount > 0) { + log.warn("HCS开票登记推送存在失败:{}", summary); + } + return summary; + } + + /** + * 扫描并推送待同步/待补偿的收票单(C109),返回结果汇总 + * + * @return 汇总描述 + */ + public String pushUnsyncedInvoiceReceipts() { + int maxRetry = hcsProperties.getPush().getMaxRetry(); + List receiptList = invoiceReceiptMapper.selectList(Wrappers.lambdaQuery() + .eq(InvoiceReceipt::getApprovalStatus, "approved") + .in(InvoiceReceipt::getHcsSyncStatus, List.of(HcsSyncConstant.HCS_STATUS_UNSYNCED, HcsSyncConstant.HCS_STATUS_FAILED)) + .and(wrapper -> wrapper.isNull(InvoiceReceipt::getHcsRetryCount).or().lt(InvoiceReceipt::getHcsRetryCount, maxRetry)) + .last("limit " + hcsProperties.getPush().getBatchSize())); + int successCount = 0; + int failCount = 0; + for (InvoiceReceipt invoiceReceipt : receiptList) { + try { + hcsReceiptBillSyncSupport.pushReceiptBill(invoiceReceipt); + hcsReceiptBillSyncSupport.markSynced(invoiceReceipt, "C109 收票单推送成功"); + successCount++; + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "推送异常" : exception.getMessage(); + hcsReceiptBillSyncSupport.markFailed(invoiceReceipt, message); + failCount++; + } + } + String summary = String.format("扫描 %d 条,成功 %d 条,失败 %d 条(重试上限 %d)", receiptList.size(), successCount, failCount, maxRetry); + if (failCount > 0) { + log.warn("HCS收票单推送存在失败:{}", summary); + } + return summary; + } } From 815f3f68e53d9ec95edbd4450396eb2d8eebb1e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 27 Sep 2026 23:59:25 +0800 Subject: [PATCH 016/124] =?UTF-8?q?feat:=20HCS=E6=8E=A8=E9=80=81=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E6=97=A5=E5=BF=97=E8=A1=A5=E5=85=A8=E5=90=88=E8=A7=84?= =?UTF-8?q?traceId=EF=BC=88=E7=9B=91=E6=8E=A7=E5=9F=8B=E7=82=B9=EF=BC=8C?= =?UTF-8?q?=E4=BE=BF=E4=BA=8E=E5=90=91=E5=90=88=E8=A7=84=E6=96=B9=E6=8E=92?= =?UTF-8?q?=E6=9F=A5=E9=93=BE=E8=B7=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/support/hcs/HcsContractSyncSupport.java | 8 ++++---- .../transport/support/hcs/HcsCreditCheckSupport.java | 4 ++-- .../transport/support/hcs/HcsExeStageSyncSupport.java | 2 +- .../transport/support/hcs/HcsInvoiceRegSyncSupport.java | 6 +++--- .../transport/support/hcs/HcsPerfRecordSyncSupport.java | 4 ++-- .../transport/support/hcs/HcsProjectSyncSupport.java | 6 +++--- .../transport/support/hcs/HcsReceiptBillSyncSupport.java | 4 ++-- .../transport/support/hcs/HcsSpecPaySyncSupport.java | 4 ++-- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 471f5004..4cbaf90e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -175,7 +175,7 @@ public class HcsContractSyncSupport { HcsResult result = hcsClient.getRelativeRisk(param); if (result == null || !result.isSuccess()) { log.error("HCS客商风险查询失败响应:{},contractNo={},standing={},fdNumber={}", - result == null ? "无响应" : result.getMsg(), contractManage.getContractNo(), standing, customerCode); + result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo(), standing, customerCode); throw new HcsException("C101-1 客商风险查询失败:" + (result == null ? "响应为空" : result.getMsg())); } HcsRiskVO risk = result.getData(); @@ -199,7 +199,7 @@ public class HcsContractSyncSupport { query.setPageSize(10); HcsResult> result = hcsClient.contractList(query); if (result == null || !result.isSuccess()) { - log.error("HCS合同判重查询失败响应:{},contractNo={}", result == null ? "无响应" : result.getMsg(), contractManage.getContractNo()); + log.error("HCS合同判重查询失败响应:{},contractNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo()); throw new HcsException("C103-3 合同判重查询失败:" + (result == null ? "响应为空" : result.getMsg())); } HcsPageVO page = result.getData(); @@ -227,7 +227,7 @@ public class HcsContractSyncSupport { log.info("HCS合同推送开始:{}(C103-11 更新,§9-U5 定位方式待联调)", contractManage.getContractNo()); HcsResult result = hcsClient.contractUpdate(param); if (result == null || !result.isSuccess()) { - log.error("HCS合同更新失败响应:{},contractNo={}", result == null ? "无响应" : result.getMsg(), contractManage.getContractNo()); + log.error("HCS合同更新失败响应:{},contractNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo()); throw new HcsException("C103-11 合同更新失败:" + (result == null ? "响应为空" : result.getMsg())); } } @@ -344,7 +344,7 @@ public class HcsContractSyncSupport { */ private String validateDraftResult(ContractManage contractManage, HcsResult result) { if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdContractId())) { - log.error("HCS合同发起失败响应:{},contractNo={}", result == null ? "无响应" : result.getMsg(), contractManage.getContractNo()); + log.error("HCS合同发起失败响应:{},contractNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo()); throw new HcsException("C103-1 合同发起失败:" + (result == null ? "响应为空" : result.getMsg())); } return result.getData().getFdContractId(); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java index 42605ab7..34c9be20 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java @@ -111,7 +111,7 @@ public class HcsCreditCheckSupport { HcsResult result = hcsClient.getRelativeRisk(param); if (result == null || !result.isSuccess()) { log.error("HCS客商风险查询失败响应:{},paymentNo={},fdNumber={}", - result == null ? "无响应" : result.getMsg(), payment.getPaymentNo(), customerCode); + result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), payment.getPaymentNo(), customerCode); throw new HcsException("C101-1 客商风险查询失败:" + (result == null ? "响应为空" : result.getMsg())); } HcsRiskVO risk = result.getData(); @@ -146,7 +146,7 @@ public class HcsCreditCheckSupport { param.setFdApplyAmount(payment.getAppliedAmount() == null ? BigDecimal.ZERO : payment.getAppliedAmount()); HcsResult result = hcsClient.contractCreditCheck(param); if (result == null || !result.isSuccess()) { - log.error("HCS额度校验失败响应:{},paymentNo={}", result == null ? "无响应" : result.getMsg(), payment.getPaymentNo()); + log.error("HCS额度校验失败响应:{},paymentNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), payment.getPaymentNo()); throw new HcsException("C106-1 额度校验失败:" + (result == null ? "响应为空" : result.getMsg())); } HcsCreditCheckVO credit = result.getData(); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java index 301c385c..9c1cbf6e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java @@ -99,7 +99,7 @@ public class HcsExeStageSyncSupport { param.getFdEopExeplanOperateType(), pendingRows.size()); HcsResult result = hcsClient.exeplanAdd(param); if (result == null || !result.isSuccess() || result.getData() == null) { - log.error("HCS履约规则同步失败响应:{},contractNo={}", result == null ? "无响应" : result.getMsg(), contractManage.getContractNo()); + log.error("HCS履约规则同步失败响应:{},contractNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo()); throw new HcsException("C103-9 履约规则同步失败:" + (result == null ? "响应为空" : result.getMsg())); } HcsExeplanVO exeplan = result.getData(); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java index f4ca4d03..b130a851 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java @@ -179,7 +179,7 @@ public class HcsInvoiceRegSyncSupport { log.info("HCS开票登记新增开始:applicationNo={}", application.getApplicationNo()); HcsResult result = hcsClient.invoiceRegistrationAdd(param); if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdId())) { - log.error("HCS开票登记新增失败响应:{},applicationNo={}", result == null ? "无响应" : result.getMsg(), application.getApplicationNo()); + log.error("HCS开票登记新增失败响应:{},applicationNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), application.getApplicationNo()); throw new HcsException("C111-2 开票登记新增失败:" + (result == null ? "响应为空" : result.getMsg())); } return result.getData().getFdId(); @@ -199,7 +199,7 @@ public class HcsInvoiceRegSyncSupport { log.info("HCS开票登记更新开始:applicationNo={},fdId={}", application.getApplicationNo(), application.getHcsFdId()); HcsResult result = hcsClient.invoiceRegistrationUpdate(param); if (result == null || !result.isSuccess()) { - log.error("HCS开票登记更新失败响应:{},applicationNo={}", result == null ? "无响应" : result.getMsg(), application.getApplicationNo()); + log.error("HCS开票登记更新失败响应:{},applicationNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), application.getApplicationNo()); throw new HcsException("C111-3 开票登记更新失败:" + (result == null ? "响应为空" : result.getMsg())); } return "C111-3 开票登记更新成功"; @@ -217,7 +217,7 @@ public class HcsInvoiceRegSyncSupport { query.setPageSize(10); HcsResult> result = hcsClient.invoiceRegistrationList(query); if (result == null || !result.isSuccess()) { - log.error("HCS开票登记判重查询失败响应:{},applicationNo={}", result == null ? "无响应" : result.getMsg(), application.getApplicationNo()); + log.error("HCS开票登记判重查询失败响应:{},applicationNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), application.getApplicationNo()); throw new HcsException("C111-1 开票登记判重查询失败:" + (result == null ? "响应为空" : result.getMsg())); } HcsPageVO page = result.getData(); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java index 1019a314..0ed6a3b1 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java @@ -94,7 +94,7 @@ public class HcsPerfRecordSyncSupport { log.info("HCS履约记录新建开始:paymentNo={}", payment.getPaymentNo()); HcsResult result = hcsClient.perfRecordAdd(param); if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdId())) { - log.error("HCS履约记录新建失败响应:{},paymentNo={}", result == null ? "无响应" : result.getMsg(), payment.getPaymentNo()); + log.error("HCS履约记录新建失败响应:{},paymentNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), payment.getPaymentNo()); throw new HcsException("C108-1 履约记录新建失败:" + (result == null ? "响应为空" : result.getMsg())); } // 履约记录ID 立即持久化(调用方必须保存) @@ -108,7 +108,7 @@ public class HcsPerfRecordSyncSupport { log.info("HCS履约记录更新开始:paymentNo={},perfFdId={}", payment.getPaymentNo(), payment.getHcsPerfFdId()); HcsResult result = hcsClient.perfRecordUpdate(param); if (result == null || !result.isSuccess()) { - log.error("HCS履约记录更新失败响应:{},paymentNo={}", result == null ? "无响应" : result.getMsg(), payment.getPaymentNo()); + log.error("HCS履约记录更新失败响应:{},paymentNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), payment.getPaymentNo()); throw new HcsException("C108-2 履约记录更新失败:" + (result == null ? "响应为空" : result.getMsg())); } return "C108-2 履约记录更新成功"; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index 52aefe9e..df3e7b80 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -131,7 +131,7 @@ public class HcsProjectSyncSupport { log.info("HCS项目立项推送开始:{}(C102-1 新建)", projectApply.getProjectCode()); HcsResult result = hcsClient.projectAdd(param); if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdId())) { - log.error("HCS项目立项新建失败响应:{},projectCode={}", result == null ? "无响应" : result.getMsg(), projectApply.getProjectCode()); + log.error("HCS项目立项新建失败响应:{},projectCode={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), projectApply.getProjectCode()); throw new HcsException("C102-1 项目立项新建失败:" + (result == null ? "响应为空" : result.getMsg())); } return result.getData().getFdId(); @@ -153,7 +153,7 @@ public class HcsProjectSyncSupport { log.info("HCS项目立项推送开始:{}(C102-2 更新)", projectApply.getProjectCode()); HcsResult result = hcsClient.projectUpdate(param); if (result == null || !result.isSuccess()) { - log.error("HCS项目立项更新失败响应:{},projectCode={}", result == null ? "无响应" : result.getMsg(), projectApply.getProjectCode()); + log.error("HCS项目立项更新失败响应:{},projectCode={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), projectApply.getProjectCode()); throw new HcsException("C102-2 项目立项更新失败:" + (result == null ? "响应为空" : result.getMsg())); } } @@ -225,7 +225,7 @@ public class HcsProjectSyncSupport { query.setCurUser(HcsUserRefVO.ofLoginName(requireLoginName(projectApply, "C102-3"))); HcsResult> result = hcsClient.projectList(query); if (result == null || !result.isSuccess()) { - log.error("HCS项目立项判重查询失败响应:{},projectCode={}", result == null ? "无响应" : result.getMsg(), projectApply.getProjectCode()); + log.error("HCS项目立项判重查询失败响应:{},projectCode={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), projectApply.getProjectCode()); throw new HcsException("C102-3 项目立项判重查询失败:" + (result == null ? "响应为空" : result.getMsg())); } HcsPageVO page = result.getData(); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java index e070a97e..143d94e8 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java @@ -118,7 +118,7 @@ public class HcsReceiptBillSyncSupport { log.info("HCS收票单更新开始:invoiceNo={},fdId={}", invoiceReceipt.getInvoiceNo(), invoiceReceipt.getHcsFdId()); HcsResult> result = hcsClient.updateReceiveBill(param); if (result == null || !result.isSuccess()) { - log.error("HCS收票单更新失败响应:{},invoiceNo={}", result == null ? "无响应" : result.getMsg(), invoiceReceipt.getInvoiceNo()); + log.error("HCS收票单更新失败响应:{},invoiceNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), invoiceReceipt.getInvoiceNo()); throw new HcsException("C109-2 收票单更新失败:" + (result == null ? "响应为空" : result.getMsg())); } return "C109-2 收票单更新成功"; @@ -211,7 +211,7 @@ public class HcsReceiptBillSyncSupport { private String extractNestedFdId(InvoiceReceipt invoiceReceipt, HcsResult> result) { if (result == null || !result.isSuccess() || result.getData() == null || !result.getData().isSuccess() || result.getData().getData() == null || StringUtil.isBlank(result.getData().getData().getFdId())) { - log.error("HCS收票单新建失败响应:{},invoiceNo={}", result == null ? "无响应" : result.getMsg(), invoiceReceipt.getInvoiceNo()); + log.error("HCS收票单新建失败响应:{},invoiceNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), invoiceReceipt.getInvoiceNo()); throw new HcsException("C109-1 收票单新建失败:" + (result == null ? "响应为空" : result.getMsg())); } return result.getData().getData().getFdId(); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java index 990490e6..98370a1d 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java @@ -101,7 +101,7 @@ public class HcsSpecPaySyncSupport { log.info("HCS结算付款特批更新开始:paymentNo={},specFdId={}", payment.getPaymentNo(), payment.getHcsSpecFdId()); HcsResult> result = hcsClient.updateSpecApplyPay(param); if (result == null || !result.isSuccess()) { - log.error("HCS结算付款特批更新失败响应:{},paymentNo={}", result == null ? "无响应" : result.getMsg(), payment.getPaymentNo()); + log.error("HCS结算付款特批更新失败响应:{},paymentNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), payment.getPaymentNo()); throw new HcsException("C106-4 特批更新失败:" + (result == null ? "响应为空" : result.getMsg())); } return "C106-4 特批更新成功"; @@ -197,7 +197,7 @@ public class HcsSpecPaySyncSupport { private String extractNestedFdId(PaymentApplication payment, HcsResult> result) { if (result == null || !result.isSuccess() || result.getData() == null || !result.getData().isSuccess() || result.getData().getData() == null || StringUtil.isBlank(result.getData().getData().getFdId())) { - log.error("HCS结算付款特批发起失败响应:{},paymentNo={}", result == null ? "无响应" : result.getMsg(), payment.getPaymentNo()); + log.error("HCS结算付款特批发起失败响应:{},paymentNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), payment.getPaymentNo()); throw new HcsException("C106-3 特批发起失败:" + (result == null ? "响应为空" : result.getMsg())); } return result.getData().getData().getFdId(); From b46906559b73ee4826b6d316c242802025fb0295 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, 28 Sep 2026 00:02:44 +0800 Subject: [PATCH 017/124] =?UTF-8?q?fix:=20=E8=A1=A5=E9=BD=90=E6=94=B6?= =?UTF-8?q?=E7=A5=A8/=E5=BC=80=E7=A5=A8=E5=8D=95=E6=9D=A1=E9=87=8D?= =?UTF-8?q?=E6=8E=A8=E4=B8=8E=E6=89=B9=E9=87=8F=E6=8E=A8=E9=80=81=E7=AB=AF?= =?UTF-8?q?=E7=82=B9=E6=8E=A5=E7=BA=BF=EF=BC=88=E6=AD=A4=E5=89=8D=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E9=81=97=E6=BC=8Fswitch=E5=88=86=E6=94=AF=E4=B8=8E?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/controller/HcsSyncController.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index d04ff7a7..0363060f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -66,36 +66,42 @@ public class HcsSyncController { private final HcsProjectSyncSupport hcsProjectSyncSupport; private final HcsContractSyncSupport hcsContractSyncSupport; private final HcsPaymentSyncSupport hcsPaymentSyncSupport; + private final HcsInvoiceRegSyncSupport hcsInvoiceRegSyncSupport; + private final HcsReceiptBillSyncSupport hcsReceiptBillSyncSupport; private final HcsMasterDataSupport hcsMasterDataSupport; /** - * 单条重推(bizType:project=项目立项 / contract=合同 / payment=付款申请) + * 单条重推(bizType:project=项目立项 / contract=合同 / payment=付款申请 / invoice-application=开票申请 / invoice-receipt=收票单) */ @PostMapping("/sync/{bizType}/{id}") @ApiOperationSupport(order = 1) - @Operation(summary = "单条推送/重推合规", description = "重置待同步状态后立即推送,bizType:project=项目立项、contract=合同、payment=付款申请") + @Operation(summary = "单条推送/重推合规", description = "重置待同步状态后立即推送,bizType:project、contract、payment、invoice-application、invoice-receipt") public R repush(@Parameter(description = "业务类型", required = true) @PathVariable String bizType, @Parameter(description = "单据ID", required = true) @PathVariable Long id) { String result = switch (bizType) { case HcsSyncConstant.BIZ_TYPE_PROJECT -> hcsProjectSyncSupport.repushProject(id); case HcsSyncConstant.BIZ_TYPE_CONTRACT -> hcsContractSyncSupport.repushContract(id); case HcsSyncConstant.BIZ_TYPE_PAYMENT -> hcsPaymentSyncSupport.repushPayment(id); + case HcsSyncConstant.BIZ_TYPE_INVOICE_APPLICATION -> hcsInvoiceRegSyncSupport.repushInvoiceRegistration(id); + case HcsSyncConstant.BIZ_TYPE_INVOICE_RECEIPT -> hcsReceiptBillSyncSupport.repushReceiptBill(id); default -> throw new IllegalArgumentException("不支持的HCS推送业务类型:" + bizType); }; return R.data(result); } /** - * 批量推送(bizType:project=项目立项 / contract=合同 / payment=付款申请;复用定时扫描逻辑,单轮批量上限 push.batch-size) + * 批量推送(复用定时扫描逻辑,单轮批量上限 push.batch-size) */ @PostMapping("/sync/{bizType}") @ApiOperationSupport(order = 2) - @Operation(summary = "批量推送合规", description = "扫描待同步/待补偿单据推送一轮,bizType:project=项目立项、contract=合同、payment=付款申请") + @Operation(summary = "批量推送合规", description = "扫描待同步/待补偿单据推送一轮,bizType:project、contract、payment、invoice-application、invoice-receipt") public R pushBatch(@Parameter(description = "业务类型", required = true) @PathVariable String bizType) { String result = switch (bizType) { case HcsSyncConstant.BIZ_TYPE_PROJECT -> hcsPushTask.pushUnsyncedProjects(); case HcsSyncConstant.BIZ_TYPE_CONTRACT -> hcsPushTask.pushUnsyncedContracts(); case HcsSyncConstant.BIZ_TYPE_PAYMENT -> hcsPushTask.pushUnsyncedPayments(); + case HcsSyncConstant.BIZ_TYPE_INVOICE_APPLICATION -> hcsPushTask.pushUnsyncedInvoiceApplications(); + case HcsSyncConstant.BIZ_TYPE_INVOICE_RECEIPT -> hcsPushTask.pushUnsyncedInvoiceReceipts(); default -> throw new IllegalArgumentException("不支持的HCS推送业务类型:" + bizType); }; return R.data(result); From 62917c6864fd33bf4349c9549d853ba2937606ac 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, 28 Sep 2026 00:03:22 +0800 Subject: [PATCH 018/124] =?UTF-8?q?feat:=20HCS=E5=AF=B9=E8=B4=A6=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E7=AB=AF=E7=82=B9=EF=BC=88=E9=A1=B9=E7=9B=AE=E7=AB=8B?= =?UTF-8?q?=E9=A1=B9/=E5=90=88=E5=90=8C/=E5=90=88=E5=90=8C=E8=AF=A6?= =?UTF-8?q?=E6=83=85/=E5=BC=80=E7=A5=A8=E7=99=BB=E8=AE=B0=E6=8C=89?= =?UTF-8?q?=E7=BC=96=E5=8F=B7=E5=9B=9E=E6=9F=A5=E5=90=88=E8=A7=84=E4=BE=A7?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HcsSyncController.java | 44 ++++++ .../support/hcs/HcsReconSupport.java | 142 ++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 0363060f..10c8f586 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -37,9 +37,11 @@ import org.springblade.transport.support.hcs.HcsContractSyncSupport; import org.springblade.transport.support.hcs.HcsInvoiceRegSyncSupport; import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; import org.springblade.transport.support.hcs.HcsReceiptBillSyncSupport; +import org.springblade.transport.support.hcs.HcsReconSupport; import org.springblade.transport.support.hcs.HcsMasterDataSupport; import org.springblade.transport.support.hcs.HcsProjectSyncSupport; import org.springblade.transport.task.HcsPushTask; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -69,6 +71,7 @@ public class HcsSyncController { private final HcsInvoiceRegSyncSupport hcsInvoiceRegSyncSupport; private final HcsReceiptBillSyncSupport hcsReceiptBillSyncSupport; private final HcsMasterDataSupport hcsMasterDataSupport; + private final HcsReconSupport hcsReconSupport; /** * 单条重推(bizType:project=项目立项 / contract=合同 / payment=付款申请 / invoice-application=开票申请 / invoice-receipt=收票单) @@ -127,4 +130,45 @@ public class HcsSyncController { public R refreshMasterData() { return R.data(hcsMasterDataSupport.refreshAll()); } + + /** + * 对账查询:按项目编号回查 HCS 项目立项(C102-3) + */ + @GetMapping("/recon/project") + @ApiOperationSupport(order = 5) + @Operation(summary = "项目立项对账查询", description = "按项目编号回查合规侧项目立项数据") + public R reconProject(@Parameter(description = "项目编号", required = true) @RequestParam String projectCode) { + return R.data(hcsReconSupport.reconProject(projectCode)); + } + + /** + * 对账查询:按合同编号回查 HCS 合同(C103-3) + */ + @GetMapping("/recon/contract") + @ApiOperationSupport(order = 6) + @Operation(summary = "合同对账查询", description = "按合同编号回查合规侧合同数据") + public R reconContract(@Parameter(description = "合同编号", required = true) @RequestParam String contractNo) { + return R.data(hcsReconSupport.reconContract(contractNo)); + } + + /** + * 对账查询:合同详情(C103-4,fdId 与 fdNumber 二选一) + */ + @GetMapping("/recon/contract/detail") + @ApiOperationSupport(order = 7) + @Operation(summary = "合同详情对账查询", description = "按合规合同ID或合同编号回查合规侧合同详情") + public R reconContractDetail(@Parameter(description = "合规合同ID") @RequestParam(required = false) String fdId, + @Parameter(description = "合同编号") @RequestParam(required = false) String fdNumber) { + return R.data(hcsReconSupport.reconContractDetail(fdId, fdNumber)); + } + + /** + * 对账查询:按申请单号回查 HCS 开票登记(C111-1) + */ + @GetMapping("/recon/invoice-registration") + @ApiOperationSupport(order = 8) + @Operation(summary = "开票登记对账查询", description = "按开票申请单号回查合规侧开票登记数据") + public R reconInvoiceRegistration(@Parameter(description = "开票申请单号", required = true) @RequestParam String applicationNo) { + return R.data(hcsReconSupport.reconInvoiceRegistration(applicationNo)); + } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java new file mode 100644 index 00000000..8b45eb5c --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java @@ -0,0 +1,142 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.dto.HcsContractDetailQueryDTO; +import org.springblade.hcs.dto.HcsPageQueryDTO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * HCS 对账查询支撑组件(设计文档 §5.9/§8-P5,运维收尾) + *

+ * 按来源单据编号回查 HCS 侧数据(项目立项/合同/合同详情/开票登记), + * 供对账查询页与人工排查使用;返回 HCS 原始数据结构。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsReconSupport { + + private final IHcsClient hcsClient; + + /** + * 按项目编号回查 HCS 项目立项(C102-3) + * + * @param projectCode 项目编号 + * @return HCS 项目立项列表 + */ + public HcsResult reconProject(String projectCode) { + HcsPageQueryDTO query = new HcsPageQueryDTO(); + // C102-3 入参 columns 用下划线字段名 + query.setColumns(List.of("fd_id", "fd_num", "fd_pro_name")); + // 项目编号精确匹配 + query.setConditions(Map.of("fd_num", Objects.toString(projectCode, ""))); + query.setOffset(0); + query.setPageSize(50); + HcsResult result = hcsClient.projectList(query); + return requireSuccess("项目立项对账", result); + } + + /** + * 按合同编号回查 HCS 合同(C103-3) + * + * @param contractNo 合同编号 + * @return HCS 合同列表 + */ + public HcsResult reconContract(String contractNo) { + HcsPageQueryDTO query = new HcsPageQueryDTO(); + query.setColumns(List.of("fdId", "fdSubject", "fdNumber", "fdCateHierarchyId")); + // 合同编号精确匹配(§9-U4 查询能力联调确认) + query.setConditions(Map.of("fdNumber", Objects.toString(contractNo, ""))); + query.setOffset(0); + query.setPageSize(50); + HcsResult result = hcsClient.contractList(query); + return requireSuccess("合同对账", result); + } + + /** + * 合同详情回查(C103-4,fdId 与 fdNumber 二选一) + *

+ * TODO 待联调确认:出参 data 结构 v4 未定义,原样返回实际响应(设计文档 §5.9) + * + * @param fdId 合同ID(可空) + * @param fdNumber 合同编号(可空) + * @return HCS 合同详情 + */ + public HcsResult reconContractDetail(String fdId, String fdNumber) { + if (StringUtil.isBlank(fdId) && StringUtil.isBlank(fdNumber)) { + throw new HcsException("合同详情对账失败,fdId 与 fdNumber 至少传一项"); + } + HcsContractDetailQueryDTO query = new HcsContractDetailQueryDTO(); + // 合同ID(与编号二选一) + query.setFdId(fdId); + // 合同编号(与ID二选一) + query.setFdNumber(fdNumber); + HcsResult result = hcsClient.contractDetail(query); + return requireSuccess("合同详情对账", result); + } + + /** + * 按申请单号回查 HCS 开票登记(C111-1) + * + * @param applicationNo 开票申请单号 + * @return HCS 开票登记列表 + */ + public HcsResult reconInvoiceRegistration(String applicationNo) { + HcsPageQueryDTO query = new HcsPageQueryDTO(); + query.setColumns(List.of("fdId", "fdNumber", "fdBillDate", "fdContractNumber", "fdInvoiceAmount", "fdStatus")); + // 单据编号精确匹配(§9-U4 查询能力联调确认) + query.setConditions(Map.of("fdNumber", Objects.toString(applicationNo, ""))); + query.setOffset(0); + query.setPageSize(50); + HcsResult result = hcsClient.invoiceRegistrationList(query); + return requireSuccess("开票登记对账", result); + } + + /** + * 校验查询结果并返回 + */ + private HcsResult requireSuccess(String scene, HcsResult result) { + if (result == null || !result.isSuccess()) { + log.error("HCS{}查询失败响应:{}", scene, result == null ? "无响应" + : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId())); + throw new HcsException("HCS" + scene + "失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return result; + } +} From 6dd1d678440b7eb2614f7bc66d61072c2f6a7c18 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, 28 Sep 2026 00:10:20 +0800 Subject: [PATCH 019/124] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9EHCS=E6=8E=A5?= =?UTF-8?q?=E5=85=A5=E5=AE=9E=E6=96=BD=E7=8A=B6=E6=80=81=E4=B8=8E=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4=E6=B8=85=E5=8D=95=EF=BC=88=E5=B7=B2=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?/=E6=9C=AA=E5=AE=9E=E7=8E=B0/=E5=BE=85=E7=A1=AE=E8=AE=A4?= =?UTF-8?q?=E4=BA=8B=E9=A1=B9=E4=B8=8E=E4=B8=8A=E7=BA=BF=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E6=B8=85=E5=8D=95=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-09-28-HCS接入实施状态与确认清单.md | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md diff --git a/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md b/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md new file mode 100644 index 00000000..570f222a --- /dev/null +++ b/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md @@ -0,0 +1,192 @@ +# 桂物合同合规系统(HCS)接入实施状态与确认清单 + +> **日期**:2026-09-28 +> **依据**:[2026-09-27-桂物合同合规系统HCS接入技术设计.md](./2026-09-27-桂物合同合规系统HCS接入技术设计.md)(§1 决策表 D1~D15、§8 实施拆分 P0~P5、§9 未决事项 U1~U12) +> **分支**:`feature/hcs-api-p0`(基于 `feature/payment-apply-bfi-sync`),共 18 个提交(P0 一个 + P1~P5 分步 17 个),全量编译通过 +> **提交范围**:`a739211`(P0 骨架)→ `61b2c62`(P5 对账端点) + +本文档回答三个问题:**哪些已经实现、哪些没有实现、哪些需要确认**。供代码评审、联调准备与上线检查使用。 + +--- + +## 1. 已实现清单 + +### 1.1 客户端模块 blade-third-party-api/blade-hcs-api(P0,包 `org.springblade.hcs`) + +| 组件 | 内容 | 状态 | +|---|---|---| +| `feign/IHcsClient` | `@FeignClient(name="HCS", url="${thirdParty.hcs.baseUrl}")`,**24 个业务接口端点全部建成**(C101-1、C102-1/2/3、C103-1/2/3/4/5/6/7/9/11/12、C106-1/3/4、C108-1/2、C109-1/2、C111-1/2/3)+ OAuth2 getToken;URI 均可被 `thirdParty.hcs.*Url` 覆盖 | ✅ | +| `interceptor/HcsAuthInterceptor` | oauth2(URL 追加 access_token)/ basic(Authorization 头)双模式并存,切换只改配置;取令牌请求有路径+空令牌双重守卫 | ✅ | +| `token/HcsTokenService` | getToken → Redis(`blade:third:hcs:token`,120s 过期缓冲),`refreshAccessToken()` 供 401 强刷重放 | ✅ | +| `config/HcsProperties` | `third-party.hcs.*` 全量配置(§7 清单 + master-data.ttl-minutes + perf-record.xform-id 两个落实性补充),含默认值 | ✅ | +| `config/HcsFeignClientConfig` | connect 10s / read 60s,空拦截器覆盖全局,**无 Retryer**(D7) | ✅ | +| `dto/`(49 个文件) | 24 接口全量请求/响应 DTO + `HcsResult`/`HcsPageVO`/引用对象等公共结构;字段按《桂物合同集成接口逻辑梳理》核对,双层嵌套(C106-3/4、C109-1/2)以 `HcsResult>` 承接 | ✅ | +| `util/HcsPageUtil` | offset 翻页(从 0 起),默认上限 50 页 | ✅ | +| `exception/HcsException` | 客户端异常 | ✅ | + +> **口径说明**:D4 明确列出 23 个接口,§2.2 又将 C103-5 附件下载标注"备用接入";为对齐"24 接口"口径并覆盖文档全部接口,C103-5 一并建了端点(当前无业务调用方)。 +> **技术说明**:`@ConfigurationProperties` 注解前缀为规范要求的 `third-party.hcs`(大写驼峰前缀 Spring Boot 拒绝启动),YAML 仍按设计文档用 `thirdParty.hcs.*`,宽松绑定等价生效——与 BFI 现状一致。 + +### 1.2 业务侧支撑组件(`org.springblade.transport.support.hcs`,12 个) + +| 组件 | 内容 | 状态 | +|---|---|---| +| `HcsProjectSyncSupport` | C102-3 判重(命中回填跳过)→ C102-1 新建 / C102-2 更新;万元×10000 换算;合规 fdId 回填;手动重推 | ✅ | +| `HcsContractSyncSupport` | 链路编排:①C101-1 甲乙双方风险校验(留痕 check_log + `hcs_risk_*`,黑名单且 block-blacklist 阻断)→ ②附件转传 → ③C103-3 判重 → ④C103-1 起草/C103-11 更新(先持久化 fdId 再走后续)→ ⑤履约规则同步 | ✅ | +| `HcsExeStageSyncSupport` | C103-9 行级同步:聚合 row_op 非 none 行(add 不带 fdId、update/delete 必带),整体操作首推 add/后续 update;fdExeplanId 与阶段 fdId 按行回填持久化;软删行经原生 SQL 照常上报 delete | ✅ | +| `HcsCreditCheckSupport` | 付款提交事务内同步校验:C101-1 黑名单阻断提交;C106-1 超额不拦截、置 over + spec=need 转特批(超额时 success 仍 true,以 fdIsCredit 为准) | ✅ | +| `HcsSpecPaySyncSupport` | C106-3 发起(双层嵌套 fdId → hcs_spec_fd_id,状态 processing)/ C106-4 更新;特批附件 fdEntityKey=fd_spc_approval_attach、发起带 fdBindType=ADD | ✅ | +| `HcsPerfRecordSyncSupport` | C108-1 新建(fdId 回填 hcs_perf_fd_id)/ C108-2 更新(实际金额);关联履约阶段 fd_id;附件 fd_plan_att | ✅ | +| `HcsPaymentSyncSupport` | 付款链编排(特批→履约记录)+ 整体状态回写 + 特批结果人工确认(§9-U1 过渡) | ✅ | +| `HcsInvoiceRegSyncSupport` | C111-1 判重 / C111-2 新增 / C111-3 票据日期回填(金蝶回写发票最新 invoiceDate);合同编号经应收结算链路回溯 | ✅ | +| `HcsReceiptBillSyncSupport` | C109-1 新建(双层嵌套 fdId)/ C109-2 更新;合同回溯 + 人工补录兜底;税率 ÷100;fd_bill_date 为 YYYY-MM-DD 字符串 | ✅ | +| `HcsAttachmentSupport` | 附件解析 → 文件服务下载 → C103-2 转传 → 合规附件ID 映射缓存(7 天,未命中重传) | ✅ | +| `HcsMasterDataSupport` | C103-6/7/12 模板/分类/币种全量拉取 + Redis 缓存(TTL 可配)+ template-mapping 存在性校验 | ✅ | +| `HcsReconSupport` | 对账回查:C102-3 / C103-3 / C103-4 / C111-1 | ✅ | + +**字段组装规范**:所有 Support 按 §3.4 规范逐字段标注外部字段中文名与 TMS 取值来源(照 `pushArBill` 惯例),待联调字段带 `TODO 待确认` 并标注 §9 编号。 + +### 1.3 触发与任务(D9 / ADR-0001) + +| 项 | 内容 | 状态 | +|---|---|---| +| 审批零埋点 | 项目立项/合同:`/approve` + MK 回调(4 处);付款申请:`/approve` + MK PaymentHandler;开票申请/收票单:`changeStatus` 到 approved 统一置 `hcs_sync_status=unsynced` | ✅ | +| 付款推进触发 | 金蝶 A103-2 付款结果回写(`applyPayApplyResult`)paidAmount 变化时,已有履约记录ID 则置待同步 → 扫描走 C108-2 | ✅ | +| 金蝶开票联动 | `syncKingdeeInvoiceResult` 推进 invoiced 时置待同步 → 扫描走 C111-3 回填票据日期(D12) | ✅ | +| 合同审批置行标记 | 合同审批通过将未同步履约规则行置 row_op=add(ADR-0002) | ✅ | +| `HcsPushTask` | `@Scheduled`(cron/开关可配,默认关),顺序:项目→合同→付款→开票→收票;Redis 分布式锁(setIfAbsent + 持有值比对释放,TTL 240s);批量 push.batch-size(默认 50);失败 failed+retry_count+1,重试上限 max-retry(默认 5)超限人工 | ✅ | + +### 1.4 手动端点(`HcsSyncController` + `ContractExeStageController`) + +| 端点 | 用途 | +|---|---| +| `POST /hcs/sync/{bizType}/{id}` | 单条重推(bizType:project / contract / payment / invoice-application / invoice-receipt),重置 unsynced+清零计数后立即推送 | +| `POST /hcs/sync/{bizType}` | 批量推送一轮(复用扫描逻辑) | +| `POST /hcs/spec-pay/confirm?id=&result=approved|rejected` | 特批结果人工确认(仅 processing 可确认) | +| `POST /hcs/master-data/refresh` | 刷新主数据缓存并校验模板映射 | +| `GET /hcs/recon/project?projectCode=` | 项目立项对账(C102-3) | +| `GET /hcs/recon/contract?contractNo=` | 合同对账(C103-3) | +| `GET /hcs/recon/contract/detail?fdId=|fdNumber=` | 合同详情对账(C103-4) | +| `GET /hcs/recon/invoice-registration?applicationNo=` | 开票登记对账(C111-1) | +| `GET /contract-exe-stage/list?contractId=` | 履约规则行查询 | +| `POST /contract-exe-stage/submit?contractId=` | 履约规则行保存(行级差异标记) | +| `POST /contract-exe-stage/remove?id=` | 履约规则行删除(软删+标记) | + +### 1.5 数据模型与配置 + +| 交付物 | 内容 | 状态 | +|---|---|---| +| `doc/sql/transport/blade_hcs_sync_fields_20260927.sql` | 5 张业务表统一字段组(hcs_fd_id/sync_status/retry_count/sync_time/sync_msg),可重复执行 | ✅ | +| `blade_hcs_contract_fields_20260927.sql` | 合同扩展字段(exeplan_id/risk_level/black_status/risk_time)+ `blade_hcs_check_log` 建表 | ✅ | +| `blade_hcs_exe_stage_20260927.sql` | `blade_contract_exe_stage` 建表 | ✅ | +| `blade_hcs_payment_fields_20260927.sql` | 付款申请特批字段组 + hcs_perf_fd_id | ✅ | +| `blade_hcs_receipt_fields_20260927.sql` | 收票单合同补录字段(hcs_contract_id/no) | ✅ | +| 实体字段 | ProjectApply / ContractManage / PaymentApplication / InvoiceApplication / InvoiceReceipt 已加 hcs 字段;新实体 HcsContractExeStage / HcsContractCheckLog | ✅ | +| Nacos 配置段 | `doc/nacos/third-party-api.yaml` 新增 `thirdParty.hcs` 完整节点(凭据走 `${HCS_*:}` 环境变量注入) | ✅ | + +--- + +## 2. 未实现清单 + +### 2.1 按约束明确不做 + +| 项 | 说明 | +|---|---| +| C104 收款流水(C104-1/2/3)、C107 认领记录(C107-1/2/3) | ADR-0003 边界排除:推送方与链路待定,TMS 不承担;Feign 端点也未建 | +| 付款申请/开票/收票的 MK 处理器**补齐** | 约束"他人负责"。注:现状 PaymentHandler 实际已由他人注册(探索发现),本次仅按零埋点约定补了 1 行状态置位,未动处理器归属;开票/收票仍无 MK 处理器,直批入口已接线,未来新处理器只要置 approved 即被扫描自动覆盖 | +| 前端页面改动 | 列表页"推送合规/重推"按钮、履约规则页签、特批结果确认入口、对账查询页——本次只交付后端端点,前端(tms-erp-web)未动 | + +### 2.2 有意暂缓(待联调/待确认后补) + +| 项 | 现状 | 补充条件 | +|---|---|---| +| C103-1 报文附件挂载 | 附件已转传并缓存 fdId,但 C103-1 请求不带附件字段 | §9-U8 合规方明确挂载字段后接线 | +| 收票单作废推送 C109-2 | `voidBill` 不触发推送 | v4 收票更新入参无作废状态字段,口径确认后补 | +| C106-4 特批更新的自动触发 | 仅手动重推且特批流程已存在时走 C106-4 | "单据变更"的判定口径确认后补自动触发 | +| C103-4 详情数据结构解析 | `HcsResult` 原样承接 | 联调拿到实际结构后补充 DTO | +| `blade_hcs_check_log` 查询界面/端点 | 仅写入留痕 | 需要排查页面时补查询端点 | +| 附件下载 C103-5 | 仅建 Feign 端点 | 对账/排查需要时接入业务 | + +### 2.3 简化实现(功能可用但口径粗,联调后细化) + +| 项 | 现状 | +|---|---| +| 付款申请与履约阶段关联 | 取合同下第一条 perform_type=payment 且已同步的规则行(fd_id/fd_property),无按款项性质等精确匹配 | +| C103-9 返回阶段ID 匹配 | 返回行数与请求一致时按行序对应;不一致时按业务属性组合键兜底,仍匹配不到的 add 行保持待同步重试 | +| 收票"票据变更"触发 | 无自动变更检测(收票单无变更流程),变更场景走手动重推 | +| C111-2 新增后金蝶已 invoiced 的竞态 | 同一轮紧跟一次 C111-3 兜底回填 | + +--- + +## 3. 需要确认清单 + +### 3.1 需要合规方/联调确认(对应设计文档 §9,代码均已占位不阻塞) + +| # | 事项 | 当前代码/配置占位 | +|---|---|---| +| U1 | 特批流程结果回传方式 | 人工确认端点 `POST /hcs/spec-pay/confirm`(过渡方案);若有回调/查询接口需改造 | +| U2 | 组织/人员 fdId 体系与登录名同源性 | 引用一律先传名称或登录名(经办人/创建人经 UserCache 解析 account) | +| U3 | 字典值映射:fd_settlement_type、fd_invoice_type、付款用途/性质/类型、CONTRACT_STATUS 是否必传、fdBlackStatus 取值(示例 no) | Nacos 各 mapping 空占位;未配置时该字段不传并 warn(黑名单判定按 "yes" 等值,联调校准);CONTRACT_STATUS 一期不传 | +| U4 | 判重 conditions 是否支持 fd_num/fdNumber 精确查询;HCS 是否按 fd_kingdee_id 幂等 | 按文档 conditions 精确匹配实现,联调验证;判重查询 C102-3 额外携带 curUser(文档示例如此) | +| U5 | C103-11 updateDraft 如何定位已有合同 | 入参同发起;补偿重试路径会重复调 C103-11,需确认幂等性 | +| U6 | 相对方 fdNumber 编码体系、fdType(inner/外部)判定、C101-1 用客商哪个编码 | 按甲乙方名称反查 CustomerArchive.customerCode,反查不到留空/跳过校验;fdType 不传 | +| U7 | 合规模板ID清单 | `contract.template-mapping` 空;未配置时合同推送失败并提示配置项 | +| U8 | 合同附件向 HCS 的传递方式 | 已转传+缓存 fdId,挂载点确认后接线 | +| U9 | 立项 templateCode 与 C108 fd_xform_id 环境值 | `project.template-code`、`perf-record.xform-id` 空占位;未配置时立项/履约记录推送失败(xform_id 未配置则不传) | +| U10 | 开票申请→合同关联字段 | 现实现:开票申请 → 应收结算关联表 → FormalSettlement.contractNo;回溯不到推送失败提示补录 | +| U11 | fd_ap_bill_src_subject 关联键 | 一期不传 | +| U12 | C104/C107 推送方及链路 | 范围外备忘(ADR-0003) | + +### 3.2 需要用户(我方)确认/决策 + +| # | 事项 | 说明与建议 | +|---|---|---| +| 1 | **前端配套改动归属** | 推送/重推按钮、履约规则维护页签、特批结果确认入口、对账查询页需要前端开发。是前端团队按本文 1.4 端点对接,还是需要后端继续补前端? | +| 2 | **菜单与接口权限** | `HcsSyncController`(/hcs/**)与 `ContractExeStageController`(/contract-exe-stage/**)当前未加 `@PreAuth(menu)`(新功能无菜单,登录即可访问)。是否需要建菜单并补权限注解? | +| 3 | **特批结果人工确认的业务归属** | 谁负责在什么时机确认(财务?项目部?);确认后是否需要同步更新付款申请的其他业务状态(如是否放行后续付款) | +| 4 | **C108-2 履约记录更新的触发范围** | 当前仅金蝶 A103-2 付款结果回写触发;付款处理单记录(applyPayBillRecord)等其他 paidAmount 推进路径是否也要触发? | +| 5 | **C106-4 特批更新的触发场景** | "单据变更且特批流程存在时调用"——付款申请在特批中(processing)允许哪些变更?当前未做自动触发 | +| 6 | **收票作废是否推 HCS** | v4 无作废字段,当前不推;若合规方要求作废同步需其提供口径 | +| 7 | **付款与履约规则行的关联口径** | 当前取合同第一条付款类型规则行;若一笔付款需精确对应某一期/某性质阶段,需明确匹配规则(如按款项性质、按期次) | +| 8 | **履约规则行维护的状态限制** | 当前维护接口未限制合同状态(草稿/变更中均可编辑);是否要求仅草稿与 change_reviewing 可编辑? | +| 9 | **实体命名偏差** | 留痕表按设计叫 `blade_hcs_check_log`,实体类名为 `HcsContractCheckLog`(P1 命名,含付款校验留痕后名字略窄)。是否改名 `HcsCheckLog`?影响面小(1 实体+1 Mapper) | +| 10 | **C106-3 的 fd_id 取值** | 设计 §5.5 表格映射为 paymentNo(单据号),接口文档 §8.2 语义为"来源付款单ID(主键)"。当前按设计传 paymentNo,联调时需确认以哪个为准 | + +--- + +## 4. 上线前检查清单(Nacos `thirdParty.hcs.*`) + +| 配置 | 必填 | 说明 | +|---|---|---| +| `base-url` / `auth-type` / `app-key` / `app-secret`(或 basic 凭据) | ✅ | 合规方测试环境地址与凭据(P0 依赖项) | +| `push.sync-enabled` | — | 总开关,**默认 false**;联调稳定后灰度打开 | +| `push.cron` / `batch-size` / `max-retry` | — | 默认每 5 分钟 / 50 / 5 | +| `project.template-code` | ✅(推立项前) | U9 环境值 | +| `contract.template-mapping` | ✅(推合同前) | U7 模板清单,按合同类别配置 | +| `contract.settlement-type-mapping` | 联调 | U3;未配置 fdSettlementType 不传 | +| `invoice.currency-id-mapping`(RMB) | ✅(推开票前) | HCS 币种 fdId,可经 `/hcs/master-data/refresh` 后从币种缓存取值 | +| `invoice.invoice-type-mapping` / `receipt-bill.invoice-type-mapping` | 联调 | U3 字典值 | +| `spec-pay.payment-purpose/nature/type` | 联调 | U3 字典值 | +| `perf-record.xform-id` | 推履约记录前 | U9 环境值(不配置则不传该字段) | +| `attachment.file-download-base` | ✅(附件转传启用时) | TMS 文件服务基址 | +| `risk.block-blacklist` / `credit.require-contract-synced` 等 | — | 有默认值,按业务松紧调整 | +| SQL 脚本执行 | ✅ | 5 个 HCS SQL 脚本按文件名顺序执行(均幂等可重跑) | + +--- + +## 5. 遗留 TODO 代码索引 + +| 位置 | 内容 | +|---|---| +| `HcsContractSyncSupport#buildXformFields` | CONTRACT_STATUS 是否必传(§9-U3) | +| `HcsContractSyncSupport#transferAttachmentsIfEnabled` | 附件挂载点(§9-U8) | +| `HcsContractSyncSupport#updateContract` | C103-11 定位方式(§9-U5) | +| `HcsContractSyncSupport#buildSigners` | 相对方编号/ fdType 判定(§9-U6) | +| `HcsExeStageSyncSupport#backfill` | fdChangeStages 对应关系(行序/属性匹配待联调校准) | +| `HcsExeStageSyncSupport#markRowSynced` | add 行未匹配到阶段ID 时保持待同步重试的重复建行风险 | +| `HcsPerfRecordSyncSupport#buildFormData` | fd_property/关联阶段口径 | +| `HcsInvoiceRegSyncSupport#requireContractNumber` | 应收结算回溯口径(§9-U10) | +| `HcsInvoiceRegSyncSupport#latestInvoiceDate` | 票据日期取值口径(发票日期 vs 回写时间) | +| `HcsReceiptBillSyncSupport#buildSaveParam` | fd_ap_bill_src_subject(§9-U11);作废推送缺接口依据 | +| `HcsTokenVO` / `HcsTokenService#cacheToken` | getToken 响应字段与 expires_in 单位(v4 未给出示例) | +| `HcsReconSupport#reconContractDetail` | C103-4 出参结构 | From fc5bca2b108a5a6f714893a016737435eec17fef 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, 28 Sep 2026 00:21:49 +0800 Subject: [PATCH 020/124] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9EHCS=E5=90=88?= =?UTF-8?q?=E5=90=8C=E6=8E=A8=E9=80=81=E4=B8=9A=E5=8A=A1=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E6=A2=B3=E7=90=86=EF=BC=88=E5=AE=A1=E6=89=B9=E9=9B=B6=E5=9F=8B?= =?UTF-8?q?=E7=82=B9/=E5=AE=9A=E6=97=B6=E6=89=AB=E6=8F=8F/=E4=BA=94?= =?UTF-8?q?=E6=AD=A5=E6=8E=A8=E9=80=81=E9=93=BE/=E5=B1=A5=E7=BA=A6?= =?UTF-8?q?=E8=A7=84=E5=88=99=E8=A1=8C=E7=BA=A7=E5=90=8C=E6=AD=A5/?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=9C=BA=E4=B8=8E=E8=A1=A5=E5=81=BF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-09-28-HCS合同推送业务流程梳理.md | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 doc/docs/hcs合同/2026-09-28-HCS合同推送业务流程梳理.md diff --git a/doc/docs/hcs合同/2026-09-28-HCS合同推送业务流程梳理.md b/doc/docs/hcs合同/2026-09-28-HCS合同推送业务流程梳理.md new file mode 100644 index 00000000..269176cb --- /dev/null +++ b/doc/docs/hcs合同/2026-09-28-HCS合同推送业务流程梳理.md @@ -0,0 +1,235 @@ +# HCS 合同推送业务流程梳理(现状实现) + +> **日期**:2026-09-28 +> **范围**:仅合同部分(C103-1 发起 / C103-11 更新 / C103-3 判重 / C103-9 履约规则 / C101-1 风险校验 / C103-2 附件转传),项目立项、付款、开票、收票链路不在本文 +> **依据**:[2026-09-27-桂物合同合规系统HCS接入技术设计.md](./2026-09-27-桂物合同合规系统HCS接入技术设计.md) §5.2/§5.3/§6、[ADR-0001](../../adr/0001-hcs推送采用定时扫描模式.md)、[ADR-0002](../../adr/0002-履约规则独立数据表.md) +> **状态清单**:[2026-09-28-HCS接入实施状态与确认清单.md](./2026-09-28-HCS接入实施状态与确认清单.md) + +--- + +## 1. 链路总览 + +```mermaid +flowchart TD + A[合同起草/变更
履约规则页签维护行] --> B{审批入口} + B -->|页面 /approve| C[ContractManageServiceImpl.approve] + B -->|MK 审批中台回调| D[ContractHandler.approveFromProcess] + C --> E[approvalStatus = approved / change_approved
hcs_sync_status = unsynced
履约规则未同步行置 row_op=add
合同主文件置 approved=true] + D --> E + E --> F{HcsPushTask @Scheduled
sync-enabled 开关 + 分布式锁} + F -->|扫 unsynced / failed且未超限| G[HcsContractSyncSupport.pushContract] + G --> G1[① C101-1 客商风险校验] + G --> G2[② 附件转传 C103-2] + G --> G3{③ hcs_fd_id 已存在?} + G3 -->|否| G4[C103-3 判重 → C103-1 起草] + G3 -->|是| G5[C103-11 更新] + G4 --> H[回填 hcs_fd_id 置 synced] + G5 --> H + H --> I[④ 履约规则 C103-9 行级同步] + I --> J[回填 fdExeplanId 与阶段 fdId] + I -->|任一步失败| K[failed + retry_count+1 + msg
下轮扫描补偿,超限人工重推] + G1 -->|黑名单且阻断开启| K + G2 -->|转传失败| K +``` + +一句话概括:**审批只落状态(零埋点),定时任务扫描 `unsynced` 后按"风险校验 → 附件转传 → 判重/起草或更新 → 履约规则"四步推送,失败自动补偿,超限人工重推。** + +--- + +## 2. 阶段一:数据准备与审批(不调 HCS) + +### 2.1 履约规则行维护(合同表单"履约规则"页签) + +- 端点:`GET/POST /contract-exe-stage/list|submit|remove`(`ContractExeStageController` → `ContractExeStageServiceImpl`) +- 数据表:`blade_contract_exe_stage`(ADR-0002),合同维度维护 +- 行级差异标记(保存时自动判定): + +| 操作 | 生成的标记 | 说明 | +|---|---|---| +| 新增行 | `row_op=add`,`hcs_sync_status=unsynced` | 待随合同链路首推 | +| 编辑未同步行(无 hcs_stage_fd_id) | 保持 `add` | 尚未推过 HCS,仍按新增上报 | +| 编辑已同步行(有 hcs_stage_fd_id) | 置 `update` | C103-9 行级更新必须带合规阶段ID | +| 删除已同步行 | 软删(is_deleted=1)+ 置 `delete` | C103-9 凭 hcs_stage_fd_id 上报删除;**不可物理删除** | +| 删除未同步行 | 仅软删,`row_op` 不变 | HCS 侧无此行,无需上报 | + +### 2.2 审批通过(两条入口,零埋点) + +| 入口 | 代码位置 | 共同动作 | +|---|---|---| +| 页面审批 | `ContractManageController /approve` → `ContractManageServiceImpl.approve` | ① `approvalStatus = approved`(变更单为 `change_approved`);② `hcs_sync_status = unsynced`(**唯一的 HCS 埋点,不调任何接口**,ADR-0001);③ 履约规则未同步行批量置 `row_op=add`(ADR-0002);④ 变更单合并变更附件、清空变更字段;⑤ 合同主文件 JSON 置 `approved=true`(`markContractFilesApproved`,供附件转传筛选) | +| MK 审批中台回调 | `MkProcessBizHandlers.ContractHandler.approveFromProcess` | 同上 ①②(幂等:已 approved/change_approved 直接返回) | + +> 重审/变更场景不重置 `unsynced` 就会漏推:首次入库靠数据库默认值 `unsynced`,但已 `synced` 的单据变更后必须重新置位才能再次进入推送队列。 + +--- + +## 3. 阶段二:定时扫描(`HcsPushTask`) + +| 项 | 实现 | +|---|---| +| 调度 | `@Scheduled(cron = "${thirdParty.hcs.push.cron:0 */5 * * * ?}")`,总开关 `push.sync-enabled` **默认 false**(Nacos 灰度打开) | +| 多实例防重 | Redis 分布式锁 `blade:third:hcs:push:task:lock`,`setIfAbsent` 抢锁 + 持有值比对释放,TTL 240s | +| 任务顺序 | 项目 → **合同** → 付款 → 开票 → 收票,各类独立 try/catch 互不影响 | +| 合同扫描条件 | `approvalStatus IN (approved, change_approved)` 且 `hcs_sync_status IN (unsynced, failed)` 且(`hcs_retry_count` 为空 或 `< push.max-retry`),`LIMIT push.batch-size`(默认 50),按主键序 | +| 单条处理 | 调 `HcsContractSyncSupport.pushContract`;异常统一 `markFailed`(`failed` + 重试计数+1 + msg),不中断本轮其余单据 | + +--- + +## 4. 阶段三:单条推送链(`pushContract` 五步) + +### ① 客商风险校验(开关 `contract.require-risk-check`,默认开) + +1. 甲方、乙方各查一次:按名称反查 `CustomerArchive`(fullName/shortName 精确匹配)取客商编号,作为 C101-1 的 `fdNumber`(**用哪个编码待联调,§9-U6**;反查不到 → 留痕 `skip`,不阻断)。 +2. 调 C101-1 `getRelativeRisk` → `fdBlackStatus` / `fdRiskLevel`。 +3. 留痕:`blade_hcs_check_log`(biz_type=contract, check_type=risk, result=pass/fail/skip, trace_id)+ 合同 `hcs_risk_level`(取先查到的非空值)/ `hcs_black_status`(任一方黑名单记 yes)/ `hcs_risk_time`。 +4. **阻断条件**:黑名单(fdBlackStatus=yes,取值口径待联调 §9-U3)且 `risk.block-blacklist=true` → 抛异常,合同落 `failed`,msg="客商黑名单,禁止推送"。 + +### ② 附件转传(开关 `attachment.transfer-enabled`,默认开) + +- 范围:合同主文件 `contractFileJson` 中 `approved=true` 的文件 + 其它附件 `attachmentsJson`(去重键照 `attachmentKey` 惯例:url|link|fileUrl|downloadUrl|uid|originalName|name)。 +- 流程:按元数据 URL 下载(相对路径拼 `attachment.file-download-base`)→ C103-2 multipart 上传(fdAnonymous=false, fdLoginName=承办人)→ 取合规附件 fdId。 +- 映射缓存:Redis `blade:third:hcs:att:{attachmentKey}` → fdId,TTL 7 天,命中不重传;未命中重传(重复上传仅浪费存储无业务风险)。 +- **任一附件失败 → 整单失败进补偿重试**(§6.5)。 +- ⚠️ **挂载点未定(§9-U8)**:v4 的 C103-1 入参未定义附件字段,当前 fdId 仅转传+缓存,C103-1 报文不带附件;合规方确认后接线。 + +### ③ 合同起草 / 更新(先判重) + +**首推(`hcs_fd_id` 为空)**: + +1. 判重:C103-3 `conditions={"fdNumber": contractNo}`(查询能力待联调 §9-U4)→ 命中直接回填已有合规合同ID 置 `synced`,跳过新建。 +2. 未命中 → C103-1 `draft`,顶层与字段: + - `fdTemplateId` ← `contract.template-mapping[contractCategory]`(**未配置则推送失败并提示,§9-U7**) + - `fdOuterSystem` ← `src-system`(约定值 TMS,D14);`fdLoginName` ← 承办人(handlerUserId → UserCache 登录名,解析不到失败);`saveType=submit` + - `xformFields`(值一律字符串传,时间字段带 `fdType=timestamp`): + +| 字段 | TMS 来源 | 备注 | +|---|---|---| +| fdNumber / CONTRACT_NO | contractNo | 判重候选键 | +| fdSubject / CONTRACT_NAME | contractName | | +| fdAmount / AMOUNT | contractAmount | 字符串传值 | +| fdCurrencyId / CURRENCY | settlementCurrency → `currency-name-mapping` | 默认 RMB→人民币 | +| fdSettlementType | settlementTypeMapping[settlementMode] | 未配置不传并 warn(§9-U3) | +| fdSepcailContract | 固定 "false" | D15,原文拼写笔误必须沿用 | +| CONTRACT_TYPE | contractCategory | | +| PARTY_A / PARTY_B | partyA / partyB | 名称字符串 | +| SIGN_DATE / fdEstimateStartTime / fdEstimateEndTime | signDate / startDate / endDate | timestamp | +| CREATE_TIME / fdCreateTime / fd_syn_time | createTime / 推送时刻 | timestamp | +| CREATE_USER_NAME | handlerUserName | 承办人名称 | +| CONTRACT_STATUS | 不传 | 是否必传待联调(§9-U3) | + + - `signer[]`:甲/乙各一条 `{fdStanding, fdName=partyA/partyB, fdNumber=反查客商编号(查不到留空)}`;`fdType`(inner/外部)不传(§9-U6) +3. 成功返回 `data.fdContractId` → **立即 markSynced 持久化**(`hcs_fd_id`、`synced`、retry=0、sync_time、msg)——履约规则同步若失败,下轮凭已持久化的 fdId 走更新补偿,不会在 HCS 重复建合同。 + +**更新(`hcs_fd_id` 非空,即变更单 change_approved 或补偿重试)**:C103-11 `updateDraft`,入参同发起;响应无 data,success 判断(**HCS 侧如何定位已有合同待联调,§9-U5**)。 + +### ④ 履约规则 C103-9 行级同步(`HcsExeStageSyncSupport.syncExeStages`) + +前置:合同已推送(`hcs_fd_id` 非空)。 + +1. 取行:`selectSyncRows` 原生 SQL 查 `row_op <> 'none'` 的行(**含软删行**,delete 行需照常上报;无待同步行直接返回提示)。 +2. 组装:顶层 `fdContractId` = **HCS 合同ID(hcs_fd_id)**、`fdOuterSystem`、`fdLoginName`(承办人)、`fdEopExeplanOperateType` = 首次 `add`(无 hcs_exeplan_id)/ 后续 `update`、`fdExeplanId` = 已回填的计划ID(有则传)。 +3. 行字段:`fdPerformType`(payment/collection)、`fdFundNature`、`fdFundAmount`(元)、`fdFundDate`(毫秒)、`fdInvoiceRule`、`fdInvoiceCycle`、`fdFundType`(行值为空取 `exe-stage.fund-type` 默认 byAmount)、`fdIsFinish`、`fdExtendContent="{}"`;**update/delete 行必须带 `fdId` = `hcs_stage_fd_id`**,add 行不带。 +4. 回填(合规返回的 fdId **必须持久化**,ADR-0002): + - `data.fdExeplanId` → `blade_contract_manage.hcs_exeplan_id` + - `data.fdChangeStages[].fdId` → 行 `hcs_stage_fd_id`:返回行数与请求一致时**按行序对应**;不一致时按业务属性组合键(performType|fundNature|amount|date)兜底匹配 + - 成功行:`row_op=none`、`hcs_sync_status=synced` + - **add 行未匹配到阶段ID**:保持待同步(failed + msg),下轮重试——存在重复建行风险,联调时校准对应关系 +5. 同步失败 → 抛异常 → 合同 `markFailed`(fdId 已保留,下轮走 C103-11 → C103-9 继续补偿)。 + +### ⑤ 结果 + +全链成功:合同 `synced`,返回汇总(如 "C103-1 合同发起成功;C103-9 履约规则同步成功(add,3 行)")。 + +--- + +## 5. 状态机与失败补偿 + +``` + 审批通过/MK回调 推送成功 + (未推送)unsynced ──────────→ 扫描推送 ──────────→ synced + ↑ │ + │ 人工重推(重置unsynced+清零) │ 失败 + │ ↓ + └────────────── failed (retry_count+1) + retry < max-retry → 下轮自动重试 + retry ≥ max-retry → 仅人工重推 +``` + +- 权威状态在 TMS 侧字段(`hcs_sync_status`/`hcs_sync_msg`),HCS 不回写业务状态;**排查推送问题以此为准,不以审批日志为准**。 +- 失败日志均携带合规 traceId(`msg=xx, traceId=xx`),排查时提供给合规方。 + +--- + +## 6. 手动操作与对账入口 + +| 端点 | 用途 | +|---|---| +| `POST /hcs/sync/contract/{id}` | 单条重推:重置 unsynced + retry=0 后立即推送(仅 approved/change_approved 允许) | +| `POST /hcs/sync/contract` | 批量推一轮(复用扫描逻辑) | +| `POST /hcs/master-data/refresh` | 刷新模板/分类/币种缓存,并校验 template-mapping 中模板ID 是否存在(仅告警) | +| `GET /hcs/recon/contract?contractNo=` | 按合同编号回查 HCS 侧合同(C103-3) | +| `GET /hcs/recon/contract/detail?fdId=|fdNumber=` | 合同详情回查(C103-4,出参结构联调后明确) | +| `GET /contract-exe-stage/list?contractId=` | 查合同履约规则行 | + +--- + +## 7. 数据落点汇总 + +| 表 | 字段 | 写入时机 | +|---|---|---| +| `blade_contract_manage` | hcs_fd_id | C103-1/C103-3 判重命中后立即持久化 | +| | hcs_sync_status / hcs_sync_time / hcs_sync_msg / hcs_retry_count | 每次推送成功/失败回写 | +| | hcs_exeplan_id | C103-9 返回 fdExeplanId 后回填 | +| | hcs_risk_level / hcs_black_status / hcs_risk_time | 每次推送前风险校验后留痕 | +| `blade_contract_exe_stage` | row_op | 维护接口/审批通过置 add;同步成功置 none | +| | hcs_stage_fd_id / hcs_sync_status / hcs_sync_msg | C103-9 回填与结果回写 | +| `blade_hcs_check_log` | 整行 | 每次风险校验留痕(pass/fail/skip + trace_id) | + +--- + +## 8. 合同链路配置依赖(Nacos `thirdParty.hcs.*`) + +| 配置 | 默认 | 说明 | +|---|---|---| +| push.sync-enabled | false | 总开关,联调稳定后打开 | +| push.cron / batch-size / max-retry | 5分钟 / 50 / 5 | 扫描节奏与补偿上限 | +| contract.template-mapping | 空 | **合同推送必配**(U7,合规方提供模板清单) | +| contract.settlement-type-mapping | 空 | fdSettlementType 字典映射,未配置不传(U3) | +| contract.currency-name-mapping | {"RMB": "人民币"} | 币种名称映射 | +| contract.require-risk-check | true | 合同推送前风险校验开关 | +| risk.block-blacklist | true | 黑名单是否阻断(置 failed) | +| exe-stage.fund-type | byAmount | 履约规则行金额类型默认值 | +| attachment.transfer-enabled / file-download-base | true / 空 | 附件转传开关与文件服务基址 | +| src-system | TMS | fdOuterSystem / fd_sources(D14) | +| auth-type / app-key / app-secret / base-url | — | 认证与地址(P0 依赖项) | + +--- + +## 9. 合同链路待联调确认点(对应 §9) + +| # | 事项 | 当前处理 | +|---|---|---| +| U3 | fdSettlementType 字典值、CONTRACT_STATUS 是否必传、fdBlackStatus 取值 | 未配置不传 / 不传 / 按 "yes" 等值判定 | +| U4 | C103-3 conditions 按 fdNumber 精确查询是否支持;是否按 fd_kingdee_id 幂等 | 按文档 conditions 实现,联调验证 | +| U5 | C103-11 如何定位已有合同 | 入参同发起,补偿重试会重复调 C103-11 | +| U6 | signer 编号体系与 fdType 判定;C101-1 用哪个客商编码 | 按名称反查 CustomerArchive.customerCode,fdType 不传 | +| U7 | 模板ID清单 | template-mapping 空占位,未配置推送失败 | +| U8 | 合同附件传递方式 | 已转传+缓存 fdId,报文暂不挂载 | +| (新增) | C103-9 返回 fdChangeStages 与请求行的对应关系 | 行序优先、属性组合键兜底 | + +--- + +## 10. 代码索引 + +| 类 | 位置 | 职责 | +|---|---|---| +| `ContractExeStageController` / `ContractExeStageServiceImpl` | blade-transport controller / service.impl | 履约规则行维护与行级差异标记 | +| `HcsPushTask#pushUnsyncedContracts` | blade-transport task | 合同扫描推送(含锁) | +| `HcsContractSyncSupport#pushContract` | blade-transport support.hcs | 五步链编排 | +| `HcsExeStageSyncSupport#syncExeStages` | blade-transport support.hcs | C103-9 行级同步与回填 | +| `HcsAttachmentSupport#transferContractAttachments` | blade-transport support.hcs | 附件转传与映射缓存 | +| `HcsMasterDataSupport` | blade-transport support.hcs | 模板/分类/币种缓存与映射校验 | +| `HcsReconSupport#reconContract / reconContractDetail` | blade-transport support.hcs | 对账回查 | +| `ContractManageServiceImpl#approve` / `MkProcessBizHandlers$ContractHandler` | blade-transport service.impl / mk | 审批零埋点置状态 | +| `HcsSyncController` | blade-transport controller | 手动重推/批量/主数据刷新/对账端点 | +| `IHcsClient`(contractDraft/contractUpdate/contractList/contractDetail/exeplanAdd/uploadAttachment/getRelativeRisk) | blade-third-party-api/blade-hcs-api | HCS 接口客户端 | From 1906e8c80b87d2c47f5cd9d41d389a733bdd1fa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 1 Oct 2026 02:06:04 +0800 Subject: [PATCH 021/124] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9E=E6=A1=82?= =?UTF-8?q?=E7=89=A9=E5=90=88=E5=90=8C=E9=9B=86=E6=88=90=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=AF=B4=E6=98=8E-v4.docx=EF=BC=88=E5=90=88?= =?UTF-8?q?=E8=A7=84=E6=96=B9=E6=8E=A5=E5=8F=A3=E8=AF=B4=E6=98=8E=E5=8E=9F?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E6=9C=AC=E6=AC=A1=E8=AE=A4=E8=AF=81=E6=96=B9?= =?UTF-8?q?=E6=A1=88=E5=8F=98=E6=9B=B4=E4=BE=9D=E6=8D=AE=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/docs/桂物合同集成相关接口说明-v4.docx | Bin 0 -> 1122304 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/docs/桂物合同集成相关接口说明-v4.docx diff --git a/doc/docs/桂物合同集成相关接口说明-v4.docx b/doc/docs/桂物合同集成相关接口说明-v4.docx new file mode 100644 index 0000000000000000000000000000000000000000..89280f3743e8c9a590f0f8b25401435a5b1544ac GIT binary patch literal 1122304 zcmbrlV~}ml(ly%LZQIyw+qP}nwr$(CxqG*5+qP|g{harn8|S?7{kd^xRK(24$~CJh zN6uU;Yt@jG1O|Zw_~#0h+2i}?{_hLoM=-KAlyk7PbEK8~F+=`Qfd9*EK786)3J?H5 z4hR4M{y)w1?d)jWtgW)+du{sY;DxS}-{9o0b_RlH2#3pn9+e=71RRBG8VOX8)*E1g zyRU&Lik7!rOfQaaX)gfTU{6-{04$fU1V*b$6;sU}SMh#OyyfIkw4K1OEYMQ& z!9s5TPReKi=kzX%*d5$XiDaH?<);(4;yqk(4CKFPb zBuNWr*)XJdEZHlBQ{+Y7mNBlZU>vTM*s{A9ZS9MiCvWlo+w-v*cH0_1o;UdMJi>o^ z-q6;;_#fAMC&)_n)1il62W;mbY>{X;w+8tZK?P=PFr#9gka5Sw$7tvfQGdiJmhK`Ukh1GtqF^#soUxa63&sMv zK~NN{NGCi?g+*BGzKKp^Xxj>;bfPSiZ&&173wZuigIrV2G15 zc8KgEPG*{fl;u>!NUS{w(cyTXd-0++h*PzsZ_=XE+x^o^$5!PUW%bu$C6QF7_^aPD zeb~Hki}$-4jrRwq8CD6*hwosQbjV*(LRUUdTxU-(l;?mt-1~dgAl?54LWFOQ&sAsN`JbF-qA14kgCcqhmp&JqQQV6J`^5E~2lf-XQR*Q!JMTb~I6o)KPnSh9c>j z5QM^UJaz{{n&J0AO5NFXy}(p_&4+prnOO_FH>;rkvLj??sV!Tb>dlyPU%rtRhhl^P z{zY&R0OMd2LKnWergNx;{WjazwvKRm-*XT1KA0q>6GBQm(D6$cO=jaw z2?f={U8hMuvD}EBHQ1Zs_4eE zunPANi2wI=2l@k|tF434|4MZ|8jqYeKRM1W0RRB*-zJVu?pDT*|6qKnEt$C9g3wh; z@$Fx%=ujtGJIiG;tZC>@;&QoS&$YkFD9r!6=2cE??CvG!AkL76-Ns?e{JLD?OWK9< z70sLpAb}820RW;_5k+^XXynW9YA93$7^LgvP7s~#T0G&+-iaQa8y6NE(fxKV_KNnG z?R5=aHf$D?V_`AY075G|SDe$$VPfw0MdYS?1~&+iGap}4PUzO4Ubb=OePQ8(X5x%A z-Y^zoZ)_zS#3nRN;(OtY^p-ViYzNy$OM3SWFs~;YCR}JEAR3Y`^j~qODPb;1Z`$yA zx8zyXsr|*VXYlXeTVk-i#oz`Ln&o6=EiKZN&4CMI?OiXCj{URfshZqhSbTRS#wp52Mie~KJ7ivnyZd;T?URb9t~R8(x4Y3d zUJ2OlDH|NO2J)fCHnVGK3zfd0?B_2S9`hG?y}pNiKksE9%xSBk*gftB5%waxiyf@) z6zWSUf`1)@sCF7#Ll+INleMEqna=R#2N*qOT3V^10o(6e|9MJ1$Yc)RDlvkvPUm%# z6!>oK)pRJQosPqOM4Lc^eaHM)HteAW zxQRT?J+!68(Vn$=W@K}*6U|o2m3n`DiRV8;tD9!q@!nxuEl8v`!-%U7s#=)g5x*3v z#+zxN<~NT6L04kxst`TZ>u4!**0Rms7U`AAtP7z@F!XzMrIwA9lx4c=|@m(~YfR7Qia0eM}L@MJ5UPGTN{>P}@V zIFWXyn&8b{?rH9gg7sw6)t&TIEwn^50e+4)!+%~TZwu@U983eFsZ>;;%0A@b1L{c& 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

8^p*Qqf=aHp(&C@uQiSIu^`e<}?r?J9Q~xxW;xa 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")2CMh$=tJ>_oJ0e54yxxEQ{`CymFAQ?$ACyef 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�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�z{w+ZwxrvgKj|(}036 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

  • 9Hjmo=qMNa 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

    sr4k z1;pa}7o7rw%ex11&AMAkJepS`;f<@ ztY_Hg+?eX*hs>UL)AF`Xx)lqg5eI%>PP*_2Kj_JnpHFRksRfsbzMPJ%O4~u;%1&7h zvT4w!naL&7)MOptr;S^#U)yg(H140V+YHGNO=mrG+k)RbZW%mo0lx013Ev|RX+KaLdqtGLiBty|AmfJPxhNNYojg{&;}1k~n+iKiYclrC}g5;t=WeQ3K=j|0q1|>o6;cLVwfM~ zPAnP_{y4T5o#KTe|J__CIIg#t_f-{RFcV9k0bf1hYCd^jP@!g}x|Wp8`f+>dn9n@@UbHuFqVgoUcNsUNGRcn!>KzE@Y%&bDA7-9ZGkQuPn(qYaoy8k#RszZ=pR$B&$Pki2aoWU6gJ_&yLji!;3E(woO z-oI&5^h*pTkXCXKNpE@6y}(?c?ZUQtr>A#XbC!h8IKLvSUGWvp1Tg>BPs_^tA+Dj9 zLP)FaV=lMjq>+Mx9Y>Kk#ZJf2E}RROYJGy6LN9(pRBla$*>Y~fwpf2!-@CaUtoSDY z32~V@Gc_Fn9L2-FC=1s8En{z3aakA+ETg)q|0gl|%Y*GIv!q5ffB6)aP0SC{PC#E! z6zSrO#55LG+-d1~rt4yCcI+P*(ork1qKfxA_NOMrLx=MeOr!Uqb1nJiXA8XnPAq7q z_6K}JxF}u9^AKmU_YrXV$7EdzqC^KVIQ4W$76rLv4{}dWZIO*xxV%%+Wud;zS7=>_ zhd3v_g#Ho-a|OoBXQ09IUaRnW!Xu{4-3jk8z3Vl&(fMw>QLkHt zRogms8vuy367J?74$xOG^s%uzi+u;*Nvbr(i-XTOUn-{EzCq)=iuL+#w0LRQeP&Nn znr1ZQS;lZOKQOS-edp&K(?CLNJ@YrIIlEEcdu0IsYnwsJW~bGPb| z(Mvt5#2G2l0$^yWRiQoHF(xgp%%y-*PhsGsX1Aktnie6Bd0-!>;SM%sx+TXW%5Ys| zsOI4=S||86gclp`cBwONVIKBY1x8GNmOPgB0!iotHs=hjnS}S!{_Y=nl4vGm*K$~^ zv2*nP$V9n1Mz~Y|T3wZQGz_Z!p5LRiVSe#J+`W3cbRNsI>iYbFI~eNikf+w8nXZT% zIn-Kj>f}77fXY*~D4mu(TRZ3C9W`8d9=CelhrJfp$DJm2%T)mrEeD!B9lwMkJKYu9 z9vG94=qv-OVBoUNeZXF!a8a-A?TOiA2IO(CRpit>i9O@Kt^>>6uwkEEBaHGtMIxcB zABH`~G%Do+QwU#GI!!P;|^HBv+Ha_Wfut{QLFQ zWA0KwuTLg7WCd5TzGN+6N4zw6?Is4RjA+bn=KcDq?!~1Z8~5xS5pHBbbTtUnK;(%P zp?k>?g)dyn`IjCfu(V0>CVI7Zb8pA~4GOi`(F)lXw>?#5uH?-zVH%fK zZJco3Lg3uk3H>CIyE{I-+(@MXnJf}`czA%$+EK`%QYOKR(d6WO_Fp=Fpk@il3Xwfe zKOCCd!78bz>M;TZ0@+6k&lH!+gthozo~Hic4U*GIj1&m%9UD!e4<7}^(ZR;%=s_GV zj=Mh8Bk*#*pZ!F6z^QnnUsDNOF~FfI4%N5!J8D>`|FJf!V-@rUdJqrpw zgch%a6-Hy2#V_xYdtr|LJ7NnhZ%LzTZDz(%TMJ&US3JCqAQmL~n3!Kk=8Ed5({a96 zYjf--_xRCNf8?3lm*DzM zg8B+bqKkxdcZ7;jaRXKE;K+Y-0ruTAN=KcpyZ&T=cuO-!+j`{{u=Jdw7pjD&pM8_^ z-GLeXG^pCPO_nS+aB^pErda9yot#T>+IM^x(2^Dc`%FV3@a3%16RT_|lb5cc&)ogz z&N?+#;>BTT#v2vfGO6R|{a97nCD7}K$BYNUwmxY_5wDu#nvfA;)9@U;xBv&*l4spF zcKT~dkPkVvht+s*yw>`|w=ppoE9elh^dJq&n!6_bR>Bry$~e2_v?Mogsfe{c*|6Qh znyPgh2i+@$XPtjV#c4!)fNDt4YI_wlUC~IjotUsDsYQz|mdx0p9`lXpWeUn$VRyY7D6cv#-R|pP zDHK&>Cm*aUTt77yx#UReQR;cEWGA;&J+`+^OUx;*-6D;U86RH4YqsUJ)o8g8lan7B zl1n+>?ej%Qbn3cX#OMf?f`z~&6S8SVc8f`L<1X4gTmmhLqE|sT%@0LtQ(|SJ;pZ9+ zKhjIcuKcEb;rpY4U@F^OtGkGvF!^hIN$)B^InvhIf8{X2kENzPACe^;jYVLuQCc(4 z65<&?b*XPB6IEN9HR03NP)Bb)%6c{d5~R_Guy|3H!72!+$qV#3rN(AWHqJuLTa&3k zkGbnh=$Ssgg;#n99X>AyYlIK*H{ zGAGKwbB+pQ$9yEB%oMPnQWMG}0eVgc&+G4dp;ZA5GG*h7_kz+P`5ma<>(0S_pH$pk z+W3CTPmC%D(dJj_;RKaNoTj*iKw*iq)oE?Q&QJKUN2nUqi)2)mlrAYX(Ewqn-Zgcv z$f&V3R~kIjM_0teAuiPKBVqvIfBaC&|JrX~yP}Lvp0Z^Fh1557%4)x|2E6Jv%n})T z+_Re|d@xl}@uC@-)xd6M_%C`DSHPXd3+^4|3Rlw$^@juZ`0QG77#IIA9&Wv$ z;omz?xt*=;!FG71XzUNlm&?~ z=Bm`zTd*SA{Z+g9AnzQr+xYPQUh7ezt?UrVKxV7|aAjTtZ&OC)Bme{zR%{27b1gmn z4`2fn&^O2G-46c=@e!w*6KWY-)Y5(@MG(1Xypf**1BU8Y;FC=3d0ZMBb8J;a~$Z1PLAv&fzKEyQ}_hDAn$ z&Qb=FDn%|*?&l3m_WXn4OHCcjgCd?IDG1EupB@FM5nPD=)Bt(VeCQD*H*D5(<0E9a z(Zv_*2y<8r_9(O*Q?9xp1Y0&((>+sgW9=Q}?w$(H54F~~j9Dbq*E0NbbTQd%t#k8D zjodQ`s3OM>!4}MkW*2`0a}wjN4<(oGu4X6POf4D>?152I_fK4`)SKho!jLz_vA37XD^Sy|cuMsD7Bpt<^nRJ!FdkHaVO~|1S0)mPV1sECVo={h0n1 zHoLH3AIEDD0C8W;!lw@+NZ3f`cH#o4%Z72WB2RD6w}|GCp-^RWr(o#A634{h_bTZO zyclX#@7z>d4wtLZ6Y^2Ue5>iQ!aufhA#)UzdohzK6GQ}w`GP$UG0DkZ01a?|f8Xz} z*6;41_3=Qj(G^&$EvIAy^fuUusRmK}eI=Ru@dSz4?Q`dkUi(gZ7A<)+ymmcPrM~$`zj{gnt?>s6|dz7kSQ;J~e1Nf8vMm!k4qPOrp+ON z|1?c?^N5=y@e7yo$hub%sh6Q5e^pBJYRxNy#-8H}Lza@bT7hBOIB_SFKTHe7Gqdm(&*R_$X13vf z@jD!dkD#}A|MV%C=XC3`s~jfu8>!M z1WYO&oFx)neDsC`yJ6h*^aLXL{0BHL!51IIVJYncV#qrTPBrB9`PayxO!kD@!#R?D zgOc&Y8j>6N+{*jB08!1S%ckWzItGOk0AyX%p7R#&)=teZId*1ZDNIm}cB?xR?q{7dW4A(S zMl}hq&b~t}v#Tbs*|XHiRhX+A5pu_6r!2A>?ZzV>bn?x=xN(`bak@sAPBvSLqX8|8 zB@c+=bbfMLRn=QIir*5}`PhmVBgPdXJK$TJxoW>`6j8n3yclU9PfAz{3~xr$MO&Mj zmrOXqE_F}%>UCA>Mkzs7IV=zlz4I$M@rxT_>zjOn(khD-7g|zaOcmTx^4=)vB2x)N z@Iex-qia?2y~)G~R6r;$g1BpKfeUz-Dezr{{Kd14bUmcma~qRYIL?+Jd& zT8*CwL;t;_Q_mKx1fj)zA_4 zAhug0==b(!aJdX(aKo_PxVFj7!6HB3Pz{_KB|O2%JIgm$IE~!3&@P60{77f`^-uwD z{)f~Fio*MQ{>7iheQJq0H)M3g)@q@B=jCBK>AQ1erw}*J#`B(Vkw$rPV)*rvB(bs2 zLw{spXOA905p3&}I(-DJhS-dM>70>sCr#cLy0z#xcdv=4!tkqo#kIO6Cccu2HWsA& z@vC|1*E$>atT215@yn;L?OW!4$5c$Rb`x;66u>%eP7x(z8E#$NdmX;{thMFPQ4b$W zNz|PFChxmpX>surhG)~ULNKl8IDP0649&lY6IOeHmIa|v+N->r+boga%F_);X88%t zud*b*j42KZ&sitQm1g7z!pJJU5d8q)p2@CRbJTBuo5jltc+Im2GP)g=@*hmF^wl<} z#%5Zw;9^Z}R>?~yJ(hB?)_O0k%RG!PdKXcb7<_bmW4Vy5&_eVU3+n=B-W{K5hKX)2 z`DmnA-9&%PTB+LT*>Oh7P%{}&?J5{$kG<+wt2-LdLs(ms)FN>h->X~7Erie0Y-twR z@)Og{sOykr@wyA0C@Tj#Ea05j(s3^g3V+0kY;zIc(;=HAgWk)S4r%5T3I6V@iX|$* z#=OYP4BkrLCWY5W#5Rf#9ph_(Ke6tS!xDd0mW(W@sw`7wOw?5PF|di3ZDAch?ett| zGU4iZhs%{K4%3E$3qEPw3(DsTEtcB4q8Ma83_j`?(o1P1H&<8>-p`RDf~VoNI(ZQ# z;R<3q=7Gta=B2HA+Mbk4V@rDiaW{#IJj)?L{NKZH)Yz?Evp%f^71r)ZObgQTb@b6HmwleoozeV>UhwQl{Oej>lm8JXdqC95AB4wE6i^`Mv&fE#RFN*ok6oof7|?gPOUuii&YDGP9nId$jziFGzw) zeQudRbwD!HS=zkst z{l~ksp%!gW^t9im$kxD3x_m{ie%Y$={k+EuHPOm9e~`r5ys8wmQetx>+e~XUgk2n? zpi+4=Elw&qgQJ4D_UXz{!FS$FEr#Q3S3WpU1R0G`pu6SsuaS6)0jI0RB8Yn@ERV}M z^W!xpax#GQcq8@5;2E{?EI4Y+U>B8W;t!=p;jd>OXyg*!Hh7p4(mQHs#E=&1(4lAf=|uZRqrq0uwzCxg-$yn1AdP#+`n= zPZ^K#F@h;+rn&d;GL66kX*o~Pxt1uS)#I8%Z|+j=L^8K%?Y7S@I&?QaUd@*MqWC>a zQq1Ch^r)SV-t6a^vucEpQ<-M0e|f)buTwDPW6$}iFi0Vq&6uUwCH6;&_5_m=G6K6PVW4l{oP3rg^5byxvP z;@2k((!lp7CzGyy^%t>NfodTt4$adCugt6>Xv63*?%2h_C1W`W`ZDr*327p|Y+bSp z`~3o`Fi6NgFUFc@+7x;@)CTaWIYQ%lxr#SXv|O_V?ry0A8}NeX{xn-V@^A0VO1TOu#VkV3?(8<4xFface~AgQ6ZJ`cI};(18Mkb3kNob-EY`?9N8} z`s)}#))ms1J|GofRm9^LvDU^noRd3&sNEPeAa~*}!mb=sWQAIBC%ZqjwTNlf>?)W7 zVPUI2I?$fZy#U!W@Xdv<-vxM(dxEXYNm-?cObReoDcWUmkc2EOOh_$%5NjFlJ|zyg z3*~dWY3%`2dZf0E{q?&9u*Yt$2~bwJpvp7g7dHIw$cQ#E zvBvkc7VStY6T6&_!5lF7lQ;fXNreszAWGqXTqnQZ|9=lR{{ILG{C{Qs6AJ?Bg0GPo zbORQO!2LmL6FVM#IXgm&fs_RW#1KeiRsyMZRe5YC01b!?3v)x34fvw3DDpE%3pZWQ zzTlpY|AT}C<9w&}|3S&X{~K=0{}DmN?Ce+?5NPxEiAE3b-UR^8w~J(~47Xv&kGyo> z+vOqP3Hr~q+VZrHZ-Dp*K|w(m0X-w5_0LyF`}=1%-at8_rawa-Jcd(SR_~{km3gGV zY6|FSI%A;hGY?79NsZ*@QR*cPKUH2Jz0vwiwI9p>Tlez7%t8|K>FLG4-eqnjJO4bK zz3sZ+9nQ0c9M+W<>Wi{?RMET?!hU-4&MsyQtgGh@H+w-*2?_aARzL*Bffrj@uU6YJ zaooYT7RiRsiS^E>n6>=g!g$*RqI9#$C+*!ZR)2u{%}Btat>l`!(h@02Rd4v);oft}yT3>BGC4pXJS!PCJ6Gqf*1bT?_qFI=`|U zw}%S9vrT{0DBLXj4&iTjx%@=im$>|b41)o@d&E6_^bR7b=ap4u>i#cX-&h@Z|Jlcl za{@8Q)dB+JvKwhne0`wjtH}`hAj z-a;@YokPU){$jf#-KMaSiXNg`;w8*aAT8ri^vgN7ItZ66 z;|PA9xZTOrajl;6<~VG;z3oEjG zQ2enjY|sEJU8qI$C5G4ri&_RN0E6}EKwh~CzB13>0i&1VU=x7*@-m|FT0fF%*NvQU z#cy*XB;F_W-BPhfoC|_^kdM0OG_%aQS?DjykmSP|K}%}QmrjkSM_y@c7Ri<+w-2)K zn{#$(R@tX#dI5Uw+|>xV$x!A_BkQZ$CyF`W2Z`kWjpiUHIUNumtU_u5_BhbD2^Z&! zJS2ZP08iZ)P~LgH+B&a&_y3?g*uB>CDn7vQ5(jgN=b=@3jZPlw>Y1--TI&c~wA}pF zQgw8UX1_<6yRt6BxbV^!@0H!f7Rnrpr*5O7lN%+gNJpyYJujQL9U2;sQzw|T8dd49 z3St#gjzEqdv9PuP_~&h8n@Tiy;N)WQaZTg9l(n@LpE*9tedAwOpB0uJ(p@dPw_hOp zeLiipUY=L=9iZjRZ73t2csa;?!uC0@iLKyIv36wO2!XF&6uuAqTkBqP2Qo(MfNDj? zU3h?K{bBEIj#94`7%V&-bEmGPzWH-a8pkfJd;zbXZ`epb>!31v{QToEdjynb4<+t9 z|JVvz!#=}d`0t)G|IELEBceR>5gyqST!*jb{0i;6C4MS`g{AX|S4vad=4<$l1{uTc zWDgP@R=+dvgvq#l0OyQ}WJSAnd-dqM_V}7i`Rbgb<2+WHPG7hz|AtBwdC~m!?N?Jt z(b7maxC>$O8C4s@h_DrN-Kzg^EiN}zs_QuCR)5%9aahIzZkPXDo;d%+mI z;PJc7gQ;Yf0FQ_>@M>c{a$U5#@w!eC0Pf0D1tY}0jlV10HT6_O@`_eigli3c4EHm5 zaZ|%kY}{bX2X}5{=OiMVQK}(1S*5U&rQBQW=n-WXM`>`uS+{=?e4j?kHns>PvQx-C z2EnfrZt@|>Hbjm^sciuf*`oDU;VF%;=d!dv0L053)J+Z z5NKbVNkh5OdDlfS)w)}(X<1PtQ*)Vr@8C>omCohdYvnAKJaryZs>}Yk=m?(Q|uSXM&X| zQ0iG!1&Fa&slheRfYNW=d%-^O(|b3&L?^nYXLeaj+f()>=17+LEUC>(d9z<9zIC6T zk^38hC-Rof$Pug1Azn$r?g!}}EWUIZSSE2U=se`3E>n(!?^Mt{FBk*Dgi0nfiMis z9bmCTd>L)OBJuy`irKL(gTI`-ox-bWsv>;xkNYd43SRTcojITIrKz&1vWQm}{;-Ee z5?`#1xZ!O8o!;?O&Kz+a6+b3VKI&DdD-{@Av7gTxSMMBzbJukGj(WI#xLvG0a`M4$ zklIAl&8e`_3J{8{ERx_V<>Uy9eiGfBN=lK(NSA?ljH6jM%VdD?bORCcbwaI{W71-t&)Dc0uH65K`F^JV-8 zNhm)CU?O3p?`o*c^5j~of@YRtiHmE{F4qe~mpN116@PeN>Io+M81>btZDm`ifzQ6wJrI?@{^#`l z-;#WR8-JMKgzx=^QW`p$fkO-EhP3-&pC#mfh)Vt*mkyMxd+pc6=8-b)*K-Q~KiAbL zbuo@_INhLiPN*a=xN_b-EQD-_2SIB48fL$^?xAC0Nza}F7O=h6zPa-atbYNPY~}Hb zl#HCbl5m#f{KDGH-1?_+FMj#s(W|ZAakV?8&)bEZd6zW3K0m9T_Lj~1LLmQU&-o~f zRHNsKYP3E4?B4;gAcqgr&8hHHARcDowgEtb9iJvJb-p4|5j9_G+}r4GT$CSPUQApJ znls*A5-FQDVPTC}Tou&%=!au z-=CpMFvE1A|`uFfAce+6-=#Ji7;l4S={^P%;gmGg7N7YVTuo+idEB%S4+98|E(&C zA^*Qum5}&;@^d?ijF7usHm}vLEjAf7t-biAe08w>oqq{+k;p4m(L~>FtOBO1`@iT- zDDFFp&aFl7({pz~7`)6`CbcuEdRZjZybzf^krcE3v}kHH%A#5o$CZUct-8t^nmb9Oo&fKTfJBhFyZcD!J5bufB-1oQ?`xa*I)r z>0dH(DK4k~X-#r4IFxZnHG)I21zys^(wp8+fxVnz2-_>c9^7+rK_7|mr%}1KVOxe% z4`)_HLlQk9E^3y_jto2onssm-4L$#;@+5d6%9MLpjiAe&`k>466^WEGsdS&ub5xn^ zkQGx@KX+A2}tGbJGQo50VcDaE+%+GZ)jUjs3rU_*_CG z<4a|M4>)W5Rhr$TUpeTTHJ*m{O(m^ciFf_dAu<16FwM+RQ6Q*cV%!kmg{LX3%bS$KEO>Gd+;6 zZQjWdlF_g@vFYrZAT}f50+)NZQb>#j{lpDo+H0Dk2L(>&*H!Hr^`_=hlS`>Y=ODXMbge0`F6BHPpgrI0x(M@(*K*R^3lgEUks_teP^ENRNCY z6|YQLi(sjM`YM3h6O`6GsC?A}|NRmx^27VKyEkNncC}s)w-B}m} z-G9{WI#z3Wi`p8|<<$~X@f*=;6bH-5z})o=42S% zxpYzv5f4-cm!|zm#~IU9XBj^y&rPv8FXsIr`rGja&3{*qtgh&CJoUVlD4uEM&G?ok z7!2wdV}(^I$VrK;L_R8+G;T*)nUF60OU7~b!;(>?1?JpWLkyGf`XX0@-)r@sqvnAj zcPS=pTI<&Lj|;#aUCXWasa_g#T`X^T1XoBEQO?dTku<7-TN->C(!rFQlhqlDZJ z-)eje=TX9&!xvPicb!3uEkp)5b0A$-yJj z>E%8NR5)s$+IIB4x1@3_vcU7{=M~Q@x$7v$!vi7Q=bV|9_~w$GTCdrkmW6FPoac0iICy7;HCIYC`q_q+!ir_P{l4BBHFkP$DrfY$G~cPo;5h1xeY z)LFSX&gi*U>CZzO{#4!Q)|dDoG88Ap8Fh!f&@n(f=CyW0UZ)(^3=AA4I*N`xS#i9= zrY+!LHS4}bGToAS-+meJ0AOxa%AF`^GmSw(IehhVQ~EPaB8O>|44B<$-4G zrN>A&=cm4RugoTo=~+jn59cD=wQDMd3Kmv=)jl`iV(UJ1y_+u4!NJD%y{t@^cQIHk zSQk)<(OD7Z)6qLsN;ByCZapx{ebK`_TvE2YN{WH1kqkJbCN#Q_ikT(W-2SFn)z#}c zOeKe7%gg&uL&j2??Nowp6uxioNE}JgtF|l0S?)qrjzlsPi6HT$>As)9HUkyE9o{ke z1!XXLUm2vt(1e_CvLRET3L1dJ6>VH=9XCnsuN)9!T}<&2@VUSrJm7sGR3W!7(5MGF6>}yVoxgZ5O$BkowmxJ>~t{!PV#} zM$th6z2yXFH;5KRC-awwhk}0UVs*k^^d7DYbsV~qu1Dywq5VVic{(mn0m3!#q%jZ< z!x4q-YyY5MXnwc3T4zIOOOeboZT~_)oTL7uc9hXBah-H5jZuO3|)d(a?8D17g3cP)}FL zHHzjlY~eepkzDm~gmd9c+$x565Q*2zYoUk1kJzlas5AYOrssPTH z^HMofAZ$i;hWsUb&60VCH6g`p?O0HxLA27(PP5}&u9Y}cNh%=MraVrW?x2$h1OjduPJfnV9POo3uLq1nk4&2lX%bRkIvT*F3 zZAcJ>l)qI9HVRGrTFS#I3H$P<)`R@>P@CNr0bYcgG0`1&C+7=CD>!V z_X$aSQb0j`;mImXr0#`MJiDB}v39#0>f9~kyNyC;%z^u|B+L^tck8|P^=CsJX7R~g zL9f+b6Z5vs&CBc5+A|=~vgK%++Y{?6YxGNO-0%Oow0p;HKn3s8Q(XH`wrU%*Qa4_z zp7qJ@f*h|LNU)goa4QDb)^wO6{Ts)QOQ^6E625(Iva)U&a%@w5OzUW@tXME*VX<77 zR=N)q8V_n})pOpUuFWcm4WR*{BTeWzYfz1Djf@?Tlt!;^;r|0#Z#@sqxdT#%%F%M# zjkTn||A6L~t%&0)PFUZf(XSW(N4*=fET{bIz@QA-`Ss~C8AtEK%cAzd{8Cn>JLwq1)&7dcszS6qEXW4mjxKFlX5?PlM|wxq zNItxKOZ$iE4l^gO)+_I#KEip<>@w^~u!<2xZRr36!ph_NiU&1KPoOB1rmXZn zb6c`OZ2rZi5q)JEY%J**>n)SYJB^~tp{pD^yi+P^rHakf5d(W%Pec;QG@1}rrRS8% zgM&k}0w{AX1CLxwUB)>e1rd+da&xt|Py{FogH*KuZva^6S!x8sVzTU|X^9Y>A<;Ud z&OOQsgD^z>hj7>^v+R@?K1kWLl-!o)gZ;ZJB7TsoN)I7t-ib3#e@th;p~jm%`oO<5 z;Yaitj3uTE3cP`VmhnK9F#m^St%N#p_&+%|xWkEoi2hPP%A+6R&7CT_iWv(GqAq=& zK@&8Az9zRN)#8B!R)PaD6r%6i9eg51>?pfJ!RyJV=3Mj}1p!EGdx0ChlHnwYfWM!r z8%ml;aShY4jall(@Ajs0?culRnnjmdQdASi7bPU`{-`%k96ClbA;4ncthnt92WKul zEUlbDF$WWU-aUp#_Lex!$mpe=16ZAGO&giR)!ns!OAb0-q*;_$sr9M9GTs2zX=DPb z2TL*?wc}rITFHSEg4h8<>8z2MOrW^_q~gTBHwl0Nl^v8syW z22{;%Omi20w7rxf(@Iy(>X{V7bZci}Jky*av(~t8-mxvN*Z>a`JD2gc=ilXLFK|Y9 z)0SK|QwYZ&UkwFm36~2e_+#hZ!M443A7Q%z#Sb?|_sa->A2%n4fVAC>+iynV=Tl24 z5c0-G13^Z5!z#Lpeu48=KT)bX*P&3$cOo=DfK=`@sZ!B7(po6cdZh4D23O8CxNi-V zTYV8>$Gx4%yXcH4O?+*Abg!%4;2vY}Yl?)gBA6LJ=~ZE0v>V1$Ut4F{y5zh`r6?Qox)|z{1U2ypAj-8J{+?`Mn&!Lpg9D*i5YxBj zXR^#N6=ii78)-F_)|_R+h=&c*uCc;1wgD0VmxZ)ISPnI^Bv|wYz9j7ve52?d*I}ps z?DTgm`lu5~PjcrJ{`OFw$-8Vl0fUVse^D7S)9WgJmlhEC*QGR+MA# zWd^RoDt7R)ymx*$UYB{MX zb$e0f_b{yk8HNg}jL*&0+b-1Hz;|Y5W+;8%L=1ddf~7=M5(9NcQ>}Xd=5K12X0l*i z)iR_#lSpZnW+6WIjignTM&a)M$ajQ`ij#r*t2_S5H38?4LBM zMmNdduym)&)htNZ1Yu^O7fF!5I#sxf75N7JCk-B6q`O35>$5lhYf(6zu2`8KU| zwJsXW@$e`VS_DMTj_F3ml;_vkw*iFjEcl3xcUEH*WlXP?mV&L>KCc~~`}-|DgD zwVxBn=|*^b8NEmlZv0fksLfW%EC}=7u+8eyIlsPL5v^qO_)~GVoF3GqR!lIYdo*`? zRh~$Y@tFr*-4z4j)u)n~Xd%&AY97_6l6p6`&yIOm|M)fV>X-i03+3+Mk1ZzXtz=EE ztW42(eQNd39YK-q&-{s=6On)=|EUs!yhqe9lYS}@BB|WtU(*uKlUb}ub-N>98JrAj zv2E~Lz0iWEqmhe0UihJN-;;m5JWBBEPvh1R@-gmv1=!FD8P-KqOsqKl70PL`sihGI zxuTVd^2Fj1%Pnx+tq5wBZx;|t7;u_GIQSO3WHy*k20D*4_A2F68XQcXgID#MK7eIc z>?}_q-0oS8$!Lof;F@Yra`YPQr0crLuz`I4*0U0B?FF9bqb#chNlMA?pu%w(=HPZ= zJ>6l+8uE=cMbCVQ{V_x>m)MfI6B?!GsQrB4$juXp6;MmHaN zGkc^5&erB0Nxk`DU4!O_y0{e{S?bBZ-nF5bw~@3mOb>C0lq#HqFuiVo9CMqRzaybi zvMZW>DEtJXS<5Xc$m}{%`nX*(A8k7DYcRSkm1S_w+O=M~p{-3B=Fkq|rvHdg5UQk|igvVKW@>tFMv)WC*`Nq4-2~56E5rZ|UcDjP4 zzWrzKLQy56Z`_u$@FK3H-KA5j*^h@^uG79rZXM25l6#-D8z63H#>dD1D48hUCz#G% zt@t78chZuBMLL`*221{?Omn9e3Z$F`U(|)f?OF3+8a(I{Xdi*IuRmIy?E3T;O>{Cs4_ggwJTI&6D zur3`s89oB%c{$w(Yh1W}LCqYVu}Qde9N;!2hQ2>bR@n$_4RUqf&UK%rzdif%n#trS zESHu#WT8S*e=->t7F31_|0lLLn&P1~JF`&3{OEd0?_sPFajRIFo{n=L4?jS>E40RI zL8K-WYUH`x6H=HUeWe}#+Wq<9ePrf2qG&il62KeEsl;{eT7IQ!nJ;@uWqCL3-{^Ag z@eq@ANofZ1B{O%7Pkl^tItBYPAl^D6AT>Fy1ZIwYs{1#@u^F)vIQj#9P&oCwr!Hc6 z@8x*%zz*?ZntQL3y;*5@RFyjjNI6Kh0V^91S=>`=AmPhV~Zg- zBdGPfz(1zqS#q^MRI7TR_Cfzck6iByG!JXt2w4Qbn9}DM>!8PT$#JDD#T58EtVn0W z4~%P8Dr<^`CA>f`gX&Cd;r0t***_#)0P&0NF@IWPSWZYWW66NEDNfBT_wa9o_VWQP zw2|D@`l%gVswlI`$@tQ+lkf%)>ypwF%DfNQTQy0+%#K4iAHEhz=q0hA|8a8Do~4#t zv)1x*w@#Od>At|TCKTZ9VeD=Gl~m4d4~OY2nJ|qG2jbaT#9Aaye@G!0VD>{4 za`0S669)_Z%m5pUGByx{0(%yMb5r&^x>z~ySII_4Kq=^k16!b&$A}9-7cUjVQK7{; zZxQx=F@0VD8kevBBEtUOnVfN+h^wr)^eCUuHtRVEh5#aF^k0$qgmJ%hBq_0SjWkht z2>Jw>LS?5^!y_(284uBZGnF?(e#UA}df^__YVr4BauZjoLfN2FBg6p@32aQFksYAD zajc4;)$W|zm`=x{6nPP+&soOb7zj1Rk?_I-ISQ0vN7@varXJiOSzPfi8qM^|;d zLSIriDT6@j27Cgr}Vzex{y{O!9yO2C4toa8Vsp#gp(aW7|-Yb9i zYQM@4AQYuB#WUgaDru`r{GIIScq1>P=h3SL-vZrCRK(-?m1|$QMypWGkn>teYLSlW z$a0_!b?xh;Co~&!9_Wn!_+4Wp(Xq&83gP-or}X1(MOaP_G3^O)o60v{jiX8|X)bZ? zDeQt<_iy!CO@-oWsXQ(8yva9AieT&5*N7}uhS*G+$~^6A`1b&)I^)lf2~SS55xqb4 zQ$y5@=reU>m^_s&TPWYi|H0be4{|FiWD|s=zxKy<4jFY*Jvd8Fu`9nH22LxRhK0(F zteV5K5sl$++I0NS~ zA(y?oMow(n`cf((^zUd|SAO%imWZaUg0mA&)krHXc)UEdD7U5_wyA^9k%T2z8Ix84 zqaKlcms0xjBFm^|ukwe25MP)dR3Ew>16V~EJHZn_;(h8n(Zt2YeLGfe+zag!4HhC1 z74g14sT>s%>~8*HX;kiApWnYulf)SN@(tl_J%S?h$B%q<4k=tl)5*0zuJ#^-n#oh2 zK-FjBpvX^&Qay35cM1Xbjz43eY77#MV%LqN%*+rJGHfr&A3?x1sp|aJ?n~!k5@FH=RdjD-RNjURjsMjLT)2*bjs&t7CE z4OhMvZ734;+%Z5{Uaqil3Y~6fSN`$-wwum7{OP}n|C^Zu0CWjBgnx|s;Q{XQyV+88 zwjQtdxMM|g#9RpQ*blyf?|x~pGZeqh$Agp&va&Tw)s*l+v{oZZwe}TeJ5y4Qx1sq{ zpO=ZTpWnwZ91riJX>~fcB@fClJ%!)`q;~KCsi4}nQHZHqy@zSF!0mg-vVQwuS|hH+ z!mo1zk&Zs^5=Z%pNm*_Tiow}unC!B+1JovsM%DV;v!Z9d+@-ygX^~(VT?K6_YDa;F zR6C;wQC;M4SP{6&dF*67Okc&$H##~y37Mk1=%+(Up0b;6-;OFM@-5aVra7`h?tO{; zj5jwiWhn_k@txx!YeQ2vA^R{YMT{vaX?t%2GxyXsdUaB@lBD*Fku&{|{nB~w-(9eJ z%OOu2_wsA!`I(X_m903$PxMD02Cx}g9>8M0b8dK|JADi`xLgRF53d;GTtT8?;R+7D zW|w=R;ba)p&8(EeTv3%Uh*6A?FCXUxon*fg6m`OW!OG*}YJe(&)#%!M__fnvYyTVp-W~J9!tYM6^*cBSK z;9Sv474o`}dazRJFZPnzcitdIW9H}(PCNandzo7ja%07 zR?`yS%HMnM`p*=(Y=RgpZAeC9vu((ID#^q=gDJ*GCy!lJixW4=+BbS@W8$j-%me~~ zk7#gMdirE_|1~X`H&=qGiQ`!}n9?K4+t+CN1A|K_1c|(g)Z9p-^|pgl3#T4AJ(q{0 zY|T_UV!ytdi8jt~WY*c)ES?sP8ZR^M5Dy7}P8X^!&sNrcsaNIV zwz;f_54s{Yi8H3Y?1Hp)44FdffW*eJ*iN-P-I#pAKjg{eV!!oOE+slGi1AYBrGjvi z^fE;sBK=4w6%Tmu2)%%4bhmn4W51$huK4@On#V5%Q564ni&J~5A1lu~$bmGfP=bzP zgyyZ4%S9h=fc=rSXd|1ELc)WFc&_5+yw7~(A*QS4j~b-ttlz)i^YBbtaE&CeZ{)=5 z&(}iIRT)ak$|Uaz$%tWDwp*lKHnV!C3LR^uHX8*Mh1IR}dVBTC72^cZ(q9)*Vbd>h zJu)zgxX*QiUQ^44V-yW1eQ}Al3cI3D(-SWyoi;BaVNd!=Xe}LUJ=;)}QpsJrXy6I`&nRPw`71!El@=gU@5(@gzU3lk~dwFK4Xq6|dcX(7V+8 z6nY^|s84ES|8a*0sR%vcTrJYY@frnvHuXmJ_9{iE#J++fiTofQ=Bdg!b8R`l_D=Xe zSk0JbyZWIygJMderV{(#iNKTr#f-FNzg$MQ?u5_3ZjaauhFc2lD!iLpxNh;2Ipuqv zp6cc(K%QOLjpi#lIZKdCdXd{|eD1{8IOFx@&$u^Gm#g}h3FNs~^7u0Y?}>5;y!d0? zXyOhJA^{*%1yf!9bpg2Qiy3a>gjg8L3(BB-SCMeNR3Fjmv$Qdxs;_}U&n{|yV&wZp zgx%b1Yat*TsTzLlAHW0DnMQ5F?b%PY2RMt0PoYR{!z zETygEPvS_cF}el1w__h#C&qMtu?jnAx~~6DomOwE`2pCo6`G0<)Tfcg^haw`Xyq#3v{c`4z7W5dR^k|6ABo(a5T7_)5!yN!z^1Nh>AFsSIj8I9T)(+(U^p zk0#Rn1JQWa-kq@F+zdkw?SWBhs10UBEGn1o&igTde5L%V&E?U(iA4U8P3Z5s8t zy^Dy;24>qdM`kgnw5Ksy2V2Y-tXHM7-6;n((2WG19yh{~4@(zvQM}WHm7XGFTjgoH zOO6Rb&n9bhveH)WzJM+=oA)|W-9ioAukdKjSWSd&&bfTwjfh^lzQ6G`-TIJ)Xz9SD zkS1N>X(Hl82cZ8M2~Ov-p|h48gTMCU@KQa8B4WsKL6dMh*Y29n?;Yqn{R}seb39`5 zl9w*C339nA1T)=db~FaQfk=xoADLd$kObnKVYiio@Szk>n={n zV}@PjXGoXh(%O6zUd9A#iltKnMYgZrSL8i<6wrg59uVOjiu>&{1)+$KQZhqe-D{vu zn1;KIJzXVd(76V@p>e`t_)p#;#7~8$A~-(W-)pnbKf4E=1wnHmE;vN#|#6tmDNM z7M9ikZ|={*#(1j(Yi=g2NKosiCH*gUtcrITTB$ASu~f4Q$;tDn&m(PgY}06~Bp#M0 zj^q_r$YIVp`_`OVp#9c%tVp)Zo`T1oZlq zhQK#0d5bCP+JZBx_Dy!8dyK){ulw`21T=OTy#0>W)3!5HJ1=Ov&W?1ZBKO<8m?o!Z zoXzccHy=N*uWRXrvy#16+7FHeZwhH!)P1U`wps&bYf18zE1I|!{uLPip2Lzx>d zEHU%|Xz~U;Xo)P>aDRV4RitrsbycKVSO7zlqqWPktOd4a@p1_DN^ptb_y~SASNxHN z$Dmf8P08$Eb^9LE<+N?hqJGWBn8(@0bDf1%f#yrrmnwbDU+>9hID3|9Gt3-r{+gT!zDcN$yCHvvNIm7^S}}9!ifY+PcSa|(V@<@aD2iuw5Vm7 zZ-LrwOx0!`_3Z=Dg4p08K94ubTmU*D=|4IpajwL)zf8nzAIuQ-IOP?8KKT^1Eh@)c z62xw!Fu1lkuIG2}(ahCkMy5vO^#TZNiUC!^?P5vG{Gf1_DC2i{SnZYj05>K<#pTO9 zVXZ#)4d&PsU_W{fQHCg2@GU%LhFQFAIBri5Y7soUe!O74_uUU`y8S7;;d=D0xVR~G zU!%<<8$r<#zfF^APd@{WDGVP?I}Rd8L2=VC7oC^}=5AsXQ!cH{g38nKNQyvgm__?g zjb7!?h`Wc@#$*)_FU7wT_(N~Jd{^dxE!WSi;_S~)YH1_iII<~L?xpwtIn7P0rr7+_ zm?GhDO9&%fRziA$RW-_FNDlfHIcUTUTCWC&1&1%QUJ3@~Bu-T?s9`bq($Jw5ig8SO z>*9-rC5{K5TT{jgCq>NvUS&3vFSavJ2zY+BNV?A{Zl<9k?bEY&|EjhWBvAq6Fp!&A zj;mGFuO+_?Q!T=1oho` zsKc6wTIed-V_wC2wvxVzOMbT-FpV}zT7UP@uxcP**X^*Te#e3QEy6=%RwGB}lXEMD z(AE#@xCS4!T#R^=u;uGg^$|^3s8q~vCZVy%2$vTgfhCqM)dHk%jQppMt9K3>IKatCz& zi}ufqu(B9LEK`z;tl75hWG!s|%3WT*LBgSpS9HaD^R=8WB95>D8h2f`X{`FfQ{1}V zHamqIm{(-&UoS>QE0{O-|AlGQYAk)OJ3q8ui);2!->#RAtQmlerD>Kce>~y=O%?t^ zm+X;k$XS-64nQfX!OtoQfJ#+J7{E(;hU%<_zWtIaw6!p_mVHBO8yE2=EY zXO3bg#Ib2Je6o~$qp(ca+-;`rb=q^e!u&ERBbxA58_O0O%S$0Mll@e@#tE_g9`=D? z3)z8Gi0Hf(N1G!324BD zxx}tKy)QSS}|M5sP)JW5E#4a}!s#6Qv+E*lsAEb`_ zhjtAN8A%C(K`@Xa#>0qt%|=q_v4eyVctK!xc6QGHWRN*L+`7b>8XMErxpn;g`?l8s z4WB9D&^OHVtJ@M*X8N}8Csd)GChv@+n42F{BWS?8wEIhd*Tf;AuJu>iuKs2BvRe>@ zS$f4%{jgaxm1pfMiTQkr-S6M%+|Sa!JU>43Zb_&QyqP!>llV*9 zmW8ly_LxaM!_yR_;?qHilp(V;JsTwdh)x9?3pHhnU`wsnmW4M62k(H_%yODOn~9Rl zE-}CFm0klD*2gRZZ_&pd4UbE;-G*SnKuxRIUlAY(^!Y>=VQ_DlB z7(@2`N>OW{A!DJAM9b?YsrUb~ABN$MDncni@0@w!38v@VU2G*^yw*Y%dMPG)t2Db& zj<|$GG_$@9SaTSf*{rdMy4w&W4I)DIcbIYxl*REz2Rn$L$*YMwandb1p2Fx#Arr>8 zXk@Jx9HEjB_?&q<)>x)^2$>;kI!U_E<(x?iUT5USE9w5X18@|g=^tXHeE=csw|TnH zbfvrLbEVCU42t+cZtjJSZqBGYr`;hz1ybw%b-u>t#`p~%+4aPL*GEMSq3Eyo>in$R zD|kz?myW+mWq6}bup&`*4T&+Wpiw7n!k=BQF?a8YGYbI$x|6ra9!arSua(^$DQn1; zw**RPBPO{Mk}+qKFr_#!?#)aH;KWNcvOY?!=kG<|!v07VK6n&d{M_2^V3@ig9b$EU zLC*gIwAZtLo9c^qNaUd}Hki3SOkFaiRp#TeUdN)FR<4;;a6v+F#bpY?%;%$-t0PmB zc!tz*-4G^7Q!i>zYk-NATS-?cwUJneJsJjkel@A!*N!Wz+#8YDL@ZD2PSr8}5ZH?W zfcr?Eu=<@Rt#$auqMaM=FftUJ3EZ4ZVASHprI(yWxIQ$T#|L8X98hD;%Py9e*Q4-) z62B}5<$XffCc`nXu%h#IMI{Ukk&v$EjZ_7TE`m}(*3C?E{I4CJ4_18K!#GvmihI2k zw^Uk+X5N_a26C^N(pGVJ%`>%~RI`=Tv8_Bbm|wa!Ix>^rWpu05a~9%iDqXqj{Vx~m(@6Y(zS_|KfAwX|6rS!W z4N9+r%F@%H1_{Z1{Xzc6M%@O|SNb1-{2HkZC(LxN0M=3Wgxx3x(VqUBq=kfJz$=Co zz7dX$l>3%N9{9eKgr~pu|8luMearuH=|2r?|L5x~!KeQznC$5@s{wC0{^zd%exv{Y z%ly|3`QO}|;go$0BqVQU@5h^+Crg2aBeG*0anKlm)ZZ;SjS46Ewo}?q7?xiR#}}Ev zGkpT>2fITEQ7JKm1{&Qz9=d7PZLJ4I4&nV2Mg=s;*mj^ugz>k=o=P-ol^Kfv{8)D; zf#d8X%hA%gB4o^TNK^ApTt0=LI>0@Dvs&==>96Gj{BVDNf2P5no}TcldNDCEmiPle zS}TcrGlo?<$8sM)UNm*Tbzq_-{-z-U?})2t8O0!o=U4*g%LXEKIe<&ZZsTs zafiNOP;IlFQ_#)bZFHlW5y%nkzJz_0$!wd$NO4oJ@NzBf6%vv$PF*;f&x&@AR2Ksv z-v636`g!B{c;b6v5kNq?PNVBT^z9Xz{2k6UC-`5}s6O-_!0F;YTi5q+;Jy1idW{~+ zq_xrie24kEB*fo~`y139ptt40KNbo!*qtv8-<&))%xqNdDE=PR2kN!ft`2)aAn?UK ztaS4RuW68<*84e-a;m`OD+ewwFUJl7p0-}%Pxy7yoq-aS!|kUI*n1Th^G6U9CNiJW zdufoat<}Cx*~ReVRXQgwseR}L6|gl2I2KDFDLH9j&S=?%E}OM5@XC76f7ymgdx)ju zo1K0=2`bpHRWO>mB?&mD+_zX>Fv+_q)J;|9xVKjwctkiw>@xR!zM5CsmvMUXrn&Y1n$CkdaAiO1UUaaKOn{&GN-IYSVV$DxP@h#LrL- z{swKeOU&S4?l%td^~C7LK9>FGdGD%&z~HfJ%quVw5@E=Jv!Q2VEVyw0(n`%6SJ57R zsiGE`#j}G>Ae}86tEB_yKC@q;Q3~(Pw7!g4S!_3XTQ}X%nz*lk-=h~2(bJ4)7JC8c0suOx?Ix6=I|eeFN!G(bN8-x zH{t|X>~PI~(h-k-)t0^DoVpg*tn*Ws4J=2JN9pP@mo6=*3TJdNu#K6|Af|-$-*+|( zsrpM;y#39D(r5>Wae1l}miQ2;)DPvUiLT!hfDMu9B+cMCM2awQtCpftoVK$3MHkww5?s8LP}elr<iAbT zM$;Ml7wufJf_5rwyhYvSj20~|mo>dAH2Xta6aO=P3xN`%GGf&g@u+A`&rOftJ`gFJ zh;>Y^jXrVCv5M?d8CXTPuKdll`a?pGzSJ{s(!*!A_tbCIiZwGzeAUP<&@Oc_R8jo2 zm%=wBZDTUW-f(d@tKejHKt2*t!~)1bsro#f>y||#or#5_PT|@Rx@rMrF_$WSQWE%|Ij~Jdob;BVgV&G=pt)a_ir0j4$4!RX{vXu ztR5cqWL}z4ms*}!xIa%n4*$o1vX|hA_(Ayg3#{I|)m&j{|7*`$+Oh|&%c5+Av4(js z%(AJuSLn~G&gmRD>tzrMBja(HXH7;=#F8*rczeP2QCJJ$M0rJRf4YOcD;xdWEW#KB z-5#}?6&K$AmQuw2C_TCZAY%30#_e^Aq_x%>i=}M6Pp_hM-rq&}?Fgj@6GGg{{n6@- z@;gv_+i-f63_kmgiKB5>{|t$73X)n?h~JFSD!!AEqgRwPi()EMfGn9_FT=^zbPq3?F057ThrNg@o6p*_Q&Cmw zt?3Ha@&2?giwdl@$Xy-!()W2F5Z54++h*-J=yY>NQ7xetb6^&RTIohLrO~9ufH|+sSjj{DrPD~)JrhX0M6!1{97fioh{oJ z7et*iyH5*`C;26>+sPl@ydq$bX^|M-VwJkz(ssVJ&vqng-?i9{gB1h?Wh*(SbHdTM zr_?;BKCyeq2;Nt`zxuP(P}ZQe=hpk0jXu!HNmx7~+8lhvg=o@rQ`oWvfr97Yo-v9M z)B85%u-|_HrNLb{8!1%8bKaPYBP!o;MvAMpSLoM-bc0_)v2N1SN{nF|NfX89$FLg* zCVi<Yfv;PAO5swuE60gO??LRz z`aZvTg&W%)vd40l3KI5N6aoY0ZJ!r+wh&e(DC57PcN_{p+rJjzkDa9ksrV&^sFSH>ci`zX`}O*@b$&aqi)Ax{NTZ!+$JuF8m)fNRnl@|U
    > zpD}1bjikN%%;4++KNTMB!qS9OKT<`g)VWQaMbv?@ab<{9b@QjnSx!s_vkBQ15eU6y zEh+z6U*FZsKel0#Bz8tl3_@52AS3n7qh+HJyVaz3!?$==r+i7Maaj`KQgH@?i*hLm zO3kgTJ|SbLveC9GkG?QxhrvM4OH6wBznvOYH4RT=DFMXoX5Va{6E zc2DDhvrAYj%b0mKTNs74w&Q#Ky6q^HnRIS`bb z^xx+s-*!5y8gEV`RameKmY0hnZ+oV2n>5pHA1J3C@35`-I`2&m-MY0y5r)d>dGD`)u!AS+@$tvm&B?bej@s1XDMMF)uIRsZZ?Ab!o=!MUPRb%$F`qW4{aFAIHD5Wt_uXovuC) zr3Kl&I|@4sd_7P^BlCJbX+GLpi1z(=7>W+1D8|2hP9>3Y?M3k5bkTEy?7?yFikJRb zIZG`nSU%z-Wt?X6;txFL)6aV6Tz}F?(rg1v?LgGzfqoy?SPTEjV|{R@cO}<)OW%%6 z605_Rd`?c5BmubdTXVa)cp6(eZ)UIjiQD(QZx78KGz3aAmfby(uUI$a!8|jmLn^o9 zTG!K*J^Go{o(~PuG9-t>3-_p4S^cm3EX^iGRpYCY>*IJNTjV6bcGhrufLA^IS}N#L zpL(7-?pd{f$iA6LWerZG%|k<56;i*oV%uf6-Z^}E&BgUpFGL7fg$ zmG-@(!fBL_;l;;96idnm$^1cZ^|aIk(_27>RB=fF1$eN_oC)vNECp)n@cNq-iOZfJ(SYr_A3@v=w{Vyji z&EDCE{oco|B-)~1F7E&CVKA@NptKPz?oG_A0TsAM{^{?(4YN4XfQICJ8|Chey6-Lw z*bHqm#}>Z;g!Um!=dw`+&^~+Pf_Hbh7j!q|Zs(59O9Tr&tyMv~pR>0f&G9!s2vIS+ zrd(GPvAd3n?*B zJDw=yg=`w*b$BaF)lL#`J)GewgCMa~mpZ5srx&(?=Z&_I=6L@u!GoGdgwR}`$A zzIYTlPKLPY;0JG6FFE46C0wz$}~BmN8;=)e2Z1U;^)5+FmNcwSaT%P0stj{3?L%+_><7s2;`%Q2 zJ#UVo$Fv|vuFdT9P)d;6spZ4q_lF99C@w2Arf+#Xu5(Y1p3`e897$oakczpghI;=X znJ>}M(plU1JxE>yBU@@e&vt*N1wKA`%_VZ1i3Kr67Y&X}xH0R0C{-hGX6M`gZ*EyTcsY{3i~dAZQ?E z886xSo8Bd0@Oai-I|T5;0OQcJ&zJX_`%T9yVZHHZ#3v(|%)h!0*;gLn@(%t#)y*OF^P;6LzjF;mkPTFh$K$;Qfm#};))N|4BReEQKeRcsePLc1+XN}c z#ukb_7j6M>=8EMle>RcP%|i!j6Q0hBKBwigG?5W$@Zl%R6C!FKO!)wA&%Dg}(Z%ih>Zj?Y z5{$is9GXC3TD2w;U78p-O{SC&U{v1>i#;bUj=OGdJb<+l6*^Bs)IE5fC|N^R#?d^V zFRyCB^Y%hJsIRt1%3i-=)g-PcP8tdoOiCqVSxC^!V_o8y{*Lo)bR#HHHhjW$eZy>6 z{GKp3f!6mPFy2C(#kbyX^S1I&Eq%*de(%@W-6&n*(0l8_)XJ0LnVx!A%QN#*zHKRP zvU>Bsxd4ii@W?@u^n86-{{iXY4qtc+1z4a!k$grBeAvD2psYe9k6m zX|cTvs#fo*)!2S+=kloP_Tmd@F}y}S9ID0AYvh%nx(q%3Vw&UC&S?BYiJtG1ko%)R zPT|Jx_SdU6sYTwXzV^L8thj{bX$e#=-v7$c&Zy^KcBOd@A@ghWiu4m=89)+T^G{cs zvwvAQEABMI_h+X%GZvp3$Yq0*64VC{gEtVtBigE8E?qmlGzG>B+e^~iXa%V;F-*P* zLWd!Ku88|u|G*hDYUv&pCEq%|I{WU2kQsCN1v-v@ix}>nGEpL_p84=hRYL&f&l`0( zm73a3Ljx}#hd&N=ZQIIvryPL~_1nmk*ukyW4~YqhgV5&s=M|yr<8MHqk#pLRjTg3- z4qfxJZ0N71A54c?jK&LPCpt`D-(p7|p+wA%PaR$GfP%IWV{+@+4<(Nc-=D<46aQ4wTe9`6IA*Oj&KCq#0*2TW#fO{1aH`cs3dO?*liD+9d^G|5vNkg zy?*rR{*`9*%65G=4g0p5Zo##IolCBfDyxc*a`hF2x!;BcD>C`HoA61|eD8lt%_<-2 zKh>)F?*F>L&Xa$W`tG218lUJ18X`WD{jqTi?MYIH+x%Hg3^eAVN9(n~IFUl{jff!O z=Wv597QirsTr}m6EW;4b9(AR+T{)Tii&hG7aipj7x9$!v6^Cqjx!<)$F#t)PLXkpV zDzi5H-Io)2wb3qaGVMfBTU^&Z^!Dj`)S&ITzYgl-Ao@sn;e>RTgeX}^>D+m9y}yH2 zeu?P4X?sN2`TZ;f_SZ6^c8{tdpv_5${q_*Cip96$USY#~@~&Kv-S|--oxV{6JqJ=S1&< z(-59XyL8h-;Ylr0M{=H$pxWTq60Lr>{3~tn%4@r;IBk|}=p*U`uwjZg`?&$6pGR+Y zUm!FYSa7kQ6we(VK9qxQ_hJ6E5lc&Dsj)F^+PHHjq_-=r#J|sO(GBUNkbN^~3Ullif~3O<1t7+=ivWmm6DKJ7P&oe*~ek zvXTQ{LC{UD93ojD^2mB%$-*AYS8M8~UDuGq@lYUP3&M)DA9h`1P4ljNgq1=0l5?h_ z(c7dn7_upJY&s^wL^af12gE}gobwoz3$$p4lc6^E1rysKnSQSg_9d!bk7?mI;nnr3 zDdrws*Gc6>Wkqkg@q61BLDD|mnAt{HsLgSOwXz*P-;u}~y9JDwa=&`@EN|39-sPAw z3+iLoF{Y7rXJXV>O$)RJ8i8&@VeV(q=;`E7MH_iF~wZ3bX6o(8ee(>S|5V@4p zE+=7mn0#ABjfzkh7()uY^IiBa>HZL87n)`;Pz zR{<54e=3}=SH#k=hryihT!o{-Y5R*2>i;UaP`H|YobA+5s>yPuP zRLUxeLp5@1Ako9xvFa8oxYOhVF&GUmKz)iB8P%H0s%(*xSaSk@^E0X5!nzW}W`~*H6L494XUvQ2%N| zcZ2r1bd0zQ_q&+UZ~eT^kNe1(C|*rlk;cybn9$51IQqpR=(eLamCfTdQ}5v%9*)D# zDnI7R0$oSWQ&nhcg}Ic&j5AzLsU)lic5)!=%{YnIZD=j`PWxnGe14P4{Y@RdNfd0nkuSvz27f= z++Ff}$eSA-MSUE+0n~U?)vs3&3UX6L69T^ft_2*ZQru&%@J7tqUsRnHQc%CLOU>i3 z%Sd5-kcDr@1Xd*o1iGVU1oUd3Wx(SpIHdf>RaZ7_^z!Gz_#Obz+HBhhqIr+VA3gTr{rsNN^Yr=Miu1|_vA!>>zrGeLOa4NGkPI@cWe2?Iq@j; zMz_!lb4vZIK$bD1Lu&2htNDuFsgM5=x9kxTe|H+O27|`~vLw?!C9@B#$6b2KIJ(RCWCom(zB6*lt5}myy6s)xDh5cKW15d~{!~+{($dKZ1;=^Ieu|zzn(KlbPiZTtsnZv1p-ny`t2??`@_p>&wy~5kiHd2VBam#~Uc5#qHR58;qYn|+4 zbTA}y;0lHOU;H<-O&t8^ui6@Q;GZ|Bnzfz3uSkG00b>h`Kv=gXXyEbAO9J?ekel_6 zfA;3=s?p4tv~q~D;1b%s$`8SZEBDJ+3?`)Wkf7bX)Mb8j6z7eL4 zF#Tf}pOc%d<3q<D-DNU%kOkmx}_<+7Ib9zVo6G zk3yk)aXw{c>&J?M&AgXIvYAY!WlMbO39AV6wD~&5w!-x)Wid%T-UIT zl*}#J+;r}BqUT7~SS)wmbhriF5|#UZVSZoqxB6Q_OyZcm>aJTTjL*TG z%Uk5_c2StqeOC^T@W$Ibp4Wq^1wXy4yfk9IoZm@eOMUwK7VDq%2vN_0;fK?gYuno* z#|IZQAW%Pp-c8|G>hK;L6-gNdeA#D53U_s_*uvx^EWP7b<^9gCAA(*H<${%zu&_u) zeN&+KDw{wU@X1;yuwSNcD|Jk?yOeVve)&@s7QT%R>f@NH4D7_%I3}IoOuJXUYslr{hq_@SgUNoy?LF8%s~%#Ifg_sUWd6uZ$`2z##9h z=4qpPhLwsu-L2-zPHsg1`fr!+#_C-b0k2na$arSos0x=FJ5YahuBXaE9yOPo#SC$P zMSVK~{W~*edS%j)MoJ@0`=sSb0kk{_?^{y6nIMZfrx4nTc?&xqlX{u1zKOq)Z*n6t z*Uz?AP4(jD-@$JMTqI_ti$W?%m>2}NoP)CWJ;nM9r4W;MCB2IFF>3b%pEAi>x0)vC ze;wYuJszDFwiGv)WFhmf?`ws>nAdCD;NlRM@O?A!;g5Qg@w#-T$Y;DW8M#YJ+kv%r zUe=A2262B4E3k4bc*M{1(Vtorr5SUQlGjZm4g1X_XW8!!^&@zmFa)KCd?gg3rLQMc_+U~=Eh=@-i|gye*2C|a!(&e-jnj6 zW@VZEmlVMC9Gj*i^EUYMI}ao8mlrmpRgyXrPokpfR@K zHEIu!#4M+i$O@9?z1ksdo`_?x({}eemTwjN!QKRXqnG8IvDFvBR=g|nimCA;i>=y| zT2i@J7Ru{VL6)GUWV;!mT`+`Gew?fzUcDCHr zXPU6A&LONU_5L7E{4HL=UM)Q>-`v@YM1Ls}+(E5{A+V$PJQR~Tq`F#srvmd`&CCE| zgSr07RHEKGVxVC{SE&)E+WnW5pY-(`Ilg-AYQOtg&nGL^u(8O^_ zXO3e+W}LwAy*{&VDB8x$SlT}8eR@EdMWvO@{Ls-1 z4|T#3SmxsPm5ykcepa@6$i}_oy?XTu3(1i!30BcNPY(K_gK{F@aJ8fzj^7sW#6W2zG2Di8$9{UxVk_ zJ1sZA+uzA#%J(U*^3H=4ZsRA5J(%~h!L)C^U6+Rsyb}trX%P;8a(E?hF0)%VLY?v( zW*Wczp1=Q!53MR#_BTr+|NC4?#ZcAh;-P83F%s|2ld52SUJZF_s#FdnlZGR)b^c|L zBK{lLmy^6V+nUToeT6pxCED^YPJXSZ0NpDSKnk$sd^4$nA z-#JDcWT(A0Zr4__rijYtW;pFqr*v%8rNX~cV}O@XFC_CtZ63}Cw<0BAV2hvns=w0S zZ7}p~ZTB36lyJX*lp2uS_YO)SuY6X=ZPII-n{c&MCd8_@n-#g0dk=DSNqlDu9&i{q zy}L`nP*KV_-!z=-7jqrRpI`T&439Rm>x=Xbf%0Xwe*)+Fa}R7$2fL5H8QAo=m#WY$ zIG0aiNnvKNtdilKB66im_ftJw`2O z?Ovn@g&c${gbZ(l!Iou^v((bgW-_#^iX-|Pdz47yN=Idk=~>0S3sD=U6j(b_=!R8e z{ZEU2#)G(@``Ps=?&|Fp3sEs}THacMZC^MqLHc6qq| zGPOBJY4Bj4ZjXA7)c;}L~J>=cZ(7lg)x)aZ$v%rM$&BDWBLnk`k zQND3-+vz!AML`dyQrdO>>C)LWia;ysr~53U-uF);l&a9XKiIa?4vHR4+-pci87a(P^i1g z*t-cj#)5qojev`VxrwGD`Jzqnp1m9Y*!;_TzV8NP>(5K6-U(kzAspca|`R3HTp~b`5iwkv1nt>Uv!~%#BNuNzdSg?)llDzPpR}F0U!CvEIP&c^t&n|Kj4o0Fhet z+HoXXC}@?acoTcjRBlls|B#kp()DJ5Y-qkPDS|gHg--k6FL#Ru+f8KwGPv;1A2wm( z=CU%y0#$`8%~eastop-W{?M+JatnX<6K>O+M5Fp+GzW>&q;f)?VQ{FYu{|U7S6nk) z9uEGRYT`(A;(+zYStBQCu1Y?~uqRl1>WpFFUG zU+BZgyo!``E$S<0CQ3c>Bdd8+E>$Tc6|2-7ffX9mB;G7tU=#+?U%QN?a6ayAef!XP zGJ|R7yLDB_>v0hwYb+~^Qdo3sa?5Q`MuvEmq2q+3lpkdc8c^-F#P>McSheTXgUfjx zH#cRK$~}H;q$wuC7h2=RQaVey9QP0#e0V&9ZK5r9kw;XcEDd5juR@ zkC#b3S`G%YSSJV2iC3H5OSpy?xq|jM5)+^nh6<-T&CQmOKImbqz!zA2{IM!~*9(Y~ zxPgQE@2WFqR=M4~?}=TvMKZ}=9B$Va=*dTbBddE*!~PC6)=2RXU19jl5F(yq!$sDq z8PF9lsm<`jnf&uu7?M3N_R`ZU@3Cpvd)ABw6bUYGuCcQI!h{F2TE9V7&?%aj-oMcv zYRO)xF8hE*K30pwR-ntvgnoy~Ww1?c9gKc#p+aa)gcXF1E2!vtuOg=O&39q`<=*Xg zBYZ=!3g@QnG{1wPA8xwm|?KTraXW@K)r zsC5QH7iL_W$28-~8Q$Zw4=m-qIlXD15qrG+5l6$l-TH%8Qs#A9qCb5P_wktEA{bn{ zKtiBPHo0?#kf9o#>w1Uj6qAq~EwT32Ja)$RI(wH3B3e?5Q-Bdy6eN^)j%mHKbIcLml$@Ljim5{BKzP5ky5y% zq@-J7;539nNHQ;^f{7RhXKfJ`pnH<^Qq$5ZUe-zMV7s?_g(OF^RUX|q$5$Vsh;M6F zXJna7635k&;CroPZVh4!js9GEYW3`QOWMVvCiq+T)F21cK zUh@Nbi#T~C%oXwyXk?dSM|$xA4{KeoDDrhUgV{RK=`Js*Q`6Qp-TBMQ{T)(U+VCna zozg~&jLfeWEa*F&rSUwXSGQ z0IkDc1qZ2Z^L1W_`=QH|ZUFQoARybIGYBRflqIL*4vZ0h3KyD4v z-}@W5FlHI}7YGvr<4j0&YN8`3QPO>UJBU_Y^&x}1mz_<$UDlxSky*^%<;2J(*1+k@ z>B$iRz{Q+8B{dWCtufpz1xKa0)dcWOE4#G!?e*T4a3=>33H8@#?DeF*$9dmIg%}Io z=$zL}kVH4Gp7R<1mMH$`aD>GY4+_;PWhiC+TxKNMyue}>D=6}LTd*WAoQo?_{(?uP znJRBta7`F%j6knOw%L%}^TRG?wIsbfOwvXP}&;J{Be;pLpyY>5` zM2P`u+({aDcT1pw5G=U6YvV3SNJ8Vm9fG^N2X}Yr#@)4X?&P=jdiQ$k>^gPst=e_= zoqqr|tLdISd-U@R`FzKa#S3#3m08jJ+%s%QApQBH;*LW-cTDBPs?Fs=1hr%8c2LJ? zu*Q(RUA25U`Ja_oqc*;ZyC*0wCZW7;8t*>$$p3VufNi*e!EuhOmgze4u-3-imq>T3 z`3c)30EuTI30JaP!9Dm@jxK=v{@S}OQWT)tKLB|3Zj7#Xk6q%N;8JHLILz$s=JMg> z3c>8yXNIs)IJx^#-SKVTjV5_V8T~3-kC{_+e|+BL36!tMbCk#tDXc@M%S2MGoXhjg zSa9N{UBFbJQe#SPe$}s<6J}XGb&(kWzBlZkS;(W6U0to+F?vtMi%VV7#D4ypC)dC- z%3z1|Zd+obh>aKVFX;wG@6hfG;pnxXxswD@E=;vpMMe5V%?y=*j??r+9K5}NGJ9S9 z3bHUrxPF{Yw+i=Pe+guNWjeXJvoYXmvV znZMQKc*c!d7ZQ!*wfW9}*0ze`nd0lVe!mB6jd&hha4Ta^ZW+tNQTA_*#@B3(DS4R@ zb?{IDM`dsu&_>~QPit)$g0dXBtou&*pNGMo0(;;8IAU3&jkoL#+`=<*bO*vZP@B$| zch;covu@&7X(DlyrmX*HMg&M{>dyR9ItzaMPkD&Ro1XaZ$DHX6ou3?z`y8@dKm7BQ z<+7)a82^6u|M5E+`@anj1J3?^4U7W$Z-?u@N5=ivS>}g8{XdVzpa1jK|8>6MA&&ab z<160(d~5$YfA}y|;lCX^|3_VnLzV|{brHTRHCv>Q|GCb7S0CYCd(UN*ujW61&l%-! zP-oe$BZhwK!vJ^&RxG)ee;#(2K|pNGD`bcAm!mZoP#>UV;s3Y!aKM@W<=v>G63_lO z3-EvRo%uiNWBPw^F#~b?fG$b^^gjmC&F(qNIf{mT;_$hv@Y8tjTJ+PKnT$<15aytZeszg|_$9`>>+i!vuKtR$JYHT0K$ z5>xUiupD%>w|}At2L|O`u?D@S`sO63F}rSJQ|AXw zvkpE~D(0^Q#P-=ik2Q2UGD%zisA&=1bm+Tf&Vi)bj^FHCpo17i$XHa=H60q><&qfF z;H1flcmq`WDO6BPy|#GNkugY_neh9=Lc-FAR&{gqh*BauR4w^NTYgk^zk0wo9m@Yj z+lv}nfCF|(T>~n4MhWOu#IIQMfP^v|27D*EJEU&lHf};6BOR%us)p7?%&>nVmDO#@IudS?Xm-oLwUOp{*IQ0aB=6>u3t01s!451 zJXz2A0wXVLm)YIfC8TF}IxIzRW^0N#$SxWq)RgU#6JOph+QgiMk2ua6*zsKRv{0H% zKc)JZrBtLH6Y<^xVt;=2cM`qCl+z&kaz@QpY12wA&ENi ziL<=KJr==K@=S6Oea4ujW|6_2>@8z|0{IogszcAU@?LqV{G<-lD-_hj#dM^*9B$4v zGIaY!Tdi+8vpvbDe1ktXi(bIUCSluu=JfHP_9hPF%@l8)_n&3d<2*n!(s_gC-o@h) zhLd750yJ0tS?!&J_6TVE{7*3=+Q`3nN5u{IFe}AGRfnQCueL^)U`wLpQFez>o%oZj zHD0MM&9idnF>}8Klvc17D`}2p6@1Y({8LQv;H_P$``RX6Vf7xG@IZAD??f36Sxi>6 zW=YDVk4v4zBe_b;tlo(8us}Rx>`j$tmG^db)@V`9WsYaIPwaNfl((mR3REbbCp{DO zJS7KTWtA1jWB#PnikBiPgID5XNOGCHwYyoWv z;o&9$PdBOzwc&SHCEMh*WHCy4nzKet3~5AGwI{2OgndrnEr@7B{bF=CJbpi*pv~> zm{%pfBTKT)tSwN2Hm+57Q`#o}wHr7OSugU9$)9`+Dz^f6oy{v`JTm41*$?+7U#A*E zQ{Rw_pc}sNsv64zg(c_40bSkLn)9?GTBTV&B@df_sWG|wbMy76F7Oj)Y1>~8&>&e3 zPahWjhMcNO^0|k;5WU;CQj)xi;Ax5rs;SS`1NpT2WFz^#+s=tRCg~iNbqi*m z*I$pNqr#QBtBOwOd3X5AYP<1^**UC^uM_D_9) zG%+abhd-Koi&G!1rzqXaChvsjgNE_*?x-Nv*Xljm4@w?~twcA8K>czKS7kg?PU0N1 zvSXX@!nouSp~k10G6=2}v@63=!@bT|ELqJn(%GT{-UK((0dwZ=?9InuIY4w04dS_0 z_mbZ^N}N?(v%C@h_VZ>_qC)BFipVt*kLoX$XA?VdQ%ExNIiioB@GZ+jhS=kyqx;|9 zRIY=D1l}cyP{UD9Ru9enT}~vm54)@=hsh@aU~Tg0Zv+;uNx00ob<^0saQG_kUi_kE z(2Fw!`#eza;^Ov);SN~SWdbD)#F^PW*CL+A{%#{ll)#d9S9Ek|^e;6b;8{{S(FdPM zY`(4{BMd>X{?IT^#3uzm_%wQ1TQ2cLmV~l1JgURHq2Ju&Ph8^N!jv8oK{%q2)~H`M zDfq#CA_HvBfy8a_Ee%i>2a=zw}NL?j64^W*ee@3zFZRlI=TMm~&+A z_S3OfiyyGgSFFO64{&y={SLcgjB=w!)nP0mM6W0?&bD5`rfnPhuFPFg^m;~jQ4TG^ zCDt{pz%?bBGOb|BDHvBYRLrM8wIAb!#Lr3cU!-Xe_>TG#RrlbS*yVMB0FcCRpPJKH zJ7FL{cbwnb+h!rq2okkqi*TQ3?RKfE!bS5k<}a!07g2yOb;`6k{a%*zqBC~gc%tj* z1h>`jfeN_zmyho-n2wWiL`naN=bs<@(>F8wWz4MNtfrGMw>4t@*TzCj*q7qHaNQDj z-9?+1%dTbcSEcePR__)qRf_rv*O(^$iSMG2sc0A>>`x`SZwMMwCDOd>Gboa8jUt*d zY-f6?3YC^)6p*jI1V-X2A`}fz)<^~eqDW!bOnP` z)2&uy%gs$Q)7lP3Ob53p(kMS-sAKx$N4{%&`etJN!A!5-(R0!@4BP;Xa@{6eU@#i@ z1514y(jv!THJ9#*^Q}MYKmVvwMJGEaprTP&(2>YG)DPUcC1qT;s%OkMsC-*_kNE&Z>`M8nyIAD3)< zH&^sjvypl|`)RptRWvy|cd46l^5PFzY}7N4s(4PB#L^C}28A=D1wULVU4;bNlQjrs?VkW%tW)zmKg5#+dfyRp$otc>yUbDPa;m*pBKAY|J_cJ1*X%-(~Imx#&^ zZK`XTRMvq)HihgAVzfqi8!16&LZNWkX>i&3c!MxkpB)5`@N|b3|{NPg)I2Aro`szZ2579P2a&v*lG4Qh==ue+n8_3*D1! z<-TfWLs~i$g?V0=%P9$$OwETQwfRhk9DsWQt$e%E_1ZsMG9~AqQlfXnohu zd&W7NzI-eylFr7x<<^a=wmKPG~y@auE z6M)DMu*LlZ?d4baqRlCzo8tzdXNxhqW6tC&>)jnLf5lD{IKL z(K8IY%xlV#_s+7tah}KGMeF>0f3RGqY|&xB8s-#PPA4E~6DL&_sczF}Bt;UkBXL|7 z{76oB0gnf4D&~9+tFG-y-bS!vl^5^`cT7(An^hcFu5oTyQ<~C;(CfGmTb!R)Y#w02 zgm@!k;2Z*Ptqqg-Y~O`k?N(gbqSKLs?Q69jQ9t>*WmG-)`t|GkuKNqJ%F0Th68g2f z*5>3fYxqT+lfBc+hDA*FM^1zK+q|ZABJDX2PvR$8@?w;YNlc0=;qo*mIwD?DMRVoG z5ud3*ST0t_o#;zTOq#slUX5&6ddn8+8-anRAK$%7$7%5be-1;P)M7GF2m75A6NeqV zQoGQ22Ocq+_|mFq?&`kS61{`Les5=k2`5SKV+DaOf2QjS?CQKtIyLuMhu+R{%Bhg= z3^P^C&v=X>e^Lu-zq6ntCXCA7H~~ths&klf;e21T_X;u2337zC_hpmENX_Gk3XnR< zm#O=eZjunViA#MkuQNBu>ugbk*&G)%@(*ReXZpST9jeB=V`v~r9=1ox+VA`Up9laQ zSVxV^GmTg1IT@=z)NVd&EG#6CO^$4~C?| z`4D^|a=SKQF6)lgzia-q^!WBKv{M$|y_$I8e*P(vUhTFAy`Ea6>UOZ5a@~lDaxS@2 z?5?~{$9lNH`US$-{3z~EJQqqRJtx21A%%j<#QIYKhCTWh&K#U`9F+DWUuapsPmV09!K{U%S*_O^Eg?@V&Eb_*)|` z@N1AkmCkrY@NfH!bj*X0r8KWK*P}RBZ>>LoPY<_jZV!NXr9OSSm>Kfsf*XFD`T0Of zgt9gFmrY^dVKhW6%!~FNCs<6PDwpuapEwg4v7fU2$ze>wiCQ27l_`|b6z9+MXFb}RZh=HaS8(QhTKrh@%X_a*GvP}-gA+J z_L=9=jd{dNVS&iUCb{ycD}3`GbV8X0FJAp4e*!NA#cERdQtOnLic%(K9mD z2MS}bt3Z{0l=W!=j~LWP71XHmI051~U~?Ub?M-XX+y!E#kG|GUdYA-sJz(dI%2ITm z`i?6q$KkQVd)kjVRdS+VM*{%`ZN( z3k<{U&)!eGk9~W>HyhXaeQGIf6h^)r*(pNEYcKGS_043%(6|H&g65_hTfd!j%YCG7 z!u5Do_d_1SB%PTj1ZFf8eDNpluXnP zZ*NyMR+siSG+eAUIh{z@1kAX+%kZ{bVO%Os~ z-B?RC|Fz4xM+DOE9_0y!XOrF5uuH~UkQj2j!rj49C?bR!Cq6f2EcG;6MK+V1 zxLw(DutZf7&+v^!AeVfRj@-B*B{;J>uBy*%i=4V#q*e=<8^tQ)oMU0gm0#nz6_bTJahdfiAV$JGf;c z;vxgy{Ky1n??%4G(c7}E?(D?hIT|1p?_I0Gz6o7QOxChDYh|vO#JDSi1G>e!op!|V z^Z6oUc5=b!9j-3B_EX_r7m@(I!g(d5Ixz~9HFbL~o3Hg&=7UqV1Xwv6J8OxMcBbg( z%`u-aDIkzWz|SnO(d1O5@Qk3e=W$PLTT4J0)Bh_2>Az9?wxPZ3hDmjL`LUp%IofG6 zVIen+j7c7#Dvt^&jkBMAruXs6TnMlMgMWcu3mjk$)S$mTG&-be0BFDe#Qex@q>5G zI?EK&ELU%sZMb}%I@SM}`ySZcaRU6fbs}SK$2@9?^^f_4zZ^osjg%U{)X4pD5%}vD zI?zl|cKT<^p`*R}LO#n;dqE+sE>WJsuEA_37mHp3@5e)>r95NX*GoDx$50$Jp4i zwBr?<_^I{$^%&>O0IfxW!s9fvBDYPS8K>f6L38=NV`)*QDQhX-+iwq28sbZ-3DZLQ z5n)}IS`pSxWV>DC%DsrY36%@~>>Q85xOrfgI>}-wVef;O29u18tP>Xnt0iw|@Tt|5utX^%*B98LGx5{Auymd&_ z=(VQSV0E+=f@CFGlctt&=O>xgz$SixaF&83AMu-Ol z#UwL;YDd!gw5FqJrQV6Tc$PWyJTqG|H_ZpXmd!`Fc=ik<&s1a*807St(f9PT)?t1B z_f2Vc+ti3rFX7+&a%7IoFxgNm^z}dAxBkiU+_N~7TlzEwEnG8C0~OoZ2@>xjvQKx3 zo4VWsaO(!7$w}kY)H;(pmt(-q!M$n8*1bbd6Ui+!zV@VD4*Dwy2)GxwFn4He8-(F2 z_+$rW*BLJD3j7j~cI{F%Epi>hjC|ej0DlA*(vr-JNgpx(52l5fTxFk+mt+7}L#|uZxu} zTO^G;>}y{HaOG!Z4A=+_<#S)j9@yk>ReS(va@DLj(%2+yJ(XzBL87g7K_KCkYtSn7 zUcQ@2&r?I0G|gr~dzE*eY28#eR6q7-VDFDqn!gbY_5P|>3WJ%UsD74v(SfU-HZyF< zL~C@<19%VFaXjB-)G1;*vCbUML+cZ(pI*-pYA4iQi28CZ){3`WmZne1K$yO*2rznH z3>8!*t7b^u6h*CIPUGSBq?p2<^VApaJZJW_C~|8vK#Ukn2UYF8EwXXAME451Q_vG?vMSC?&~5B9n~e->x@2i&BUf)v!1Iwe`si0R3#Hjjka z)z~Sf#roqhc%ZAz7wmVDYl5BxiIk8|o32ZyxtmVqJYoZd?FNfv0;$Qpv|!kT^$>xb zC~LbfC{Q7?>?fq1f`Ou$s#a9Xi@58Oxkm7K%ik`PpHpj4ij4P3^RxBKiQ|rl>Bt}l z#0!B{v^j~CXC$LYnwNiH6xBC;NUwyGAFp-^k8BoyRzkJ3-~6x^>#?H2F?05QyU}QF zsKQ9vOsniWmFV}>nH#?%+u3~ThMZpbmqT$}i_IlFUO;8|Fx#>Db`QF?w)S4pNY1;z zY?s;lC=jTOIP-PBkRzxrzs!!};_h)Czj}sauqMtqW>Rs#PFy|0pZ+bs&Bz(6oK<0mMSol^{gPm#_H2018^M~50j!CK3nSQC z2`wws;Wz+5?pBWQp7eV2KFxpPp-n@S@8pIMOciY8@A4d@VMZ+`W1#sG0N6Y9RB7X zg6qP3>mCZKO2d;I{3qAiNQC8eKzKAn(V}8Mv{U4h(R!2~72)N!RN;4lDL^Wf5^Yw4Z2Q`W^~`NBP~qb@xdswzL;_oX;J3*jRO6t5H0V z8f-&cURoHSk+O}(>s|h0=9j&Pzep(wCf@L&iQpGuoW;FZoG+imv^X1XED(I^A(}d9 ztDH6sSF8M$da^>ydw$uUi1saM1L~5rV+%QcL@y-Pm@eLESfC7~O@mbxS@s@FKPpt| z0|X%}U2q#DqS3=wVfFrI=>8_g=Q8GD7E$xf8ne958^t!a0%@P9*h#8Vrx!Us=`pJzk`gRf=v_ov-|OfG@;~sm<@X z$RUU6wBkoen;Zf%5RX^3d5dOrz_Ei&nB)vOt|^aI-Y=rRQ>?m+U(rI%CfTzmdG{eG zi$#0|=~P|2Q1Xt>UwqF%(7x?2)x;A#kpW`j^~g5;t%d}1^w@X2w94}t$6iZGg>EIr z;UT!mi)7>g8-h_!`xzlftP(OnbZZlHFuF7GBsHQm@Lk zr~RRPd5p$;CusB3ufskn4Eh`6_K!jn&QYvBE+!v(WYU^s+HAQZNPMl%s^c|8kiz3V z<#_LV(xA5LK~u|8y_FF4 zTmQ&cy4g0)hK4&BPx{KdLc{w5#@_vS4}>ra)Yd7dj9OuFm{(-36$_F}V*o3^UDyCA ztuM6^RdX4j%y(SNe;mz2SS~|C%d5_ScEP;Aa`*Yvlc%0oYN3m2Z03=4J&Iy_P7Vwf zLMAK=xuZS);tdP{S_0-A%AL?GZ7tTR#rbr9#8g&>^+1f`cGTPS{f?06)=fbd4q51F z?eoOVdCRO!I5qe7m>|lsB}$wXGI|B9`tRG<-^qbtLAFH~owMbqZUkX%BP(w_UBkKs zSr)0%#9oe#Pd*pHD(}6CZ@E89-y%i*ngS79$821wOYhrC;)9#-Ey6O2*R!4?{Pfwz zUs~#T{+k8Z!7o25yCfGfJ&jf`SWd~fvXt#IB_EVRS*q<3&bY`i0@rQjvovk>o^pIA zjdyk3_M334z8V^rk(UgFHN8tS)3xE7SM$II0u|((KgLJvLuu4O0h|rIcdE(z*~WztrzBXkV6|&d zu<2{l7+*8(Lk0E0{bS@u()398nr!y5oVm}gHQg%r!#2O^25CG^`Nwaz6)TV z{898rAhUCDNIWDyG3A+DF-vFi41_k!_l{#(pI;&de!_rA=h}S!Refkq(lY0Br~{w> zCk8@RRz}K_1uD!Y+$(=^;f0QXb_j&L`uU5#|1(rSM-QqW8s{VjT zul0~me3^qM@QlNfYg4peL}1lQe%5SccXXM(t-KO6LXDOX0LTLZ9V`fYqr6W(1JIy% zjK&AHx_t{|3iucVeBYVwY2!PA!7@#8R=p&k=WtVyLXa2 ziNfCVw(cDUJI~PUJeCegOG}H5#rJJ_i-U8v9LT)C(5y=r#l^)17XFnBj-~$xD&&qX zAU2NrziM$x#?-dhfF2oB!e#JL$tUYL>%x3w+cN9&A)IavUMfsFRkcy}_kCj31Md1@ zes}ZA@cwAa=ujK;3Gaobm4-NSgDI1=t!IFyVNxR65<($&l*F9TXXH59V%OMW+K*}@jp#L!FM0Hi#zx(Mlr*VJ-VfzEOtFYVWIEQ znW14H=MO?ftL<_^Fnlgi8P|YOSOi-HdDoQxIw@x|Q2xk$Z;e_`fB&|`=))o`(RgOY z`(>)qoLaW{Mn-n>u!j2NM~a@AlPrVJcSdT~PDiye?p?}W`&6a__4Sc~w-`H^Pp9yS zkKHo~Yh}YU`wfxxi~Y6Wh05vVOTa zU)+yNc30o?8!K6>e}+KpM*Got!=WIMDTf-Y+p$EvwgCb&2nIqT<+rH?sb~=l=Q{c_88aMzIs< zLsQ@js6(Pmf-ax6=a)y0n{4r1C11RfkG6Om3ZpFQQ_n4~H7LF`FP}fy65J@=<5Z=( zR%?sBd=vK9PS^FiNj4TNF%TR4y>yqPBR3$m58QGk8^?N4Xea&Ol}S`f|D{Y4`+oD( zu2#!{l}TG);|SfOnS*lV06DzIaZ}ML3sJA#@gyUjDM*a;hFGh)s)tIOj?I2A%Yaqr5}_YU&m1=CTK>Gvfy9x#@&o`6G$4XZtkTwnXDL|{Xw6Z zxYNes(3Vdzw02c;wM=U*8}V>+pq_MDs| z`c#yif3c+wd9G)4wBX|9o%)G8mwHATqNzupV-n0gU9o|G6{p-wjf8JUvTzYmg+o0g zCYsv%Qy4XNzU2AjXo+);Z8=nV8y~3vmZ2uY_t+nYKVK;(pudpPQdkjqgwZu4b*Orx zO}I64Ph2++o`6kN9$DmBfl5>4`J`j$(`237swYGo^Y#EiK)%13_R8_#9^+~aMiQ<; zF$(#Ky>os7rvItZ(O@6vC7@llk?JBS-%}Zme^M21HK1$U%OEx@HB`Gxrp~NpCCCJ1 z9jk~3(%xx#OR}8R&3QJ))OR5)upgYYvkG7&snH%2a8q+CXDOURT%00CIBZut|@D$o@ig z^#h|ItwO>T^baxY4@qljX^D+}L8SWz9X$XtHtFE31kOGG{SAT06^62tRmJ&#qL8;L zE}XquU5Ighd6Tmios6e-KX7tGV+kX8Nq%0Tq|n6W=-|(P7onA`#0gEIodK2bxkyK7 zGZ*r)=YD+G?>VWfJUc&Tt967~xPg#Ak!zpJ^nhi?i-q&CxQ@TWA{mPJ$ z94!CcV529*$AX4#80bRzPFwd&fg-&)Hih4x>9LWktPQkJ0&=ZC?4AUwD=Md$PI1^( zYg38eYb`qcSoV%@#);=L3aig6iTu_w-UG;c@66nEbwwF>Gjxli;|Tx`HD& zB~n-fB`q@2pHd4YG{_Q>?o#6q)2ilWsu9RxUX1wuDY@LAlXRVim76-4%A~aFh$U)o zR1Ba zGHVgbZlgu(c$9tp@xyJTP7(omE1W0ynf;q{82*{tvz_5@B2k3Y+ocN*b30CR*9tQv z;R=+X1V|$J<4kn3 zcfO2r4pj(;e2atcy@tHEbbcbT@GQ+m;dUoE9hqm)V7K-7o@-FlKnl>Dc^m+mv8^n? z;_Tvk2z-Fp+GNv5Jn|m%86{HxMS*>Yqu(7)e`YAh9xLSC_W9n3#aTAm&UB z>zZ(s#C9u|9KG|#&l4*6y)pHRY0YP#To8PamzjD$tTm`8Zd0hz@_XkOoK`3DtrUb~ zkwbaks^nz^{1OF4ob@7|?57s#Ny38krJ9~+)h)rC?8^suvPzr>C-@+(&x53$WXx!a zKUU^fNK(s?ob;yJKaC9}t5&4@*8fB`PEqL#6>-ewGy-geIOhE)Rp`eBAp!rZXLm)G zccDJS$6|@`dKMR6LL~RT6JLz~=9uCxP!Aubz@NrCE-B%MHV$s2_{c&YS`Qf#uk{~Y zZluVqhZ@lEl4jBnh#%jG{KB?d4WI*b67Il<)O>R+1xymzf2m3m07(Oac;V8^(hYa7 zEJ5+)cMHFpVnCm*$2c}jl1)`qhtvCTwcYouPFJJq$LO(lF}-S;1Or@5Uv>d zJN7Q<_j2E}5xPU6qrLT}#HQt5vi_UaMLoxl; z@D@1SCdb@UiuY!+Ed!gQQmER)L0wa3Kl)zCO$0A*P>lhebH;$@Ld41cI5|7qN{t$$ z^d-vQvBCxWM+TWj+YF5&v6VpBylwJu{Dv0s=|COQ9VcNUCU3S zjeWj&n@C)gGMLUMFA$fFTI$Qn6x!N^Y0%=1h1#oVRnYhLdi@;nhG0%KDJ}!|E8o8B zK=HQG=^2qhL6I4PbO#jHd z)5RDnXND#6K4Wm0LaF`olYi7Du8;qOaiU0vQP%>$9*(c5gzCbV7ds)}E`EFqCHm}~ zkVrun=_O^Y4Idc( z5n{}u_%n}w_xqn zmP|prt?FQO1ls=rpSNf2)33KG_u9qwEPqa;kRh#yy7Q8Rey!48yC5lrI;vQnZcI)3 z!#{7H9S@M1{Kfu9R{)%FJxNVPmYALkpA<~|N0TD{GURdoBLh3 zk5Yt7GV;C}l2#c!>u+hg@+vEdHN@ewW>Z-bE#yCSLodL9TI0Wt zr=b6o9ew|A+K`X`sapE_?my*7|NCF=&yk@ZFav@lAT8+Z?Zf5HBkzp9t|i)`;EQ^4 zJVLS6WygPGDELDkXqt2QwT4XiJ8&0J<}KZys|^yMer0W!0Q5#ReP%{z5C8nH70QBgg!rrEx{~7=U+%#KNz&^fuo=vF2 z;qd3a?^#*xYUa*QPjm9FCRBC9zzdW~I%mH&v$iYZN2U{o^4+~Ol6103f*T*9bOtPJ zG`bIY{?T>fR~DUBtScq`mjG{A18OvFyptudF2N+E?c%kgEHg0cFKNihviR)-Ao2Na zIaRcEb_H7P0*A-O=1lDrYu7uYcAgENcvzg2_a%%U8uy0XbOfI4L>(Fnt*J?#yC<0b zB|KgacRN|PHV--KZ{E{ra6KyWAsUc>g3|d_A*I>%Xc;~jcF>Za*Hq%?osyl2@b2X9 z#x1>!uWn9k%=(j7>#%D02qg$JWpvrL3gfSv zZ`FHD^!3U7)2~FYf#ej>D<*JrEqkXZrZU7TM$qZnAZXhWeir1VZQV8_pU}vj&akiV z=(rZ`H0kta<5^n!jdD<4a-G+d-;t<3$CsaPP?nL`647L+6jW3pf1aFg9@191*jHOt zRai-p{hZk6OhQ<43!V|-ax>8s&BhrAsjK2%jL7DtA?qTgSNajuN-k|s{x?Ih8`}r# zzmHJl6OgKWO~jr_1nW0AvxYd%VvZ*&c#K?-;w65?`W?eidnI|vz|;_%|7w;bihseShCg!f<#WY& z%KFVSv0oqi*eBNWKKs$JNUF3s)w?E-ryijgN(xr#&s3R=#P%ih4n!AHs((h`!5ip5bYbdF~$d zw+MU>vfBW@P=9ZG4xD^$yn6=SL*BcXaql@!_A-#~dHB6TWdAFaX@+N=u?R~BHNq>6!~ zPoZ#|?~IOS>n5Dnbd9|A_(?!(GIk0I!A5y249|E81}i$Y7CRUG(jpkcNM|I}lJ`Zbya9Dq=TDj!xZc;5C zX6xM7l%o2kv+bHy{R8*bEEz1W4mE_finHQ#j6re<{8v>_O$@E-P7PxiJ}EiC#G@b+ zWJ4SC8jfL#NB(cv$ZQky;SrvANhvoiM4pH9+XBs&vknM3LSnFe#~x1DNeUmaI|$?z zFk+@r>i%v2hPKNM1WG#k$+7Yd=Xnz8Mm8z*pv@rwMq^4G(zNa@y7vgzktEt{v;VPNfR+u6N)-l?`Ryg1wLcUmFK+NJlEtsIpSq$ON%1<~x6#QgyW2!|hJy zRb_dE>n9LpTBtSSGMk2Gvw!XAai>$gITlFoVk(%4=4dwrU$@<(t!8u=F6R!jC>~hQ zQ|0U|Ko)c`Z$3u)Z`?;scsb5p`?!@|%&4UwdK9dkSp-po{idq#E_+p9TdR%*=tvP< zNIcocK1*DwzAZ{mwv>mw*_R_m8%vv-^4jRAQ1``N%C929u^CZExC-t<)e`O^CbCv= z&iLurL$PDink9$G=)4_OpwR1#TIQ-U9d2Am13hf>OxPv>cP-sCe zuJ_w(9(vab-eNPS{x&WFD<*!+`_#0njBB3({DK=RiUa9)HWpHQ9v=C78x3GEVc0kR zBR9FI)dMpX&dz=k53XNVdY4KrUHF^_ZN3H7T-E9H$iIbRxhuJ!p1Fuy$Dl{;Dalnc9tCN+GvhJqRWtk!nv@64!3y3C4>n1uoFJIa z%)8(G`C)~k$h7D*GT0h(nyS_zj6u$(vqI6$%3ap05Yekgt6eTH9&QPAd|i|b2ww*) zJWmiCB!S#-Y;XAnC-x;(WtFiHoFo|d6v*zno9cOXH)xr85!d%wY3WYB&;D9CbR^(} z)#FaJEH5`nJXjUlo|0G4ex$_i=qZ9bbipg9 z_dR&MvbgI-N~?|p-W^}4xfp~aB6}-cSNpcxLQ$-LN2)yeRieKoS|3-l-K_lRYQf!b z5`jhBPC>r&b;oZ_!tPKp2-2!0TKRmJFtce;=d^&5PZDTpq~y)?EADw_qb?I3Zv!Hg zxUe$Upqp{o0=u*QQWqPKEVNXMS6#=Gt<%15Ke|GlH5xTXLaM47#xP%F_i>f1t3Q#k z_H2f8(&?bd)n0VBo-z#+mYPTxSAFMwCH{Q*sD9y=2~fk7c99b8d_!S1%ig{wxx8pV z;O}VPN@AB?hT*$ErNUcWR{Uwm$!7?UHLIDd*wr{UMV;W%Vj!5ad-@U+_ew zhAPPHtN)B8R=F4jf{3QIY)?g3JfE3XS@Wdgeoy7)B&uKMrSr~ShSFXRr-MzSIgU&) zrF=$x)tR$`eGtve|z_CQJ7^z4v8}$DcmB(?}n4DQV7$nc(3t5;{I! zzNkzoNdk=+7s7JPCtnLv0WjJ-6iLWOC3SBzTJth`Y9hF$3>D~zdoILXOu=3SqD9Td z*vB@ZRFgm)A{&^wAcGlWJ%_9@b{-M$^KW&%gYhLS%dy|W*w zon7`Vid0_XbueTgDaAke4^XCgxc#I&=An16^IxekfZF5rb4uQH87>VfS@Gv>NAJ`A zZVmSa*)udL9w=A97#IKmZDAEfw8!#B6c;346SDH1tRXRt+WRd^n{*1rhmdx zESJQU(?vV8jk#_u;q}GSwxmgJL0dWa&p84gR#r)yH=}E65J+q52s5-=M)DKiT-=eo zYyJ9&g%QczR^5&!^H0*Jqhqx3@s*9~uTDMpbAc7cmF{-^%d%LTf;n%qL~Nq!Gd_RNwB+ZXzS--*ows2UiZ3lw$% zpSS7Pq0EEt4>eXJEtHJ<3q3eRwoYPHRgt!w_JhGw^-y8H_lUX^VQ09v)iMoU?t%mm zk1l$r%MGb>y63}JgsQFYhjF^x+50cujuyu9CVtWhkc|bv&P%^EZWyLxpDlfK%JOW} zSLRqBg@=i~PZcq8ktt-a=aCuH{9aJLYKoREWXICvz*G(EmvYO}#XrBT;3(yf3QU$| zmBF;TpIpOZ?f1yi^*Zd2G<94)PrhGH`_z8fU@=z)-{M}4TE*9tZD+?^`;-Z%|23uB z^FXRY(IvCd~xcz;)7UACJ+J#NKxC00edD(N(Uwz|rK;3(u+k(KM3McY_V<;Bu;Q3#{!8Q9r^>UNh3UlGxEx9gt z2GW$4g*GV_C&T$dCicJ*@w}Sh#^Jr(=L5W@mrUTfQ1qL(de*L|< zvkAs;?V9SXu8Z3}!~h;RqJFpgDTuY%sbJGBWv4(BGMem>bss1gL)DekD;6pzJ$n(_ z<$kHXMzo_GTCgVnu7~T0oy7;` zACJ0MKi>Z_xV{J63D8N^z(~xg$j|Px12XNTDy?GD{F16bf%^5}XX(zmB7VytP#c5c zz2J8CmKcPuCs~D7*0u18)C}UBpO9>!W?9e&cGta-wrlC=nBlnT&NUSZVosFK;s@+D41#@aL5} zuX4R$ANMq1L@Yy!mDIwNHQSC6Zefz`GxPN(8#rruauCNcw7PHNY;Ys*=w=ducaJZR zssUCt<^E=4;cBwF)1Ak4(aED(snL6+xxuc-(br|E;y8(EO_y*YQyt`Y&seox9^jI- z7WaWWeV;xct=q8an=|2PYK1>cf3iPkg~98PXD0ym{%)o8o$kpX+F4#kW93L%gb6|X zfs*mr1~@Q4CxxVI_Cq%dU?oYZ$-;9?X_6i$MX-g9%K_@-d~k$`z)6AR&>TiOQ|tw> zvRp>!5`x8}?q1p;pE- z@AxdSq2^x%NI@f8X}a*kRYfq~e6n*`Tv~+(1VTC@W<2%WSANyu=!Q&;LW$6;)VYnc zdb8ZQI8<=RlH<&^5?Ej6CrpYS>seKf@6T#72c&KdaDa{~>cylxbG9%d?^i&e+NJ5H zvi8!Po3W(z#gtz|hF)G`YrJ8#V#?5L2vBtxbo7|@1DOiZF^b# z>GOGStjkVDp|G=6BL_52)m2NnmQz1shF(|eEeO84xl)ip9Slx>O&SV&zrRvC99wM- z4CqZjG5)eGfx4%|x?0F~lJrfVV3HrJMsc1g8zx}Pp;du%H*s!KiF|3@yQ9x-@Hlpd$$MX*%n+FLpuusNu9EH+*dOtZ|6SBNp}C%%+@sa-ozVqK3AEG z{BcR1;9INP;wYiI|LEQY6>3Dn6nTVt|BS!RzR%P8XyYnuG-~a7oDWIH zCkgA{20feteSdaOHlOh*hq*n=Pif>&PxvzdgE=k`TQq*qtw&7U?Dulh&3lU?JUVE7 z`>}}z5AyD6>D|+e7mH4KL&iNiek0RA#0aDy^MKG3*UMk%@Rv`!l{!Vpuh~$hgz~IF z*QB*t%WdX>e#Wa3s;+6EV{ARb$I_!wV`K_M8xnF_-Z?hLZB_hR@wb%FQbE%JZg~ zrpihuc%2iwNq5L%E)Io*Kk49Xk!SvN%nwl9# z@NpLwrO#T^@omHCnz{RtyKJMbUHi&xit0^!4|1h3u>>B^4HCSvk;V_xdV6Gpao~dwnnX4R-*%V!9cEj6LknHEjvkqA>QfoB7$ zFEhH<8qdvG829N34!FHrgNYd{=31JNMi#G}9c&!6nVoLdDd)swJ~+@`CxF+I!FH-*N|hVdui3~py)kz3Q?s3= z55JxVp%8n8bt|E$TbTc*FH|hDPWvpcyERyhxgAhYUMo!| zlRH?r%%VZh*SeY41Klhx$hF${Sg_N&&^ROJ~=6yx7^->jmuR> zg|~~W?$G-}H@E1bRKyuGb>tfFw@_o%g~{ylP>eZ9^hdLGbdvw^VKC|j=JInaLoYtrGW)jDiW z(|0cn>sSFA*p78}R-uh^$;XjY@|2K)+6o@Yve@6E*mP;O0+Ry1?HKbKr}10|9OPJOox_1yDspNiNi_?!Kin+FWs8Y8?6s=ODU>mZiB;1oZ9!&4LQp~-h8Dj3v*(T zk^4NsWrA!pE1?niU5tG7qqnW#w>On~`A(F-u;9G1|TDUH*-Qr z`vI96{g!-}V$b%K+IQeAUioq|2?YT>F-TDP8}Kr3tgfrp1T$Q*(gHTnnnNAJ18Fad zTo1rE9IUgb-YnC>fad@kcs`6FDEYC#2X1w00}X?b>Afx@_$5_@xT*JbOfzO7*9~Fx zluqdoBcb9*-M8ZN9R+)5h@;n(b6o=S1<+`gTh+!td0io&U3$!4njOEcF`%9b>gKV9 z%Fp0ll(a+|9TAb9x1B2LcjJ9OS*UrP*?oU^aDT_`bHeR&Zt8O`cYi83PPVdtNX(GS zLtWRgrYy__5nyF@_?e2hx_l|&Av-7yI^vb(gE&gzW(KeKReQ{X**tPq3ScX&&=dYk zoQ?L1qCCf(^e&-oe+(iBM|A&BVpDzW4!10nAh1Kr4($?|QRnXCz9x}+Bvy7kPcYMK ze9nJ@V_;XF;V)F|r0n^sU69TlWTgQ2;+yPmv6JN`jsX&a=dhRI5ek)@(ZjxrRs(`g z>8BP)TlbdOpvzLXjK3Fzn7x%USAEzH>pL&OuOkw|a=VGU#JXcZA*7=K8sXsn#i$KAPp|KvJ<$@~NG3 zC)8e6u|bv91E)azWa5LI=@C`nZ+dVVhmsX^%0I)XF^WKb(WiD~5}el8D^0eSf`%V` zJ{v%;<5uN*)-W8tz?%fl%2s?{zgZ+X$bj^Z~~JY=3B*+WTm`=JaqK+ zQ(?q>j-Mc{imQkl*ZaHM2x>Xf75U|*#fJ=}Q1vEbCMy*dt1$zo8nS*z*m+|$0V1ex zi5XW5cF@_?M(gD97;XBBiGlDC(sc3p$_OD?8{X0FJls%LN6#1z?=F;_!= ztga?ZK1ss-942?)#Tb_+8KOq35=$~_a?o#0QtdRBe)3SKqWX2)@NGds#E4Mv&B8tV zzk70ezW$rINgD~!&(}5LkRr|ILJ$(rr z^3IJ2(s1bk-))P3-X(bHgwNT!+(QiNW@#w!$X@Ha!T6ssBewKVYV{>5dFZhNw z=431PmSj4t%L}oBCwf8IEsMN-4QAWuQ3o@sDuF;9ZvD8oA_xccIbP5fmxOrtHf_BW zq}uiUKo?6@Vsnmj;9yx^^-%WIom4&S{VnQ^Dy3`8Ei-M4zioPPx+ZOZ;(GXvEy#=4gbzH?2#nU zT@`3&vWB)x3-?OS=%2u>y7C5@ktv~7& zb`1D*Wi=2@CPSQZh<1LV_t4*QKH{c{K43Y?k}Cnsgy#lF@8V_6$QbZ%2v~LEC*CN! zxG8mB6FR^x?GJK#_2f;b<${V8GT?5FQF9q8!jny#C-l>Nb$AnKQpzvn;%U!I zO>aeKfTXPl8>l6M8ua++y;4(0(>b{B#Ycf$fhSPJ0GAD0C1a;I34eG<6Bf@^?5n}^ zHkFpvlO@kuL0h!S>kyVjR)ETM%Q?rBTnnd#_95djC^x=i*;U zja)O$i}CK+Q*JKJ_<%j4s^;l0LLZ=(6Y#^ikj;(_Y>@mQ4{_7xhGQq*XiZSywTQmH zzJWp7garw=&Ah{qV70@BZ2E|rva*)T6fQ{v1=8;O=ox)(+@$z$zl@0pr z8Ex=-K_+=YrKjCDby>doY$177x?I_LZ$9W zaUN|`%a}qqwzh_Xtu9MamzL?9Mx9n!Z=ZVDLg`WVHJ_Femj4;K`%hQ z7@cc^Ni?P&%LpSa@nfE_Ch2tT1Le#ZWC%C3rl@AVC_lYkl~8oV!9JN zKRHK$YkgeovCW5B?#I4$ptrJHxR1uP$yB}&P8**%z8GjS4eh}OO7eD<#@r5lHbFJh zs*r~WoDptp-1G({NlGTM<|qdjN>S#}XD6c`9BPV^cOJ7ikc>|L@CU&|`0a{VwDsC8 zbet0@a39%uv^fmI<)lMVtI@A8MukoVV@i# zv?&-F4UT(12^HsELF$sI6ATv^0{y~~tLNcVAg}dk?oo+Ci{XP@uWAH++I_0=?`k8f zi2gV!r;wE*B$6k3_r;lggIax|I7nu88>eyVr!+Gow>q+JXQ8r)Clar}tzlr!nICeh zJ`)YPV@MiY#|24BUEg(Ap^8V?IOml97*alpRt6IDz(IZClRFO?sn2-ZB8Jl@)_8H%?#2hJNk^oiXraZKGqm8L%z@OY*W&Ag z4`oiaLaith_)@`wrFN+>^K|3KhJpJpdzd4P13??)gfLa;v+XR2i0|r#tv3Wdj zp0$#vkH?Q@NyKkSvts?E*m}TDFeQu6Mq-_8thW_IErpn!`7kz&`HohgN<+@2Cgx*?k z38`Uh#}*b+uV!31XnNHG9`RTPXk%t1{Pd-;HkbbCIdbtGu*L|ysJj&kJ2Yb$S0A^m zPQrF`UJCTZrl|0Vy*Du~F+ZQDT#tKF?C;lQtO=AGVK57Nt+(lOV-a(+ccfgHF2A#h_;`8xMv4)BJYVCl!T%h!4jCn4jg_7w;7J7%&C5>X>K)t5XmlUZ9Hjl+q9)oRfU*>Ra~^06F7RD){PT)ezosxef+50!LTx-DGH(EV zfPNmIM8swOuCd$YnslM=)M>iBWtCHaDXGL<5%6fwf=ZqbdaZ!`}2| z>=Jytsqv}d7rq|pd?>Uxy*X1cbk;Jre0KwU9Z45zw!#o=`uEP-wZ>D`=W`5hp8dCe z=UhxcwLu~uok;WnV4JUIswc6YH4Tbb+lJ?p=%@|!xrV4LduTbXF_@*>E%0nx3~~_EW0;cz>M%1R7zaxz$6i-c)Z3%2eXW zVDebe-(MRzG+!_R@XXRpL-K+@ES6`mm7DeIftKOuOpK5C1;3<}5XnvhUp*76U+5vY ztfgUztSYab4ey$QWTl>z`wqmFPXWt7eX>4=Q(cI$_j!7-i-DfA&kD9oe>@yE>=Lk^ zG=5mO@uM)hT~CXTvLV=^_+ zqF)h#P#i9>+HH+e`nLRzbFw%O>sZv0$?&`*GEzLsXxNdQ_a7lf)}&)`V7hnqT$p8_JDBz^8nwD6xdF zTu`3a!2=b_784n{q^eGA1F+kvSo@Q9kF2tizuU+D=QC+_y@_998rJt-OC{DJ@)Z&E z0aMgKHxH#Io=!^oh1~FtojpXVu1tP{P>aV5J!pZ-1}H;LebA(loihzsy6pc3{T#19 zI3%?Zz+_vzeK`_pz$6E#`D=F!TZR+)@rrntImMEAK5d%muH%yM$BrG;F6t|smc{{u z9ihNi!c!i4#0slkMf>GQJ3kik2f|@Q;?#GL_DN8tD_sz(?gqfAy$z#I@jONkIlepU zz|##{FHYm;CH+G~F!C7M9V<>;s{o*AY;MP^e+THvKZSX?yDKRhYt)RGcIWZcLP!Zt zcLshdJK0N?yn27N9a>$xik1()DyT;74*gayk$?TXx~pRvK3?O@-CO)>o;>oZwYjYB zMq?$^Mf3HTlUK^2_)3bqb&B85Rzhu!{p5ktV?)pg6OEeS(AIFHSz;c$P>jKF0BrDL zKH?knw7aiJr%SUhKu&}EMqowFTaT*+fS9VjnS4Y?KVhHyAae+$!Ic3zm4%RxgpBko zAj3$*V7>}SrNUr6__y<4{UqaEG5#zIkUrUGL&Vik+cE`Qe+)Ms{oPT2RN%`GHd%nq zI|2XyE>!sLLRHr*lO|w6c(=2XFxcc6Xu<`YOd^;SWhk=b_AO$krL zaA0k9C^fP|0vwWWC-Q!k|J|WeYWh*os993O^lhenB{<1 z61fnx3eM4V0YP3qp_~)O88KaB$VgxYUWUc$-!yLxG*S4swyPEd!g19PSLS7JOTHe$ znw#>=A{@@bzBROa6)_9&&-`E2f43dYxxV{1A-vecYAUa@{#5ytR=wCLK1*B(Ilnzn zEN7d`x8kt1E@u9m4(RBH@)h*&@dtmsM4SKUoqT_kJVwBN!flFJd-TBQVkG`3{ZFWR zQRn0TMn1WutHb!;EWpF<{(l#Z=I|~6AlP(K`N-0LMkIW_Mx?wcNn}SyF@%Lup`h$r zKKIox@cZY(B7KWokzfHX`KyP_5K15K3JS}w3o{@I=t2-&@Ngsl$MOFvrv1O4RsOfx zKD^uiTL|6kMh%$OvHw!n>ujRZatcT%+H#MZaR3P+@0+8pgZ`R--!PPYIv}y}ySV8p zufBdxj|D()(Ou?}lS!48o3FO%6;`i*{TIo+69zmb#e#CNG|9PNV=)}gI$<>Kp%V*Ag^^BRX z#fA7#{>C2D?HR=8Vu9B5&dVAV94nYivtX`Kfd;WSFduCk=8cIV20mw&uDACg%o^n} zs_yH!UTP7B<3YBz|Dv`MCQ0%WID=HtS1OxpYchK9uToJ^$k!D$gtlClJ1XMl1z(~3 z_07)SpQ@&Cy8+aOJqu$LGq=z=4-1AT+6NEV^X0YD-e3ARd;i`~$`+1+w3M9B!H7&Q z`Lr<*6apFXTM5qZkcI(7+?+dq8|DHF-@o$Zvw+`6j_)vxr|Sv2&Bs>;SZUA6VoC(r ztMqR`p|$-08Ok7x{z+Pz_#^7>$daPf!K%%amHA9G>4~~uW!m`#R8Th$&e!%vaW)_Y z+gR`#Z98v2>%=c$p#sAre@3iJh$UqAyWm?%YlQCBh5exu05_|eg(^?uj0|XMSMYRd z4!LAGPj!*9ss-4OiTHRt?7=bpEE^k{J04`{7B-XXF*1#z4W`>Jd$~?JN=hR{8%;dz z3ulWdn9GWU=c?l~Nj4q)AEAl$6sEV^{n@`RBEQHft0b$e{gV?M|75^$5ns(nf5TH) zkvflgX`?LEt$SY7)v#i8X^>P=@4bW5c4FRktq@z8X12A|x`K0gfFBBA-s#2CNtE2# zWjz|DZB-d`5zTBU_^fBszl`VN#SEFCblh?QhEJNOoE%j$oQKw!cf8EoAR^dv7_QyOAM7X3#yL9EGlI!obk& z@ePU+G`@Hsy_j&6oXfyq#zhw5R=$FgT|Gh_N`Cp{X`15&QB!nKbL_ho`&G?bRkJhW ziYpNy+3-^$gXF&x(F?fO#+YgOiKr9gY(*p9+N*#a_#W_@!K5qF``jhj7+gxyt{zx1 zMUE5Gp#6jQv18om(1>q3lqLDyK9G4g;LC06bL;^pYt}6*N339}6Rx-|@LJyOL@}kn z#It=`->G5`nN}SSS&6Y>x1XxLlr+_+}kY03iR25=7ekM1=Rzt_hFUKpq$ zYuGXW%GC0$kI||_jpGf3eEp=VyY$PwfDF1rpvsODpRdb+kRS0$R)1&{#}?vV_Gh7X zKYu{$-DVL_=_cuS^(2jYc_a5jb#nU^uAh@INo%rIx)ekSPq_eKhJ597R z+V|d}d%-t*DS7%H`S7OWA1j4?&PiOPaeQf_wg@gYH7j zX&YcH2T2+VbzggVQSjgYi<7=i;r*1oeVIPUBY6B|@*sCWTi%Yz_HicCYs-$5(Z$<} z`RZ>xJH5q}Q07dXrKU{zHlAYty10(1+kQL{qohp`yum7>DO$m?l$|X*R}b7k^W<{Q za-Z`~pfiZCG`DTeEk++9+DNrq}QkO-`Kj(9jw|JrTqR7 z`Qh+VR`-I>wrLu`;(Z3Nns~f_->`Z4 z&tlp|iQzGY#bq5|Lfd)#kS@pcVYSmO@tSjAtmB-di=Ca5>mF4b!* zIVZe#zX#MDY?(ZiIJhZ@IHike1gCkLI7oAE8hD~@Go-UQ&LiKbM^VSL?=m0O_mUM? z=K^)G5Mo~#gGQ3-T1gc@9eUlsB}hN&Kfvk4=h@bP)+QJskpd`HI^N5zsne^TCsmpG zCR_`_lbfd)uTGbH;p%ecVxGOF;q%t$Q_1#oX-IYt=uF6gVyia5l_@Hl81K#KCJHIL zBPScmGn^4$_Z$RKT_*CM+;jYerE%x%W6;%=T&j!IEoDe?ijhHkE(##Yl@3QpRG zl)t4sjlR}pf6gczxRdlU==ZF`H3DIA&07qEi5vZq^$h4DAHDZffpFB7Nb!?j0ZZ1| zt{yBd28dnH&H59bJie`? zbQ8EdB6%3ag(RxH97dHDOJ`?XXh6DkEu%e|e~nChs_p%bAE@u9N7b5Yc_q^g7Bc+C7VSx>%7E)Zwjyq?0dE41L zUUhhZ-YP~WIvj64@N;fIe-1jT?{%403aj8oJ{MK_?-+H{n0E8^mncz4zojl2$KA+w ztL_GCAq-}6T(LPv4fzjbkQ$;xHqrlS&>5=2_;;MwuY zUqmmmin*`IPIZdc0U;e&s_bDc8Kr4L_-603r_)&A2hAR_ z>3iu-M!XFR-$wRtVSGLXt=_T~>;uo{>{kzt>7H*-;lQGs*{LZfdmM*hLhrws{jaI( zfaI&{^gcelpO&q#=dnQYgH;p4x14y(!Z2s^u(gH*1!TGF1)C^6FI%%jXf;Ci^F)XS z`^IE~%E-7HrWmkxL#ZjdV54&Py$e(?H6{4W9a+|bCyR?TC~_CZ$G@yMc6W zw}s(Y8H1wC&ugQIoq>wTySbbP1xIu4W-ul7WLMGP)BVS5pS&F(m7bk-q$+wT0!bXo zlnK5YzLVL3=wbf(v%uw9c3NJ3htX#CLYMr=s040|>|`}wSA<>BL1ytyrwPB%VlPlq z)GYYQdq;I>K9esaL6?Y%QLoGN;>O8C*hTxYJhG+v_-lPXK;3HBpQ8$2wCuy{0qXW| zH?4Dm6a;zvN@~?kWqld5%dP{l$`ngfr+P4F?xv}uZO*z?nMO>k2W1=x02X{qbtyan zD+f-`G^Wt_?YlDTYtrg|rdcyy`5Ko&SWs=6D0g3x8Xcgtyj!w$zZeO|0WH8+l@@sm z?Jkoe0<|jVxUie7CI&c*)v647mQ92B%8cIZN?-nJ%QNfGtS28b7ya42AFpBRY!{zZ z{Z!qwXNXYNe?`x8L(2vf7jrD#9KU{$o#_wH)jDSxW5uzMt#sP(?ciy!nm~#Zw zG?IqW(S}j)Z;yoUF&cEk!wnsi@qd!Nz<=L%oEPCkaKl$WTEgh!QZ5(dc75J(n)DJ2 z0;t83$_-Ma+9S)liR&aq&H%U*e+)P7dTQ#rA&)zRxl7My%Pd-uG4r$VMQZiWI)nPwG|Ei|D$K{cuf|eB z&eRU|QlNgx>}=HyLseKd%?-V zU#@rlwyk+I6$UfUD!s?*S^{fV^s4b6?g(tHF{^ zuS6uv4mHU4+ff06g2w zV)FUHeN6@eH|$rr;0!xv=9$U`%f3zzv>n<+t)5ac;eCsYspQ1nViYPO*!ooDvf%9~ z(oooUKkal~>YqNpaf9x*TiR8m(@5xW2}4Q(`!xneaeB*pu=&sc!A{t`zEI{R-dPpZ z9JMKs?1j%443HJ{BmyDw=6GbHi=2tJqtbp+4!pLrP7#vN?zu4mM?G2Q<8KwsEO)!^ zbXRU~ur8$ z@93VCr&DUJZj(@5y1pmvs}kvpbEX55$5y7mf3K_9jOo@p?U70MTh!7Cd=JR*u6Xw8 zbnCK>HQg6f(z|Yn>Q6ERlC*!58dhtJop|k`oC<4M=h9UimP z@e_a%*8~`GH4IdY2AhMJyea0Z7;dIGn?t5Vm8P-G8>#d<4tlV;S*dc0asxZ#&{LuN z`eK>@a44Ev{ujSdD)29L`9lBie$phWMX+|C`@st8H((o=`s{mg@08-|&&)x`Ep>a0 zX}anfEUJ;wHM-AH_Bp))S)%NYvT}-eb_(H&qiYQiPgu3ISJxNxr`(JJLxE1^VD)mk z;cxn$*3J`X4aZ!g8!g)Mt-ltdnk0`fiW}#-75}9z^0Nvw;{d3wk*&l01mGjI&I%yC zU_&LAIbvPNEvJdOffTPL(XK_cp%i9KBU|4=m}j>^xXVawuiGi43|3Bw2%G`^6QGT2 zmLxgPZbshkuIvY>Qd4dD*~m9F_aJ*V?tEOWm%YNkK0BHV+y5M|bb0KS+o4`Nnz}x> zXWi%jnAmIRSP?QF!m*AMc#uuR_oVW%euF9`Bh_do?$C0tGchmNE41P{JcgRsMtim| z-$BJVbAhMywhbeDZKEUJP2nMVF>Gp$a4E=9bmAs160(SiVebhAbxhqLxDx09{4D{m zDrsg(PhJgc8bfzk3waRTp^I`KyRnE2swW(TaQ_fu`-^gHb+7(t=_EE zP?ZG(sIQ=S>^e}uR9-sYDR;)ne#2GFZdn9J9`M^3FPB}jy#%b-j#6_>dt4zhLrGQgl+DUj>3)WvzIwa#0Mr z(3qKL%FrxJvD4QKwEWsd?B|_*>gr?HDh^zUhd_$IIOvi#uIg^O^lY@jSZB$Ob#3wo zr_&eUiokU}BVFo}a)e?6cmne3U4PnAjIr&c+Fo|mIXX-W!O48E(<`nF_I?T4jF|4} zkZ}gSK$%yKbPk2pAdA%St-6aR1g&)xYgl(?nnGKbyhI-R@@c!2vjTvyZW+HUu-g*D zIQM{EOsT%Gnvhc8GVjyDS||aQC6`#WO7s_n1Qw&xgJC9@wdkLj-A?n}MVBz5!Oa2KkV6H}r@0$uVt~{d>2sl>Ftkhl1m%(YfBKauUM30O;X%Ih zHEwehjOozD+D)o?7>NsgsTLQs)WaA_Zka3U1*tH$r=V-{;f+@?lq=~we-Cmo5)a#-#?x{UOw1Z3FW1# zMXrZS+Su%$+`2bTM2QW#ZDC@yh3MQz{YLJ*zEl`;ohs*2Ojo=s;ucA+ZZZg^n^g3N zA5_FjLvsRDXwCAZ!;%%ll26o-q{)h{GvVRl$@oqq&dNDRvWRtB2-jV^`HFwIJy*k- z(K(X_-Fxsh1{++`tekC`_)2W7Re@++N zK9k#IevJQZlP9^kwzoGzt9(JNBz7qTGmOK;yrrijpn)t3cfCZ}*o>TD+UP$&0LPugThRL<&4reGY zozwc=M>=24s!l~2qgTw_FU)6E^Se*Jv18G;w9X4Z2Nh+gIhS?!`}8U|ewz27%}&GM z>zDx?BF6Q?vrZ?3;?ZH~Zxr%vHYCmhi~+%FwZC^ESr|70^q0UlPR{D$ZbJ5kwBH>c zU;9uVJC=r|RE!I*9AL4tL(;9bnGf)9kYDS?*ySO6A*##W@TBXbf1b(pldr?4E;);V zpxrtd4s!dhYT7j_bfneXRN{XV}&5djr=xFooR=L*l` zvVEWeD_Hd_6I5$j;aNcnY#chvwGW1JT$E?-5>4xjX|)?`#yyIyDs@b`@r%(JsS_FJ zwfaUpy>RkKm*U)+03XC}*Ic_^> zL2djPG-a~}8|lX=_m*DOc;i-2n3$&2RF`IvACOe?>$I&RrTQ%`F14RWO>ExmA(Le; zCz(*ASnbt}Q0HHVo&Gp>pqSgUaDRscn&tkXE#nt9Q9pm^-2!xKN$C`7mFiq8xR%Tv z5DO@bnoXUgRhY0q8ynTTpCGWQob>X zF481aJGwY_Bv#^GGczp{FrdtPk}_KK7)6@c*-3fKB4rM2n%hrr<~S=%SD>j;?8H6r z3i;wCOW8MvDN;;9hVu%Eka5a~u>l)In{_g$nJ#?#_S|YA3n{qprey;-}9+etJ?*>@QSJ=!@cqZPlldT6{hh9!(dkh*IXNMIAQ~wbaL^0lM9gV0*U`seLm{kgpFMxJy_tiu+S0z+i{&Oj)PgNKKj z(d~25M&^C9LiXVGT&+gPeeroC_v^$gb?FtWIS%K}O=z?vf#vk`l?nD}n?h$?kbktv zYfw3u(+!-`G`ICGt=3RzC~Zb#u8(!a!D$H?^)w>Y z?*d?K%`OXOq&X>D7F(|PG59#syLVBnl_gZ)9SC{lWi^q%?&qqx>%Wo zwU1bxeJ(+&cw)Grr85@^N8ybJ(sx__fQh-F9b9F0%aA1B)Y!u#H)Di8dTr?fWlFr5 zVV%@IYumbvmqeC%2sypv{MQ4^+9Mk(&0_{^+GtHi_oMGX_Wf*L&**Ea$7j?G8t~Hx zr#vv9iwhla{=AkyDvzM_vsxZEf)8>csM3OnjkOm=&E_;+4n zOW*0Y?%b|HX<)=5`}*uhwO7~LLa7I_pJIPZh@pCQ`8!0*;*BJ_1>{1ExNo`_Z9(** zRlCTSJwIeaV0X@)C38JL@H-zJUQ7#pX1*l>fzHnCABUy$(cc~px7}-vS8&F`jC$8z z8u1%e;grapP^LxENBS=KHcY4)ZoNEvy6Z$nM_LJ)x~!DQf72aj0B`BgoGTtfbGU2EabR33`D@m z$2zTj9~-{Jd;R^$=A{0+2ZBvYufFnLq76ziYxV5NRN5L+K50Y|yyCWcvL1e!*ES=A z%@SSFoC2faG7$*-6{&2jnp5VrU%Tk|cI3O;D{!4vH{#%(fo_Ts>#k~U0Q$dKfOFoV zV)|5w>=H1*6wj1P;_}j7&dBq|Yb8wRIIDZ(?)Yn#)bcIvD_j!~r?~4f zK5&3bLs`Y0teZsS(87*)6!>;*)3%X-IaiCD_x?igcBEeTev0<~FQn#Vg|7U%jKspCwb z>ci};9T=4_{pfZF3PY^Kq!W6?BY)RAYt20A>-8^E*f1q#JQp6STjm{#|GiSUSMU=S z9)X|$U$r_U8(Y3&!|vfn??DowqAb>8GlpS;&=QKdzAgZ^)PFSu|5MZc2|ShK@ZJM0 zvHpB`PLEdvnQYWbq+adm-t`F+{${GAhJ$#7-x+c}m^^R1-?t5{O*AAvkwlTzTzq1; zpDn56yWo+`v|@XOn|rmU4M*K_Afl)^g39sv7^hWPsk92`_1k44AvsXzeh1}eO&16V zEioOYastovSByqKD~=uyDZQJXa%rNxblJmp39wQVUQ1lL`*x3sHy9mhNhKAQg!usO zxXSxSKY8vKs8pZQcM}T(rl%TYgsSl}s!0iPG$u#>t>*72njD=dtO{Q-HfOUR%8gDi z)y$akHpvMbh;^}-i9R(F)M)}p1Lhx@6@Vyb9FLoKvr&6ys=ddxai&#aLKE?>)A zyJ0Ns%%*KzDF9mTk10?s9;fx$r6FY7i+XG&GpZJzuE&EQ7UIJ=ZE$&B79W z{;X8w`Nrdp8*wv|~e8g{KaZ$#K*j>+#>KMHrUN`}J%Z z>$p0ts1?jrLdsKz!;R@Is(1#IHx?!?tXfBATS2AUYgnL_SL+eMk0q5X=bI&>p9v4W z5=4KAvgp>HBE0i1ZT0d*T!U`$#ml!;F0jp7P^#uzu^7}=9ZE2z(08+(FsI9Q&a(Zw zn?Hf1qd|a29(IPRWhd%DBz(w7ODcLeW5=Dpq933^cz^xvDmkaWg!-1mSQs_mL(t_k zCV_0&(VuJNB!hMxl|x%0fkJM%t$Uw9kpPg@Qk2AU@=C=c% z0A$PGz?>lioA=;KzO&l?P=CmVQ^+Sq+(S3pODSmSmI&Uq!R* z^fp$+?&0>eKUz;p2!>N=R$7zi1uV@_>Ev)#U`g&x;&usCicnG3>8QH?eXps$#*KEF zn8BURrFKPgc}-8+RY^ljPPAfjJNesmf}45!#=^M7$4wqzWdSpja<-)nX^6-5G1ItzepFzlu}S0H!$ZflXLf{Q7(LyPW!rz z1@gG-?4n93ifP~rJMKxQ@Aa%oB%^7=^%sL(s?W0}&eH7Y047Wm;Eih8qLZX)W*26V zFO-<{6vY+&C`9V^xLPg6FlDmjY*4l4<>V zNd8nINbRnZiB`7o_Gt0;Yb4`P}bNBaFC1AKwaONc3Thdo-2w10>3!4?SyiF60hkZ{z$i<8|$&e8raS@T_qB;#v zPL9k%R8{<9#lkxHvqJcX&{;x*1#%J;pd@M>5@}cHY>L9JyeKF-5KkxuC@j-ax$b>; zo4vJ6)Vez9IKl;CA5B9$1O2_tna(tTzmNOW!>MS{RZ-jNbKhO*Zx}50$NW{q@pIYt z_>~U-bC(@1APUf5Pn(K#|JQ`72tHPM5Dl~EMjyJ5OGUUBhp6jXOqL#$I+9O!O z_cNlu-e}#Y%oCIB5}LN45|(_){gX~Pu42<^#2ev0 zXt0CpZ?xSDUa-QK_!NsG1a#T2(P#j=?2GHr|8O{S34rg#qXP5XTFqT>>{rz^DZ6sB zC&ROIxS8bRw~|zAoLpbPPY#PA_dJf*Ey2uQq-PYxO?Kv|Atb=!z(woF~QAIs+242b1D z)Yn`Bo~Q(-U^`wT3dJ@N9>!_gC8!-eV4rx>NwTxD2g3C5G1jvXtnc$fu%he|?xhvE zDRr$3wZvVQQj?HDwMOR)0+HXiY1NEBcV6{3@Kc<7P(<%Bs_8CeJiUFH?p(DXT2>LT zqEurO^RYUF|HAy^aXBu>-w5Mdv0Q5rVJcni>X{-ekmQD0ueT1%U|bY|@l0uexiFK} z|A)D^jEbY}wngJ4!QCNg+}$k+jazVs;O_282yVe0g1b8nbb#O%+?~eV8ffGe@3+5w z_WpCn9cPSt_NgC??xMS^y85Z-S!>NX*K9N`nzsXtjQhFbxn2(RsD9yd(Ry%6y>1@z zP74ms1x(9raE}<0C9L0}9~%!!{*6nUxV3Xyz4>(JfQ?yoW+e5_G3x2#yfquhK&h>x z($t@jX;-e7=yLQ~Zuq-dz-=OEt)Uyr;b0nz{N?sB4FxTC!hGDZ1w`#r$9zn_Poq1l2J{=>}UqFHD^mt?K+(q zn2UJ0oD45T=s9>SkI6gx{X(9_AXu-|`J&wX+i(X3x)ogcCOO&Nd~O}Te?RE~ zQ1TP(R(%$R#8$(+@>N&I(F$}=WCjnQM1Wl6$W4FOMt1Y!zFd;hBx(D8WVgDenDnjB zxFVCxcNe#;^>k^4_SxBv+%kC|qgGeE=r2q|Lb10s>~&@XI*ZNDoy4NpdZE*@nZ8+L zltP_^&jk~~-|)ep7}jb+>|=;V%MdcNo3hSkH22nG#hV$N-`G=IwHf@@g=_+1McyvM zr`kQ?W*(p-OE;%3L$iwn>vgK=%{_%FOBj|T_om5F{VAogZ8_tB>}z)UY=xC0EDrzZ znC-%${!)iZ%?r7v^|WipmT?XKVs#TDh!np>9q5Zvfbj5?={i_?Y1Z2wcQfd@`~EB6 ztIl6=3BZ$D!CU`}b3M?1C>`rNxyuNUL2!+G!|h&(WW@ej-7;lXY-9??c68jhu46Ya z`+6MHne`?E-9Jbew1Y#4UChQ6`STd%bwP*whKcaQtrN)e?qZsJT~Am9cy<=zP4_Bx z9Yd^-l^QS?Fd>k6`R%b`eG0(w@;dJ4RoeLW?PG(nwpitc<#)V+tzyg7;i;LHlk*5#X zwc&ee$QMJM)dq*-`{z+4!fw3@v^~k>BG1Hz+p_nxFSW`wWv2s$XiZd82SR_6KY#LK zyC%&VCm4%;;-mP%v7iDt_b0j^X)0wNPU5`lycqlh?VL$R#Rq!KKp)B7&RR9L>w92*w3E`RxEI=d@jB` zcz2K=aAv~|Qeu)utEc~mQXT#R;G?g+@kk)n1e(nM4(k;ALD%|p1@o8oeoYi~b2}4r z{Gn&}dpb1@-Fd-oT}?}rZe7aZKw`_(vPUlKQKP>x(fZE!7v3zt&(MRYpL{h#CDKHs ztcXvsX8r9Y`sWZ&uGxSOt~ir4U9tdyVtU!>tpb6*2RDf1v9hH;+uS!dQPIE^fAZVt z+n))1y$F0PfQ9fMo4f6x%%lnUj8f)rOKeus>cdP2su*$3fgpu`p-LWg&DiJpe_r`D z`cZ@UukGtrptYv_Xf;L@+iCbdNR|;`mIJ)*U{K~IP(k>w+wYo3Lic~$-2d0-{KtOu z|4L$i+_&;bdH!#k;D2o^|M;J;NdN0A{Ogs+AAnWtzinjytzSFvuiuX`_4dkCUVv&zJK8fClmr-=~1{z}4fbMMq(jt8mDt3yzUkeC0Rvu?DAFV##WiU!q2H zQ;`R_GlA_`aJwEJVm#T*UC?sd$6Dif&u55X*}1y zff1^dNb_3n?yX%e_%igAVb&`B;(9nM4!bZfud;lu2kR*SPJQ9G9I7+0)RInJAd|oE z`ZjK*0mE)CPR){dfWvio?kC&yL#*$Bu{Dl)7Qe~y;bHTj>MM!uh(Zxd7VS-Fq74o4 z3+bh%rC4$&RF7GgVN5uxvs%#WH>dJNuhA1=VMGR@^NWifgam7)`EQUdJf4 z;mc(>ZXkU_b`GW^^6piG}`|KIgLqb*^(M$Nj1|9QV)d%`a2am1m!vR(I3!9P+DI zw&GLxI+-Q=R9+$o&Gc6mTWtbEH@CBn(B4p_VxAf%tg8pvFsn82QLKRQIP~+BP!I$T z+~Z=lSKMf%m46x2g%=^Hi8BKZpZ+qr^Nj74M^cY^oU|wtc>dI-ja|fhm@wQS4F5UH zql$tV4cB)0A@uZ#`zWh&PDrpR>*!N-AZK|n*xB^5M?2jS0Any8Kr`^@QuejC_hZSX;WFc{`zkbu%=s$uU z)G__{+Hj<`l*0F^(=-f8cbp>ehKa=bA`(JpL?;haWDE0>6}y1K!H~~Mh1?J&5gX+p z3ky_aZR*voh>HuROY%|e&7st7?$qFK>@-=`)pN zxhRvv^9<=#O3FAyAdBAH%1v4>r_k?kCd+c)Tut0tL2nUi3#UT3mqZ%qsa&A}bp)ngt(yVeG4{fKjgm!Iwc>Y24Uy}4H z&x5}sctvI|C!Z`XeUbX&UQQkg%5J2*t&wKDEPkuJ+aBJ2%h(d-XXjPo6R4zLEfc$; z_jw~ly4p20o#rk2y^K@4cDviOhqK*t^6ovPW3c3wd9gf|z+pdbClEFpj)fLe5}qY6 zB(F%gi??ZT-Nw-Okd~Y0SGEb^1nyf`}0lnNbfvoXO`+6C!P!oc%nVcS8-naNP8LZZypQx(Wuovlw3a!Iy!7c4*gp^ly zf2`4{PZfPiAt*G}k=qje>U-v}3_t1G`yl&_xr5_F?mU#iH4|o>^FivS?rO^a&FPlN1D~+)y_G&$_YI z7Z#!7zoj5+DRzcboW&-KMg1OPIUf(p!?#9d(&=t~=kMN#9WbdLlHTRG$UE|k zJe|7J0!d1O@QN$4f#kzX5^g*YRr(BbnNe=+&u?nzS=!j~cAA(YE$bhCoUt2}A+TVj zcFP|X|6_UP^vdk*mxRRlvU*#7lPVp`$SlJL$gncP_}N{9cd?=(WCl$eWE~Mz|YyRM!E#Ix(?B2B#d7=X;k09j266#Roq?9>bZ^1>DkMM6r z(V73m?<1*2r?{yl{b~#_<&a^m4vlszQ$`ui{Sn>2B!7&$da-Nw%rI46Y z`I7#We)0Xh0a_*1Gx6lP_~0MIcmuDM)t@!aiuBv9gv5mQtD)XenhFN=Ztg1cN!#&- z{dJs~k>gaaP)Pr^)6+bX#Ei+7!sW{~6n=xW+riB-y|CM>`oo$PV}E^wSq)X6b+zmT zf4`#N-?HQU#aBTxSb(1CSA6?T^t5O)$FfQyevu4Oi{5;j} zd3e;K?a0v3U4h?CL4SXLK`YCX^`2xoSCHu>QQd=wnz&XLjML24X=4z5v3G|nf$HrQ zU38`ORR~^eTJA4ow6}BRrwK*1{U4n!<|oWfFGV`^pRr`vQSP~x>6fVe6%ZjYC}M-c zo^-$a$R{{u5)-=>b5YC#tUhg6!IJD+4jVooX~|2LA;3%z6m(`sGFpj={y4{pjz34A z(DzC@ZS8Y#cKgBH1GqS0M=p8Ka0#&=I_mcqv>l|-6i2(*|FZxeFWDCqj8oM$`Fp_* zuLVE*eXvemmsdgz3)pYCc=RMzt0#5y)oxRwiEp8ooivGJ;_T$EP2{2&SYMcT zS~R%|JmGivs*6gVXq~b5K3~Rr-VlkQi>y%OUHw)0m;+DO?K=Ppw*fWjw>m9fYA%h> zd6JBCbk021Tilm=I^gAVMT+P{W7}A=gYQ&6N(aE*cjvBxr*6FyPg+Yl^>1- z|1{uCq(4-BO0ge2x}EY@X@ehabVl0#cnWo`OQsjgPj!65HFP~_;ME>Y^?BzCI}2n20Bg3T>o zU*347z&HJjVMxT%BcFHO?6lvbx4fV>2@Za&$b)J2Gz#*%q|!X}iGhOV_z?9jH3%y} zFN56mVBhanM1RrcS`}@!xH#f0L?==dG59Q}yjT9$yixd16T*2%;xRaW0yhK0SW^4u zOlaB7>NQ)FwM!jZO35^J#DUb4@741MsoXZ9AtBd03Vt__coL(IsGe&&$Cc3;H^~^> zFG+V=?yTC1LG4v|ki&!tjOVy&?l}@yO)xXjn47kFeZ46(kgD1zPVYtlZq2(j9;ixB82SMeM7x&Hh$}H2TvKqw}HX_eS1Sey8cZFXDOTVEuMYU z`}df2I%K`!5!sPQZIF`u>Iw##PtD`gT%QlbjmfIs!{VP2&&8@!R&=i4P;K zLHenJ?LNbq6#uYH(U{w-%`yXmecW14`BKi|{nuyDij-8NK6mw{^L^e$DR_Hr2VN$5 z7zgT?BU;U6-)NNLaZnXZS^|1ek%)OHD-urRUK#O>YNysSrvAb*&L$g{0`FUUtl*ij zv4gTR^fG9#N)=cAZePlT0hAN`VPx-Ii0v5}aUZA2?Ax{OX;rc>9U;SETj>TmL?%lb zF@p0)WDjVkAh*?@S=GZGZ2d#ssO7EA&*RQcxOYaqMO}fRLUebD%CL!a`7sXx_TgTa zKkE6IpcpTpf_qRpnKv0(t-jF2frhVWw6rEZB2>IMuYxjqF#3@F#CnrkuC@FkTUSz< zeQ9&X#L7RMaFrOH`*rwD=Nsb1XDl3UzPAx}-s||#tFCG2{Y62mz;VYOzU}GvFyoT? zvZTJZ14i_hGfnz+rwm-agpQD%V-xwLJl}DlAGOfLb>17TUQ9xGqf0=xxqJHb-zVoL!u+wwa`ii3Ib^^wY}sg_EJY14?b}1dhzcON^4|;i`|L z>qX<3r7INb9kdUyD+$Euk6UOBj5)sFlOz;ZUxadtE(YQD1-*^q2o46wKpo1@sBmrE z8SE`c-oNKnSew_^I}G*niX(`BhP`(0#6v4aD%Wr$=!ODo%ld&<;4d8QXDB4>uv=8d zag?9br)|EMDC7oEw#p;gq7||96=VfI`>pscRB|?#tl#swOpLYDHf-rlMI)V5MC?Uf zJKE1#karSm2I+{<%acy>pV@|L%I^GX1n=Zb80cS>?3qCicuF%#Xoy?IuCusLZdIrK zT6nJWUzW{L8#gG#QZD5o5|ZX3fQptVThs7v zm5<2(84IHY%0M+oF1U57_*v)VsQPDX+u}^2#wmd=RFX59*xx!kuf!H|m;+t_gqic^g%m7O;r3Y+EBWO--( z6Mh0fIm^Z{rk)N;PoG)^11Fl*_%V(6KB5odS4x{5^|XSsCxBVqcWwKI^u}5 zW42>bdx(>#z!ah+O{twPKV#IO&)%>!W^RhcWNO7nfk9-DG;8*s!)4%Bnc^H6E0?i!(4vYSTNcr`6W6KQ-$#)oRDY5_c}Y_q77D=PZ35 zOy?#Rm}I4eTS#F3+=2UF>FBNyu>ZBm{>B_>r#3?@Pf-L(-He-a!=Xt$B6nixoReAc zG^!JS^T;ed?4i(?%3SyShk&}s2Rj8+Ya}5d_5iZ9yad8~pPcGImnc^`pFA(woY8nOI7L3nq?dgw|)z!>BtuS?+ z*dQ#&NUeiDNz7bH{#j~gIfjkt00ui<$o15{53_3CV^=4)9JSYz;?YR|)ycif(DgbA(ytz~VVPNjvM;T}$>a&2$_nU^FIjjpw*0OK^xGcp5tvyOan8=p)=MpX+}!o~`LC|o1m85szPvWo%l@0Vw{bXX z&9OX{uZB}QGi2s5WO;NlWx~bvmQvB;IYe9JS%``>m>J4e(rSkK64C0fV)E9d+0y zVP%N|dB=T?8d#WFGtXaf)?wn*B_8Hs)#{LLSL4@yEg=yV77YHjzR>mT)=W(sK7Yz5 zOfv`sp25w7K3zPZFgFxP48BMa7srjx9cj+s`1w^g9H?Q==r%qxMn$2!~ z3{3;gq{bdN_q5Sw2)0UYTw{&EzvcJ{}y#kN5>kx!>H>LQBAnmp}z?I=);F5voT4 z%IQCq#}T=og4zuXd*g$1twB?qHl?aOL5m&8AfTy}fqtljLB@DmHbK1=}j!O3bR} zq0U#IMWl>wuENrGI!nh)GbkO0gpJw_p<+L30#dE`QYtDu%RLF6goF86x=r??DGPb5 zrv3av+`=*K`tQGGxrvS51KMe94xCUalQWKUB=+;{m0ImGGbVkeh3#wB#xxfZy1Jpy z>M(|$yDs{)MM#6@=Z%DyFPbCocBBvz+8!G5diIMhq7NBG<-G5ibhN)*DHgR>LEI$C$N*qox*R3ALfyeG#0HVD+J|p4Y*N9%vtYlqw&Zi=+TEZnO z%iMI~aM`aCYU+EG=Q;npR_Qn^Gxz%T0W0 z<8`4>9gzr*p+hbPVhjnd_M25xBOW?#b=aU^3j&2DIvS|FM@cuTq$e8Hh5?kC&u1JF z3nH^7>grr&mrYEL3H>eK#S89oI-2t?v=qh}N1MG|^e9-;bN-{^M9Vuu^wu?ne##_7 zw3Ec)$B*boR`1VkgQ@}{$6V%<_lmrH%O9p~vRPWk-^4=N9gR;Sdw+5uDfpeYqEav) zGy#;|kGoz+me%( zM%Vd0k-d*76|(Tu$*$#c+LjU$TRrsl`6-}6CKGV}5F>Nh#^EvVw=_=P3P1BpKaJS= zc9f=n5C7m2c9m`?cIdN}Hyrg(2=P~tL#RKl^iy*2)TY+kX}lx_YkFPxERajbrkT$I z&XMissf3K%cqTJ1#}Ds%B!&Epdw(4^SLG&9816{B?8LWw1q?$mqg!p=il}<|pHB8Y z`CeE3XE4?pR&FyO{w5^1h}gM?vD-Eq# z4qpG|j&F*G^JYK&DV3B%YbtZtcI6K?FJJb+ zlQS_^4l!n*Ofyz3HeKg3nrgP(J8aoK;)D%eXlplq`Foc;Oc!Ha)#lj1-Tu&cD43G& zmXcUjN_5ZkgjJa0aoG=%sZ`rJjS>)xq2p0cXeI7O$n+Pxs_i_a**5O-j(1xujw9&^ z)iy-aBkM_bP{l$K0QL*BAh%nR0_JhL&+lkiHn0#-C@L;!*JV(}elO7u@As;U?Zv^VXAaUK@B{){sy+R837GjI3JiVF4= zxH}~A6n6P3unME9Jzx?Xij{3;D5V$u52ehPHJ0h#<L0WTv+ z``h=@*Az(TwKK__u}pftaY-SGdwlBJ%)fEd06Rd$zpOH`Te8TY1gdRQQJ;qP^czwMWmVW@q*U0Q1TX00vkG#!cP;PyW=nySjf2Uyv#5y4ijFAXJfd9Wh+PV%$K?8`4itL6nJ*eqC%O#)N6P@>(A9PU@pTz1FFh6LG&(xr zQ}-*l68~}7N_%tnJcap0<(yic?tUQMuqG^D#|^9m8X3Gs3Q(k=%1fBAGkCLpp5y~3zm8qE4E?m+u!t`(n;(umxb%y#VjkW$ z_A|B-vOI5QMlYGcXMGa_4G~Z|ncT(@)lOB!@qf-@s zeJkI;KekMo`A42s*3YEmCHitRf&dg#UBRHitrg9fne({~lUTq{52dr0AlnuMDsRgE zxyvzO(TnAQ0w*x#2c^YZc_Gknyc9l;-}_||II zJ;aY?*UO(HWl0TR3%mHNW#4}7ImRIbg4dVd>o!EO71)QCs(+aohLT%iqp8lMYLm`} zCUM6`(7ty%Xk2@d5Ra{!H$1|tweOeV(&d!F<*2nrw!5{#3mQ>Cf5gyi8IBGq1!-pH z^xcPRtmX1o(ch{w<}-kCSg+AONaj2iM-^%h`an&H;*f}aNV{)F)sU3?fi0qW66D^AUL9b zFkH*>aDd;jfC`wF&wNi%GYeiD!Pl_z$^^25UkxjQORf*c{?N$;-KYb@SHo|APhdIb z7UCKzAjVyq={W50@Y^p0*-WOND>koJKI9ScY|$Y}JOKY;lyo1hzz-YNavR7Az1tag z&w%^Y!Wr-}Lpmyvf+hLIxTn6L>*;)N%Kgpw(|WR8H>a+W%zxlO4P>}+T2&vVTMHI5 z9Z(&(*4Byu^3Wbl4v9bcdEvL~9y2}qwIr;(I=OSC^di(C6HPC#*<%RgF)t!{%#swL zuNBlEM;6s}jM!<$9G4Z^-)>PFmzq}50CUj;2d4S0T3!1w;-_6kO4p#tm1B_Efq{0W z?44qS?+lGDuXZCmTT*Ji-lXW6NcEY^gZN+A$H9=t zGRozo)1pR__CZo!iQS+g#%NifoJe6M-8qewzf1hXTnkkZ{livR{a?W4y2k~(m6|xK z5bYfc3kyAczd5Hk7|f{CXg`u6T??Kr zHsQ1KxnrdyW`6fn11b~N4rxLo(2|qcA31da6o!)n62c=`2Z=xpSjhms~z z2sQnFy6h`{A*EkLdz~*YqDnR?JK@$qUt~F6!$s=VK_|=CaZkAnl?Di^p6IdXv;~o_&tc~}dq4;w@KPR{U z+)9Q)k0XHu7HrILPqk`ss5SFLn`A^{{NOC#2|QR^Md_{-8fgl|a>7Y&raoGK)$+gz z9kuV2->(og1u4os-V6Xwuh`8;!5w8e+*vi-mh_pYM9 zTCmM%A}}VrCKk#(NKW~#GoEr6xQ`AiknWzuYo~ha?N=KfjRi2HhIQU+-Se9!_(#Jw zHUzz|D(mYnd7#%rZa||uA+O7KB7rpB9-NTM2=lf!MyDS}@y=4kp<0YK5|>gen0dvj z1}Lvg2m&QvOS0t3a7=`EdGD;W)#I8B5FQD~5kNv>xJ%QIbR%mfbdw9DF03#aYvcE= zC}Jo};+KxTGL&uFX7kxqBq=;mc(&wt%*%H_Fo@YVu1+i77v<5D=XuE^iWq5R5p7(Ij6ApSkofIAoNvIa)A|!ba83 zW%*(Ln&5BvtN7H$zJ55ht6FD{4SvOrcQpK}s$nZy^B^bISI5k&0Tij24X| z73x3db0hk-8qAKM2;R^KLW=sh{DUeWAmn_npZeiXL~~@KcY2i#Q#6=zSuKyOHQ^4| zl=&k>LO`(7=o!Q0iiyjAkreF!xd3>#`0{uz%Wc|b&M=)^Ce0} z8JBIp2R1x)SDzwbN;L(xsG{CS6@{jp_bm~R!K^sL^Ri}T|CpHZD-;jScQjvY&FHQoK}{9{#~r*%o8HZM0;5IU~{AKr_ow?$oLMhlg3nLt){e z;K+j=9Uazqo@p2t2P{}^FqdTO2c>V(P&jx*t1@V8DSk#`0MN02-$Yr9#DFrH;#lYO z(q2*raDar$x_Dll9$*w$?AtIwk;VMDO#EtKa~6UJ8aw86%yqFOyXGxS(H&z)DzY@1w;%FuHg7rgZ0clSWMHuf|b#$=h8$+E~zBiCsjkd{+d{d>~BZ^x7x zbI&3cTNAaBmgob=>l$2N%yYpxtI-0++vztNSL>za*%gWsJ}cUdJ#$fmw{*xwzjvN* z6$!reIGT2=@Fl*qr1e0JlEJRGJz!*j#N$o7ki#Dg42E~|W#BgyWk;Bp5 z@J)m!CtL-#MEz2ZY?ak&b3Xp~a>WEVDLRf%(Rd{U-8Decm0hhQphKn#kt#bW7 zdqtzgorlr65eNuO^d_H-=aIxMIRKp1o#&hu`DyF8^(odY0~E3;?MqeMi|bahsS2q6iD%9bPDu#Y4)5{L6R$|y z;rVry+RZU8f7yV|w!a`l&U=$T$d(bpT``%4efUuL%+hyq9`|8^??OYtl>g=esLxtL zd+uujlSMQvlSYq5elEA!NI5u}JEgBq?sHKaNjsjBq=Sc}G5i}wEz4XQ7xcPVKp^@E z*ZY!dnN5$#4O|kq7+s6j*jM+`(5u~+|5}<>va92zX-hA0^e4_reV3oHYF+gj$adX$FK%CZQ&A32 z^d{O$vZ@J8d=j%HbVbvLyL}A}%pUaJ_C|bE9ezc9N95KDF@QR!_h(zzo z8}FFsg-gyfa~W98AEZ@lm$B2q%jh(7IPR}XQBQ;(f@vRccM=!SKQ7a6MIW-ZeD~Pv zEfDJNm2GyQP%FD{Jh}GPI_SlYv=|rXhw^=`I=`6KSI7|5%u{;#pq{7H)zu{j!0PP} zr1}v3BC>8+Lu6rPx6*un*=tUKhSf* zm)7818z%cVWmVhjr_-C}6UAS;Dvgesbt6S0k~-%ruI5_tq4rHFq%_0zS8*$-rTa`J z5jF+ZnfGI`H%oNm+Yvj-C2EX5E^XXbdm94EPHTbhT~@ zJIz=IF3plMTQ(eDrBopa@Si53ycPHG%(3dw8Ubbhv&21$`{HN8d3#7A!OepATOxid zM(ry)UJ0cl#VDL_?ruAbB&rduc>H`}f;@YCAw(-E#fU+9@PvYR>IfOZbCMKRHfP$l zqd?Ce`+O;mL!l0Aac|eZO*eU8R|g9s_G^rI`$N`GVFNkWIonc^MmSVP8f|x%^Y2S> zU#bEYF3JV+sKPDm-*K9NA9d?YD0jT0Xd(sS4%&JjcdVne8R}7`cadRZuZw&KIV;Hz z^n`yEIBVWDa-lio#C&fQ7jepx<9YK1;_f2n^*VSg$Wes4>qm-RQFy+0Zw#f{c zt*u~|QO$HosL)d)YtzUZ0>ZzLVA@L?&G@bO%fn}1FfkRa^jKlOev@M+;y%Y}>Y=06 zQn%_l(5t3{as6hU3pMptRXuuskKSzDQRcznNdA^SqI72Qi$8H-U4YKy;(0wAE?j{a ziK|$!h8Lj(h=fFwhxMlIkD=129k{8JRhk`g1Wl!+T9xQ5HpC}d*@;(CbPGRO8691{ zs@21k8s?Pn;Gft!3kfDTkFMwvR3++{!r9V%f-!&-;o6HnWzX4lCC#otSnKXayZ1#F ze1M2RiUj!G8#@J=ZN7KS(|f2d0vDT9^OWS$`7eN-WT{y~f4bJdwmhaV6;eX?#8$fjE0N-I8)(!n$I%BI%y<-uvF{zLryHU+m8dQa_RVU9D%K0^k?Cn&^#NKNn^x)X)fqZZ|Lw)TGK zh+E$xpHS6VL%i5Lk)R>1pjPT42NaPw94K(3p1IRV>_y4-4hn0`uqqz=?O3A z)8Cze;!~^QP0?K9xc~NHIo^g`8K{{PxyN%m>8slLGJ+mF4X3HSwwHG|Ix-)%fPmA+ zzg=#=zA@7Cv^D*%P}`R<&4D_OXuCX}i*b3wBph)MQ&DbK#CJ&mTwcB+#7Av-eTkwd z|E&X)C7A2FrV2A^$saY_j5iiu`NvKtDy{M4zuD;+{QE$U-}A}qf4lMg^X$ieQ<;7G zZ}PFnp85Z|eZ~0qQ6G1G0P^Mk{MVCrKmMzD4dbyD`hRZ!{~wOsqvg>;r*rQj5{~hB zTv_)A?rz6&-Y4M{XmY?)bN+POmjAHO!Nfkncs#omgK=CVK6R2O-I##F@X7Jl(SHjI zA3x#$^jG*le8v8E4;S0x1zf7njlOp`fMELhx8L?WDn%;5eCujOC50mUGjeC>bj~7i7c9$*RX9g zj3>t{?opd2#``W2yTbDdnqf<8!=V>V zBBg|LtL!7`5c z^T)OC+lMd4*AAb73;vq_OB5QkVYM|)xA?%!Eg!AEctlfm=eTc>>beQJ4&BswopFWV zOPq3+m&KA!rudh^;vh?>a5q^cdh zmfjfHb_2RuxZw16)%MJlavMe5No}>+S$BCkP-EGs+C)45y<=5y@UoY+*|6>Gy~oZk zB+`|S7DcnI1EY6hr^R*Y4@v4yR5!)>Ha&0k3HMI6Gf7YU4@rkx8Ibpj_x&RR#4#~X z(i!!kJ@Jg<^Zf?*2U8|?nstQy#xG; zIxo9mah{PzMhNS4uGee+oE6L*Z$-_YN1Q%DNW?HV@H8)P$@6%8gjw&z#nSl@laEGtQhc5)Bxc`Z9IlSsy;Yi7G_n+XXtM&7Ify0G>nL8=zStvpsDGWa0aSIv>0qk@tk!~R z5Nc_R;2wp7p3%Ro_R%-D9d%j};svE5D?g2-PqTZqV-H1-G>OYYEZhuckm?szm%rfq z`^vF?Li6Q2){qs#tlpBGD!#MD93A{?0X_2+wxfNx{o$irc7W=0h1XxS7N5E=jCtXl zZYvFew{%{X=NO1}joK6$P=s6vxu#@`_4X&CBFS7%>7IrqA(64LmSdR;C(d}}Q?16! z8qKWgT;ILvNetONl%h$SSAH9bUW>mMienX?ICzxFq)T!~1#~VCuHEc2P~9A&RP377j_f(}6Xh%kPK8%$@&NrWQ|R7+ zK;v9*?)0{gJ?;xfN4CA(QQR#Z)ihax3pwY^YVRwA%5NN}EA|7(=c~8QH66^ijM#=x zGNvnZ@uM-&;cIA7?;qYph_%#tXd)ItmJ!T~GzWTiVe6lxbCz@*YB}T0`dFoJr_+Lj zXDkF@*lbDJ%6Or(xJ8jWk~NJO>u*CNh`&cl8!s^@nZ#IA&Jv# z1|t7Y$`%JpH!*QDURh~5dJXYE@Ty0*o6Rm`mqdw*23%UdhU9k|RnS)m?w;O=1-i%b zuT;fPM-)^x|WKY^K4cuyQ%_70cO1*hZh5XWNapUAJq{;82}v`C+TIVh}exb2h$V znQ3k!yWc0F$r2L^*Kin?myi+j5WQ(1%%Fi(Om5iJBUC&Gkm|DoQdXSSJp7EDrjG=# z?qbDQF7~I_nyajIPre7Hs!L?P`n`z88-2Ni*&iqTScH8k}A!_MphfHrXE8!Wx8Q+gUrW67``cp9D zR$c+Ya(#zN%cSbjGfgA*u zh}Jem>u6=ty?!sdw=wJm&^{;d^qjListzgkw6aT?w>;|QqiK5ZjXO2kDZUf?fLB;! zdP&`Lr*82$bxI+t81Yv*GZt9c9W?R-Q*c4HFv;J?_WR8_Lvc$xkoB-Qw zKoGtLR>vVp-0`k{r<2Vvs-rYl93BXo-|p~!WTH-8(BjikSlp{Kz+|;04(byjR5GWn zZpGr=w{T`PPKc2#FoFSV?WhwFDRt1r9`csyi&7>T2o1b@!pxe|;zI0&P;sNz!&Epq zg{_VV0hw3)X0r8sY5la7(^hcs+Ct6vk^$|4`Jtwqz_M`)d7C!0VN~n5?QXLp<`k&d zp-J9n3@#rqG|c6m_XOl?Dn3l<+-@%xLecaPZG{6vuuS3$#RQ~lqWUApmw(O=6MT85 zoi*p3_G+vri3gNB$)D~(_GSV`6+NPinU+PuFTQ=dyN5$F0bB&$25&t9{C@&Go9mZ9 zE>wW6mX3#5(54Y!6Hl`Sv1Ol(_@)C=GpDNc{Z$2Kx>rrnR8COc}0cmaMwLVSKXu<;iDywO!G?AB3-OlGp0IhJ701Uf&n`dgoJ zE=y=Ri%79G-e^+8(T?!XV$MF|V(AJ-I$K*_Z$S~4Mvj^%&v)rQ+SV=Gq~kT1cefUH z6=7o4+se%l$)+RD>)LF>G*^juvY&RF*#wVZMc2O{_9aNL$vi7aKciv#tPaJv8s&R4 ziR2b_Cb4x$#q>D}@c(ggv(7H&?g?|AN`oYF3P{KK-b{Z}3z;_{TV?#27006lZMKZg zeYv}P?DhtaTwyQvSI|ze&`N`k%-zY%KeMlCsP9g9=vaKw4IN+v9)*P5)yB8J{%!I#m> z1;fJn=2X&1v>HBw&n~pSn2JS6UXENJAIOmz@U)b+3dPbydAFY!(Hodnk6sOauo|48 zGRMQin__OTt)%~2%8%swPfg(#~o7V{4rs=yzwtRs^34U z+S0U7Z+7#}>ULLr;>}yk(t*pPKL`KT`xmo1?}THyUzXiCJY{L;8^n@jQ3kO`6SDz% z+DsA_EUCeJbJ03w;UKjoFy@Q-FOMJzx8}>K$dX0<7vtj=#k;6NId3n$4}q~_mqskB z1f(IKF4`CQ2ZT{-f##!}W1J08AR4{&YO)hbrW~_G=XBxevBizHJIb()1x#ngJZ_39 znUVwtHGd*f^4|g`L1j3QlFP49Ht$%c<-FOW{N&7Hy?5=IOFPil+9DHko-f8Z!h#oe zTi_}kpZA6z+!0Ig3<4PF;>}|rfttw1@-ii>g0$3f42Ea6Hn8c%m4k zpQ@#yn{xNP+Y1Z^Pu%Q_(!@sL*e&VT-X;ylsaL~XjO={AEuSdXsVlurwDf7qxL*W{ z@y)@(vZJk6{VnD;0j=ep)6cKVSq*#?+pe)Q3uW^VH+na&_#jA$m5!#ExT?aN>h3f% z!m_5iJAADLP)y9NArxnqB|^Lk(xNU%YM2CCyVsTZ08TtLgr-@jorV!PFyOQ3W4=ik zy_%Z`8=D%|wjHk47TFm`jqyBP5V6^9j#0sET62_RBQkThTGFufDPP+kHa-HJNOy#q z&5oD_tHx5|9W-odZzhpSmV$3}&k@XNz}m0n_EB-9E{+^kl^8yiZxK_oERuXJCU>G{ z)&4fsw9R6&zpi8)b?&bmTiN@?iH5q`X)A2ZbhcK%GKCJhqHDnLCpV3Lc>V}4qRCr7 zeBScxjDee9{lE!K);}`QI0JHKek^6hVfK|er8hA zm75>jZCwaYP^-n|rAHN-)!7so{k}I##b(OjKnb({)RD$!dEczgR%)`($}f|I-mNJZ zgp{2IVhI(aS@ZO}F4qqmV+O624{Q2zegw8}{MmR3OTGvj( zJ_+cRR0k+L6NAfT!#k~hSMC`qA_)^RCO>) z4M^DG#^cqaO%XSyya-!!is$#4m!Pe{NAn@SCWdhuc=D{!Gu*EQc5#J45G#ULSD=MX5+re8b=N@z6}Ht>f4)!Yk4`sAMcSY ziRJQ}!w|{!>+;g%6URf_D^@a{KD*3J?`dnB1vEsNh<8pow~WGx!$q*T<0kqy@`vK_ zn@wz~x%RyQbS{Jlg8ewkPUvJNzxNRoqdoI&ahTQ|EoUCeWLc_N7fM+@)_0hiEsgIH z@>SeZPmo~Xnxd>Ix`JT^xy+Y0-|dkiaR!FhUE7%uZCOrOj;C5F-Ki6)nP_;a`?Vd< z^iX3)i|A@KG6`rEZ!wlfrF|vbo?2a~%NwRKoYORnbbplv!Du@Ca;LQ}U3Qc-=_R_D<(*8(_K4UNK=bGQ{5Kx0#f*vX*Nx@iVbpcw`80=A1EeYSh+!6NcAUudvk zQ3A2B{)e(14w-ky_K0r1bDpk9O|c%dRwA7h5u>5GnO}N3DwE?p3bARH81R>3`IIbo z=suYw&8xPRn&{*%9(UOpCiJCqhEh8|D0B`EneM7*O0HcjOc|T~r*JE40n+;PY)uVE zXFs6{WBWX6yP8EBturre*{TA$>58J_#`@}C zONzHzhpg9|-ciESreL%{W_-eWDU5FiR{sB-8qM-vt z*b2FA)$;i&D#XnL2yQ2&2Fdyj-gtx1xO`BEwK1s^;)>GAdp!JTZ2!L2DW>*=kBH06 z3H|l@f!C3@Gs1tLCI$;hI@&5t_W^F#jN(Vcv%?k<6#z`mWESd{-0F>DR+>|2R;7D?a7*1M5HFLeRy~y(FXEHQCPd<8*VS22!EIVciF*FeaMy z{pRA(hFC5k#oA#dhd~gipU~vXJHKjo5i3yvVYZ7PQ866Aw`y$2Zm0k83_q2`*O<~j0UZQIuSHD(Ho_ciY2h{ z)JW2K%HadLmpxrSm31NcG#kfyZIqytqUbG6sgYeV!9>A!N#o!xBT$wyJN#Z%=9AN# zA}*GsDSYdy7951b`<45vibi3CbTl!3I#lS$($z!EY)My_=wj_9!SiN5Ps|3+40~%? zR6q8yyAu85O5yI_ojC!y8XBGpYDnycx5Qk~X#OJZPP!$0VUapyzUo6R4K(cj6Ivolqlba#42w-IGrgg?qy3X?#wZJ*hoLP{vBT% z+c?~DsxCwzjd|YN?$tJmQKb4e>9;!rwN&)ye!}(?d-jWje%sJ5zz%l5y}wR(ZQ&!u z_rC5=^#OqBUwr{Cu;+Jep~_BP584WY-u#}Sw<8ZZB{vTj#P^(sP*b6k+?$i3pCLbi zUWd5$>TO0YNX|{Msa{DJVG-qC^Y4S%<{Mwa8-dVEF{I}bUHge@5@4(#ES5OcC*rrHU%sT5U0-Ij2%V-Be8%YGv@B9jxfY>H&T7E6ozuo_j|~ zq1o^Vqu|e3NMq-TMJuSrkwf{rKE3oiai=Q*5GX~=G`4^BYL>-&2d^yHv0l(kG@a&M zU_|Cr`I~`sD6d9K&2WK55wB*<+}1a=2nVNwf}0@^uQaA0N8}7)Q*BbURm{(6xJ{`d zm%R)7fdBhtRA{^iz54Fk1l>W@k}t2a0kGi#_<3$G=j{|i?<((_oVK`a7kHgE2aAj8 zPmKg$FLUBN)^Gwls&#yhy-mBVW_Ms>5lolL!UO$>NM6r|13kr5^7ro-%Z~h|%kZK< z3{uA~f`)tYDR=dfEWG6@#&&ERbX(Sxhvx^T`Sw$R9vy$x35>Gu;_A%(;9WIp|b zM}WwU`&Xsq!E}=b-5PwGzofTc(iKY*zK$trw_LxD+B1@^ofB}?iI}hA%0`~p?~~Jf z1C%3XYqRou)E{n&%8>biv$_39Inm{Lxgpk0=trJJ$VOx$V>a8A;pg^Jn=?$dcdYlgNn8=G3arezl_8#RA}A9I;HKa2c*)Xr?E$qOiYz=`wVDV%ZN zHxJ+B(!kn)elJXiOoT@~7ZiDK$%a)Ynfn2Mq7 zaVJ?H@#~oBfSMN~*fu$R+*_2~_hTzr{1f4b^tPL|)-d^mNIhiRFDe$Y0)8IUztl>) z+}ckBDz+U52J*&7x3@JruUxZyL*)x>-MHY4vU(TmMtN&Dxq4$`6uuEI;>wz zt@Wq9K~XId=mO6Sb;fn~Tw$kOg^O~cN7*uIhW&#WJtrv&ZM7RBEGb(`DC2%veZ^&O zN20p4mG!o;*;=)eh)g6b@A^Y?0#jOD7ZWOPXWaU=S_--^A_}*(-`2zkjPR3y*5LKG zQ{&^Te~-UUor#4pnZe>0$rH^4_j_o zv$ZuHtW9R7eJhOgKPt8s!0y&k#Oh{ix*g2jjd#@4(r?@JZFTO`dz?--3b-aA`;+lS z^TqUP#}m)UUdO+G@b9Rx)6iy~nKC>7!@s*R6wvK6m4tr!oMOV|W=tsBOW@N%^tvNH zpp}rGn4a_$-Izbz`9U@Fh0nHUsxb+WwLu<6(cUxLK+?}v7tb3enxMx#!=zogu3y^8 zjh20;9-e+L#W5$|#LB&uytWpB9Y#txxQ__7DrE2qTyWRl*|37u|w6{0s7&?!SH*H$?Ftd2`9(p$~f~XNe0Ig_fcB4+dxJTk>vjkJ;wCqN-ZL!iNmpHrBvncSE zo0yGYVM5n)MZq7eY%luaVJodlOeYd$*_em8uTdsx-&R*#ppyX;_J{oUL~rKVM+zBRs7l8MfRYnF+) z=#(&KI`iBQ!{5POkCn5xh~~*9gH&!hDMQz)$c0L~*xljrQByRswYW~vM`+k9^G!@F zUSY}5qW%w4tHWZ_JU8N$dl7NW=!&Dd{@expH8IM)ildo*-8znE5s#&|;G^YzPxF|; z;##L~v#V4cTOC{OXuH$B{ElB9p^f{>4~w-~`r(V3mj=I7*IZGcvsYm?s)!|b!?T_S zdE)GbsxN>WfARWcUkCjSxV`%rL}e8(Ub-|GHE-r&M=l>9qdlzoXnx^Opf5j#c9E; z>P>=t=OM+Pu!{Mjy%)vS=51D{j*6U{^C9`*8chuaN{hSj()Rfd>}A#JBDc){A^by)8s5 zi=*xXH@?Z81v%D1I>h41^a5o`$Fvh2{*W359uc7zg0bFc6aQ7F3cIA_j0OU1k3!KUo#zP zGeT5~HY;z8KRBxA7n#B}>9mp-%O;nioovS<%M_T30g3>#@IC_dK5p$Mf3)*B(J%j| zVpidmvhiN3LWb)y-|_Mt%ZOsUX2$2(^iY83^E+qT6QThAv&TP$ah>hhK5G9F%rA${ z^~v>6NAXLh3G=nP%)~LTB!soWIIFj4EpS9gh9~aFVMZoBUi1bRY&MI&HX+5$N~@#b z_c>oFV!QkYYpBtYJOre5R?n2f&1Y}U+**`kP_HpDG#1tfgJZ6iBMfC&`OywpcQjjr zdwfQ*F?6p4w@DAf62ZnxHBL82O;Ib&V;2iOtZQyyv6=`2ZJE6v8D)Q?r&RgOHg1@S_(e`Icb)gTtYBMLUhwz|wZlhfehB zSoHXYG;7B#LabC`9Z;WUiG*`R&SMrC7pCuFVz7Kxikx*;y5isjU|(#Mg%cpqV46P? z)zx4Bo;}?6pSl|z(j9|?*D4#JJD4+T;SZp4K zF4fQ1m%#7vIM!>b*YIZr9EDpZ8$aj@tq(_*7}&A>SOqWw9-9dK9e$?Rl>KEUt>caC zrTfX^-PLLGAOy1RLe#SR+C%Bx;f3EmM)bs%>b&3apN&Su%z91$@sB6Ry_!0nm(~^= zhDXt*FvMbDM2{u;Wxa)ed{{^?7owbJAClb$C=VT+n-gX8KSw)!7qxsG1}&RHjNsnw ztQj}FS=`a`nKqwFys1w6`%+~vr{|r00muiY8aqR(&o7Lip2t#)+7>o}higDZ+%Zgy&d}*>as2deOMV5myaaa@6Zo)H zk(0jLjivvv}E@x;Ee;jo% zDEu2P4$hyRo_XtfsaWdP+tUHSyk~UpLRD3DqsRR-4r2HjL;;1kBvdc7sy}?XdVC;^ z=s-@tT)ws;IEisU+}+yCrAkVkf1yD5tgPzCLC506HtuM0qBHqokh?Hm`caKC(1&I? zlc)OQv(61Wz7Ywub-5}(t%~6OT6%vch461*f(dR6l@5_l9NVmVQ)Q)7g`{$Um}qvJ ztJ+q`uR-;&?;J=L9O{ssNwqo=FQc;1k%=FB9758Z;A4Zkv(TMlo3Ih0;auqRh?;_C zp4wkEgTBB-QjPy(iF4@jQ8ABfF&&UCUoHlR`G`^W3Fh@JXsT^0U`Nl!27TsRRQ398 zhpjp@*mDwAeV8A=STzeVl~HH?Y)2IF!6$?H@XKLr-Eg`3X0fcFl<6Fj2-=h1oz$a^ zAdbtNYd!VW0fB*}WGsr+l#z3O0@D6I-L4_f+~C1cZlqSL-f!hIUts;eQ`p>iU%J$T zqrAx;vF<+5{SKp{vn-u4rCj%=RI12YFf$7m2XCvHpm{m}zH(RMIfCIMLA)=~PwhV&If$?Swh9iG zgi5_oCF)!_<29>UV_Z_&dSnfl?jejPvo)*poRdpd+#QxM zMGsQUsldVo7rG?^-H``~&}<*XW@t^Gtb61~*w)rE#I2&a`38E|@Nju_zX+YLF+;y* zBO@4zZdo(kdH5pdx2rxbH@0nlfBgIcAGEXijXWNC%$ySxIz5lKB&XF%J6`HA1LeK? zcs4dhm2$|oU#p8Pr3vx$g?ow$k)Jg|wka=P7~)^ZefH zc5W0oKF0PZbvxZ(5$HZ_F}|Z&j;l_~vu&tD42)Pyz0DF^zaVd?$b(*0uGng7O4wYr zbim&O1Ek1|-4uWn?F*!+VQrV-ZHb$*a~vVN#gxiI08gscreO3xOh)odDZb&l9t~O? z>PFiANLp9t^6B#XhhaXy$Ug@&{3d@qTyrUH7M7U`6lHOMu;^=0#Cs=gDbqpq^sWo$ zBjj1C`9Oy~?d$CPt6*yno63u4z7K!hLM7&TP{rm+L7=w4?_G+X9bqUm{!MB%_oM}v zCJ_art7_od%>%orcR8vBw#;09dS65|<4)rHPJLp_J5P2ngC463V#x+Btj(ok9o?!^ z$nhoju>&pMeI?2Zs3KPO*I;-(TrHd4^^GJ<~{OWD%0x_Q#$GQ86PU@3HVhu&`G zpgnQF(y4}-&K$bYta1>6rw?cJ$vA@AlwxbjyBQwq(MmZ>M3Bvs;NI|=Gox36T*Pnp zh1qQ9GfDF%Tc};mT+g;%UOw;Q3bV>7W&I~7*)Sd5`t&N$qB9UR43Eju&Ws|PhtR8?vHn8*-bU->^JQkwcXHue8aqtyKipgMn0p;uK` zR|m+F#QM%IE=4NE?@NP`h7eFe&{80|sRqmSMqYMO36~an10~T`$lkbuU^bhQ?sLp7 z1-GVWq8fI+wt5atkCDihmh?lG`40{TDvN^#lU%Ti;We|a*kK?md^Zj%X|Eq>->aT06NnDpeS`IlQUgMOkg#F zPln+2suWOqJ{ZM%G$aJ0UJT2>ey+ZCb&&#&-KLn=p*8DwS}r~o$S3%TSo-~ymsSrhN67%l-_K#1K zwR$V~Whv!A&FusDk6-8Bfj(foww0w2&*oHDe)v<}w5(q?I_q;mqDtwN?#I@Oyrnsi zp)d3g2&mkTs;f3T5b}`S#jS0cVkWv*?eD92IJr3+yAx$I|z{A z|M_W~f`3+_1rT{RfBDIM>-jv5?u+5#aXaF7|GVdVd($POrk@JiKa|n6t2I}bCMhJ zoi%&{0ns8>GWYcVr13KAw+W_*gl25;iYu}Q!shLuq#as{p94^yJXX>4p}vcI z7q6ammh=CMv`!^LrhMO>{rS)QkTJm*@mjLLyb5BXVdljK4gn8oXDek#AX-I-yhf>yOF{io}w>I4|gK8UqMn-<`7KV$DETqe^Lb9?ML>e z%VjRen0kdKK$bq2Q8od{ouB43Jr^Thxm_7G6B!-e$CzJN1s5tW>sblz{mtFwQrL~? zxk|FRUyTOaoL|CH8q03&u}W7@x@MI8CcX z{fc%8@AD5bbFq+070sN#i&L5zE+I~&7aGY$)$(OyK&+f(p^6)MZjshJ1j2?gX8R>z z#81D547#;+V`4~+_%iidSM-|=0UerK4a4i{9{Ky<07IwW&rex-svn(}zP=;U6uI?I zTu2|s7Vy*7tSxJ&2<*rKN|(+0h_P9FiHBW|bbJv;=BpVdt*`@kMfRFrqqX(FFP@+i z6KMt!!^EcuR5}0oD1c_4bF>zu`LYL)W9JPms86N>0xD?6OkEKK{)4~im}aBr$&)X# zKa&F23r-{fdK7Sc;7vc+ScG^u+G*yD2lkQ!eX-xRwA35xehO2_@#C9}vz=hGLIqyN z3IYO`f3_sn+ORVjydHPCoRL9>KJVYp0jbUtGCqfOp?|&LpTEC5zyD84Wd3&rAOHT6 zkKf_{RRCms>JAuUi3d&ZksiH&e09?Cy-hew$KeTq#G|WI(qCu(MR#quUvxSvPjjNV9^d<~?SEEO^#A)6`~NPPk|jHO3W#D>Z!Y!#q+Ng{XZH=U8rw5&h^us&)&-+rp@AIMAyQ% zJS{f&;5(EHb2OAEtdYR%8@Q$ptRX=wGrpY%r#s@S8JT>Teae&k0ePY4*6np?ud!+px5k3ODUcc7mG4=--WG`U)&Ar zGE`4(X{VD?kRv}?5xzxCF zlF*v{88qrDP*9pvZ^LVc@qRbTP{n1EtdT3+?rqMa^We`9?^vsEd1-}(eP57PN(3#> zAL|V>PhJ9wR|>r|K6F+7w#WtQ*=nZo<1c}5dnH1BUB*ieGu@}LY%2Zx>fX|jEw@8t zrlqZ=LES=BW|xBjTHYl)Bd4xerMt(93sOsbZ7FEZ4^x)*KB3tM)fV$0`}VeLE;!L= zxL7(!fwQ8NNp?CU*n75eZ#S_`#PjhA_GVd(!kOh#37~65+UKXuRoQC=l+FVt;#*?NYj=1K}w-t$L&&gzpjXjPRr&&TK3}^ zUfRg)miBVIhc=x2teZM?^ooB`=6gT3FK5Mp;ORW}8krz1x3Tw_Yh9*IArvJbrmp=8 zu~kUdru0yi+B{nqA`pCL+eqx|+PHcprT|gLJSNrH`ZpIKV)zTE8E&~uR3kfa2d>UG z5qExaeoJLe!}8uEYVk09R`+vw{wR5JFI#<#J%gY)czZ;fG%{yz z_UeZ{o<{A#$&PrWN3>FSl)OO3n3!zw84HFum=<<`*cBFEv}jktmYcdM7WuJh+uWG} zGmPz|FjhZJPe<<{zIzzoPc?-tcA(aQPxl)V!5qh)&+X^_|FWz7!n9Dg5~o+T6f^`qHmv zfN(BV{JOcT4f^}OCb*TZ{50*tMLid;8>Ky+XTAS>WbDyL`50UxyUDUHpYxkx2s6|!KP7!?^;8q}tSDMH zI(gK-c*QOJ@Gq-?`?dEfJ2}_z&6|N4_dqIn8=SUm2 z4LR?FjdK9(jEfOg(qE??q{qtE_|-KCec@NbNBZ)t~rD4iL40DSDr~V!Ya9U%7!*O z#v?GhUn&2z@{Vsz8+zpv8y_5~_WlRTa@yaYi587`tQ?SjVz;wRm!OdZq@lrXcK@?s zgB&F~Cnv!NM;BtJhUqz-j97Y^=ik?>HT`D2P0tjKqTh0SIz|!}A$rp$9>sFGJaSJ- z`+LFb!r*8jN%bSK#9Zs1p4QAzMo)-tJRzjw#llZTpr7{NS@bM96nEBu$z9L-WF`Fp+q$jSO4k)$OPCMV|&U$_T_? z2d~RN2O-B-pH(NH6A9Uq34YT5f`~qeg>*}%3R0t>V+UXW9zD(++bg^0b!KJX!^~@a zf1~wW{C-`S=}e?!hJNAaI=lPYOXYTqt~n%l-^R2@klWXFCK4G}^qUCtz!)@#l4!;1 zoCNh4mWuMgy@F2Qg%-AF|z7WvEpSjpDUrSo;$I(g`dTSYq>YowzFSw=c7f-s|h&^p3i7F>S_ z=#mPxHqtGRiN#W;^@2Ax^T4RU9o6Xi)TpRArr)P7`;n60=4W+0L*1SuW_=`Dm+i62Lp)&GXF-E0* zXB%(BNb`upc%2jjnnf#4bXjKi-qJJkS!5j^R~cRif*jur<;}ucU>__*r9TWMC6{_` zjkX>Y8fP4d0>E=1+)7o>L)jz|?-fyLpNnY>wwtQ0F|}qc*!qdOr^PU3z6gShz>bW(w-mcz4gZA`gbSn5i#PfwGf)jv^f3Ra)_M zLwswN5dJhm&*x^|qvLwEGmn6)0xg{z{}1Q`x&aZpcI>iIIy zQtlsEjMokRQO32j-_V<5ohxOVtK@(iSvdTzvNZZ>} zaRMsZ;BV6~Gvkty|44HNClsGIg zBWmz;`WWZekichy1+)iiuG{^s9ptYjLxb7LnoX-w`l$`XDy3QJLya}M8(%z{5EU+A z)_G!^{gN*}sGaO>Yk(FgtF&(k#{dAyz#@>>Uc}fB1PCb9>o^R{p+0rM4HH1L;sPigu=WO`MNYE{N+&a67FJUbw2$_n8rRSDXL)pX7 zHo>;h6lqq~SXG*09`{<~vX&+=@qx%1LBC|qA~2Y#xN zNEAJi(sDs_({9EAh6Q`m9?fVGyS%RmN~4taAyebk>nFDJCkmyMqb-@l_LFxv^&FX& z8x-o>O0GU87pU69Z`#kbWlq=!U+X*H<80_1{nH}^0@=OrO022Q zvF>Ov1dk&QA0@WgN}XPP&VXmao^VntF!+Y3fA1woOwVI#=5S4NmdiwZ=WjPUub13M z8|fPO;i^)dmf_k0-hiqSQhCN)th_XqCIheHam0pp_#r*b7lyrWr zk5vT*e<~1rm(6A6Kj6$~yxB&^c??7UC(ephr*XnQH)Xxg+}~PrYy0{F0>X#8 z-Q8U?Aw2hQP2hs<7~4tF&C5YNk0Ng_XzqxW+RAi{ z(_bF^S4gT!R*L2Y(ObV)daM)&--3uMM5Ga^njy}1arA)y77hl<-KioF>-;J4x5#{z zV3kq&X)0RRyajTUe}trP?p&TLyevYmFtoMWO;KJimLa+OSv8(VWX7y;7u(HlZ16Hf z+)4Ced1R9e)&f@oDY9(Y!f|^Jsj@4`^|lKJUx0|3?PIYLM@Y=@H@-MgeKV<|$TLI- zMrz&5!!Z|@2(P4kpC(^EkEK>*KitaJhT4l4bAU_QBB|%Om!|N4wOQc~4u9-i$11tK8 zoLI`c@geeS7EJ8p> zpR-JAzOl?I$+jzQY`9$@aSrYY1zt3bPCEtsG>hNbK{v;W>1lrc8^^3>)^&ddlbrlv zJoElsGwNjq!*IgdLUTq|Vr_iE>9d6VH~F^t*IAkyjFjl%JOKB?KLyD2D?xykJ7aBKIA0ta5e{qY{V4%yWep+E8$= z`<(+vP1WGaE2g>&*BJA+HRK{Y&WmBq=j3`H4(>nfJ7$+VoPTONCP%ke8vHff_NHc+ z;$lA!#!?r>(CLzEWw-rB&7^HXesy%b5E+isYYma)NskIHJlM52{lw@ZghJ9iE_03QxfK*^%!X)$_%&0NO~;5_ zH~M~}Xga5XkN650ySu4n@1I=5diZtlE1DjzTQym%aR}cVKl!>9HxC14C+0fO?>LLh z<6dL0HXE=JqSi5?;Y-1YFQSzq2w_v5P$?KH6>feC=`E&sbQ{xAE6QYc)m=VwfmKEt z6(na|T;^=}R^iV0ywuFCMyniy%2~?~BE!;H2*-GIitx7#dC2SH3lm{i3 zv%4*zuB*(|4Qj^D7@SNV#T2U*7IqTpl+F2`e3#7COa>`0eg0gqXt|f=tiRjKl^P$c zQD<3AkJ^lQ`7Jm`9~n8Q2ilJ{8^D4T+^&&4)BQIshQ-pr?=ty!SdG|f*XUF9&+st1#L^cU|LkS* z5yZ2z%I~|ndwv_3QazN880-2PjAuHjD!>hNR*r#=I82ZZt9tUJSNtti#L#5AXF@{y zG0zM#+^mtUjUH4tPsmyans^JItRH!A2|#aQEYQ0HJCVKB-%eun<*e)Kd#H=u{tGsY(#*dE??76?XfZ^N<+_5?s{P-u_d^_X>uUpRv(^X=% z3%6N0y>rz)Qb}TK>Ke~WCFxA&y}7Jgkf5s=wC?w7mkUvC6lmg_DO-5g&x71Su6qy- zY6OXcCK^t1S}y%;o=GozAn6n8ZkI(3-%syCHWyKIGG@BD{jrCq96?p{4Hg~9Izd?1 z+!?_tc7{@$$Rorjq{YRKG_7|@tn>lm!9mOmxtum6i$v$btXS{}YEOIqHRP8Pr8Lxv z0uZ13R?bN8kou2RTRxLHR(O$x5ykrh~Q-}q>#!P(rf*Z$IGpWctQ;lcNk20d0U z{V&T|9rVEY>+z>4MR=6lM0foNG_kvBteMuK={$AAphtRp1Ww-ScY2>ysu^;UBNk1} z*!eJW6ok7Rk$mz!FzU@e17H0J9}Q$lr?50KgaqpclB??q2O^4TMIF7wz z>=skU(=1v{dl^9>&F-Lp{x=KesUyG&?iQ63HGv!)Y`m*NrD^kRvKTVY_l;JpEJdyw zhfBtFwL{D+dJNmPTAMi(JXjnbi|2#&0tquZ?hV4a26+Q~`MQCET%xURm{;ScSLwUD z5QB9>hYuLK>=%a|lTUqeW&<2S0(I%@ZpBo``nU@s>Hr z0g*pvn@ttqLSB4FPFFQPI5KL?h;|dsRx&V57BbMsGaCuZb=#b{v(9CriY~5fYWmsh zvZ!*7?)ecko-lEwOMa~C6~=HMq$6rs%nOt ztx?%s@VEJ2)9hgX1b-y=7}~dRL`n#X7MicQYqM0eU%v4CG=p;O(y30_r$zZcHe;a?T+L=uX~}tWcKV2JdO`wFg_7^EzOWMdC30o zug3@rYzdL!9J6fLGZ5(7*OuRSsFqDqh0?UtvR{Mh*rMbveOk2PH6_ooC)&0x)*Sov z1MT*`f9k?+WDW)}&$4M21G)`7y>?qM`HHz9pQf{Tb?is3)mW40dHR_)&mHto%Nkl)u9#Ezq z>=M@?Y!4hxQ!-=tJb~elxwaEMbB1oN68$VM=)|dHk~x^C6csX^Id6Yu9pWh+q`zrq zTxPWmZ7r%?v6+;)o07r5{$0;^#{Sj~%jL}bcf|Y6i@Giv_P6PmPG+*TT0D+c`DL7o zeivEqvho^#rMLxyDNUC9=^17cs*>I(cAm%T+|90?n+B#!e3#r+&5AIE&BpUVhd2|q z>zKOQX0q# zttcjoh2*~DGN`bFw5lDcjQ*eU-YP7PuG{w|LP&zULulNCI|OLlg1fuBTY@{m9TME# zHNoB8-Q62KMc!|%{jU9-b8&9=#X0i=9*XL&?y6C9jvC|t8-w`+hPigS-Yet}(*v)O z3syqrN30lKd3O-I+p>1cH4mJTqa@JY%5YXx?L^mjw`d%DFHD|n)2xPhYS{9+UyeG( zNs3#IO{=ImfZDZ3e!B|VhM!o*P*xu}p5#jIp<;2<(mfT6k+ALrQjJ8eTLSJWVq4rM z1gkB3tdyv=WNktnXUPLJRyeY(+sI#?eJbf0?~#4ncw{2x-)CArRUHrgoWn%f6`qHI zv9(959LB*HOsHA}^vJbKrR^`Ny>$n@g;!{1a#+Y*IlrkrmyfHTf}Z$3vG{O(A30V?>Wt;8JtUbG&SP!&hO5ol)b^D+yTpZd`;U@r`@#R z7!C#xgqT-~lrjd%ZpUrgsE2)5MyIL?P;)sTEi(625(kr4SVz305V`nh#ZCtmF`}UzVCzcJ*O-B6PO$7nt2<}Ibp@w{AgDMoH zb{{NZV6V?fi0ohp%XSRTtX783=Zf8YrSqh^9j7h?H>pC{^T6_|Y2RTHTwcGU2@Hjw zY3A#VH(_FJEedh?@Oc?KwQ9};C3vo$k{btqaEo0%*8TT7Nm6a21stUR^xL%#~9TbcV8}(C1Y0Ylu;br+*HN83$zKsYeu3Z zNC4QfXJ=Ri3G+RU=t!^YiJ^713yC3j_SF?TsQ)=Z!|pUq6=)pOcG~&qeRo3dX>7II zxug9wVq=+d;O>oVf0~BL>Gk(6yErIm-=28I=LTYC!7!HJ`=eMASCr>K7klo@6rS#V zr3%*sf8AqQHaoXi|0Av+4ZFdRU#7Ugf>sXsDr0zn0i~j-I)o|q&R5EOreO045};68 z1R3g=$eq_twvd*y8dEMsOtFR0KG&Eq<+R$ zufCV4FjO>)Fa6+=7dJiymOdcmLN1a%1Lwx>D;k^|55mn`EP=CCIgW=tWX68x=;?o- zql~kjJa9JKtm-4>q?<;=WZPr2bPj*JPZH8B=%1zzS8KHq;qW}ws-UWnU&!ibFj$Uz zpys`rxuET_ZF5KMrO6Zbr{WW=F4oWgLy$eLcP2h$1U^o#qvg(N;a z!ED;JAl&@6Ml+%4=UgA9gh9rzdtC+VCof47W&&o8U^!EZ?o;L(>)ZeSSQYAt-f~Nxmp3vK%83HWS%##q~YV1lFDVWE9M<(euRA zl_uWJfPNM^`aZEbgfa4o#k}@ z)I@g4iBEC&aBSBMdHQ+PF}ovvQBfvSxp;0b}Mbj`a7hvI>f4z>5)@QHl+q zb6D3pmB(YUc&4Yj)bg>aB)x?ZT;fjTdmKhKZr*M9iO{No>dY7u+h1Na1-FSyOGPAWo zRcFFyJ9({yst$j*T_f^HdWB(x?VYz49uN?p{wlK`x=@Ob zYI2CpSP8YlVsz!gLYOs0lx%`V&UAXWR-4Vpx}fHeKL1h6etBK&-cxtJf|Z~SHEZGc zUc%v813gGiJG8R$TT%xS<+K?o-pshwh$00^*mlRtLqzuY@61b(F}oglaHfs%rFvNy zqq+B2QmDP3OLjm%b%z1DCbs6CpRs^rn&}dcj{@!PIo#daFMnUd=#b_|NkdINu;-A@ z?K*zsbh1!KPZIKQ^89r2e2Vydis^m!(!H7fhc}!|Dp=Ly>rCsC0Zjosm97++nPiy= zBut0cMiFYvZsD891mvYW6=nap#dW(x zBi4MEtZTTjf9ie7pBPXYc?@!&0gh{kaFuOS7O(pRvP9Q?O`nu2KYD%-i*J)2?}SLT z%8k=yUs|4a*cQfEJDjIwlF|6c_-D;7qwOA}cMppL@HjieqS?$O;D`Ux0^}7Lu#GY&~XgVX20cD%ZFVU$2 zGqbhb3)>sEG&v2=c>Tcs@ST_2s8XIwfKy3$$7EJcr~dl(2#qTRw=STKCxk5?x#se+ zo|0qT>a-c9!55|&%&2J_Z&ab--uUgHn0>ZzEV2r}ERKsDMYfRB#P;fMRG53J5FgVO zq?U6XnAeQWv_r49q_$n@|G-j8KJZ$`(o*CWTi2vl2z*#1i(w4jE_ZkjJ|9XE5VvGX zmNHLLimAEEv={uctJ!a6ca^;O4W9nRLYQ4+F;vEdI9&H?plJmHyQ1o_f_v!;TiK&v zPN*z7{?ZSXlKN1X=an2A#V~%6LrG{eAIU|n3}Zp5b~Oim1V=3NfR)?q3U9r z3@se>c($S66ET#;w1XXqqJ1C6oj%)Zl`%Q zOlEjm_b#STeZVGH`Z$wGf3s1%oq{bMe+jER?e|T6Fa{~Lu&O7!OiV(-s@b7OkB}Ow z?JrtM#Nq969}My#C6Y@Pg+oGDje2pg0hgw%?e|?pspac}Xg$Oc=mHP(^xD#I2M6Vg zz4A0+txNe#>?6#okdB(M;TF9-UhkDV!^X#QLMdyx= zWmNlLXUDB6Om@qmIV*hG4Jg*aC+7**k3CDCsVUpy`{b!Ui-a+;m%nfOK0z{jF`qVw zhT=$|Ezu|wk0u7-jhu&O>vpyj!<~y7_1<`Ck2Im7;)N3go;><*dKyJ@LwC8zT7i&$iieWM!eS~9wI!mmj`O{bkl=&UO zw>54o&RQZ0#gPpyqnxsCzsjQ^WAFedYgTT@5haL(B;fTcNW+!#glsOL#eX13w8gwG zfO-wmg1-3ik=?BGiUlhf3=*!BMMbNL&Y#Ieozbgv;Ec;q4-!Si(u*&c4DE9p(rch9 z_eOeSrXhoIT_XgZIpWDcg~p#XJaIyjJwMn88T+WMLH<$f;POWWP1IuqyBp${16Lrt zLunoM#CSe~4t5Isghb@`;8XduUk?W!1dk+y0MS8f{Rk{6-oL9XaVWqMm3H@*Xj2aE4lS^EYOXMURO|U)k1oE@RPB zovtL~S!ZSFTLM$c)u&Ug)fzbX&V>s48qvb@gC3<(@jfYfb`<2@~+`uOPGrD-$JYZ;4RgIRYpE5 za17)cAO~^BexaaR5-ux?t&*hu)$xN6jhI>lcZN;Bsvbn~7eBHFLmZ?H68LH9{FwRin z@21dYqduilq9?Vl;Rj+M$ORf}Vhj&E?SY9_LzX7KyX>cK_%D~yW9J-@}0lP-1XT}JC3F40ptU#A)s6;tC2xVI? z{uAD(ph2_*-a_&%CsFm#Fsf z<3~Mx{cz!pFl?q}kBgxfluEGvJ*$e*N{gMy^O+BDe4j_NwAYCJOttA;6D*qCPOp9+X=CNAqv4Ax8WhCQGoehW8`%W`r;VM6jmOcLNT0#mB>$Cy4 zMxWIFmo)258T2wm}+QTEP6*|K<u8TMmy$(D!$hYL+oOEJzaKR`by-+<8wectCo%kxj=%7|S*3l)qBtniLJuZ!Klt z{`|V(E&JViS9-cc_sxo4Mb^Vtm?&_L5PmBr?gqWjP9?T@*lUJ)4b97i6?t$$YPb8GGV9sfJ3`uXh5df$Hueq- zxL@wddU`&-lz(};(tf`B{ssn#FCcG6Sa3|2ON_ZGWK!qeA!p`PcajLRr|NA{b-T=)@pgq|kKNL*acc?<6Gk=(4|Y#l+m(=N z#{DvMIqn}5#5bpwZ`rU-rC_^8&aqhF9$sZ`A`^sEEIR@C9KYt8+=}&oQWR=g_zebj z4HT!9{YRVPPB{0XwYoFcQC*6x7aztA-bo>9&V+A~zXi?Bx23F42tv7Z`_%>z_)AxP zI#t-t#BJR4!x@TDf=YR< zM63sN&)Rp@H;Ri3`vo@>7qCv<>P>&~xG~Lf;hK5L z1}clizb*dNO{7eCRf7@JpCcdy=pKV)(FywHkv?qPJL)8#$Cu}l`Wxc<>@-T8Q?aGk zOLGkoVl%3R_~J}zG8M}(_~DCFt*EF1Sq-7Xh0PKr+7M)Qe0MAJkW4JO4NkBGzqrJ% zzP>n+dr)k+Sj@$7KiYOUNDfoD!gIe6v(Jk$m~Uy=XicJ6_^LG9+&8-PBgSgXVsMlq zN87<6aiLh6t#2BiPMyh){Er%>4k$RlVx5zZs>vGae^UODF1mzEqmFd-_`5oLT~obN zx}Bk!c)xnzWy3Q!*@V&o6Np|R5HoCHtehwBSERuKm2*i%eY&8HhcviSR;~t*+zwVP zHC9fkibbG8#^|cF<)9dvHeg)XQQr@KGA=DGZmmh^&>!wI4?t3vsnwY2=zPiIFH&#` zS&Rs1dDoPpK-wDTG2nD4&ZoR+M#q$5{*TJo;E!O}Ad{eAQ_X^?6ue%Y<$2 zuMU0`p|#^M+cM9TGU^4>Wd(ifUg^5*eMY&sajn*@q^f05v?*djSn(jLS6td0w@8aX ziyYc#(vZ%5P@x7unF7*Zs%lIWONBe zcXuD_0%3mL6Fvs-(u;U`xm+B4Gj55R`E6smn9d`psOUWL`XhT}7@y?k_#zmMaw|D# zyt;}B709EGt{xW-CM?{a7<;da+w)qC-~lNe)CV$2OpcY)htW+N# z4C=YTw*;IjdKo1GR&ERdfQT9)4=~K3`!heUV|m33()`(XUru8_7h3Jb)SO>qQuHY1 zKSew7_}T95{8>X93HJ9t0k>CyTuPyIl*Ib4H&9Etr1O}#!v|f-1*YT@1DZ*TgNNqQ z(0OSUw~xnb(d?z=O*Mt>y_0eNV|gY z6}Hq5!W7gTI`u4B+@vupr~Ib~4JpZO3V-xg?W@mqp;Kts!OCsvTqDUrU+|&Ym`rUy>M)Xs>4taaRmBQko+fB&xYWoc7{dMRyp2wrhpj zT7Ekan}zTp2k)56Xc4PL<29gWt5>tcV@%DO);78r+sWV(mOm_z&K5@i^@<(nwZx_W z%Bbv@Nibtz5(#3(4Jg_tw%KLPcFEN6>Z2pa(9jC!sfvlWim|T(^De9GC4ll_`0xP; zBaJ+sp0ei+&cyz>+|(C~+2Y#RHWl=WC0}I&<3y_%i`RNx7>cN66i51K86e$)FCj@j zbaS%mOR3hH3diris=E!Y@WWqHt%~t)weyD3nH)O$m&)y0CFrNFHSY)ul74oDp2r=a z#Va+{Od)^fQ7}9zrjZmf#DsDQb1_Ud`@>+q3Mbu8F?}?vm<`K`A8!3_XLpYb1ToLL zu^>;NcpqgZ@foP-bsM(|83!cTfV}8#)nvC&(%N==@Bx^xohR6}a}GpbbQn)0@46cn zcEmy3hwq?0cf@(s2oi7bs$_5v;1h=7X*LcqU-WnBfKXM@+1(T{vMMHWLoh z0+aD@tSCwPvp7j~VqzjTFL)Dj!ek48OYw&K`sA}*x-Kp%NPgMb*?j~vY}+Vlne;!g zabBeD$}Cyw z+2fkCc20a9IeU1GDnIK13cb3H7$-O`h6`qeC1;$OnH6zA%YRIKl}ojS!HDB^ zKf*gE!{eKIksiujaqT)bBK>NoLJS9&8?lqR2HI6PB{X~BBd&RsM-d_odO?m-x3{-A z9ugQc%E&vAmq#FI&asvG@eSQLd;yZ2kyomVL^d=>xbX$r@(FR1Yg-?NCE_2mR+@5a z!~9G#VGzrBI{i3LYly_W1osEpd{-5}u_Vt82idlrg6nwRB&Sl&Zj==XmnH~% ziar0%y}vva@|Q>DR{ze#WJEw5u3`Yo#Ga_s9j(iK$Exjd294ZuJ#Q{!6Fbp^sqMj# zWbMyqhet|@-Mw{C)<)2wg!~B>8|vHkVA6(aGvjxP^V8GviM`ZJ%eCx5HkBVt{`K=A z%CV>4BTdjERr7Gv;O`p?R>|KQhKa(%ONj7A`kA!FBym zv6THq_Hg8Q9$YPTx+0?H=HcZe!qtXv0@F~Zv65TBufKyJ9|IOj9!VPLr6v#m zQ57b6Q(*dY!PkEproDcj>$CVyq}uqowixneY62e#c+GESLzd#Q)hwQd&qbxeYynE_ zz{XPz{!V7374GWYV>|vk)EcMf^o_ zS1G^zMQ2xCN#u88^E0kKy}UU6O-NXDWtcG!@bC<8KNDX#ceJlOMAA_ij)w{r@qA|2|{?e>sW&2Q4ERQVevC z`%LO_HKpu)ylC6Bw6P=$iW&r>(Q(RJu8bQm)cJo6m%iFJ9~D_ z#m#-_z}a@UPYsUBqhpIAIpj~+MbnfM?iTH_dp|ZtIjEZXW5^3-;|(x#3?89aM{ZO< z87$SRrxlwaUljNJb1R){95g0$kG1m9mwfcP{R=~pUO}o*GNyh*rNdGHFz^@P<3;ru zpav15%34?yOOiDKsaaGkOzr?fYjJV$f-MI1hTG^^bn_4n?@q4$1Y@8+>O?H0ZdD&YRdYzNi2i z3?+$@FxsbnZ-Wj@0H+!_Ru7MY;vuT&*DmAQVkm7+-o5Z5E6(|a`&QQ`xZKOY3U$_n zsqM$-_3O+^ai$Z2W6_1AJ)e$wS&GZ9&6yi!f9u^uVK;Z!i|gSV{%ZS&;C_uX^v{d4ZA^W*+_*REN+YK~E(#xwD(v1+Y3hSbf`soyBqT*wF4#^x52 z#K1a_r}c6#?Th6YxQ<5g>G(490Y!p}G-=qIYFBOJ_=PHgiywAvL<#5Vj_1@qQ3;{f z`dyV^976#X8ZJ(2fGI4Ndi0H;s^}vb%MGd>a3sl7c)>S6IrM>wd-&%u*D^<#ybKML zK|2TRSCAai%v#gLlrP6{y&0nVAixG)rf}uvO}!RJe7SzMp1Q;1cIGB#I(XWm9L{d1 zZt9@-Ti8}@a+5k_I=cCOE%*e}YRTA}3n@dp80k-yD)0{jVJ#;H=f#DkK8KhTy@nNc0dt8k$b>M=#cx_y5!_6O)HZxlJLSe|Uq#j8Q zim{Cbku0ifDRyjhsH$g|@wK>%{{-1V9RLpM_}opwvX>#LbT#|~0{f4NJV8u$h~Z?0 z8@t)to0s}l&|4{=YLxZ**Vp+^N=S=N_5PU<1x4^8Pie@Mlvd(?Hy!L?k9SB0O-X;Q zhPsYiWrhHo4BjYMtWhobu2yBwk_ti7oc=+juNft$$sV$(b=?vuty?4m4}bdh0!DJF z+!Z4RzpB9K9Dk%12XAj)nXQI6t`lc_oPktAc_e{>5R-uOyF4n_TMcVt9Dg)ZU-9`8 z-{Qvi`mre zJnnWgmjofppsM3M-E142JB|s?UP&DDtO_P)Yy=hz z-Dk!5KB?$q*2PZj?b+^dI_EC<1DFYJ=&zvq?7vf-O?y1${ ziRd7wQUXOeq%M}Tj&A7Cc1Q28pQ0{84?7vrft#mC_9MMxrVl{OMQexP*tY|-sOhFB z6sYYp(8!|9SgzR##CvtpKm};Dt62*4L1(hV_0#)w6sTA@6oVSBrYDShO@nYtm-Ajp49cqBUHe?Q4Q*q2s{S|I>uA zHP9u&%boLLJnV4Cm2fFM!gn(>bCpl&QpFhLp3}m#Dsg+NAdlPjN^= zyA9^eT|b21V81od!j6$$n}KTVC?hd4uHvS|@9Y{I9aVB;`3i03EnueOr)YU;kv8&h z2ej7pGOJENX&i9Lu+fGw--Z#3cU%kX1ts|p5=x{e=cVl1g1$wz11wMWK{d6g5{OS) zPNHLQmxrt2W^h#(>w?uDDaThD7q_a>g*h1vFyl;4#@9Z;b4wHO=3+LCcWi?DZKxf> z+f;3>Y7Q}jszAL$^@$p!+nrz+TJ&Z5R1|nC%t@9DbgULFAO?d!5^R4!Ei^ofGuha+ z3V5Lm*73d=yAt(M3#@1{Gf5c@TIeG0I2@6#iAX<`C6ZjQA)vpKMG)ZJ%PiOspk_8sDbF@o_2je#!Wq@8)Gu#~;Oy8=L<4a_rKTyQA zIVc;F!QAni&~{etCsvXL;b04}JQ9DQKQGJsqlB=2C%Uleu^;k>th4i}S~&Z3 zuN(DM37g|e2-Bep(>sE@``Bc) zBC66I$J@_-D{&5bW1BGIBY#w@V(A@N{qw!{2TnK+0?gcD83lXfW3z6BV>QwGpCwwOC#VQ-+4c&8c&C|YIPU|9HNxZcLzz*K2_j}c z`@M&4xKc?u)3pqhaEs9euAHwBIi)YlKl`s3^8y57%b1N{^FZzD8S(a5jh^gst1$qaI z+vaXkMxx4<=M@sGRm_Zyn`P`fUcYENFRlV^vG$@=ZMNS+gAov_vRj}IN=v&1$?j4= zsdAN$refEsM|`uHc^TQr87>`bvY|1LU*l$bMn+f#SuL$B`7s|mKCEAf0%sSRD6<0 zYT8lzr-4&EK}>!#cFUJ|@aDzXW+fNF#k*GsuX7Tg-FJFuB;E=b8ly_t1Bv;E!8pJsn?^|oo<0(lS!XTH%l$>*`(pq`9a zX3~Z|l@M^6W#=sm%y?IoU$d33u^z)GFq-MpmxMlh^dgoXaxxi1J476p&sO`Bd3%U* z*}$KeeH%v3)tta;KoWrDA#WvS7A7ur7Vw8NN-a$;`9aY*JQ`6<$d>-kCE!l@TI{}uIUHp{?^0d;JN9s&k z8NW7}JJ9O}LOHns}1oA?llkiN^u^Ivz^K#s%`ReUSe`5jG!`KUPxYGeprJ zqQPyfI}}O_Djx&1t(h;ScLW`66byC~(Sc=Qjwc#z?fm#w7=MNlto4_qwtU23c1kJZlJA$FD5p!s@*XPM zq#LEMbD3Q~~dRfx(zC9|h!d2Xj!1n7BDg3gw$we(N67tIp_2 z%h|Stu}){}Nu8}z*R@bj8ptD*Z%5v0A!f5G$7j+5&gpHV5wFv^%oDZm$v*p#{P|Y( zXRt*1E_;U-vAAFpQabIiDMt9y?g91?w6Lq&TE8M8ygI=&y31D;m2Zzw!Nfw2Y}f2xCmmO&5V>i&g@;w zQG%>Pbee~&0onF8gb^j?wJN+80QQ-Ka~xSun)AZ=2;yPYSujmI9?L`*^Zmju+wbm1 z;|@7L#Z$lHjXBMM8#V&2VT9?@*{6HLJ~_AxnO#O}2J`^dB`=!|amkYwDB{EiMd;=DM!O)Z_s_(^>dHHqSuI_iTsx_&$bIr?kztXIG?DSO2Y zXzg{)Z#{ZNtq~dTp&y+~FKd+!RGCZWGTw*A{l0ME;mp`s&)+>3|R@3}N59P)b}`hif#INkJB+QaAwO@{S`5VHjOKg3!iL4JCP$(+&o zrOFJHt$)X|G-xBlwg3GbK`K{4cBERbv*FQJ1Vv9?eAyJ0#+(}iqsXJdyb;$f!=1G) zQ*CV0!_t9DXkl(0{a8@wGjH~**n@8Jm$8E+=fiiuGLE>fJhr&bU0H@XoY4fy5D zF}NkJORIxvJ;aC!d}+R;6SNOA*WcepR2G>6YniZ$$&-2<%(f;MZtWK>lBA%Cx7qBS zbUVUgP@%0PW*qzIfO>Ctt2%;}QQLQ>Zp4uGHMPkSmnuDlIAR-ic-rf-*o0=@IbR77 zZM#|OuC(_H*ku)fIp$k;UOuo6Xj?OWH0w`VmA(4De^ZOviu9wCUGqdb5Q&qP5H5Ap zTRID9iuUTOrr|uNx%N4lDStC34{RhQz82SQy?I4Mq}>988tHs}d<;n#SxZh-tNQzL zo=cmc(zi1nNgHG9$o$*EJe5~%3r{$wbKGSDuW@dGn!@;pwe?H`qn|V0Een`v&f7La z4aoR5(`!RhCo!ui==giCShY-NVa&k7Z{Zq`?0j|2aL4@9?*Mc#dYG zsP%JX<2~g(^fwiAw^EXIa??BX*5mpEHS_joVk&ZR4Qk)N*ILT;yQW)y=XqG|UIu5a zpUuMTo8I=M7+)k0MOZXv9L2mK_F3U)gtT4Sev(tDs-$jCMmz>V$^APE%3hV9gnSPc z!BJ8Er#?G1)wy54Vd-78(>u51l{^*VSq!7GP^H$tK0CUPWN!X0m?ZhpSizgkQr?IG z|KyRP;_zPaq?y=-Y@AS4@3wMx%5dk6m2H_f;<)!o7JNw!>X;Xo# zh!C`RO10!#Vu7rhQO@Sxca!`Do{p{O_9%xXpBM`6ut}WhWa)=Y}m zCGOX${s}SV(TRERB{tlWt2Uv~6C)`C2>hA~v+7sxe*SmjnxRqw-bOZ(I%*7y_Z5fZ z#4LTS)v?fxnL=R(8dKVP|7jD(o{gLg{ZY?^ztvJ1_?Z?D%*|BAVQ{&lm9EFyB_=6# z!v;X{BS|z}h>(XA=EVa%3X2h4shk?0HVW=_WT02#s=S3G!XuecN3t;u0vIy~JjyWI z*0)6Q*ZFzbmX2Ha92p?{r)tF86q7K|$SYmJuYHe@qmS1MSmW#l-xn5q4i-V{1nkAD zas`gL67FK0NE)TV0&{p+kd#*3oAhZZ`>bP?nDa|QsW#{dpidg4qrJ1%ONcIn``JT#^WPv8tIVZ8>xb^&EaGRo*6)vYG*fYSW4=5mffG97FnTI zJ!1+w3c1D%3>^)G86XhX3O?m+jav{`9p1VOFTzDdeo@2%Uu88Ve%&bL-2N5nu1^oR z*J}d?1j-GpJ%k4M9cR_09iOO~)$dq8+%B-Y56M-j`8$Tjm({wr$GNY^Cl(|z3cB{a zYyMVPYR?ZZQD*z83@PX7Zu&!Oo zzWLz^-j3d4A9sd7Q-AIk);L{1-s2rbV`;fhV}B~k#PMyJ`iRz0rG=OL>J^|WyHil( zG^pTsbL)9ryZD9m!np5iY=0Xvr4l3%ASfTv-;!tVz{>U;NM$gdP2iK z$Q6ag+a>MB9Qb`a)&S=w;q1qw4VC!!Ffoo!n-zz|8LYQF_UG~w3HvU|E3dQA$5s;R zE(`Jl&QM&sgj9mT@j;8B#3@Pc^+^oKL3sf>ONUOa;5Xe{hJ&FeP&M_b5tS*m6aBk~ag32i;}B`v!EQQ>C^sJT7u<%1 zMx+rE9$Rcx4ZQk{QCAyu31;q38^^|fmrh=XX`n2|toS(icjFwco-ilPosNlO(yhrP zTqbbijx4NZNrlGx-fr>M1M^+2mO z$xBQbBxhwGwLm}x*-MFHkB2*mwRQh}n@`e5;V-M?E${E?bb!9qvwbt(*bUzzi&+cg59-6egUuqyARO@1sp z4d!-W#hiya4q$2RsfT%5jO1RO-mSc&Z~u&M(m*EVMH%mD(A*(GfM$tb)cGt6E^KbT zumda{Nzd0*^SGF^@s6q_zXNiEZrTXJl)lcR#9phFJgE~9zkNC=nwuq#3=ZB+XyT{s^IM}Q%>vI#Ucj*a)E(kz!_$tr_OzPT zjI=R@hDxt^S*S6<5FCNwxX#FC>`1K1qBkmgc6YHhCy&cUYJ>A63pjaDOmHki#0Vdp zJK+(^i0ZluH>XA*Z+Z}NKD01|GrNiZjcAR;fHDyu$rg+wnrpH5M`M|O;zmt>*2-iN zWg}_$i03$;(eS5drTqtr>Uw}?_$ec?|GtUqfi%?}@$#0f(pe0~a2@*3DnqUoPihoE5$<>JLXOB3f|tXnd04l@mqNM z1Y8TQ`;Cyn?JON-FuH!nUPch0UmqM6fb@9AR5e^paslB+vYFs#*51`I~@bXg%yg}*i@W|<_1>At~-N9H`*5ctX#p5va0rP z4da?aES;my)QHnD^H;7XpC|tzO+n`D2<}uu_#9@GGdPe$fz(|1&9M)3Lg&GaWGT*+ zNgd5p+>9L;`~DjrEm6TP^H)*9n@M9OESbWH$G-ue@`p~gb4~8(_tN?ER~@%BM8F>T zqn<+ECLu!XQb8m!@l8NPzZA`JhzqQMRML2cQy6sl^p6Soau58r(qI^Z-Hu}8!!>5ERdm~=zg*||Gzc4hN72w7bg>}-j2e}#yZ`p|Kf z8!JSd3M1%A>D1@fwzmYsCeMX+D7-XJ$7@T+6gNL(qNI}${p>+1)G{7n2wq4R4bJ3I z6p}L&z)9Ivn!}ABKzh%2(@)h(JjjHi54EE5rj%qO7|#Rwo1_;+ zeaj!WW4=-7fbyu#na#M7wL#YlQ0cO+M-Ay@pj6ZXW}6_o1U`7mkDQkHolMTCr3+DweV7y zQZ*R5!FK~(EefZ~b@)xcNmw^mz=E+$diXu``dP&GVux|5Nn(C&&Hto_wCRT?Ra4{? z-h}gkLGe=Cf)aT)nJ&p6F)qYgQ}5^BLge1kg&-IRINw6tEaw?+55MveLCSAza-~FC zz%31!t1Bol@j)kyc@Q=a)N9GWq^1=N zp&y%n#iAyI)7g<4U>-BmmUg?Yc?+dW2Fr$*BlGpG#oB*-$;~CfQPDY^ zKr^x0?CFpt2^(zB53M0KR?nI zp**62+*3X$skjF5Mthm#CrGJVNN?74pBDH={CuNC1^iLYBBvq2hQKJH@8S)tH#BUs8#wEMklfOtB7UsyAbW4-p+y7k7N@~n z{%l`m)8gC4c^$A%9eyT5*6UiA{bCc`dL0r}7BIPS0 z2=*zh{cYYsT(U04~3VfYx{P<5>t8mVeliECIZTFY}2yE zJ7ogSC|RCN8izRWSJtx_+3}q)1Z)y{NjQV%Uxd3$AxOBejAm_c=efw}6P08Fp3b!w z

    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%0DDd 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

    DOU2)CcsT-~}{_1LUK!DiU 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 z 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­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%0A0?$XVeM60KTu|b#%fm9Sm%wD^9C)Ax<4AUAmB1 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 MC;(sx`v-UZKbnO>Q2+n{ literal 0 HcmV?d00001 From 6255d65e21f2ef36478948afb360acc5e8b29215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 1 Oct 2026 02:06:34 +0800 Subject: [PATCH 022/124] =?UTF-8?q?feat:=20HCS=E8=AE=A4=E8=AF=81=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=9B=BA=E5=AE=9AAuthorization+Key-Auth=E9=9D=99?= =?UTF-8?q?=E6=80=81=E5=8F=8C=E8=AF=B7=E6=B1=82=E5=A4=B4=EF=BC=88v4?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=AF=B4=E6=98=8E=E5=8F=98=E6=9B=B4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 所有接口由拦截器统一注入 Authorization(整值可配)+ Key-Auth,不再调用getToken取令牌 - 删除 oauth2/getToken 与 basic 双模式、HcsTokenService/HcsTokenVO 及 Redis 令牌缓存、blade-starter-redis 依赖 - 新配置项 third-party.hcs.authorization / key-auth,未配置时告警放行(对端401暴露配置缺失) - 各接口路径维持 thirdParty.hcs.*Url 覆盖机制,网关前缀拼在 base-url(如 /gwzh/HTHG) --- blade-third-party-api/blade-hcs-api/pom.xml | 4 - .../hcs/config/HcsFeignClientConfig.java | 9 +- .../springblade/hcs/config/HcsProperties.java | 24 +-- .../springblade/hcs/constant/HcsConstant.java | 36 +---- .../org/springblade/hcs/dto/HcsTokenVO.java | 63 -------- .../org/springblade/hcs/feign/IHcsClient.java | 19 +-- .../hcs/interceptor/HcsAuthInterceptor.java | 65 +++----- .../hcs/token/HcsTokenService.java | 140 ------------------ 8 files changed, 36 insertions(+), 324 deletions(-) delete mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java delete mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java diff --git a/blade-third-party-api/blade-hcs-api/pom.xml b/blade-third-party-api/blade-hcs-api/pom.xml index f5885238..148cb2c2 100644 --- a/blade-third-party-api/blade-hcs-api/pom.xml +++ b/blade-third-party-api/blade-hcs-api/pom.xml @@ -15,10 +15,6 @@ BladeX 合同合规系统(HCS)API 契约模块 - - org.springblade - blade-starter-redis - org.springframework.boot spring-boot-starter-test diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java index bf241369..9c893d56 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java @@ -28,8 +28,6 @@ package org.springblade.hcs.config; import feign.Request; import feign.RequestInterceptor; import org.springblade.hcs.interceptor.HcsAuthInterceptor; -import org.springblade.hcs.token.HcsTokenService; -import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.annotation.Bean; import java.util.concurrent.TimeUnit; @@ -52,12 +50,11 @@ public class HcsFeignClientConfig { } /** - * HCS 认证拦截器。以 ObjectProvider 惰性持有令牌服务, - * 避免 Feign 客户端构建(需拦截器)与令牌服务(依赖 Feign 客户端取令牌)之间的构造期循环依赖 + * HCS 认证拦截器:所有请求注入 Authorization + Key-Auth 两个静态认证头(v4 接口说明) */ @Bean - public RequestInterceptor hcsAuthInterceptor(HcsProperties properties, ObjectProvider tokenServiceProvider) { - return new HcsAuthInterceptor(properties, tokenServiceProvider); + public RequestInterceptor hcsAuthInterceptor(HcsProperties properties) { + return new HcsAuthInterceptor(properties); } @Bean diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 3963b0d8..8f490dde 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -26,7 +26,6 @@ package org.springblade.hcs.config; import lombok.Data; -import org.springblade.hcs.constant.HcsConstant; import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.HashMap; @@ -45,29 +44,18 @@ import java.util.Map; @ConfigurationProperties(prefix = "third-party.hcs") public class HcsProperties { /** - * 合同合规系统(HCS)接口基础地址,直连可配(网关/iPaaS 部署时改此处,代码不感知) + * 合同合规系统(HCS)接口基础地址,直连可配(网关/iPaaS 部署时改此处,代码不感知)。 + * v4 接口说明:地址带网关前缀,如 http://172.16.203.134:8000/gwzh/HTHG */ private String baseUrl; /** - * 认证方式:oauth2(默认,URL 追加 access_token)| basic(Authorization 请求头),切换不改代码 + * Authorization 请求头整值(含 Basic 前缀,如 Basic d2Njazp...,凭据走 Nacos + 环境变量注入) */ - private String authType = HcsConstant.AUTH_TYPE_OAUTH2; + private String authorization; /** - * OAuth2 应用 appKey + * Key-Auth 请求头值(v4 接口说明:所有接口固定携带 Authorization + Key-Auth 两个头) */ - private String appKey; - /** - * OAuth2 应用 appSecret - */ - private String appSecret; - /** - * Basic 认证用户名 - */ - private String basicUsername; - /** - * Basic 认证密码 - */ - private String basicPassword; + private String keyAuth; /** * 来源系统标识(fd_sources,D14 约定值 TMS) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java index a8fd786c..d41d18af 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java @@ -38,42 +38,12 @@ public class HcsConstant { public static final String SUCCESS_CODE = "return.optSuccess"; /** - * 认证方式:OAuth2(默认,URL 追加 access_token) - */ - public static final String AUTH_TYPE_OAUTH2 = "oauth2"; - - /** - * 认证方式:Basic(Authorization 请求头) - */ - public static final String AUTH_TYPE_BASIC = "basic"; - - /** - * 网关认证请求头名称 + * 网关认证请求头名称(整值可配,如 Basic d2Njazp...) */ public static final String HEADER_AUTHORIZATION = "Authorization"; /** - * Basic 认证请求头前缀 + * 网关 Key-Auth 认证请求头名称(v4 接口说明:所有接口固定携带) */ - public static final String HEADER_BASIC_PREFIX = "Basic "; - - /** - * OAuth2 access_token 追加到业务请求 URL 的参数名 - */ - public static final String QUERY_ACCESS_TOKEN = "access_token"; - - /** - * HCS access_token 缓存 key(照 BFI 令牌缓存命名惯例) - */ - public static final String HCS_TOKEN_CACHE_KEY = "blade:third:hcs:token"; - - /** - * token 提前失效缓冲时长(毫秒),防止刚好过期(照 BFI 120s 缓冲) - */ - public static final long TOKEN_EXPIRE_BUFFER_MILLIS = 120_000L; - - /** - * getToken 接口默认路径片段,拦截器据此跳过令牌追加(避免给取令牌请求再带 access_token) - */ - public static final String GET_TOKEN_PATH = "/authapi/getToken"; + public static final String HEADER_KEY_AUTH = "Key-Auth"; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java deleted file mode 100644 index 211bd6df..00000000 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTokenVO.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * BladeX Commercial License Agreement - * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. - *

    - * Use of this software is governed by the Commercial License Agreement - * obtained after purchasing a license from BladeX. - *

    - * 1. This software is for development use only under a valid license - * from BladeX. - *

    - * 2. Redistribution of this software's source code to any third party - * without a commercial license is strictly prohibited. - *

    - * 3. Licensees may copyright their own code but cannot use segments - * from this software for such purposes. Copyright of this software - * remains with BladeX. - *

    - * Using this software signifies agreement to this License, and the software - * must not be used for illegal purposes. - *

    - * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is - * not liable for any claims arising from secondary or illegal development. - *

    - * Author: Chill Zhuang (bladejava@qq.com) - */ -package org.springblade.hcs.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 合同合规系统(HCS)OAuth2 取令牌返回结果(GET /authapi/getToken) - *

    - * TODO 待联调确认:v4 文档未给出本接口响应字段示例,字段名按通用 OAuth2 惯例预置, - * 联调时以实际返回为准(设计文档 §3.2)。 - * - * @author Chill - */ -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class HcsTokenVO implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - * 访问令牌,调用业务接口时追加到 URL 参数 access_token - */ - @JsonProperty("access_token") - private String accessToken; - /** - * 令牌类型 - */ - @JsonProperty("token_type") - private String tokenType; - /** - * 令牌有效期(毫秒) - */ - @JsonProperty("expires_in") - private Long expiresIn; -} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java index 7b4a0eb7..cff70f6a 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java @@ -56,10 +56,8 @@ import org.springblade.hcs.dto.HcsRiskQueryDTO; import org.springblade.hcs.dto.HcsRiskVO; import org.springblade.hcs.dto.HcsSpecPaySaveDTO; import org.springblade.hcs.dto.HcsTemplateVO; -import org.springblade.hcs.dto.HcsTokenVO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -67,7 +65,11 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; /** - * 合同合规系统(HCS)接口(一期 24 个业务接口 + OAuth2 取令牌,D4) + * 合同合规系统(HCS)接口(一期 24 个业务接口,D4) + *

    + * v4 接口说明:认证统一由 {@link org.springblade.hcs.interceptor.HcsAuthInterceptor} 注入 + * Authorization + Key-Auth 两个静态请求头,不再调用 getToken 取令牌; + * 各接口路径可用 thirdParty.hcs.*Url 配置覆盖(默认值即 v4 文档路径)。 *

    * 除附件上传(multipart/form-data)、附件下载(文件流)外均为 POST + application/json(UTF-8)。 * 业务成败以统一出参 {@link HcsResult#isSuccess()} 为准; @@ -78,7 +80,6 @@ import org.springframework.web.multipart.MultipartFile; @FeignClient(name = "HCS", url = "${thirdParty.hcs.baseUrl}", configuration = HcsFeignClientConfig.class) public interface IHcsClient { - String GET_TOKEN_URL = "${thirdParty.hcs.getTokenUrl:/authapi/getToken}"; String PROJECT_ADD_URL = "${thirdParty.hcs.projectAddUrl:/openapi/sys-modeling/apis/data/km-project1/V1/projectApproval/add}"; String PROJECT_UPDATE_URL = "${thirdParty.hcs.projectUpdateUrl:/openapi/sys-modeling/apis/data/km-project1/V1/projectApproval/update}"; String PROJECT_LIST_URL = "${thirdParty.hcs.projectListUrl:/openapi/sys-modeling/apis/data/km-project1/V1/projectApproval/list}"; @@ -104,16 +105,6 @@ public interface IHcsClient { String INVOICE_REG_ADD_URL = "${thirdParty.hcs.invoiceRegAddUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/add}"; String INVOICE_REG_UPDATE_URL = "${thirdParty.hcs.invoiceRegUpdateUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/update}"; - /** - * OAuth2 获取令牌(appKey/appSecret 走 URL 参数,D2) - * - * @param appKey 应用 appKey - * @param appSecret 应用 appSecret - * @return 令牌信息 - */ - @GetMapping(GET_TOKEN_URL) - HcsResult getToken(@RequestParam("appKey") String appKey, @RequestParam("appSecret") String appSecret); - /** * C102-1 项目立项新建 * diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java index ade05035..62499242 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/interceptor/HcsAuthInterceptor.java @@ -29,22 +29,18 @@ import feign.RequestInterceptor; import feign.RequestTemplate; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.constant.HcsConstant; -import org.springblade.hcs.token.HcsTokenService; -import org.springframework.beans.factory.ObjectProvider; - -import java.nio.charset.StandardCharsets; -import java.util.Base64; /** - * 合同合规系统(HCS)请求拦截器,按配置的认证方式注入凭据(D2,两种实现并存、切换不改代码) + * 合同合规系统(HCS)请求拦截器(v4 接口说明,D2) + *

    + * 所有业务接口统一注入两个静态认证头,不再走 getToken/令牌缓存: *

      - *
    • oauth2(默认):GET /authapi/getToken 取令牌后,把 access_token 追加到业务请求 URL;
    • - *
    • basic:注入 Authorization: Basic base64(user:password) 请求头。
    • + *
    • Authorization:整值可配(如 Basic d2Njazp...,含前缀);
    • + *
    • Key-Auth:网关密钥,整值可配。
    • *
    - * 取令牌请求本身不追加 access_token(路径守卫 + 空令牌守卫双重防护)。 + * 两个头均来自 Nacos + 环境变量注入,未配置时告警并放行(由对端返回 401 暴露问题)。 * * @author Chill */ @@ -54,46 +50,23 @@ public class HcsAuthInterceptor implements RequestInterceptor { private final HcsProperties properties; - /** - * 惰性持有令牌服务,打破 Feign 客户端与令牌服务的构造期循环依赖 - */ - private final ObjectProvider tokenServiceProvider; - @Override public void apply(RequestTemplate template) { - if (HcsConstant.AUTH_TYPE_BASIC.equals(properties.getAuthType())) { - applyBasicAuth(template); - return; + String authorization = properties.getAuthorization(); + if (isBlank(authorization)) { + log.warn("HCS Authorization 请求头未配置(thirdParty.hcs.authorization),请求 {} 将无认证头", template.path()); + } else { + template.header(HcsConstant.HEADER_AUTHORIZATION, authorization); + } + String keyAuth = properties.getKeyAuth(); + if (isBlank(keyAuth)) { + log.warn("HCS Key-Auth 请求头未配置(thirdParty.hcs.key-auth),请求 {} 将无认证头", template.path()); + } else { + template.header(HcsConstant.HEADER_KEY_AUTH, keyAuth); } - applyOAuth2Token(template); } - /** - * Basic 认证:注入 Authorization 请求头(凭据走 Nacos + 环境变量注入) - */ - private void applyBasicAuth(RequestTemplate template) { - if (StringUtil.isBlank(properties.getBasicUsername()) || StringUtil.isBlank(properties.getBasicPassword())) { - log.warn("HCS Basic 认证凭据未配置(thirdParty.hcs.basic-username/basic-password),请求 {} 将无认证头", template.path()); - return; - } - String credentials = properties.getBasicUsername() + ":" + properties.getBasicPassword(); - String encoded = Base64.getEncoder().encodeToString(credentials.getBytes(StandardCharsets.UTF_8)); - template.header(HcsConstant.HEADER_AUTHORIZATION, HcsConstant.HEADER_BASIC_PREFIX + encoded); - } - - /** - * OAuth2 认证:业务请求 URL 追加 access_token 参数 - */ - private void applyOAuth2Token(RequestTemplate template) { - // 取令牌请求本身不再追加 access_token - if (template.path() != null && template.path().contains(HcsConstant.GET_TOKEN_PATH)) { - return; - } - String accessToken = tokenServiceProvider.getObject().getAccessToken(); - if (StringUtil.isBlank(accessToken)) { - log.warn("HCS access_token 为空,请求 {} 未追加令牌参数", template.path()); - return; - } - template.query(HcsConstant.QUERY_ACCESS_TOKEN, accessToken); + private boolean isBlank(String value) { + return value == null || value.trim().isEmpty(); } } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java deleted file mode 100644 index fddfca29..00000000 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/token/HcsTokenService.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * BladeX Commercial License Agreement - * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. - *

    - * Use of this software is governed by the Commercial License Agreement - * obtained after purchasing a license from BladeX. - *

    - * 1. This software is for development use only under a valid license - * from BladeX. - *

    - * 2. Redistribution of this software's source code to any third party - * without a commercial license is strictly prohibited. - *

    - * 3. Licensees may copyright their own code but cannot use segments - * from this software for such purposes. Copyright of this software - * remains with BladeX. - *

    - * Using this software signifies agreement to this License, and the software - * must not be used for illegal purposes. - *

    - * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is - * not liable for any claims arising from secondary or illegal development. - *

    - * Author: Chill Zhuang (bladejava@qq.com) - */ -package org.springblade.hcs.token; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springblade.core.redis.cache.BladeRedis; -import org.springblade.core.tool.utils.StringUtil; -import org.springblade.hcs.config.HcsProperties; -import org.springblade.hcs.constant.HcsConstant; -import org.springblade.hcs.dto.HcsResult; -import org.springblade.hcs.dto.HcsTokenVO; -import org.springblade.hcs.exception.HcsException; -import org.springblade.hcs.feign.IHcsClient; -import org.springframework.stereotype.Service; - -import java.time.Duration; -import java.util.Objects; - -/** - * 合同合规系统(HCS)OAuth2 令牌服务(D2,照 BfiServiceImpl 惯例) - *

    - * GET /authapi/getToken(appKey/appSecret)→ access_token 存 Redis - * (key {@link HcsConstant#HCS_TOKEN_CACHE_KEY},过期前留 120s 缓冲)。 - * 业务调用统一经 {@link #getAccessToken()} 取缓存令牌; - * 401 时调用 {@link #refreshAccessToken()} 强制刷新一次后重放(D7,重试职责归扫描任务,此处仅刷新令牌)。 - * auth-type=basic 时不走本服务,由拦截器注入 Basic 认证头。 - * - * @author Chill - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class HcsTokenService { - - private final HcsProperties properties; - private final IHcsClient client; - private final BladeRedis bladeRedis; - - /** - * 获取访问令牌:Redis 命中直接返回,未命中远端取令牌并缓存 - * - * @return access_token - */ - public String getAccessToken() { - String token = bladeRedis.get(HcsConstant.HCS_TOKEN_CACHE_KEY); - if (StringUtil.isNotBlank(token)) { - return token; - } - return requestToken(); - } - - /** - * 强制刷新访问令牌(401 时调用一次并重放请求) - * - * @return 新 access_token - */ - public String refreshAccessToken() { - log.info("强制刷新HCS令牌,清除本地缓存"); - bladeRedis.del(HcsConstant.HCS_TOKEN_CACHE_KEY); - return requestToken(); - } - - /** - * 远端取令牌并缓存 - * - * @return access_token - */ - private String requestToken() { - if (StringUtil.isBlank(properties.getAppKey()) || StringUtil.isBlank(properties.getAppSecret())) { - throw new HcsException("获取HCS令牌失败,appKey/appSecret 未配置(thirdParty.hcs.app-key/app-secret)"); - } - long start = System.currentTimeMillis(); - log.info("调用HCS接口 获取令牌开始"); - HcsResult result = client.getToken(properties.getAppKey(), properties.getAppSecret()); - log.info("调用HCS接口 获取令牌结束 耗时:{}ms,success:{}", System.currentTimeMillis() - start, result.isSuccess()); - if (result == null || !result.isSuccess()) { - log.error("调用HCS接口 获取令牌失败响应:{}", result == null ? "无响应" : String.format("code=%s, msg=%s, traceId=%s", - result.getCode(), result.getMsg(), result.getTraceId())); - throw new HcsException("调用HCS接口获取令牌异常 " + (result == null ? "响应为空" : result.getMsg())); - } - HcsTokenVO tokenVO = result.getData(); - if (tokenVO == null || StringUtil.isBlank(tokenVO.getAccessToken())) { - log.error("调用HCS接口 获取令牌返回数据为空"); - throw new HcsException("调用HCS接口获取令牌异常,返回数据为空"); - } - cacheToken(tokenVO); - return tokenVO.getAccessToken(); - } - - /** - * 缓存令牌,按 expires_in 毫秒数设置提前失效时间 - *

    - * TODO 待联调确认:v4 未给出 getToken 响应字段示例,expires_in 字段名与单位以实际返回为准(设计文档 §3.2) - * - * @param tokenVO 令牌信息 - */ - private void cacheToken(HcsTokenVO tokenVO) { - if (tokenVO.getExpiresIn() == null || tokenVO.getExpiresIn() <= HcsConstant.TOKEN_EXPIRE_BUFFER_MILLIS) { - log.warn("HCS令牌未返回有效期或有效期不足缓冲时长,本次不缓存"); - return; - } - // 过期时间 - 缓冲时长,防止刚好过期 - long expireMillis = tokenVO.getExpiresIn() - HcsConstant.TOKEN_EXPIRE_BUFFER_MILLIS; - bladeRedis.getValueOps().setIfAbsent(HcsConstant.HCS_TOKEN_CACHE_KEY, tokenVO.getAccessToken(), Duration.ofMillis(expireMillis)); - log.info("HCS令牌已缓存,有效期 {}ms(含 {}ms 提前失效缓冲)", expireMillis, HcsConstant.TOKEN_EXPIRE_BUFFER_MILLIS); - } - - /** - * 令牌缓存是否命中(诊断用) - * - * @return true-缓存存在 - */ - public boolean isTokenCached() { - return StringUtil.isNotBlank(Objects.toString(bladeRedis.get(HcsConstant.HCS_TOKEN_CACHE_KEY), null)); - } -} From c6a817fb3a14d3dfbf0a01796614b1c6e51f93a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 1 Oct 2026 02:06:57 +0800 Subject: [PATCH 023/124] =?UTF-8?q?docs:=20HCS=E6=8A=80=E6=9C=AF=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E6=96=87=E6=A1=A3=E5=85=A5=E5=BA=93=E5=B9=B6=E5=90=8C?= =?UTF-8?q?=E6=AD=A5v4=E8=AE=A4=E8=AF=81=E5=8F=A3=E5=BE=84=EF=BC=88?= =?UTF-8?q?=E9=9D=99=E6=80=81=E5=8F=8C=E5=A4=B4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 技术设计文档(2026-09-27)首次入库:D2/§3.2/§7 更新为固定双请求头方案 - 实施状态清单:认证组件条目改写,待确认项改为附件接口头生效性 - nacos样例配置:base-url指向网关前缀,authorization/key-auth走环境变量注入 --- ...026-09-27-桂物合同合规系统HCS接入技术设计.md | 423 ++++++++++++++++++ .../2026-09-28-HCS接入实施状态与确认清单.md | 7 +- doc/nacos/third-party-api.yaml | 17 +- 3 files changed, 432 insertions(+), 15 deletions(-) create mode 100644 doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md diff --git a/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md new file mode 100644 index 00000000..64822019 --- /dev/null +++ b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md @@ -0,0 +1,423 @@ +# 桂物合同合规系统(HCS)接入技术设计 + +> **日期**:2026-09-27 +> **依据**:《桂物合同集成相关接口说明-v4.docx》及其整理稿 [桂物合同集成接口逻辑梳理.md](../桂物合同集成接口逻辑梳理.md)、接口调试文件 [桂物合同集成接口-apifox导入.json](../桂物合同集成接口-apifox导入.json) +> **说明**:设计过程已明确排除《TMS业财融合-集成流程图文字版与业务流程梳理.md》,本文所有场景与规则仅以上述 v4 接口文档与 TMS 代码现状为依据 +> **关联决策**:[ADR-0001 定时扫描推送模式](../../adr/0001-hcs推送采用定时扫描模式.md)、[ADR-0002 履约规则独立数据表](../../adr/0002-履约规则独立数据表.md)、[ADR-0003 收款流水与认领记录不由TMS推送](../../adr/0003-收款流水与认领记录不由TMS推送.md) + +--- + +## 1. 决策记录(共识摘要) + +以下决策已经在设计评审中逐项确认: + +| # | 决策点 | 结论 | +|---|---|---| +| D1 | 客户端模块 | 新建 `blade-third-party-api/blade-hcs-api`,客户端 `IHcsClient`,配置前缀 `thirdParty.hcs.*`(照 blade-bfi-api 模式) | +| D2 | 认证 | v4 接口说明:所有接口固定携带 `Authorization`(整值可配)+ `Key-Auth` 两个静态请求头,由拦截器统一注入,不再调用 getToken 取令牌 | +| D3 | 网络 | 直连 `base-url` 可配置(Nacos),预留 iPaaS 前缀能力,代码不感知 | +| D4 | 范围 | 一期 24 个接口:C101-1、C102-1/2/3、C103-1/2/3/4/6/7/9(新)/11/12、C106-1/3/4、C108-1/2、C109-1/2、C111-1/2/3;排除 C104、C107、废弃旧履约接口 | +| D5 | TMS 角色 | TMS 是业务发起方:立项/合同/履约规则/特批/开票/收票/履约记录由 TMS 推送 | +| D6 | 落库模式 | 业务表加 `hcs_*` 集成字段;新建履约规则表 `blade_contract_exe_stage`;不建合规镜像库 | +| D7 | 可靠性 | 同步状态机 + `@Scheduled` 扫描首推/补偿 + 页面手动重推;Feign 无自动 Retryer;写前判重查询 | +| D8 | 交付物 | 本设计文档 + CONTEXT.md + ADR,落 `doc/docs/hcs合同/`(ADR 落 `doc/adr/`) | +| D9 | 触发模式 | 审批代码零埋点:approve/MK 回调只落 `approved + hcs_sync_status=unsynced`,扫描任务准实时首推(R3-Q1→(c))。付款申请/开票/收票的 MK 处理器由其他团队补齐,不在本设计范围 | +| D10 | 履约规则源头 | 新建 `blade_contract_exe_stage`,合同维度维护,C103-9 行级同步,合规 fdId 回填 | +| D11 | 履约记录来源 | 付款申请为主线:审批通过→C108-1 新增;实际付款推进→C108-2 更新 | +| D12 | 开票登记时机 | 审批通过即推 C111-2(票据日期空);金蝶开票完成后 C111-3 回填 | +| D13 | 收票合同关联 | 应付结算链路自动回溯;回溯不到收票表单加合同字段人工补录 | +| D14 | 来源标识 | `fd_sources="TMS"`(Nacos `src-system` 可配);`fd_kingdee_id`=TMS 业务单据主键 | +| D15 | 特批载体 | 付款申请表加 `hcs_credit_*`/`hcs_spec_*` 字段组;C106-1 提交时同步;超额转 C106-3;**特批结果回传方式未决**(过渡:页面人工确认);合同 `fdSepcailContract` 一期固定 false | + +--- + +## 2. 范围 + +### 2.1 接口范围(24 个) + +| 场景组 | 接口 | TMS 触发业务 | +|---|---|---| +| 项目立项 | C102-1 新建 / C102-2 更新 / C102-3 查询 | ProjectApply 审批通过 / 变更审批通过 / 判重与回查 | +| 合同 | C103-1 发起 / C103-11 更新 / C103-3 列表 / C103-4 详情 | ContractManage 审批通过 / 变更审批通过 / 判重与回查 | +| 附件 | C103-2 上传(下载 C103-5 备用) | 各单据推送前附件转传 | +| 主数据 | C103-6 模板 / C103-7 分类 / C103-12 币种 | 下拉/映射(模板ID、币种ID 缓存) | +| 履约规则 | C103-9(新) 行级同步 | blade_contract_exe_stage(合同维度) | +| 客商风险 | C101-1 | 合同推送前 + 付款提交前校验 | +| 额度与特批 | C106-1 校验 / C106-3 特批发起 / C106-4 特批更新 | PaymentApplication 提交时 / 审批通过后 | +| 履约记录 | C108-1 新增 / C108-2 更新 | PaymentApplication 审批通过 / 实际付款推进 | +| 开票登记 | C111-1 查询 / C111-2 新增 / C111-3 更新 | InvoiceApplication 审批通过 / 金蝶开票完成 | +| 收票单 | C109-1 新建 / C109-2 更新 | InvoiceReceipt 审批通过 / 票据变更 | + +### 2.2 明确排除(No-s) + +- **C104 收款流水(C104-1/2/3)、C107 认领记录(C107-1/2/3)**:不由 TMS 推送,推送方与链路待定(见 ADR-0003)。 +- **C103-9旧 / C103-10旧**:合规方已废弃,不接。 +- 附件下载 C103-5:仅在对账/排查需要时备用接入。 + +--- + +## 3. 总体架构 + +### 3.1 模块与包结构 + +``` +blade-third-party-api/blade-hcs-api/ (新建,照 blade-bfi-api 模式) +org.springblade.hcs +├── constant/HcsConstant.java # URI 常量(可被配置覆盖)、认证头名称 +├── config/HcsProperties.java # @ConfigurationProperties("thirdParty.hcs") +├── config/HcsFeignClientConfig.java # 覆盖全局拦截器、超时(connect 10s / read 60s) +├── interceptor/HcsAuthInterceptor.java # 所有请求注入 Authorization + Key-Auth 两个静态认证头(v4) +├── feign/IHcsClient.java # @FeignClient(name="HCS", url="${thirdParty.hcs.base-url}") +├── dto/ # 各接口请求/响应 DTO(HcsResult、HcsPageVO) +└── util/HcsPageUtil.java # queryAllPages 翻页工具(照 BfiUtil,默认上限 50 页) + +blade-service/blade-transport/ (业务侧扩展) +org.springblade.transport +├── support/hcs/ +│ ├── HcsProjectSyncSupport.java # 立项 C102 +│ ├── HcsContractSyncSupport.java # 合同 C103-1/11 + 前置:风险校验、附件转传、履约规则 +│ ├── HcsExeStageSyncSupport.java # 履约规则 C103-9 +│ ├── HcsCreditCheckSupport.java # C106-1 + C101-1(付款提交时同步校验) +│ ├── HcsSpecPaySyncSupport.java # 特批 C106-3/4 +│ ├── HcsInvoiceRegSyncSupport.java # 开票登记 C111 +│ ├── HcsReceiptBillSyncSupport.java # 收票单 C109 +│ └── HcsAttachmentSupport.java # 附件转传 + TMS→HCS 附件ID映射缓存 +├── task/HcsPushTask.java # @Scheduled 扫描首推/补偿(照 PaymentKingdeeResultTask 模式) +├── controller/HcsSyncController.java # 手动推送/重推、校验重放、对账查询端点 +└── entity/HcsContractExeStage.java # 履约规则实体(blade-transport-api) +``` + +依赖方向:`blade-transport` → `blade-hcs-api`(同 blade-transport → blade-bfi-api)。`blade-hcs-api` 不依赖业务模块。 + +### 3.2 认证设计(D2,v4 接口说明已变更) + +- **静态双请求头**:所有接口统一携带 `Authorization` 与 `Key-Auth` 两个请求头,由 `HcsAuthInterceptor` 注入,不再调用 getToken、不做令牌缓存。 +- 两个头的值均为整值可配(Nacos + 环境变量注入):`third-party.hcs.authorization`(含 `Basic ` 前缀,如 `Basic d2Njazp...`)、`third-party.hcs.key-auth`。前缀/密钥轮换只改配置,不改代码。 +- 未配置时拦截器告警并放行,由对端 401 暴露问题(便于环境配置缺失排查)。 + +### 3.3 超时与重试(D7) + +- Feign:connect 10s / read 60s(照 BfiFeignClientConfig),**不配 Retryer**——写接口重试会造成 HCS 重复建单。 +- 重试职责归扫描任务:失败落 `failed` 状态,下轮扫描按 `hcs_retry_count < max-retry` 自动重试,超限仅人工重推。 +- 幂等:写前判重(见 §5.1/§5.2),并依赖 `fd_kingdee_id`=TMS 主键作为对账/幂等候选键(HCS 侧是否按其幂等,联调确认,见 §9)。 + +### 3.4 字段标注规范(DTO 组装,照 `pushArBill` 惯例) + +所有 Support 组装 HCS 请求 DTO 时,**每个字段赋值的上一行必须以注释标注外部接口字段**,格式照 `KingdeeArBillSyncSupport#pushArBill` 的既有惯例: + +- 必填字段:`// 【必填】外部字段中文名`(层级用"主.子"表示,如"往来户.编码") +- 非必传字段:`// 外部字段中文名(非必传):TMS 取值来源说明` +- 取值来源统一跟在冒号后说明;字段中文名以《桂物合同集成接口逻辑梳理.md》各接口入参表的中文说明为准 +- 待联调确认的字段:`// TODO 待确认:...`,并标注对应设计文档 §9 未决事项编号 + +示例(C111-2 开票登记 DTO 组装): + +```java +HcsInvoiceRegAddDTO param = new HcsInvoiceRegAddDTO(); +// 【必填】合同编号:经应收结算链路回溯的合同编号 +param.setFdContractNumber(contractNo); +// 单据编号:开票申请单号(同租户唯一,判重候选键) +param.setFdNumber(application.getApplicationNo()); +// 【必填】结算币种:TMS 币种码映射 HCS 币种ID(currency-id-mapping,§9-U3) +param.setFdCurrencyId(currencyFdId); +// 开票金额(含税):本次开票金额 invoiceAmount +param.setFdInvoiceAmount(application.getInvoiceAmount()); +// TODO 待确认:款项性质,默认 progress,字典值联调后配置(§9-U3) +param.setFdFundNature(hcsProperties.getInvoice().getFundNatureDefault()); +``` + +§5 各场景的"字段映射"表即本规范的标注依据:表中"HCS 字段 / TMS 来源 / 备注"三列直接翻译成上述逐字段注释,一一对应,不得遗漏或凭空造字段。 + +--- + +## 4. 数据模型变更 + +SQL 脚本落 `tms-api/doc/sql/transport/`,命名照既有惯例 `blade_xxx_hcs_yyyymmdd.sql`。所有业务表统一追加的集成字段组: + +```sql +hcs_fd_id varchar(64) COMMENT '合规系统单据ID(fdId/fdContractId)', +hcs_sync_status varchar(16) DEFAULT 'unsynced' COMMENT '同步状态 unsynced/synced/failed', +hcs_retry_count int DEFAULT 0 COMMENT '推送失败重试次数', +hcs_sync_time datetime COMMENT '最近同步时间', +hcs_sync_msg varchar(512) COMMENT '最近同步结果信息/失败原因' +``` + +| 表 | 变更 | 用途 | +|---|---|---| +| `blade_project_apply` | +统一字段组 | C102 回填 fdId、状态 | +| `blade_contract_manage` | +统一字段组、`hcs_exeplan_id varchar(64)`、`hcs_risk_level varchar(8)`、`hcs_black_status varchar(8)`、`hcs_risk_time datetime` | C103 回填、履约计划ID、风险留痕 | +| `blade_payment_application` | +统一字段组、特批字段组:`hcs_credit_status varchar(16)`(pass/over)、`hcs_credit_msg varchar(512)`、`hcs_credit_time datetime`、`hcs_spec_fd_id varchar(64)`、`hcs_spec_status varchar(16)`(none/need/pushing/processing/approved/rejected) | C106-1 结果、C106-3 流程ID 与状态 | +| `blade_payment_application` | +履约记录字段:`hcs_perf_fd_id varchar(64)` | C108-1 返回 fdId | +| `blade_invoice_application` | +统一字段组 | C111 回填 | +| `blade_invoice_receipt` | +统一字段组、`hcs_contract_id bigint`、`hcs_contract_no varchar(64)`(人工补录兜底) | C109 回填、合同补录 | +| **`blade_contract_exe_stage`(新建)** | 见 §4.1 | 履约规则 | +| **`blade_hcs_check_log`(新建)** | id、biz_type、biz_id、check_type(risk/credit)、result、msg、trace_id、create_time | 风险/额度校验留痕(照 ops 日志惯例) | + +### 4.1 履约规则表 `blade_contract_exe_stage`(D10) + +```sql +CREATE TABLE blade_contract_exe_stage ( + id bigint PRIMARY KEY, + contract_id bigint NOT NULL COMMENT '合同ID(blade_contract_manage.id)', + perform_type varchar(16) NOT NULL COMMENT '履约类型 payment=付款/collection=收款', + fund_nature varchar(16) COMMENT '款项性质 prepayment/progress/acceptance/retention', + fund_amount decimal(18,2) COMMENT '计划金额(元)', + fund_date datetime COMMENT '计划资金日期', + invoice_rule varchar(16) COMMENT '开票规则(如 payFirst)', + invoice_cycle int COMMENT '账期', + fund_type varchar(16) DEFAULT 'byAmount' COMMENT '金额类型', + is_finish tinyint DEFAULT 0 COMMENT '是否完成', + row_op varchar(8) DEFAULT 'none' COMMENT '行级同步操作 none/add/update/delete', + hcs_stage_fd_id varchar(64) COMMENT '合规阶段ID(C103-9 返回,update/delete 必用)', + hcs_sync_status varchar(16) DEFAULT 'unsynced', + hcs_sync_msg varchar(512), + tenant_id varchar(12), create_user bigint, create_time datetime, + update_user bigint, update_time datetime, is_deleted tinyint DEFAULT 0 +); +``` + +维护入口:合同新建/变更表单的"履约规则"页签。合同审批通过置 `row_op=add`;后续编辑按行差异置 add/update/delete,由扫描任务随合同链路调 C103-9。 + +--- + +## 5. 场景设计 + +> 本节各"字段映射"表是 §3.4 标注规范的依据:Support 组装 DTO 时逐字段照表标注,字段中文名取自《桂物合同集成接口逻辑梳理.md》。 + +### 5.0 推送引擎(全部场景共用,D9) + +```mermaid +flowchart LR + A[业务操作\n提交/审批/变更/付款推进] -->|事务内| B[置 hcs_sync_status=unsynced\n(+特批/履约等业务标记)] + B --> C{HcsPushTask\n@Scheduled cron 可配} + C -->|扫 unsynced & failed(retry<max)| D[Support 判重查询] + D -->|已存在| E[回填 hcs_fd_id → synced] + D -->|不存在| F[调 HCS 写接口] + F -->|success| E + F -->|失败| G[failed + retry_count+1 + msg] + H[页面 手动推送/重推] --> F +``` + +- **审批零埋点**:`approve()` 与 `MkProcessBizHandlers.approveFromProcess` 只置状态;两审批入口(/approve 与 MK 回调)与未来新入口天然全覆盖。付款申请/开票/收票目前未注册 MK 处理器,**由其他团队补齐,不在本设计范围**——新处理器只要遵循既有约定置 `approvalStatus=approved`,HCS 扫描即自动覆盖,本设计无需任何配套改造。 +- **任务顺序**:项目 → 合同(内含:风险校验→附件转传→C103-1→履约规则 C103-9)→ 付款特批/履约记录 → 开票登记 → 收票单。每类批量 `push.batch-size`(默认 50)。 +- **多实例部署**:任务体加 Redis 分布式锁(照既有 BladeRedis 用法);若维持单实例部署则与既有金蝶任务一致。 +- **手动入口**:`HcsSyncController` 提供 `POST /hcs/sync/{bizType}/{id}`(单条重推,重置 unsynced)与批量端点,前端列表页加"推送合规/重推"按钮(照"同步金蝶"按钮模式)。 + +### 5.1 项目立项(C102-1/2/3 ← ProjectApply) + +**触发与链路**:审批通过(approve / MK 回调 `project-apply` 处理器)→ `unsynced`;变更审批通过(change_approved)→ 走 C102-2 更新。推送前判重:C102-3 `conditions={"fd_num": projectCode}`,命中则直接回填 `fdId` 置 synced(跳过新建)。 + +**字段映射**(dynamicProps): + +| HCS 字段 | TMS 来源(ProjectApply) | 备注 | +|---|---|---| +| fd_pro_name | projectName | | +| fd_pro_simple_name | projectShortName | | +| fd_num | projectCode | | +| fd_creator_unit | businessDeptName → `{fdName}` | ⚠️ HCS 组织 fdId 无法映射,先传名称(见 §9-U2) | +| fd_head | principalUserId → 用户登录名 `{fdLoginName}` | | +| fd_taker_dept | undertakeDeptName → `{fdName}` | 同上 | +| fd_taker | handlerUserName 对应用户 `{fdLoginName}` | | +| fd_pay_limit | fundLimit × 10000 | TMS 万元 → HCS 元 | +| fd_out_invoice_limit | receivableLimit × 10000 | 同上 | +| fd_pro_content | situationRemark | | +| fd_is_available | true | 固定 | +| fd_avail_units | [{fdName: businessDeptName}] | 同 fd_creator_unit | +| fd_settlement_type | settlementMode | ⚠️ 字典映射待联调(§9-U3) | +| fd_pro_plan_deposit | fundDemand × 10000 | ⚠️ 变更映射曾名"履约保证金",语义联调确认 | +| fd_is_self_pro / fd_pro_income_goal | 无直接对应 | 一期默认 "1" / 不传,联调确认 | +| fd_kingdee_sync_status | "1" | | +| fd_sources / fd_kingdee_id | "TMS" / ProjectApply.id | D14 | +| fd_creator | 当前操作人 `{fdLoginName}` | | + +顶层:`bpmOperation.templateCode` ← 配置 `thirdParty.hcs.project.template-code`(环境相关值,§9-U9);`saveOption.saveDraft=false`。**出参**:`data.fdId` → `hcs_fd_id`。 + +### 5.2 合同发起/更新(C103-1/11 ← ContractManage)+ 附件 + 履约规则 + +**触发与链路**:合同审批通过(含变更单 change_approved)→ `unsynced`。扫描任务按序执行: +1. **风险校验**(可配开关):C101-1 查甲方/乙方客商风险,结果写 `blade_hcs_check_log` + 合同 `hcs_risk_level/hcs_black_status`;黑名单且 `risk.block-blacklist=true` 时该单置 failed、msg 提示"客商黑名单,禁止推送"。 +2. **判重**:C103-3 `conditions={"fdNumber": contractNo}`(HCS 条件能力联调确认,§9-U4),命中回填跳过。 +3. **C103-1 起草**:成功回填 `data.fdContractId → hcs_fd_id`。 +4. **履约规则 C103-9**(§5.3)。 +5. 变更单(change_approved)→ C103-11 `updateDraft`,入参同发起;⚠️ HCS 侧如何定位已有合同 v4 未说明(§9-U5)。 + +**xformFields 字段映射**: + +| name | TMS 来源(ContractManage) | 备注 | +|---|---|---| +| fdNumber / CONTRACT_NO | contractNo | | +| fdSubject / CONTRACT_NAME | contractName | | +| fdAmount / AMOUNT | contractAmount | 字符串传值 | +| fdCurrencyId / CURRENCY | settlementCurrency → "人民币" | 配置 `currency-name-mapping: {"RMB":"人民币"}`(照金蝶 RMB→CNY 惯例) | +| fdSettlementType | settlementMode | ⚠️ 映射到"付款/收款"待联调(§9-U3) | +| fdSepcailContract | "false" | D15,配置项预留 | +| CONTRACT_TYPE | contractCategory | | +| PARTY_A / PARTY_B | partyA / partyB | TMS 存名称字符串 | +| SIGN_DATE | signDate | fdType=timestamp | +| fdEstimateStartTime / fdEstimateEndTime | startDate / endDate | fdType=timestamp | +| CREATE_TIME / fdCreateTime | createTime | fdType=timestamp | +| fd_syn_time | 推送时刻 | fdType=timestamp | +| CREATE_USER_NAME | handlerUserName(承办人) | | +| CONTRACT_STATUS | — | ⚠️ 无对应,联调确认是否必传(§9-U3) | + +**signer[](相对方)**:`{fdStanding:"甲", fdName:partyA, fdNumber:←按名称反查 CustomerArchive 编码}`、乙方同理。⚠️ TMS 合同只存甲乙方名称,编号反查不到时留空;`fdType`(inner/外部)判定规则联调确认(§9-U6)。 + +**顶层**:`fdTemplateId` ← `template-mapping[contractCategory]`(Nacos,需合规方提供模板ID清单,§9-U7);`fdOuterSystem` ← src-system;`fdLoginName` ← handlerUser 登录名;`saveType=submit`。 + +**合同附件**:⚠️ v4 的 C103-1 入参未定义附件字段——合同附件向 HCS 的传递方式**待合规方确认**(§9-U8);本设计先按 `HcsAttachmentSupport` 通用转传能力建设(合同主文件 `contractFileJson` 中 approved=true 的文件 + `attachmentsJson`),确认后按其要求挂载。 + +### 5.3 履约规则同步(C103-9新 ← blade_contract_exe_stage) + +- 数据源与表结构见 §4.1(ADR-0002)。 +- **行级同步算法**:扫描任务对 `hcs_sync_status=unsynced` 的合同聚合其规则行:`row_op=add` 的行入 fdStages(不带 fdId);`update/delete` 行必须带 `hcs_stage_fd_id`。整体 `fdEopExeplanOperateType=add`(或 update,随场景)。顶层 `fdContractId` 传 **HCS 合同ID(hcs_fd_id)**。 +- **回填**:`data.fdExeplanId` → `blade_contract_manage.hcs_exeplan_id`;`data.fdChangeStages[].fdId` 按行回填 `hcs_stage_fd_id`。**合规返回的 fdId 必须持久化**——后续行更新/删除全靠它。 +- fdStages 行字段:fdPerformType、fdFundNature、fdFundAmount(元)、fdFundDate(毫秒)、fdInvoiceRule、fdInvoiceCycle、fdFundType(默认 byAmount)、fdIsFinish、fdExtendContent="{}"。 + +### 5.4 客商风险 + 额度校验(C101-1 / C106-1 ← PaymentApplication 提交时) + +付款申请**提交(submit)事务内同步调用**(查询类同步,D15/R2-Q3): +1. **C101-1**:`fdNumber` ← 收款方客商编号(按 payeeName 反查 CustomerArchive;编号体系联调确认 §9-U6)。结果写 `blade_hcs_check_log`;黑名单且 `risk.block-blacklist=true` → 阻断提交。 +2. **C106-1**:`{fdContractId: 合同.hcs_fd_id, fdApplyAmount: appliedAmount}`。`fdIsCredit=true` → `hcs_credit_status=pass` 正常提交;`false` → `hcs_credit_status=over` + `hcs_credit_msg=fdMessage`,**不拦截提交**,标记 `hcs_spec_status=need`(走特批链路,D15/R2-Q2)。 + +> 校验依赖合同已推送(hcs_fd_id 存在);合同未推送时按 `credit.require-contract-synced` 配置决定阻断或跳过校验。 + +### 5.5 结算付款特批(C106-3/4 ← PaymentApplication) + +**触发**:审批通过且 `hcs_spec_status=need` → 扫描任务发起 C106-3;返回 `data.data.fdId`(双层嵌套)→ `hcs_spec_fd_id`,状态置 `processing`(特批中)。 + +**dynamicProps 映射**: + +| HCS 字段 | TMS 来源 | 备注 | +|---|---|---| +| fd_contract_name | ContractManage.hcs_fd_id | ⚠️ 传**合规合同ID**,非名称 | +| fd_contract_no | contractNo | | +| fd_doc_subject | "结算付款特批-" + paymentNo | | +| fd_doc_no / fd_id | paymentNo | 来源付款单标识 | +| fd_pay_amount | appliedAmount | | +| fd_total_amount | settlementAmount | | +| fd_payer / fd_payee | payerName / payeeName | | +| fd_receive_account_name / fd_receive_account / fd_bank_name | receiptAccountName / bankAccount / bankName | | +| fd_settle_currency | "人民币"(映射) | | +| fd_payment_purpose / fd_payment_nature / fd_payment_type | 配置映射(示例 2001 / 1 / 1) | 字典值联调确认(§9-U3) | +| fd_reason / fd_supplement_note | remark | | +| fd_doc_subject / fd_doc_status | 表单层主题 / 配置 "10" | | +| fd_spc_approval_attach | 固定 "fd_spc_approval_attach" | 特批附件标识 | + +`mechanisms.attachment`:`attachmentsJson` 经 C103-2 转传,特批附件 `fdEntityKey=fd_spc_approval_attach` 且带 `fdBindType=ADD`。更新(C106-4):单据变更且特批流程存在时调用,顶层 `fdId=hcs_spec_fd_id`,附件不带 fdBindType。 + +**特批结果**:v4 无结果查询/回调接口 → `approved/rejected` 一期由页面人工确认(未决 §9-U1)。 + +### 5.6 履约记录(C108-1/2 ← PaymentApplication,D11) + +- **新增**:付款申请审批通过 → 随推送链路调 C108-1:`fd_apply_amount`=appliedAmount、`fd_plan_date`=applyDate(毫秒)、`fd_paln_type`=paymentType、`fd_property`=款项性质(取关联履约规则行/结算性质)、`fd_id`=关联履约阶段 `hcs_stage_fd_id`(无关联则不传)、`fd_contract_id`=合同ID、`fd_xform_id` ← 配置(环境值)。附件经转传 `fdEntityKey=fd_plan_att`。返回 `data.fdId → hcs_perf_fd_id`。 +- **更新**:`paidAmount` 变化/付清 → C108-2:`formData.fdId=hcs_perf_fd_id` 必填,传 `fd_fact_amount`(实际金额)、`fd_contract_id` 等;响应无 data,success 即成功。 + +### 5.7 开票登记(C111-1/2/3 ← InvoiceApplication,D12) + +- **新增**:审批通过 → 扫描推 C111-2;**更新**:金蝶开票完成(`kingdeeStatus=invoiced`,由既有 PaymentKingdeeResultTask 开票回写时置"待更新")→ 扫描推 C111-3 回填 `fdBillDate`/`fdStatus`。 +- **映射**:fdNumber←applicationNo;fdRegisterDate←applicationDate(毫秒);fdInvoiceAmount←invoiceAmount(含税);fdInvoiceParty←issuerName(销方);fdInvoiceType←invoiceType 字典映射(electronic_normal/electronic_special,§9-U3);fdCurrencyId←RMB→币种fdId(启动时经 C103-12 缓存币种表,配置 `currency-id-mapping`);fdRemark←remark;fdThirdCreatorCode/DeptCode←申请人工号/部门编码;fdStatus=0;fdAttIds←附件转传。 +- ⚠️ **fdContractNumber 缺口**:InvoiceApplication 无合同字段,需经应收结算链路回溯(具体关联字段开发时确认,§9-U10)。 +- 判重:C111-1 `conditions={"fdNumber": applicationNo}`(联调确认)。 + +### 5.8 收票单(C109-1/2 ← InvoiceReceipt,D13) + +- **触发**:审批通过 → C109-1;票据变更/作废 → C109-2(顶层 `fdId=hcs_fd_id` 必填,只传变更字段,不带文档状态)。 +- **映射**:fd_invoice_code←invoiceNo;fd_bill_date←invoiceDate(`YYYY-MM-DD`);fd_invoicer←issuerName(销方);fd_buyer←receiverName(购方);fd_invoice_amt_tax_incl←invoiceAmount;fd_tax_rate←taxRate÷100(13→0.13);fd_invoice_type←字典映射(§9-U3);fd_remark←remark;fd_contract_subject/fd_contract_no←**应付结算链路回溯**(收票→应付结算 FormalSettlement.contractId/No),回溯不到→页面补录 `hcs_contract_id/hcs_contract_no`;fd_ap_bill_src_subject←收票认领应付单号(键联调确认 §9-U11);附件转传 `fdEntityKey=fd_attach`、`fdBindType=ADD`。 +- 返回 `data.data.fdId → hcs_fd_id`(双层嵌套)。 + +### 5.9 主数据接口(C103-6/7/12)与查询(C103-3/4) + +- **启动/首次使用时拉取并缓存**(Redis,照 BFI token 缓存惯例,TTL 可配):模板列表(供 template-mapping 校验)、合同分类树、币种表(fdId 映射)。提供管理端"刷新缓存"端点。 +- **C103-3/C103-4**:判重与对账回查(按 fdNumber/fdId);C103-4 的 data 结构 v4 未定义,对账功能联调后补充。 + +--- + +## 6. 附件转传设计(HcsAttachmentSupport,D 补充 R2-Q5) + +1. 输入:单据 `attachmentsJson`/`contractFileJson`(JSON 元素含 url/fileType/approved 等,去重键照 `attachmentKey` 惯例 url|link|fileUrl|downloadUrl|uid|originalName)。 +2. 下载:按元数据 URL 从文件服务拉取流(文件服务基址可配 `attachment.file-download-base`)。 +3. 上传:C103-2 multipart(fdFile、fdAnonymous=false、fdLoginName=操作人)→ 附件 `fdId`。 +4. 映射缓存:Redis `hcs:att:{attachmentKey}` → 合规 fdId(TTL 7d),未命中重传(重复上传仅浪费存储,无业务风险,故不做持久化映射表)。 +5. 任一附件转传失败 → 整单推送失败进补偿重试。 + +--- + +## 7. 配置项清单(Nacos `third-party-api.yaml` → `thirdParty.hcs.*`) + +```yaml +thirdParty: + hcs: + base-url: http://172.16.203.134:8000/gwzh/HTHG # 网关前缀,直连/iPaaS 部署时改此处 + authorization: ${HCS_AUTHORIZATION:} # Authorization 头整值(含 Basic 前缀) + key-auth: ${HCS_KEY_AUTH:} # Key-Auth 头整值 + src-system: TMS # fd_sources + push: + sync-enabled: false # 总开关(默认关,灰度打开) + cron: "0 */5 * * * ?" + batch-size: 50 + max-retry: 5 + project: + template-code: "" # bpmOperation.templateCode(环境值) + contract: + template-mapping: {} # {TMS合同类别: HCS模板ID} + settlement-type-mapping: {} # {TMS结算方式: 付款|收款} + currency-name-mapping: {"RMB": "人民币"} + special-contract-enabled: false + require-risk-check: true + exe-stage: + fund-type: byAmount + risk: + check-on-contract: true + check-on-payment: true + block-blacklist: true + credit: + require-contract-synced: true + spec-pay: + doc-status: "10" + payment-purpose: "" # 字典值联调后配置 + payment-nature: "" + payment-type: "" + invoice: + invoice-type-mapping: {"electronic_normal": "", "electronic_special": ""} + currency-id-mapping: {"RMB": ""} # {TMS币种码: HCS币种fdId} + fund-nature-default: progress + receipt-bill: + invoice-type-mapping: {} + attachment: + transfer-enabled: true + file-download-base: "" +``` + +--- + +## 8. 实施拆分(建议排期) + +| 阶段 | 内容 | 依赖 | +|---|---|---| +| P0 基础 | blade-hcs-api 骨架:Feign/拦截器/认证头/DTO(24 接口全量 DTO)/分页工具;Nacos 配置段;统一字段组 SQL | 合规方提供测试环境地址与凭据 | +| P1 立项与合同 | ProjectApply/ContractManage 字段+Support+扫描任务+手动端点;C102-3/C103-3 判重;C103-6/7/12 缓存 | P0;模板ID清单(§9-U7) | +| P2 履约规则 | blade_contract_exe_stage 表+表单维护+C103-9 行级同步 | P1(合同先推送) | +| P3 付款链 | C106-1/C101-1 提交校验+check_log;特批字段组+C106-3/4;C108-1/2 | P1(合同 fdId) | +| P4 开票与收票 | C111-1/2/3(含金蝶回写联动);C109-1/2(含合同回溯/补录) | P0;开票/收票关联字段确认 | +| P5 运维收尾 | 对账查询页、失败重推批量、监控埋点(traceId 落日志)、多实例锁 | 全部 | + +**全部阶段通用**:Support 组装 HCS 请求 DTO 时按 §3.4 规范逐字段标注外部字段中文名与 TMS 取值来源(照 `pushArBill` 惯例),代码评审以此为一票否决项。 + +--- + +## 9. 未决事项(需合规方/联调确认) + +| # | 事项 | 影响 | +|---|---|---| +| U1 | **特批流程结果回传方式**:v4 无查询/回调接口 | 特批 approved/rejected 一期人工确认 | +| U2 | 组织/人员引用体系:HCS `{fdId,fdName}` 的 fdId 与 TMS 部门ID 不同源;登录名是否同源(见原文登录名截图) | 立项/合同操作人字段解析方式 | +| U3 | 字典值映射:fd_settlement_type、fd_invoice_type、付款用途/性质/类型、CONTRACT_STATUS 是否必传 | 各映射配置 | +| U4 | C103-3/C102-3/C111-1 conditions 是否支持 fdNumber/fd_num/fdKingdeeId 精确查询;HCS 是否按 fd_kingdee_id 幂等 | 判重与防重方案 | +| U5 | C103-11 updateDraft 如何定位已有合同 | 合同更新链路 | +| U6 | signer 相对方编号体系与 fdType(inner/外部)判定;C101-1 的 fdNumber 用客商哪个编码 | 合同签署方、风险校验 | +| U7 | 合规模板ID清单(template-mapping 数据源) | 合同推送 | +| U8 | **合同附件向 HCS 的传递方式**(C103-1 未定义附件字段) | 附件转传挂载点 | +| U9 | 立项 bpmOperation.templateCode 环境值;C108 fd_xform_id 环境值 | 立项/履约记录推送 | +| U10 | 开票申请→合同/应收结算的关联字段确认 | C111 fdContractNumber | +| U11 | 收票 fd_ap_bill_src_subject 关联键(应付单号体系) | C109 | +| U12 | C104/C107 收款流水与认领的推送方及链路 | 范围外备忘(ADR-0003) | diff --git a/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md b/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md index 570f222a..131f400d 100644 --- a/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md +++ b/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md @@ -15,9 +15,8 @@ | 组件 | 内容 | 状态 | |---|---|---| -| `feign/IHcsClient` | `@FeignClient(name="HCS", url="${thirdParty.hcs.baseUrl}")`,**24 个业务接口端点全部建成**(C101-1、C102-1/2/3、C103-1/2/3/4/5/6/7/9/11/12、C106-1/3/4、C108-1/2、C109-1/2、C111-1/2/3)+ OAuth2 getToken;URI 均可被 `thirdParty.hcs.*Url` 覆盖 | ✅ | -| `interceptor/HcsAuthInterceptor` | oauth2(URL 追加 access_token)/ basic(Authorization 头)双模式并存,切换只改配置;取令牌请求有路径+空令牌双重守卫 | ✅ | -| `token/HcsTokenService` | getToken → Redis(`blade:third:hcs:token`,120s 过期缓冲),`refreshAccessToken()` 供 401 强刷重放 | ✅ | +| `feign/IHcsClient` | `@FeignClient(name="HCS", url="${thirdParty.hcs.baseUrl}")`,**24 个业务接口端点全部建成**(C101-1、C102-1/2/3、C103-1/2/3/4/5/6/7/9/11/12、C106-1/3/4、C108-1/2、C109-1/2、C111-1/2/3);URI 均可被 `thirdParty.hcs.*Url` 覆盖 | ✅ | +| `interceptor/HcsAuthInterceptor` | 所有请求注入 `Authorization`(整值可配)+ `Key-Auth` 两个静态认证头(v4 接口说明,2026-10-01 变更;原 oauth2/getToken 与 basic 双模式已删除) | ✅ | | `config/HcsProperties` | `third-party.hcs.*` 全量配置(§7 清单 + master-data.ttl-minutes + perf-record.xform-id 两个落实性补充),含默认值 | ✅ | | `config/HcsFeignClientConfig` | connect 10s / read 60s,空拦截器覆盖全局,**无 Retryer**(D7) | ✅ | | `dto/`(49 个文件) | 24 接口全量请求/响应 DTO + `HcsResult`/`HcsPageVO`/引用对象等公共结构;字段按《桂物合同集成接口逻辑梳理》核对,双层嵌套(C106-3/4、C109-1/2)以 `HcsResult>` 承接 | ✅ | @@ -188,5 +187,5 @@ | `HcsInvoiceRegSyncSupport#requireContractNumber` | 应收结算回溯口径(§9-U10) | | `HcsInvoiceRegSyncSupport#latestInvoiceDate` | 票据日期取值口径(发票日期 vs 回写时间) | | `HcsReceiptBillSyncSupport#buildSaveParam` | fd_ap_bill_src_subject(§9-U11);作废推送缺接口依据 | -| `HcsTokenVO` / `HcsTokenService#cacheToken` | getToken 响应字段与 expires_in 单位(v4 未给出示例) | +| `HcsAuthInterceptor` | Authorization/Key-Auth 头对全部接口(含 C103-2 附件上传/下载)是否同样生效;网关密钥轮换时仅改 Nacos 配置 | | `HcsReconSupport#reconContractDetail` | C103-4 出参结构 | diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index d25cd9ad..d9736a3c 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -65,17 +65,12 @@ thirdParty: # 调度 cron,默认每10分钟 cron: ${BFI_PAY_RESULT_CRON:0 */10 * * * ?} hcs: - # 合同合规系统(HCS)开放接口地址,直连可配(网关/iPaaS 部署时改此处,代码不感知) - base-url: ${HCS_BASE_URL:http://127.0.0.1:8050} - # 认证方式:oauth2(默认,URL 追加 access_token)| basic(Authorization 请求头),切换不改代码 - auth-type: ${HCS_AUTH_TYPE:oauth2} - # OAuth2 应用 appKey - app-key: ${HCS_APP_KEY:} - # OAuth2 应用 appSecret,敏感值通过环境变量注入 - app-secret: ${HCS_APP_SECRET:} - # Basic 认证用户名/密码(auth-type=basic 时生效) - basic-username: ${HCS_BASIC_USER:} - basic-password: ${HCS_BASIC_PASSWORD:} + # 合同合规系统(HCS)开放接口地址(v4 接口说明:带网关前缀,直连可配,代码不感知) + base-url: ${HCS_BASE_URL:http://172.16.203.134:8000/gwzh/HTHG} + # Authorization 请求头整值(含 Basic 前缀,敏感值通过环境变量注入) + authorization: ${HCS_AUTHORIZATION:} + # Key-Auth 请求头值(v4 接口说明:所有接口固定携带 Authorization + Key-Auth 两个头) + key-auth: ${HCS_KEY_AUTH:} # 来源系统标识(fd_sources,约定值 TMS) src-system: ${HCS_SRC_SYSTEM:TMS} # 推送任务(扫描首推/补偿,P1 接线) From 03c874d4cde0b789e9ea36c0310becbc86c0f03d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 9 Oct 2026 09:39:14 +0800 Subject: [PATCH 024/124] =?UTF-8?q?fix:=20blade-hcs-api=E8=A1=A5=E5=85=85b?= =?UTF-8?q?lade-core-tool=E4=BE=9D=E8=B5=96=E4=BF=AE=E5=A4=8DFunc=E7=B1=BB?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blade-third-party-api/blade-hcs-api/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/blade-third-party-api/blade-hcs-api/pom.xml b/blade-third-party-api/blade-hcs-api/pom.xml index 148cb2c2..ff5c4ad2 100644 --- a/blade-third-party-api/blade-hcs-api/pom.xml +++ b/blade-third-party-api/blade-hcs-api/pom.xml @@ -15,6 +15,10 @@ BladeX 合同合规系统(HCS)API 契约模块 + + org.springblade + blade-core-tool + org.springframework.boot spring-boot-starter-test From 8c42bbb5c9494895543a273ba9d58836634f874a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 9 Oct 2026 12:00:23 +0800 Subject: [PATCH 025/124] =?UTF-8?q?feat:=20HCS=E4=B8=80=E6=9C=9F=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=E8=B0=83=E6=95=B4=EF=BC=8CC103-9/C106-1/C108-1/2?= =?UTF-8?q?=E6=9A=82=E4=B8=8D=E5=AF=B9=E6=8E=A5=E6=94=B9=E4=B8=BA=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=BC=80=E5=85=B3=E9=BB=98=E8=AE=A4=E5=85=B3=EF=BC=88?= =?UTF-8?q?exe-stage/credit/perf-record=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsContractSyncSupport.java | 5 ++++- .../transport/support/hcs/HcsCreditCheckSupport.java | 5 ++++- .../transport/support/hcs/HcsPaymentSyncSupport.java | 10 ++++++++-- .../org/springblade/hcs/config/HcsProperties.java | 12 ++++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 4cbaf90e..f98a1e61 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -130,7 +130,10 @@ public class HcsContractSyncSupport { markSynced(contractManage, contractManage.getHcsFdId(), "C103-11 合同更新成功"); resultMessage = "C103-11 合同更新成功"; } - // ⑤ 履约规则 C103-9 行级同步(随合同链路,§5.3;失败抛出由任务落 failed,下轮凭 hcs_fd_id 走更新补偿) + // ⑤ 履约规则 C103-9 行级同步(随合同链路,§5.3;一期暂不对接默认关,打开后失败抛出由任务落 failed,下轮凭 hcs_fd_id 走更新补偿) + if (!hcsProperties.getExeStage().isSyncEnabled()) { + return resultMessage; + } String exeStageResult = hcsExeStageSyncSupport.syncExeStages(contractManage); return resultMessage + ";" + exeStageResult; } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java index 34c9be20..371098cb 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java @@ -90,7 +90,10 @@ public class HcsCreditCheckSupport { if (hcsProperties.getRisk().isCheckOnPayment()) { checkRelativeRisk(payment); } - // ② 额度校验(超额不拦截,转特批) + // ② 额度校验(超额不拦截,转特批);一期暂不对接默认关,关闭后特批无自动触发 + if (!hcsProperties.getCredit().isCheckEnabled()) { + return; + } checkCredit(payment); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java index 8fbb1062..dab33eb7 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java @@ -29,6 +29,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.pojo.entity.PaymentApplication; @@ -56,6 +57,7 @@ public class HcsPaymentSyncSupport { private static final List APPROVED_STATUSES = List.of("approved"); private final PaymentApplicationMapper paymentApplicationMapper; + private final HcsProperties hcsProperties; private final HcsSpecPaySyncSupport hcsSpecPaySyncSupport; private final HcsPerfRecordSyncSupport hcsPerfRecordSyncSupport; @@ -67,11 +69,15 @@ public class HcsPaymentSyncSupport { */ public String pushPayment(PaymentApplication payment) { StringBuilder result = new StringBuilder(); - // ① 结算付款特批:提交时额度超额(hcs_spec_status=need)且未发起时发起 C106-3 + // ① 结算付款特批:提交时额度超额(hcs_spec_status=need)且未发起时发起 C106-3(C106-1 暂不对接后无自动置 need,仅历史数据/人工场景可达) if (HcsSyncConstant.SPEC_STATUS_NEED.equals(payment.getHcsSpecStatus())) { result.append(hcsSpecPaySyncSupport.pushSpecPay(payment)); } - // ② 履约记录:审批通过新建 C108-1 / 实际付款推进更新 C108-2 + // ② 履约记录:审批通过新建 C108-1 / 实际付款推进更新 C108-2(一期暂不对接默认关) + if (!hcsProperties.getPerfRecord().isSyncEnabled()) { + markSynced(payment, result.toString()); + return result.toString(); + } if (result.length() > 0) { result.append(";"); } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 8f490dde..caa2da84 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -163,6 +163,10 @@ public class HcsProperties { @Data public static class ExeStage { + /** + * 履约规则同步开关(C103-9 行级同步,一期暂不对接,默认关) + */ + private boolean syncEnabled = false; /** * 履约规则金额类型默认值(fdFundType) */ @@ -187,6 +191,10 @@ public class HcsProperties { @Data public static class Credit { + /** + * 额度校验开关(C106-1,一期暂不对接,默认关;关闭后特批无自动触发) + */ + private boolean checkEnabled = false; /** * 付款提交校验是否要求合同已推送合规(hcs_fd_id 存在) */ @@ -239,6 +247,10 @@ public class HcsProperties { @Data public static class PerfRecord { + /** + * 履约记录同步开关(C108-1/2,一期暂不对接,默认关) + */ + private boolean syncEnabled = false; /** * 履约记录表单模板ID(fd_xform_id,环境相关值,§9-U9 待合规方提供) */ From b96a17dbef9931e85888452abf2780ef74d2bbcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 9 Oct 2026 12:00:29 +0800 Subject: [PATCH 026/124] =?UTF-8?q?feat:=20HCS=20Nacos=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=AE=B5=E8=A1=A5=E5=85=85exe-stage/credit/perf-record?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=BC=80=E5=85=B3=EF=BC=88=E9=BB=98=E8=AE=A4?= =?UTF-8?q?false=EF=BC=8C=E4=B8=80=E6=9C=9F=E6=9A=82=E4=B8=8D=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/nacos/third-party-api.yaml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index d9736a3c..dc1e9919 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -99,8 +99,10 @@ thirdParty: special-contract-enabled: ${HCS_CONTRACT_SPECIAL_ENABLED:false} # 合同推送前是否强制客商风险校验 require-risk-check: ${HCS_CONTRACT_REQUIRE_RISK_CHECK:true} - # 履约规则(C103-9) + # 履约规则(C103-9,一期暂不对接) exe-stage: + # 履约规则行级同步开关(默认关,对接后打开) + sync-enabled: ${HCS_EXE_STAGE_SYNC_ENABLED:false} # 金额类型默认值(fdFundType) fund-type: ${HCS_EXE_STAGE_FUND_TYPE:byAmount} # 客商风险校验(C101-1) @@ -109,8 +111,10 @@ thirdParty: check-on-payment: ${HCS_RISK_CHECK_ON_PAYMENT:true} # 黑名单是否阻断(合同置 failed / 付款提交拦截) block-blacklist: ${HCS_RISK_BLOCK_BLACKLIST:true} - # 额度校验(C106-1) + # 额度校验(C106-1,一期暂不对接) credit: + # 额度校验开关(默认关,关闭后特批无自动触发,对接后打开) + check-enabled: ${HCS_CREDIT_CHECK_ENABLED:false} # 付款提交校验是否要求合同已推送合规 require-contract-synced: ${HCS_CREDIT_REQUIRE_CONTRACT_SYNCED:true} # 结算付款特批(C106-3/4) @@ -133,8 +137,10 @@ thirdParty: receipt-bill: # TMS 发票类型 -> HCS 收票发票类型字典值(§9-U3 待联调后配置) invoice-type-mapping: {} - # 履约记录(C108-1/2) + # 履约记录(C108-1/2,一期暂不对接) perf-record: + # 履约记录同步开关(默认关,对接后打开) + sync-enabled: ${HCS_PERF_RECORD_SYNC_ENABLED:false} # 表单模板ID(fd_xform_id,环境相关值,§9-U9 待合规方提供) xform-id: ${HCS_PERF_RECORD_XFORM_ID:} # 附件转传(C103-2) From 4cd7fb24df92091f782004773ff12acff1fd4b97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 9 Oct 2026 12:00:39 +0800 Subject: [PATCH 027/124] =?UTF-8?q?docs:=20HCS=E8=AE=BE=E8=AE=A1=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E4=B8=8E=E5=AE=9E=E6=96=BD=E6=B8=85=E5=8D=95=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E4=B8=80=E6=9C=9F=E8=8C=83=E5=9B=B4=E8=B0=83=E6=95=B4?= =?UTF-8?q?=EF=BC=8820=E6=8E=A5=E5=8F=A3=E5=8F=A3=E5=BE=84=EF=BC=8CC103-9/?= =?UTF-8?q?C106-1/C108=E8=AE=B0=E5=BD=95=E6=9A=82=E4=B8=8D=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5=E5=8F=8A=E7=89=B9=E6=89=B9=E8=A7=A6=E5=8F=91=E5=BD=B1?= =?UTF-8?q?=E5=93=8D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2026-09-27-桂物合同合规系统HCS接入技术设计.md | 18 ++++++++++++------ .../2026-09-28-HCS接入实施状态与确认清单.md | 11 +++++++---- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md index 64822019..a5d16f3a 100644 --- a/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md +++ b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md @@ -16,7 +16,7 @@ | D1 | 客户端模块 | 新建 `blade-third-party-api/blade-hcs-api`,客户端 `IHcsClient`,配置前缀 `thirdParty.hcs.*`(照 blade-bfi-api 模式) | | D2 | 认证 | v4 接口说明:所有接口固定携带 `Authorization`(整值可配)+ `Key-Auth` 两个静态请求头,由拦截器统一注入,不再调用 getToken 取令牌 | | D3 | 网络 | 直连 `base-url` 可配置(Nacos),预留 iPaaS 前缀能力,代码不感知 | -| D4 | 范围 | 一期 24 个接口:C101-1、C102-1/2/3、C103-1/2/3/4/6/7/9(新)/11/12、C106-1/3/4、C108-1/2、C109-1/2、C111-1/2/3;排除 C104、C107、废弃旧履约接口 | +| D4 | 范围 | 一期 20 个接口:C101-1、C102-1/2/3、C103-1/2/3/4/5/6/7/11/12、C106-3/4、C109-1/2、C111-1/2/3;排除 C104、C107、C103-9(新)/C103-10旧、C106-1、C108-1/2(范围调整见 §2.2) | | D5 | TMS 角色 | TMS 是业务发起方:立项/合同/履约规则/特批/开票/收票/履约记录由 TMS 推送 | | D6 | 落库模式 | 业务表加 `hcs_*` 集成字段;新建履约规则表 `blade_contract_exe_stage`;不建合规镜像库 | | D7 | 可靠性 | 同步状态机 + `@Scheduled` 扫描首推/补偿 + 页面手动重推;Feign 无自动 Retryer;写前判重查询 | @@ -33,7 +33,7 @@ ## 2. 范围 -### 2.1 接口范围(24 个) +### 2.1 接口范围(20 个,2026-10-09 调整:C103-9/C106-1/C108-1/2 暂不对接) | 场景组 | 接口 | TMS 触发业务 | |---|---|---| @@ -41,17 +41,18 @@ | 合同 | C103-1 发起 / C103-11 更新 / C103-3 列表 / C103-4 详情 | ContractManage 审批通过 / 变更审批通过 / 判重与回查 | | 附件 | C103-2 上传(下载 C103-5 备用) | 各单据推送前附件转传 | | 主数据 | C103-6 模板 / C103-7 分类 / C103-12 币种 | 下拉/映射(模板ID、币种ID 缓存) | -| 履约规则 | C103-9(新) 行级同步 | blade_contract_exe_stage(合同维度) | | 客商风险 | C101-1 | 合同推送前 + 付款提交前校验 | -| 额度与特批 | C106-1 校验 / C106-3 特批发起 / C106-4 特批更新 | PaymentApplication 提交时 / 审批通过后 | -| 履约记录 | C108-1 新增 / C108-2 更新 | PaymentApplication 审批通过 / 实际付款推进 | +| 额度与特批 | C106-3 特批发起 / C106-4 特批更新 | ~~额度超额自动转特批~~ 暂无自动触发(依赖 C106-1,见 §2.2) | | 开票登记 | C111-1 查询 / C111-2 新增 / C111-3 更新 | InvoiceApplication 审批通过 / 金蝶开票完成 | | 收票单 | C109-1 新建 / C109-2 更新 | InvoiceReceipt 审批通过 / 票据变更 | ### 2.2 明确排除(No-s) +- **2026-10-09 范围调整(暂不对接,代码开关默认关闭,接入时打开配置即可)**: + - **C103-9(新)履约计划保存 / C103-10旧 履约计划更新**:合同链路第⑤步履约规则同步跳过(`exe-stage.sync-enabled=false`),`blade_contract_exe_stage` 表与维护端点保留,仅不再上报 HCS。 + - **C106-1 额度校验**:付款提交校验只保留 C101-1 客商风险(`credit.check-enabled=false`);特批 C106-3 失去自动触发源(原依赖 fdIsCredit=false 置 need),暂无自动触发。 + - **C108-1/C108-2 履约记录**:付款链路跳过履约记录推送(`perf-record.sync-enabled=false`),付款单直接置 synced。 - **C104 收款流水(C104-1/2/3)、C107 认领记录(C107-1/2/3)**:不由 TMS 推送,推送方与链路待定(见 ADR-0003)。 -- **C103-9旧 / C103-10旧**:合规方已废弃,不接。 - 附件下载 C103-5:仅在对账/排查需要时备用接入。 --- @@ -365,18 +366,23 @@ thirdParty: special-contract-enabled: false require-risk-check: true exe-stage: + sync-enabled: false # C103-9 履约规则同步开关(一期暂不对接,默认关) fund-type: byAmount risk: check-on-contract: true check-on-payment: true block-blacklist: true credit: + check-enabled: false # C106-1 额度校验开关(一期暂不对接,默认关;关闭后特批无自动触发) require-contract-synced: true spec-pay: doc-status: "10" payment-purpose: "" # 字典值联调后配置 payment-nature: "" payment-type: "" + perf-record: + sync-enabled: false # C108-1/2 履约记录同步开关(一期暂不对接,默认关) + xform-id: "" invoice: invoice-type-mapping: {"electronic_normal": "", "electronic_special": ""} currency-id-mapping: {"RMB": ""} # {TMS币种码: HCS币种fdId} diff --git a/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md b/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md index 131f400d..ed57b841 100644 --- a/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md +++ b/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md @@ -32,10 +32,10 @@ |---|---|---| | `HcsProjectSyncSupport` | C102-3 判重(命中回填跳过)→ C102-1 新建 / C102-2 更新;万元×10000 换算;合规 fdId 回填;手动重推 | ✅ | | `HcsContractSyncSupport` | 链路编排:①C101-1 甲乙双方风险校验(留痕 check_log + `hcs_risk_*`,黑名单且 block-blacklist 阻断)→ ②附件转传 → ③C103-3 判重 → ④C103-1 起草/C103-11 更新(先持久化 fdId 再走后续)→ ⑤履约规则同步 | ✅ | -| `HcsExeStageSyncSupport` | C103-9 行级同步:聚合 row_op 非 none 行(add 不带 fdId、update/delete 必带),整体操作首推 add/后续 update;fdExeplanId 与阶段 fdId 按行回填持久化;软删行经原生 SQL 照常上报 delete | ✅ | -| `HcsCreditCheckSupport` | 付款提交事务内同步校验:C101-1 黑名单阻断提交;C106-1 超额不拦截、置 over + spec=need 转特批(超额时 success 仍 true,以 fdIsCredit 为准) | ✅ | -| `HcsSpecPaySyncSupport` | C106-3 发起(双层嵌套 fdId → hcs_spec_fd_id,状态 processing)/ C106-4 更新;特批附件 fdEntityKey=fd_spc_approval_attach、发起带 fdBindType=ADD | ✅ | -| `HcsPerfRecordSyncSupport` | C108-1 新建(fdId 回填 hcs_perf_fd_id)/ C108-2 更新(实际金额);关联履约阶段 fd_id;附件 fd_plan_att | ✅ | +| `HcsExeStageSyncSupport` | C103-9 行级同步:聚合 row_op 非 none 行(add 不带 fdId、update/delete 必带),整体操作首推 add/后续 update;fdExeplanId 与阶段 fdId 按行回填持久化;软删行经原生 SQL 照常上报 delete。**2026-10-09 调整:一期暂不对接,`exe-stage.sync-enabled` 默认关,合同链路跳过本步骤** | ✅(开关默认关) | +| `HcsCreditCheckSupport` | 付款提交事务内同步校验:C101-1 黑名单阻断提交;C106-1 超额不拦截、置 over + spec=need 转特批(超额时 success 仍 true,以 fdIsCredit 为准)。**2026-10-09 调整:C106-1 一期暂不对接,`credit.check-enabled` 默认关,仅保留 C101-1;关闭后特批无自动触发** | ✅(C106-1 开关默认关) | +| `HcsSpecPaySyncSupport` | C106-3 发起(双层嵌套 fdId → hcs_spec_fd_id,状态 processing)/ C106-4 更新;特批附件 fdEntityKey=fd_spc_approval_attach、发起带 fdBindType=ADD。**C106-1 暂不对接后无自动置 need,仅历史数据/人工场景可达** | ✅ | +| `HcsPerfRecordSyncSupport` | C108-1 新建(fdId 回填 hcs_perf_fd_id)/ C108-2 更新(实际金额);关联履约阶段 fd_id;附件 fd_plan_att。**2026-10-09 调整:一期暂不对接,`perf-record.sync-enabled` 默认关,付款链路跳过履约记录直接置 synced** | ✅(开关默认关) | | `HcsPaymentSyncSupport` | 付款链编排(特批→履约记录)+ 整体状态回写 + 特批结果人工确认(§9-U1 过渡) | ✅ | | `HcsInvoiceRegSyncSupport` | C111-1 判重 / C111-2 新增 / C111-3 票据日期回填(金蝶回写发票最新 invoiceDate);合同编号经应收结算链路回溯 | ✅ | | `HcsReceiptBillSyncSupport` | C109-1 新建(双层嵌套 fdId)/ C109-2 更新;合同回溯 + 人工补录兜底;税率 ÷100;fd_bill_date 为 YYYY-MM-DD 字符串 | ✅ | @@ -91,6 +91,9 @@ | 项 | 说明 | |---|---| +| **C103-9 履约计划保存 / C103-10 履约计划更新(2026-10-09 范围调整)** | 一期暂不对接:合同链路第⑤步跳过(`exe-stage.sync-enabled=false`);`blade_contract_exe_stage` 表与维护端点保留,仅不上报 HCS;C103-10旧 合规方本已废弃 | +| **C106-1 额度校验(2026-10-09 范围调整)** | 一期暂不对接:付款提交校验只保留 C101-1(`credit.check-enabled=false`);特批 C106-3 失去自动触发源,暂无自动触发(历史 need 数据/人工场景仍可推) | +| **C108-1/C108-2 履约记录(2026-10-09 范围调整)** | 一期暂不对接:付款链路跳过履约记录推送(`perf-record.sync-enabled=false`),付款单直接置 synced | | C104 收款流水(C104-1/2/3)、C107 认领记录(C107-1/2/3) | ADR-0003 边界排除:推送方与链路待定,TMS 不承担;Feign 端点也未建 | | 付款申请/开票/收票的 MK 处理器**补齐** | 约束"他人负责"。注:现状 PaymentHandler 实际已由他人注册(探索发现),本次仅按零埋点约定补了 1 行状态置位,未动处理器归属;开票/收票仍无 MK 处理器,直批入口已接线,未来新处理器只要置 approved 即被扫描自动覆盖 | | 前端页面改动 | 列表页"推送合规/重推"按钮、履约规则页签、特批结果确认入口、对账查询页——本次只交付后端端点,前端(tms-erp-web)未动 | From 6c645603b69ce5555045dacee810cd38706ce8b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 9 Oct 2026 12:16:29 +0800 Subject: [PATCH 028/124] =?UTF-8?q?feat:=20HCS=E6=8E=A8=E9=80=81=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=8C=89=E4=B8=9A=E5=8A=A1=E7=B1=BB=E5=9E=8B=E6=8B=86?= =?UTF-8?q?=E5=88=86=E7=8B=AC=E7=AB=8B=E8=B0=83=E5=BA=A6=EF=BC=88=E5=90=84?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=8B=AC=E7=AB=8B=E5=BC=80=E5=85=B3=E4=B8=8E?= =?UTF-8?q?cron=E9=94=99=E5=B3=B0=E3=80=81=E4=BB=BB=E5=8A=A1=E7=BA=A7?= =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81=E3=80=81=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=B8=8E=E9=85=8D=E7=BD=AE=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/constant/HcsSyncConstant.java | 4 +- .../transport/task/HcsPushTask.java | 123 +++++++++++++++--- .../springblade/hcs/config/HcsProperties.java | 12 +- 3 files changed, 106 insertions(+), 33 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 8515dabd..c0714e09 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 @@ -171,9 +171,9 @@ public final class HcsSyncConstant { public static final long ATTACHMENT_CACHE_TTL_DAYS = 7L; /** - * 推送任务分布式锁 key(多实例部署防重扫) + * 推送任务分布式锁 key 前缀(多实例部署防重扫,完整 key = 前缀 + 业务类型,任务间互不阻塞) */ - public static final String PUSH_TASK_LOCK_KEY = "blade:third:hcs:push:task:lock"; + public static final String PUSH_TASK_LOCK_KEY_PREFIX = "blade:third:hcs:push:task:lock:"; private HcsSyncConstant() { } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java index 74f1b422..98d60bd9 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java @@ -54,17 +54,28 @@ import org.springframework.stereotype.Component; import java.time.Duration; import java.util.List; import java.util.UUID; +import java.util.function.Supplier; /** * HCS 合规推送定时扫描任务(设计文档 §5.0,ADR-0001) *

    * 审批代码零埋点:扫描只认 approvalStatus=approved/change_approved 且 hcs_sync_status=unsynced/failed(重试未超限), * 与审批入口(/approve、MK 回调)无关;失败落 failed 由下轮扫描自动补偿,超限仅人工重推(D7)。 - * 任务顺序:项目 → 合同(内含风险校验→附件转传→C103-1→履约规则 C103-9 行级同步)→ 付款特批/履约记录。 - * 多实例部署时以 Redis 分布式锁防重扫(照既有 BladeRedis 用法,单实例部署行为与既有金蝶任务一致)。 - * 扫描与推送逻辑收敛在 pushUnsyncedProjects/pushUnsyncedContracts/pushUnsyncedPayments,供手动端点(HcsSyncController)复用。 *

    - * 调度配置(Nacos thirdParty.hcs.push.*):sync-enabled 总开关(默认关,灰度打开)、cron、batch-size、max-retry。 + * 五类任务各自独立调度、独立开关(Nacos thirdParty.hcs.push.{bizType}.*): + *

    + * bizType             说明                                        配置节点
    + * project             项目立项 C102                               thirdParty.hcs.push.project.*
    + * contract            合同 C103(内含风险校验/附件转传/履约规则) thirdParty.hcs.push.contract.*
    + * payment             付款特批 C106-3 + 履约记录 C108              thirdParty.hcs.push.payment.*
    + * invoice-application 开票登记 C111(含金蝶开票回填)              thirdParty.hcs.push.invoice-application.*
    + * invoice-receipt     收票单 C109                                 thirdParty.hcs.push.invoice-receipt.*
    + * 
    + * 每个任务配置项:sync-enabled 开关(默认关,灰度打开)、cron 调度(默认每 5 分钟,各任务分钟位错峰 + * 0/1/2/3/4,避免同刻并发扫描与 HCS 接口流量尖峰);batch-size/max-retry 为全局配置(thirdParty.hcs.push.*), + * 见 {@link HcsProperties.Push}。 + * 多实例部署时按任务隔离 Redis 分布式锁防重扫(setIfAbsent + 持有值比对释放,TTL 240s),任务间互不阻塞。 + * 扫描与推送逻辑收敛在 pushUnsyncedProjects/pushUnsyncedContracts/pushUnsyncedPayments 等方法,供手动端点(HcsSyncController)复用。 * * @author Chill */ @@ -74,7 +85,7 @@ import java.util.UUID; public class HcsPushTask { /** - * 分布式锁 TTL(秒):须小于 cron 间隔(默认 5 分钟)且大于单轮预期执行时长,实例崩溃后锁自动过期 + * 分布式锁 TTL(秒):须小于各任务 cron 间隔(默认 5 分钟)且大于单轮预期执行时长,实例崩溃后锁自动过期 */ private static final long PUSH_TASK_LOCK_TTL_SECONDS = 240L; @@ -97,37 +108,107 @@ public class HcsPushTask { private final BladeRedis bladeRedis; /** - * HCS 推送任务开关,默认关闭(灰度打开) + * 项目立项(C102)推送开关,默认关闭(Nacos thirdParty.hcs.push.project.sync-enabled,灰度打开) */ - @Value("${thirdParty.hcs.push.sync-enabled:false}") - private boolean syncEnabled; + @Value("${thirdParty.hcs.push.project.sync-enabled:false}") + private boolean projectSyncEnabled; /** - * HCS 推送调度,默认每 5 分钟(准实时首推) + * 合同(C103)推送开关,默认关闭(Nacos thirdParty.hcs.push.contract.sync-enabled,灰度打开) */ - @Scheduled(cron = "${thirdParty.hcs.push.cron:0 */5 * * * ?}") - public void pushHcs() { + @Value("${thirdParty.hcs.push.contract.sync-enabled:false}") + private boolean contractSyncEnabled; + + /** + * 付款链(C106 特批 / C108 履约记录)推送开关,默认关闭(Nacos thirdParty.hcs.push.payment.sync-enabled,灰度打开) + */ + @Value("${thirdParty.hcs.push.payment.sync-enabled:false}") + private boolean paymentSyncEnabled; + + /** + * 开票登记(C111)推送开关,默认关闭(Nacos thirdParty.hcs.push.invoice-application.sync-enabled,灰度打开) + */ + @Value("${thirdParty.hcs.push.invoice-application.sync-enabled:false}") + private boolean invoiceApplicationSyncEnabled; + + /** + * 收票单(C109)推送开关,默认关闭(Nacos thirdParty.hcs.push.invoice-receipt.sync-enabled,灰度打开) + */ + @Value("${thirdParty.hcs.push.invoice-receipt.sync-enabled:false}") + private boolean invoiceReceiptSyncEnabled; + + /** + * 项目立项(C102)定时推送:扫描审批通过且待同步/待补偿的项目,独立开关与 cron 调度 + */ + @Scheduled(cron = "${thirdParty.hcs.push.project.cron:0 */5 * * * ?}") + public void pushHcsProject() { + this.runOnce("项目立项", HcsSyncConstant.BIZ_TYPE_PROJECT, projectSyncEnabled, this::pushUnsyncedProjects); + } + + /** + * 合同(C103)定时推送:扫描审批通过且待同步/待补偿的合同(含风险校验→附件转传→C103-1→履约规则 C103-9 行级同步), + * 独立开关与 cron 调度 + */ + @Scheduled(cron = "${thirdParty.hcs.push.contract.cron:0 1/5 * * * ?}") + public void pushHcsContract() { + this.runOnce("合同", HcsSyncConstant.BIZ_TYPE_CONTRACT, contractSyncEnabled, this::pushUnsyncedContracts); + } + + /** + * 付款链(C106 特批 / C108 履约记录)定时推送:扫描审批通过且待同步/待补偿的付款申请,独立开关与 cron 调度 + */ + @Scheduled(cron = "${thirdParty.hcs.push.payment.cron:0 2/5 * * * ?}") + public void pushHcsPayment() { + this.runOnce("付款链", HcsSyncConstant.BIZ_TYPE_PAYMENT, paymentSyncEnabled, this::pushUnsyncedPayments); + } + + /** + * 开票登记(C111)定时推送:扫描审批通过且待同步/待补偿的开票申请(含金蝶开票完成后回填),独立开关与 cron 调度 + */ + @Scheduled(cron = "${thirdParty.hcs.push.invoice-application.cron:0 3/5 * * * ?}") + public void pushHcsInvoiceApplication() { + this.runOnce("开票登记", HcsSyncConstant.BIZ_TYPE_INVOICE_APPLICATION, invoiceApplicationSyncEnabled, this::pushUnsyncedInvoiceApplications); + } + + /** + * 收票单(C109)定时推送:扫描审批通过且待同步/待补偿的收票单,独立开关与 cron 调度 + */ + @Scheduled(cron = "${thirdParty.hcs.push.invoice-receipt.cron:0 4/5 * * * ?}") + public void pushHcsInvoiceReceipt() { + this.runOnce("收票单", HcsSyncConstant.BIZ_TYPE_INVOICE_RECEIPT, invoiceReceiptSyncEnabled, this::pushUnsyncedInvoiceReceipts); + } + + /** + * 单任务执行模板:开关校验 → 分布式锁抢锁 → 执行推送 → 持有值比对后释放。 + * 锁按业务类型隔离,各任务可并行调度互不阻塞;TTL 见 {@link #PUSH_TASK_LOCK_TTL_SECONDS}。 + * + * @param taskName 任务中文名(用于日志定位) + * @param bizType 业务类型(同时作为锁 key 后缀) + * @param syncEnabled 该任务的独立开关(thirdParty.hcs.push.{bizType}.sync-enabled) + * @param pushAction 推送动作,返回结果汇总描述 + */ + private void runOnce(String taskName, String bizType, boolean syncEnabled, Supplier pushAction) { if (!syncEnabled) { + // 开关未开启属常态(灰度),debug 级别避免轮询刷屏 + log.debug("HCS{}推送任务未开启(thirdParty.hcs.push.{}.sync-enabled),本轮跳过", taskName, bizType); return; } // 多实例部署防重扫:setIfAbsent 抢锁,持有值比对后释放 + String lockKey = HcsSyncConstant.PUSH_TASK_LOCK_KEY_PREFIX + bizType; String lockHolder = UUID.randomUUID().toString(); Boolean locked = bladeRedis.getValueOps() - .setIfAbsent(HcsSyncConstant.PUSH_TASK_LOCK_KEY, lockHolder, Duration.ofSeconds(PUSH_TASK_LOCK_TTL_SECONDS)); + .setIfAbsent(lockKey, lockHolder, Duration.ofSeconds(PUSH_TASK_LOCK_TTL_SECONDS)); if (!Boolean.TRUE.equals(locked)) { - log.info("HCS推送任务其他实例执行中,本轮跳过"); + log.info("HCS{}推送任务其他实例执行中(lockKey={}),本轮跳过", taskName, lockKey); return; } try { - // 任务顺序(设计文档 §5.0):项目 → 合同 → 付款 → 开票 → 收票;各类互不影响 - log.info("定时推送HCS项目立项:{}", pushUnsyncedProjects()); - log.info("定时推送HCS合同:{}", pushUnsyncedContracts()); - log.info("定时推送HCS付款链:{}", pushUnsyncedPayments()); - log.info("定时推送HCS开票登记:{}", pushUnsyncedInvoiceApplications()); - log.info("定时推送HCS收票单:{}", pushUnsyncedInvoiceReceipts()); + log.info("HCS{}推送任务开始执行", taskName); + String summary = pushAction.get(); + log.info("HCS{}推送任务执行完成:{}", taskName, summary); } finally { - if (lockHolder.equals(bladeRedis.get(HcsSyncConstant.PUSH_TASK_LOCK_KEY))) { - bladeRedis.del(HcsSyncConstant.PUSH_TASK_LOCK_KEY); + if (lockHolder.equals(bladeRedis.get(lockKey))) { + bladeRedis.del(lockKey); } } } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index caa2da84..e28256dc 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -112,19 +112,11 @@ public class HcsProperties { @Data public static class Push { /** - * 推送任务总开关(默认关,灰度打开) - */ - private boolean syncEnabled = false; - /** - * 扫描调度 cron,默认每 5 分钟 - */ - private String cron = "0 */5 * * * ?"; - /** - * 每类单据单轮扫描批量 + * 每类单据单轮扫描批量(全局) */ private int batchSize = 50; /** - * 推送失败自动重试上限,超限仅人工重推 + * 推送失败自动重试上限,超限仅人工重推(全局) */ private int maxRetry = 5; } From d09e4faf0b93f4e2923303853a3ec278bc877db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 9 Oct 2026 14:56:11 +0800 Subject: [PATCH 029/124] =?UTF-8?q?feat:=20HCS=E9=85=8D=E7=BD=AE=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E9=BB=98=E8=AE=A4=E9=89=B4=E6=9D=83=E5=A4=B4=E4=B8=8E?= =?UTF-8?q?=E7=AB=8B=E9=A1=B9=E6=A8=A1=E6=9D=BF=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/nacos/third-party-api.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index dc1e9919..4b004a6f 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -64,13 +64,14 @@ thirdParty: syncEnabled: ${BFI_PAY_RESULT_SYNC_ENABLED:false} # 调度 cron,默认每10分钟 cron: ${BFI_PAY_RESULT_CRON:0 */10 * * * ?} + # 合同合规系统 hcs: # 合同合规系统(HCS)开放接口地址(v4 接口说明:带网关前缀,直连可配,代码不感知) - base-url: ${HCS_BASE_URL:http://172.16.203.134:8000/gwzh/HTHG} + baseUrl: ${HCS_BASE_URL:http://172.16.203.134:8000/gwzh/HTHG} # Authorization 请求头整值(含 Basic 前缀,敏感值通过环境变量注入) - authorization: ${HCS_AUTHORIZATION:} + authorization: ${HCS_AUTHORIZATION:Basic d2NjazprJDdQcVIyIXNCdjkmbkc0} # Key-Auth 请求头值(v4 接口说明:所有接口固定携带 Authorization + Key-Auth 两个头) - key-auth: ${HCS_KEY_AUTH:} + key-auth: ${HCS_KEY_AUTH:3F7e8yI6RV8S53mJ9tYa0672r3W4n279} # 来源系统标识(fd_sources,约定值 TMS) src-system: ${HCS_SRC_SYSTEM:TMS} # 推送任务(扫描首推/补偿,P1 接线) @@ -86,7 +87,7 @@ thirdParty: # 项目立项(C102) project: # 立项 bpmOperation.templateCode(环境相关值,§9-U9 待合规方提供) - template-code: ${HCS_PROJECT_TEMPLATE_CODE:} + template-code: ${HCS_PROJECT_TEMPLATE_CODE:template_15x0og} # 合同(C103-1/11) contract: # TMS 合同类别 -> HCS 模板ID(§9-U7 待合规方提供模板清单) From 257fbb865c074158935ca0ee0f58d0bede7350e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 9 Oct 2026 15:06:20 +0800 Subject: [PATCH 030/124] =?UTF-8?q?fix:=20=E8=A1=A5=E5=85=85blade-hcs-api?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=A3=85=E9=85=8D=E6=B3=A8=E5=86=8C=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E4=BF=AE=E5=A4=8DHcsProperties=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=E5=A4=B1=E8=B4=A5=E5=AF=BC=E8=87=B4=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....springframework.boot.autoconfigure.AutoConfiguration.imports | 1 + 1 file changed, 1 insertion(+) create mode 100644 blade-third-party-api/blade-hcs-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports diff --git a/blade-third-party-api/blade-hcs-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/blade-third-party-api/blade-hcs-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..17faaaa5 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.springblade.hcs.config.ThirdPartyHcsAutoConfiguration From 5e6ff084607e679c463fe062e3679eb95e7f33a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 9 Oct 2026 17:49:19 +0800 Subject: [PATCH 031/124] =?UTF-8?q?feat:=20HCS=E9=85=8D=E7=BD=AE=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E9=BB=98=E8=AE=A4=E9=89=B4=E6=9D=83=E5=A4=B4=E4=B8=8E?= =?UTF-8?q?=E7=AB=8B=E9=A1=B9=E6=A8=A1=E6=9D=BF=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/nacos/third-party-api.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 4b004a6f..7af9603e 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -67,7 +67,7 @@ thirdParty: # 合同合规系统 hcs: # 合同合规系统(HCS)开放接口地址(v4 接口说明:带网关前缀,直连可配,代码不感知) - baseUrl: ${HCS_BASE_URL:http://172.16.203.134:8000/gwzh/HTHG} + baseUrl: ${HCS_BASE_URL:http://172.16.203.134:8000/gwzh/BFI} # Authorization 请求头整值(含 Basic 前缀,敏感值通过环境变量注入) authorization: ${HCS_AUTHORIZATION:Basic d2NjazprJDdQcVIyIXNCdjkmbkc0} # Key-Auth 请求头值(v4 接口说明:所有接口固定携带 Authorization + Key-Auth 两个头) From e41863d7f78044f4b6314882db711cdbb637e155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 9 Oct 2026 18:35:06 +0800 Subject: [PATCH 032/124] =?UTF-8?q?:zap:=20=E4=B8=BA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=B1=BB=E6=B7=BB=E5=8A=A0@RefreshScope=E6=94=AF=E6=8C=81Nacos?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8A=A8=E6=80=81=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/springblade/transport/config/BfiProperties.java | 2 ++ .../transport/service/impl/InvoiceReceiptServiceImpl.java | 2 ++ .../org/springblade/transport/task/CustomerKingdeeSyncTask.java | 2 ++ .../main/java/org/springblade/transport/task/HcsPushTask.java | 2 ++ .../springblade/transport/task/PaymentKingdeeResultTask.java | 2 ++ 5 files changed, 10 insertions(+) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/config/BfiProperties.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/config/BfiProperties.java index 75650185..e072994f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/config/BfiProperties.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/config/BfiProperties.java @@ -28,6 +28,7 @@ package org.springblade.transport.config; import lombok.Data; import org.springblade.thirdparty.bfi.constant.BfiConstant; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; /** @@ -42,6 +43,7 @@ import org.springframework.stereotype.Component; */ @Data @Component +@RefreshScope @ConfigurationProperties(prefix = "thirdparty.bfi") public class BfiProperties { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceReceiptServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceReceiptServiceImpl.java index bed5b75b..b80dba04 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceReceiptServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceReceiptServiceImpl.java @@ -78,6 +78,7 @@ import org.springblade.transport.support.KingdeeApBillSyncSupport; import org.springblade.transport.support.KingdeeReceivedInvoiceSyncSupport; import org.springblade.transport.wrapper.InvoiceReceiptWrapper; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -104,6 +105,7 @@ import java.util.stream.Collectors; */ @Slf4j @Service +@RefreshScope @RequiredArgsConstructor public class InvoiceReceiptServiceImpl extends BaseServiceImpl implements IInvoiceReceiptService { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/CustomerKingdeeSyncTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/CustomerKingdeeSyncTask.java index a0f0a2ec..6d4162d4 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/CustomerKingdeeSyncTask.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/CustomerKingdeeSyncTask.java @@ -29,6 +29,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.transport.service.ICustomerArchiveService; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -47,6 +48,7 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component +@RefreshScope @RequiredArgsConstructor public class CustomerKingdeeSyncTask { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java index 98d60bd9..c7d98003 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java @@ -48,6 +48,7 @@ import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; import org.springblade.transport.support.hcs.HcsProjectSyncSupport; import org.springblade.transport.support.hcs.HcsReceiptBillSyncSupport; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -81,6 +82,7 @@ import java.util.function.Supplier; */ @Slf4j @Component +@RefreshScope @RequiredArgsConstructor public class HcsPushTask { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/PaymentKingdeeResultTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/PaymentKingdeeResultTask.java index 5c7dec13..8f4edbce 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/PaymentKingdeeResultTask.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/PaymentKingdeeResultTask.java @@ -26,6 +26,7 @@ import org.springblade.transport.service.IInvoiceApplicationService; import org.springblade.transport.service.IInvoiceReceiptService; import org.springblade.transport.service.IPaymentApplicationService; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -47,6 +48,7 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component +@RefreshScope @RequiredArgsConstructor public class PaymentKingdeeResultTask { From 7855254a4f4be31a72ac959d2869788a56e8a472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 9 Oct 2026 19:45:40 +0800 Subject: [PATCH 033/124] =?UTF-8?q?feat:=20=E7=AB=8B=E9=A1=B9=E4=B8=8E?= =?UTF-8?q?=E5=90=88=E5=90=8CHCS=E5=89=8D=E7=AB=AF=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E9=85=8D=E5=A5=97=E7=AB=AF=E7=82=B9=E2=80=94=E2=80=94C103-8?= =?UTF-8?q?=E5=90=88=E5=90=8C=E7=89=B9=E6=89=B9=E5=8F=91=E8=B5=B7/B103?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E5=9B=9E=E4=BC=A0=E3=80=81C103-2/5=E9=99=84?= =?UTF-8?q?=E4=BB=B6=E4=BB=A3=E7=90=86=E3=80=81C101-1=E9=A3=8E=E9=99=A9?= =?UTF-8?q?=E4=B8=8EC103-6/12=E4=B8=BB=E6=95=B0=E6=8D=AE=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=EF=BC=8C=E5=90=88=E5=90=8C=E6=8E=A8=E9=80=81=E9=AB=98=E9=A3=8E?= =?UTF-8?q?=E9=99=A9=E5=AE=A2=E5=95=86=E6=8C=82=E8=B5=B7=E5=BE=85=E7=89=B9?= =?UTF-8?q?=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/pojo/entity/ContractManage.java | 17 + .../transport/constant/HcsSyncConstant.java | 5 + .../controller/HcsSyncController.java | 140 +++++++ .../support/hcs/HcsAttachmentSupport.java | 39 ++ .../hcs/HcsContractSpecSyncSupport.java | 352 ++++++++++++++++++ .../support/hcs/HcsContractSyncSupport.java | 38 +- .../support/hcs/HcsCreditCheckSupport.java | 38 ++ .../hcs/dto/HcsSpecContractSaveDTO.java | 77 ++++ .../org/springblade/hcs/feign/IHcsClient.java | 15 + .../2026-10-09-项目立项与合同HCS前端接入设计.md | 254 +++++++++++++ ...lade_hcs_contract_spec_fields_20261009.sql | 41 ++ doc/sql/transport/blade_hcs_menu_20261009.sql | 11 + 12 files changed, 1018 insertions(+), 9 deletions(-) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecContractSaveDTO.java create mode 100644 doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md create mode 100644 doc/sql/transport/blade_hcs_contract_spec_fields_20261009.sql create mode 100644 doc/sql/transport/blade_hcs_menu_20261009.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java index 7398b13f..782c1b7c 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java @@ -238,4 +238,21 @@ public class ContractManage extends TenantEntity { @Schema(description = "合规风险校验时间") private LocalDateTime hcsRiskTime; + @Schema(description = "合规特批流程ID(C103-8 返回)") + private String hcsSpecFdId; + + @Schema(description = "合规特批状态 none/need/processing/approved/rejected") + @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) + private String hcsSpecStatus; + + @Schema(description = "合规最近特批动作时间") + private LocalDateTime hcsSpecTime; + + @Schema(description = "合规特批结果/发起失败原因") + @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) + private String hcsSpecMsg; + + @Schema(description = "特批申请材料+内部审批附件JSON(含C103-2 合规附件ID)") + private String hcsSpecFilesJson; + } 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 c0714e09..c9b62024 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 @@ -84,6 +84,11 @@ public final class HcsSyncConstant { */ public static final String CHECK_TYPE_CREDIT = "credit"; + /** + * 校验类型:合同特批(C103-8 发起 / B103 结果回传留痕) + */ + public static final String CHECK_TYPE_SPEC = "spec"; + /** * 校验结果:通过 */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 10c8f586..7534c9c6 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -26,14 +26,27 @@ package org.springblade.transport.controller; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import feign.Response; 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 lombok.extern.slf4j.Slf4j; +import org.springblade.core.secure.annotation.PreAuth; +import org.springblade.core.secure.constant.AuthConstant; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.dto.HcsAttachmentRefDTO; +import org.springblade.hcs.dto.HcsCurrencyVO; +import org.springblade.hcs.dto.HcsRiskVO; +import org.springblade.hcs.dto.HcsTemplateVO; import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.support.hcs.HcsAttachmentSupport; +import org.springblade.transport.support.hcs.HcsContractSpecSyncSupport; import org.springblade.transport.support.hcs.HcsContractSyncSupport; +import org.springblade.transport.support.hcs.HcsCreditCheckSupport; import org.springblade.transport.support.hcs.HcsInvoiceRegSyncSupport; import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; import org.springblade.transport.support.hcs.HcsReceiptBillSyncSupport; @@ -41,12 +54,22 @@ import org.springblade.transport.support.hcs.HcsReconSupport; import org.springblade.transport.support.hcs.HcsMasterDataSupport; import org.springblade.transport.support.hcs.HcsProjectSyncSupport; import org.springblade.transport.task.HcsPushTask; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; /** * HCS 合规推送端点(设计文档 §5.0 手动入口) @@ -67,6 +90,9 @@ public class HcsSyncController { private final HcsPushTask hcsPushTask; private final HcsProjectSyncSupport hcsProjectSyncSupport; private final HcsContractSyncSupport hcsContractSyncSupport; + private final HcsContractSpecSyncSupport hcsContractSpecSyncSupport; + private final HcsCreditCheckSupport hcsCreditCheckSupport; + private final HcsAttachmentSupport hcsAttachmentSupport; private final HcsPaymentSyncSupport hcsPaymentSyncSupport; private final HcsInvoiceRegSyncSupport hcsInvoiceRegSyncSupport; private final HcsReceiptBillSyncSupport hcsReceiptBillSyncSupport; @@ -171,4 +197,118 @@ public class HcsSyncController { public R reconInvoiceRegistration(@Parameter(description = "开票申请单号", required = true) @RequestParam String applicationNo) { return R.data(hcsReconSupport.reconInvoiceRegistration(applicationNo)); } + + /** + * 合规模板列表(C103-6,Redis 缓存优先,前端接入设计 §3.1) + */ + @GetMapping("/master-data/template") + @ApiOperationSupport(order = 9) + @Operation(summary = "合规模板列表查询", description = "C103-6 模板列表,走服务端 Redis 缓存,未命中自动全量拉取") + public R> templates() { + return R.data(hcsMasterDataSupport.getTemplates()); + } + + /** + * 合规币种列表(C103-12,Redis 缓存优先,前端接入设计 §3.1) + */ + @GetMapping("/master-data/currency") + @ApiOperationSupport(order = 16) + @Operation(summary = "合规币种列表查询", description = "C103-12 币种列表,走服务端 Redis 缓存,未命中自动全量拉取") + public R> currencies() { + return R.data(hcsMasterDataSupport.getCurrencies()); + } + + /** + * 客商风险等级查询(C101-1,展示用,前端接入设计 §3.3;强制校验仍在推送/付款链路) + */ + @GetMapping("/risk") + @ApiOperationSupport(order = 10) + @Operation(summary = "客商风险等级查询", description = "C101-1 按客商编号查询风险等级与黑名单状态(展示用),结果留痕") + public R risk(@Parameter(description = "客商编号", required = true) @RequestParam String customerCode) { + return R.data(hcsCreditCheckSupport.queryRiskByCustomerCode(customerCode)); + } + + /** + * 附件上传到合同系统(C103-2 代理,前端接入设计 §3.2),返回合规附件ID + */ + @PostMapping(value = "/attachment/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @ApiOperationSupport(order = 11) + @Operation(summary = "附件上传到合同系统", description = "C103-2 代理:单文件上传至合规,返回合规附件ID(fdId)") + public R uploadAttachment(@Parameter(description = "附件文件", required = true) @RequestParam("fdFile") MultipartFile fdFile) { + return R.data(hcsAttachmentSupport.uploadOne(fdFile, AuthUtil.getUserAccount())); + } + + /** + * 合同附件下载(C103-5 代理,前端接入设计 §3.2):文件流透传浏览器 + */ + @GetMapping("/attachment/download") + @ApiOperationSupport(order = 12) + @Operation(summary = "合规附件下载", description = "C103-5 代理:按合规附件ID 下载文件流,name 参数可选用于指定下载文件名") + public void downloadAttachment(@Parameter(description = "合规附件ID", required = true) @RequestParam String fdId, + @Parameter(description = "下载文件名(可选)") @RequestParam(required = false) String name, + HttpServletResponse response) throws Exception { + String fileName = StringUtil.isBlank(name) ? "hcs-attachment-" + fdId : name; + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + URLEncoder.encode(fileName, StandardCharsets.UTF_8).replace("+", "%20")); + try (Response hcsResponse = hcsAttachmentSupport.downloadRaw(fdId); + InputStream inputStream = hcsResponse.body().asInputStream(); + OutputStream outputStream = response.getOutputStream()) { + inputStream.transferTo(outputStream); + outputStream.flush(); + } + } + + /** + * 合同发起特批(C103-8,前端接入设计 §3.4):body = { contractId, attachments: [{fdId, name}] } + */ + @PostMapping("/contract/spec-apply") + @ApiOperationSupport(order = 13) + @Operation(summary = "合同发起特批", description = "C103-8:高风险客商合同特批发起,attachments 为经 /hcs/attachment/upload 上传的合规附件引用") + @SuppressWarnings("unchecked") + public R applyContractSpec(@RequestBody Map body) { + Object contractIdValue = body == null ? null : body.get("contractId"); + if (contractIdValue == null || StringUtil.isBlank(String.valueOf(contractIdValue))) { + return R.fail("contractId 不能为空"); + } + Long contractId = Long.valueOf(String.valueOf(contractIdValue)); + Object attachmentsValue = body == null ? null : body.get("attachments"); + List attachments = (attachmentsValue instanceof List list ? list : List.of()).stream() + .filter(Map.class::isInstance) + .map(item -> { + Map attachment = (Map) item; + HcsAttachmentRefDTO ref = new HcsAttachmentRefDTO(); + // 附件ID:C103-2 上传返回的合规附件ID + ref.setFdId(String.valueOf(attachment.get("fdId"))); + // 附件名 + ref.setFdFileName(attachment.get("name") == null ? null : String.valueOf(attachment.get("name"))); + return ref; + }) + .toList(); + return R.data(hcsContractSpecSyncSupport.applySpec(contractId, attachments, AuthUtil.getUserAccount())); + } + + /** + * 合同特批结果人工确认(§6-U1 过渡方案:B103 报文未到位前与回调等效) + */ + @PostMapping("/contract/spec/confirm") + @ApiOperationSupport(order = 14) + @Operation(summary = "合同特批结果人工确认", description = "传入合同ID 与结果(approved/rejected),仅特批中(processing)允许确认") + public R confirmContractSpec(@Parameter(description = "合同ID", required = true) @RequestParam Long id, + @Parameter(description = "确认结果 approved/rejected", required = true) @RequestParam String result) { + return R.data(hcsContractSpecSyncSupport.confirmSpecResult(id, result)); + } + + /** + * B103 特批结果回传接收(合规系统→TMS 回调,公开端点 + 原文留痕,前端接入设计 §3.4) + *

    + * TODO 待联调(§6-U1):B103 报文未定,当前按候选字段(contractNo/fdId/result 等)解析, + * 解析失败仅留痕不置状态,报文口径确认后完善解析。 + */ + @PostMapping("/callback/spec-result") + @PreAuth(AuthConstant.PERMIT_ALL) + @ApiOperationSupport(order = 15) + @Operation(summary = "B103特批结果回传", description = "合规系统回调:合同特批结果回传接收,原文留痕并回写合同特批状态") + public R specResultCallback(@RequestBody(required = false) Map body) { + return R.data(hcsContractSpecSyncSupport.handleSpecCallback(body)); + } } 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 e505f910..4e1351ca 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 @@ -33,6 +33,7 @@ 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.HcsAttachmentVO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.exception.HcsException; @@ -123,6 +124,44 @@ public class HcsAttachmentSupport { return attachmentFdIds; } + /** + * 前端单文件直传合规(C103-2 代理,前端接入设计 §3.2):返回合规附件ID; + * 不写映射缓存(无 TMS 附件元数据键),调用方自行持久化 fdId(如特批材料 hcs_spec_files_json) + * + * @param file 上传文件 + * @param loginName 操作人登录名(fdLoginName) + * @return 合规附件ID + */ + public String uploadOne(MultipartFile file, String loginName) { + if (file == null || file.isEmpty()) { + throw new HcsException("HCS附件上传失败:文件为空"); + } + HcsResult result = hcsClient.uploadAttachment(file, "false", loginName); + if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdId())) { + log.error("HCS附件上传失败响应:{}", result == null ? "无响应" : String.format("code=%s, msg=%s, traceId=%s", + result.getCode(), result.getMsg(), result.getTraceId())); + throw new HcsException("HCS附件上传失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return result.getData().getFdId(); + } + + /** + * 合规附件下载(C103-5 代理,前端接入设计 §3.2):返回原始文件流响应,由控制器透传浏览器 + * + * @param fdId 合规附件ID + * @return Feign 文件流响应(调用方负责关闭) + */ + public feign.Response downloadRaw(String fdId) { + HcsAttachmentDownloadDTO param = new HcsAttachmentDownloadDTO(); + // 【必填】附件ID:上传时返回的 fdId + param.setFdId(fdId); + feign.Response response = hcsClient.downloadAttachment(param); + if (response == null || response.body() == null) { + throw new HcsException("HCS附件下载失败:响应为空(fdId=" + fdId + ")"); + } + return response; + } + /** * 转传单个附件:映射缓存命中直接返回,未命中下载上传后写缓存 */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java new file mode 100644 index 00000000..f4773258 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -0,0 +1,352 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.dto.HcsAttachmentRefDTO; +import org.springblade.hcs.dto.HcsMechanismsDTO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.dto.HcsSpecContractSaveDTO; +import org.springblade.hcs.dto.HcsFormSaveVO; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.HcsContractCheckLogMapper; +import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.HcsContractCheckLog; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + * HCS 合同特批同步支撑组件(C103-8 发起特批 / B103 特批结果回传,前端接入设计 §3.4) + *

    + * 业务闭环:合同推送时 C101-1 风险校验发现黑名单 → 置 hcs_spec_status=need 挂起(推送链路门禁跳过)→ + * 内部特批审批通过后,前端上传特批材料(C103-2 取合规附件ID)并发起 C103-8 → 状态 processing(流程挂起)→ + * 集团审批结果经 B103 回传 TMS → approved 后既有扫描任务自动恢复 C103-1 推送,rejected 可重新发起。 + *

    + * TODO 待联调确认(前端接入设计 §6-U1):C103-8 与 B103 报文 v4 均未提供, + * C103-8 按 C106-3 模式预估(双层嵌套返回),B103 回调按候选字段解析、原文留痕 blade_hcs_check_log。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsContractSpecSyncSupport { + + /** + * 特批附件字段标识(照 C106-3 fd_spc_approval_attach 惯例预估,§6-U1 以合规方报文为准) + */ + private static final String SPEC_ATTACH_ENTITY_KEY = "fd_spc_approval_attach"; + + /** + * B103 原文留痕最大长度(blade_hcs_check_log.msg 为 varchar(512)) + */ + private static final int CALLBACK_MSG_MAX_LENGTH = 500; + + private final IHcsClient hcsClient; + private final ContractManageMapper contractManageMapper; + private final HcsContractCheckLogMapper hcsContractCheckLogMapper; + + /** + * 发起合同特批(C103-8):校验合同与特批状态 → 组装预估报文 → 回填特批流程ID,状态置 processing + * + * @param contractId 合同ID + * @param attachments 特批附件引用(fdId=C103-2 合规附件ID,fdFileName=文件名) + * @param loginName 当前操作人登录名 + * @return 结果描述 + */ + public String applySpec(Long contractId, List attachments, String loginName) { + ContractManage contractManage = requireAppliableContract(contractId); + if (attachments == null || attachments.isEmpty()) { + throw new ServiceException("请先上传特批申请材料(含内部审批流程附件)"); + } + HcsSpecContractSaveDTO param = new HcsSpecContractSaveDTO(); + // 【必填】操作人登录名:当前登录人(§9-U2) + param.setFdLoginName(loginName); + // 【必填】合规合同ID:blade_contract_manage.hcs_fd_id(非名称,照 C106-3 fd_contract_name 惯例) + param.setFdContractId(requireContractFdId(contractManage)); + // 【必填】合同编号 + param.setFdContractNo(contractManage.getContractNo()); + // 【必填】单据主题:"合同特批-" + 合同编号 + param.setFdDocSubject("合同特批-" + contractManage.getContractNo()); + // 特批事由:合同名称(非必传) + param.setFdReason(contractManage.getContractName()); + // 特批附件:发起带 fdBindType=ADD(entityKey 预估照 C106-3,§6-U1) + param.setMechanisms(buildMechanisms(attachments)); + // 特批材料留痕(含合规附件ID,供重新发起与排查) + contractManage.setHcsSpecFilesJson(JSONUtil.toJsonStr(attachments)); + try { + log.info("HCS合同特批发起开始:contractNo={},附件 {} 个", contractManage.getContractNo(), attachments.size()); + // TODO 待联调(§6-U1):报文按 C106-3 模式预估,双层嵌套 data.data.fdId + HcsResult> result = hcsClient.addSpecContract(param); + String specFdId = extractNestedFdId(contractManage, result); + contractManage.setHcsSpecFdId(specFdId); + markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_PROCESSING, "C103-8 合同特批发起成功"); + writeCheckLog(contractManage, HcsSyncConstant.CHECK_RESULT_PASS, "C103-8 特批发起成功,特批流程ID=" + specFdId, result.getTraceId()); + log.info("HCS合同特批发起成功:contractNo={},specFdId={}", contractManage.getContractNo(), specFdId); + return "特批发起成功,等待集团审批"; + } catch (Exception exception) { + String message = StringUtil.isBlank(exception.getMessage()) ? "特批发起异常" : exception.getMessage(); + // 失败保持待特批(need),允许重试发起 + markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_NEED, "C103-8 特批发起失败:" + message); + writeCheckLog(contractManage, HcsSyncConstant.CHECK_RESULT_FAIL, "C103-8 特批发起失败:" + message, null); + throw exception instanceof ServiceException serviceException ? serviceException + : new ServiceException("合同特批发起失败:" + message); + } + } + + /** + * 特批结果人工确认(§6-U1 过渡方案:B103 报文未到位前,页面确认与回调等效) + * + * @param id 合同ID + * @param result approved/rejected + * @return 结果描述 + */ + public String confirmSpecResult(Long id, String result) { + ContractManage contractManage = contractManageMapper.selectById(id); + if (contractManage == null) { + throw new ServiceException("合同单不存在:" + id); + } + if (!List.of(HcsSyncConstant.SPEC_STATUS_APPROVED, HcsSyncConstant.SPEC_STATUS_REJECTED).contains(result)) { + throw new ServiceException("特批结果仅支持 approved/rejected"); + } + if (!HcsSyncConstant.SPEC_STATUS_PROCESSING.equals(contractManage.getHcsSpecStatus())) { + throw new ServiceException("仅特批中的合同允许确认结果(当前状态:" + contractManage.getHcsSpecStatus() + ")"); + } + markSpec(contractManage, result, "特批结果人工确认:" + result); + writeCheckLog(contractManage, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(result) + ? HcsSyncConstant.CHECK_RESULT_PASS : HcsSyncConstant.CHECK_RESULT_FAIL, "特批结果人工确认:" + result, null); + log.info("HCS合同特批结果人工确认:contractNo={},specFdId={},结果={}", contractManage.getContractNo(), contractManage.getHcsSpecFdId(), result); + return "特批结果已确认:" + result; + } + + /** + * B103 特批结果回传处理(回调端点入口):候选字段解析 + 原文留痕, + * approved 时合同保持待同步(unsynced),由既有扫描任务自动恢复 C103-1 推送 + * + * @param body B103 回调报文(结构待联调,原文全量留痕) + * @return 处理结果描述 + */ + public String handleSpecCallback(Map body) { + String raw = body == null ? "" : JSONUtil.toJsonStr(body); + String contractNo = firstNonBlank(body, "fdContractNo", "contractNo", "fd_contract_no", "fdNumber"); + String specFdId = firstNonBlank(body, "fdId", "fdSpecId", "fd_spec_id", "specFdId"); + String resultText = firstNonBlank(body, "result", "fdResult", "fd_result", "approvalResult", "status"); + ContractManage contractManage = locateContract(contractNo, specFdId); + if (contractManage == null) { + log.warn("B103特批结果回传未定位到合同:contractNo={},specFdId={},报文已留痕", contractNo, specFdId); + writeCallbackLog(null, HcsSyncConstant.CHECK_RESULT_SKIP, "B103 回传未定位到合同:" + raw); + return "已留痕:未定位到合同(contractNo=" + contractNo + ")"; + } + Boolean approved = parseSpecResult(resultText); + if (approved == null) { + log.warn("B103特批结果字段未识别:contractNo={},resultText={},报文已留痕", contractManage.getContractNo(), resultText); + writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, "B103 回传结果字段未识别:" + raw); + return "已留痕:结果字段未识别(contractNo=" + contractManage.getContractNo() + ")"; + } + String status = approved ? HcsSyncConstant.SPEC_STATUS_APPROVED : HcsSyncConstant.SPEC_STATUS_REJECTED; + markSpec(contractManage, status, "B103 特批结果回传:" + raw); + writeCallbackLog(contractManage, approved ? HcsSyncConstant.CHECK_RESULT_PASS : HcsSyncConstant.CHECK_RESULT_FAIL, + "B103 特批结果回传:" + raw); + log.info("B103特批结果回传处理完成:contractNo={},结果={}", contractManage.getContractNo(), status); + return "特批结果已处理:" + status; + } + + /** + * 校验可发起特批的合同:存在、审批通过、特批状态为待特批/已驳回 + */ + private ContractManage requireAppliableContract(Long contractId) { + ContractManage contractManage = contractManageMapper.selectById(contractId); + if (contractManage == null) { + throw new ServiceException("合同单不存在:" + contractId); + } + if (!List.of("approved", "change_approved").contains(contractManage.getApprovalStatus())) { + throw new ServiceException("仅审批通过的合同可发起特批(当前状态:" + contractManage.getApprovalStatus() + ")"); + } + if (!List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_REJECTED).contains(contractManage.getHcsSpecStatus())) { + throw new ServiceException("仅待特批/已驳回的合同可发起特批(当前状态:" + contractManage.getHcsSpecStatus() + ")"); + } + return contractManage; + } + + /** + * 合规合同ID(合同须已推送合规回填 hcs_fd_id) + */ + private String requireContractFdId(ContractManage contractManage) { + if (StringUtil.isBlank(contractManage.getHcsFdId())) { + throw new ServiceException("合同尚未推送合规,无法发起特批(contractNo=" + contractManage.getContractNo() + ")"); + } + return contractManage.getHcsFdId(); + } + + /** + * 特批附件挂载(发起带 fdBindType=ADD) + */ + private HcsMechanismsDTO buildMechanisms(List attachments) { + HcsMechanismsDTO mechanisms = new HcsMechanismsDTO(); + mechanisms.setAttachment(attachments.stream().map(ref -> { + HcsAttachmentRefDTO attachment = new HcsAttachmentRefDTO(); + // 附件ID:C103-2 转传返回的合规附件ID + attachment.setFdId(ref.getFdId()); + // 附件名(预估字段,§6-U1) + attachment.setFdFileName(ref.getFdFileName()); + // 特批附件字段标识 + attachment.setFdEntityKey(SPEC_ATTACH_ENTITY_KEY); + // 绑定类型:发起传 ADD + attachment.setFdBindType("ADD"); + return attachment; + }).toList()); + return mechanisms; + } + + /** + * 解析 C103-8 双层嵌套返回 data.data.fdId(照 C106-3 模式预估) + */ + private String extractNestedFdId(ContractManage contractManage, HcsResult> result) { + if (result == null || !result.isSuccess() || result.getData() == null || !result.getData().isSuccess() + || result.getData().getData() == null || StringUtil.isBlank(result.getData().getData().getFdId())) { + log.error("HCS合同特批发起失败响应:{},contractNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo()); + throw new HcsException("C103-8 合同特批发起失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return result.getData().getData().getFdId(); + } + + /** + * 按合同编号/特批流程ID 定位合同(B103 报文候选键) + */ + private ContractManage locateContract(String contractNo, String specFdId) { + if (StringUtil.isNotBlank(contractNo)) { + ContractManage contractManage = contractManageMapper.selectOne(Wrappers.lambdaQuery() + .eq(ContractManage::getContractNo, contractNo) + .eq(ContractManage::getIsDeleted, 0) + .last("limit 1")); + if (contractManage != null) { + return contractManage; + } + } + if (StringUtil.isNotBlank(specFdId)) { + return contractManageMapper.selectOne(Wrappers.lambdaQuery() + .eq(ContractManage::getHcsSpecFdId, specFdId) + .eq(ContractManage::getIsDeleted, 0) + .last("limit 1")); + } + return null; + } + + /** + * 解析特批结果文本:approved/通过/pass/true → true;rejected/驳回/refuse/false → false;未识别 → null + */ + private Boolean parseSpecResult(String resultText) { + if (StringUtil.isBlank(resultText)) { + return null; + } + String text = resultText.trim().toLowerCase(); + if (List.of("approved", "pass", "true", "通过", "审批通过", "同意").contains(text)) { + return Boolean.TRUE; + } + if (List.of("rejected", "refuse", "refused", "false", "驳回", "不通过", "不同意").contains(text)) { + return Boolean.FALSE; + } + return null; + } + + /** + * 从候选字段名依次取首个非空字符串值 + */ + private String firstNonBlank(Map body, String... keys) { + if (body == null) { + return null; + } + for (String key : keys) { + Object value = body.get(key); + if (value != null && StringUtil.isNotBlank(String.valueOf(value))) { + return String.valueOf(value); + } + } + return null; + } + + /** + * 回写特批状态与动作时间 + */ + private void markSpec(ContractManage contractManage, String status, String message) { + contractManage.setHcsSpecStatus(status); + contractManage.setHcsSpecTime(LocalDateTime.now()); + contractManage.setHcsSpecMsg(StringUtil.left(message, 500)); + contractManageMapper.updateById(contractManage); + } + + /** + * 特批留痕(blade_hcs_check_log,biz_type=contract,check_type=spec,异常不影响主流程) + */ + private void writeCheckLog(ContractManage contractManage, String result, String msg, String traceId) { + try { + HcsContractCheckLog checkLog = new HcsContractCheckLog(); + checkLog.setTenantId(contractManage.getTenantId()); + checkLog.setBizType(HcsSyncConstant.BIZ_TYPE_CONTRACT); + checkLog.setBizId(contractManage.getId()); + checkLog.setCheckType(HcsSyncConstant.CHECK_TYPE_SPEC); + checkLog.setResult(result); + checkLog.setMsg(StringUtil.left(msg, CALLBACK_MSG_MAX_LENGTH)); + checkLog.setTraceId(traceId); + checkLog.setCreateTime(LocalDateTime.now()); + hcsContractCheckLogMapper.insert(checkLog); + } catch (Exception exception) { + log.error("HCS合同特批留痕写入失败:contractNo={}", contractManage.getContractNo(), exception); + } + } + + /** + * B103 回传留痕(合同未定位到时 bizId 为空,原文留痕便于联调解析) + */ + private void writeCallbackLog(ContractManage contractManage, String result, String msg) { + if (contractManage == null) { + try { + HcsContractCheckLog checkLog = new HcsContractCheckLog(); + checkLog.setBizType(HcsSyncConstant.BIZ_TYPE_CONTRACT); + checkLog.setCheckType(HcsSyncConstant.CHECK_TYPE_SPEC); + checkLog.setResult(result); + checkLog.setMsg(StringUtil.left(msg, CALLBACK_MSG_MAX_LENGTH)); + checkLog.setCreateTime(LocalDateTime.now()); + hcsContractCheckLogMapper.insert(checkLog); + } catch (Exception exception) { + log.error("B103回传留痕写入失败", exception); + } + return; + } + writeCheckLog(contractManage, result, msg, null); + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index f98a1e61..6ade9dc4 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -100,15 +100,22 @@ public class HcsContractSyncSupport { private final HcsExeStageSyncSupport hcsExeStageSyncSupport; /** - * 推送合同到 HCS:风险校验 → 附件转传 → 判重 → 起草/更新 → 回填合规 fdId 置 synced + * 推送合同到 HCS:特批挂起门禁 → 风险校验(黑名单挂起待特批)→ 附件转传 → 判重 → 起草/更新 → 回填合规 fdId 置 synced * * @param contractManage 合同单(approvalStatus 须为 approved/change_approved) * @return 推送结果描述(供任务汇总与 hcs_sync_msg 落库) */ public String pushContract(ContractManage contractManage) { - // ① 客商风险校验(可配开关),黑名单且 block-blacklist=true 时阻断推送 + // ⓪ 特批挂起门禁:待特批/特批中的合同跳过推送,等待 B103 特批结果回传后恢复(C103-8,前端接入设计 §3.4) + if (List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(contractManage.getHcsSpecStatus())) { + log.info("HCS合同推送跳过(特批挂起中):contractNo={},hcsSpecStatus={}", contractManage.getContractNo(), contractManage.getHcsSpecStatus()); + return "合同特批挂起中(" + contractManage.getHcsSpecStatus() + "),跳过推送"; + } + // ① 客商风险校验(可配开关),黑名单且 block-blacklist=true 时挂起待特批(不再直接失败) if (hcsProperties.getContract().isRequireRiskCheck()) { - checkRelativeRisk(contractManage); + if (checkRelativeRisk(contractManage)) { + return "高风险客商,合同已挂起待特批(C103-8)"; + } } // ② 附件转传(先转传并缓存合规附件ID,C103-1 挂载方式待 §9-U8 确认后接线) transferAttachmentsIfEnabled(contractManage); @@ -139,9 +146,13 @@ public class HcsContractSyncSupport { } /** - * C101-1 客商风险校验:甲乙双方各查一次,留痕 check_log 与合同 hcs_risk_* 字段,黑名单阻断 + * C101-1 客商风险校验:甲乙双方各查一次,留痕 check_log 与合同 hcs_risk_* 字段; + * 黑名单且 block-blacklist=true 时不再直接失败,而是置 hcs_spec_status=need 挂起待特批(C103-8); + * 特批已通过(approved,单次有效)的合同不重复挂起,保证 B103 回传后推送链路可走通 + * + * @return true=黑名单挂起待特批(调用方跳过本次推送) */ - private void checkRelativeRisk(ContractManage contractManage) { + private boolean checkRelativeRisk(ContractManage contractManage) { RiskResult riskPartyA = queryRisk(contractManage, "甲方", contractManage.getPartyA()); RiskResult riskPartyB = queryRisk(contractManage, "乙方", contractManage.getPartyB()); // 风险等级:甲乙双方取先查到的非空值(无法量化比较,留痕双方原始值,联调后细化) @@ -155,11 +166,17 @@ public class HcsContractSyncSupport { log.info("HCS合同风险校验完成:contractNo={},甲方[{}={}/{}],乙方[{}={}/{}]", contractManage.getContractNo(), contractManage.getPartyA(), riskPartyA.blackStatus(), riskPartyA.riskLevel(), contractManage.getPartyB(), riskPartyB.blackStatus(), riskPartyB.riskLevel()); - if (blacklist && hcsProperties.getRisk().isBlockBlacklist()) { - String message = "客商黑名单,禁止推送(甲方[" + riskPartyA.blackStatus() + "]乙方[" + riskPartyB.blackStatus() + "])"; - log.error("HCS合同推送被风险校验阻断:contractNo={},{}", contractManage.getContractNo(), message); - throw new HcsException(message); + boolean specApproved = HcsSyncConstant.SPEC_STATUS_APPROVED.equals(contractManage.getHcsSpecStatus()); + if (blacklist && hcsProperties.getRisk().isBlockBlacklist() && !specApproved) { + String message = "高风险客商(甲方[" + riskPartyA.blackStatus() + "]乙方[" + riskPartyB.blackStatus() + "]),合同挂起待特批"; + contractManage.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_NEED); + contractManage.setHcsSpecTime(LocalDateTime.now()); + contractManage.setHcsSpecMsg(message); + contractManageMapper.updateById(contractManage); + log.warn("HCS合同推送因高风险客商挂起待特批:contractNo={},{}", contractManage.getContractNo(), message); + return true; } + return false; } /** @@ -367,6 +384,9 @@ public class HcsContractSyncSupport { if (!List.of("approved", "change_approved").contains(contractManage.getApprovalStatus())) { throw new ServiceException("仅审批通过的合同可推送合规(当前状态:" + contractManage.getApprovalStatus() + ")"); } + if (List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(contractManage.getHcsSpecStatus())) { + throw new ServiceException("高风险客商合同需先完成特批(C103-8,当前特批状态:" + contractManage.getHcsSpecStatus() + ")"); + } contractManage.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); contractManage.setHcsRetryCount(0); contractManageMapper.updateById(contractManage); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java index 371098cb..eb72f01f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java @@ -170,6 +170,44 @@ public class HcsCreditCheckSupport { log.warn("HCS付款提交额度超额(转特批):paymentNo={},{}", payment.getPaymentNo(), message); } + /** + * 前端客商风险查询(C101-1,展示用,前端接入设计 §3.3): + * 按客商编号查询风险等级与黑名单状态并留痕(biz_id 为空);仅用于展示提示,不作为安全边界 + * + * @param customerCode 客商编号 + * @return 风险信息(fdBlackStatus/fdRiskLevel) + */ + public HcsRiskVO queryRiskByCustomerCode(String customerCode) { + if (StringUtil.isBlank(customerCode)) { + throw new ServiceException("客商编号不能为空"); + } + HcsRiskQueryDTO param = new HcsRiskQueryDTO(); + // 【必填】客商编号(用哪个编码待联调,§9-U6) + param.setFdNumber(customerCode); + HcsResult result = hcsClient.getRelativeRisk(param); + if (result == null || !result.isSuccess()) { + log.error("HCS客商风险查询失败响应:{},fdNumber={}", + result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), customerCode); + throw new HcsException("C101-1 客商风险查询失败:" + (result == null ? "响应为空" : result.getMsg())); + } + HcsRiskVO risk = result.getData(); + String blackStatus = risk == null ? null : risk.getFdBlackStatus(); + boolean blacklist = BLACK_STATUS_YES.equalsIgnoreCase(blackStatus); + try { + HcsContractCheckLog checkLog = new HcsContractCheckLog(); + checkLog.setBizType(HcsSyncConstant.BIZ_TYPE_CONTRACT); + checkLog.setCheckType(HcsSyncConstant.CHECK_TYPE_RISK); + checkLog.setResult(blacklist ? HcsSyncConstant.CHECK_RESULT_FAIL : HcsSyncConstant.CHECK_RESULT_PASS); + checkLog.setMsg("页面风险查询[" + customerCode + "]黑名单=" + blackStatus + ",风险等级=" + (risk == null ? null : risk.getFdRiskLevel())); + checkLog.setTraceId(result.getTraceId()); + checkLog.setCreateTime(LocalDateTime.now()); + hcsContractCheckLogMapper.insert(checkLog); + } catch (Exception exception) { + log.error("HCS页面风险查询留痕写入失败:fdNumber={}", customerCode, exception); + } + return risk; + } + /** * 按名称反查客商编码(照 KingdeeApBillSyncSupport#queryCustomerCode 惯例,查不到返回 null) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecContractSaveDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecContractSaveDTO.java new file mode 100644 index 00000000..24b275ba --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecContractSaveDTO.java @@ -0,0 +1,77 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)C103-8 合同发起特批流程入参 + *

    + * TODO 待联调确认(前端接入设计 §6-U1):C103-8 报文 v4 未提供,本 DTO 按 C106-3 结算付款特批的 + * formData/mechanisms 模式预估,字段名以合规方最新接口说明为准。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsSpecContractSaveDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 特批流程ID(更新必填,发起不传) + */ + private String fdId; + /** + * 【必填】操作人登录名(§9-U2) + */ + private String fdLoginName; + /** + * 【必填】合规合同ID(blade_contract_manage.hcs_fd_id,非名称) + */ + private String fdContractId; + /** + * 【必填】合同编号 + */ + private String fdContractNo; + /** + * 【必填】单据主题:"合同特批-" + 合同编号 + */ + private String fdDocSubject; + /** + * 特批事由(合同名称/特批原因,非必传) + */ + private String fdReason; + /** + * 特批附件(C103-2 转传返回的合规附件ID 引用) + */ + private HcsMechanismsDTO mechanisms; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java index cff70f6a..503bc9df 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java @@ -54,6 +54,7 @@ import org.springblade.hcs.dto.HcsReceiptBillSaveDTO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.dto.HcsRiskQueryDTO; import org.springblade.hcs.dto.HcsRiskVO; +import org.springblade.hcs.dto.HcsSpecContractSaveDTO; import org.springblade.hcs.dto.HcsSpecPaySaveDTO; import org.springblade.hcs.dto.HcsTemplateVO; import org.springframework.cloud.openfeign.FeignClient; @@ -97,6 +98,7 @@ public interface IHcsClient { String CREDIT_CHECK_URL = "${thirdParty.hcs.creditCheckUrl:/openapi/eop-cdraft/lcode/ext-cdraft/extEopCdraftMainOpen/contractCreditCheck}"; String SPEC_PAY_ADD_URL = "${thirdParty.hcs.specPayAddUrl:/openapi/sys-modeling/lcode/ext-pay-receive/extPayReceiveOpenService/addSpecApplyPay}"; String SPEC_PAY_UPDATE_URL = "${thirdParty.hcs.specPayUpdateUrl:/openapi/sys-modeling/lcode/ext-pay-receive/extPayReceiveOpenService/updateSpecApplyPay}"; + String SPEC_CONTRACT_ADD_URL = "${thirdParty.hcs.specContractAddUrl:/openapi/sys-modeling/lcode/ext-cdraft/extEopCdraftMainOpen/addSpecApplyContract}"; String PERF_RECORD_ADD_URL = "${thirdParty.hcs.perfRecordAddUrl:/openapi/sys-modeling/apis/data/km-pay-receive/V1/dataSync/add}"; String PERF_RECORD_UPDATE_URL = "${thirdParty.hcs.perfRecordUpdateUrl:/openapi/sys-modeling/apis/data/km-pay-receive/V1/dataSync/update}"; String RECEIPT_BILL_ADD_URL = "${thirdParty.hcs.receiptBillAddUrl:/openapi/sys-modeling/lcode/ext-invoice-receive/extInvoiceReceiveOpenService/addReceiveBill}"; @@ -264,6 +266,19 @@ public interface IHcsClient { @PostMapping(SPEC_PAY_UPDATE_URL) HcsResult> updateSpecApplyPay(@RequestBody HcsSpecPaySaveDTO param); + /** + * C103-8 合同发起特批流程(高风险客商签约特批) + *

    + * TODO 待联调确认(前端接入设计 §6-U1):C103-8 报文与路径均未在 v4 接口说明中定义, + * 本端点按 C106-3 结算付款特批的报文结构预估(双层嵌套 data.data 承接返回), + * 路径可经 thirdParty.hcs.specContractAddUrl 覆盖,字段以合规方最新接口说明为准。 + * + * @param param 请求参数 + * @return data.data.{fdId, fdXFormId, docViewUrl}(fdId 为特批流程ID) + */ + @PostMapping(SPEC_CONTRACT_ADD_URL) + HcsResult> addSpecContract(@RequestBody HcsSpecContractSaveDTO param); + /** * C108-1 履约记录新建 * diff --git a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md new file mode 100644 index 00000000..7fb368f3 --- /dev/null +++ b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md @@ -0,0 +1,254 @@ +# 项目立项与合同 HCS 前端接入设计(tms-erp-web) + +> **日期**:2026-10-09 +> **依据**:《桂物合同集成相关接口说明-v4.docx》、[TMS业财融合方案.docx](../TMS业财融合方案.docx)、[2026-09-27-桂物合同合规系统HCS接入技术设计.md](./2026-09-27-桂物合同合规系统HCS接入技术设计.md)、[2026-09-28-HCS接入实施状态与确认清单.md](./2026-09-28-HCS接入实施状态与确认清单.md) +> **涉及工程**:`tms-api`(后端补前端代理端点)、`tms-erp-web`(前端页面与 API 模块) + +--- + +## 1. 总体原则 + +| # | 原则 | +|---|---| +| P1 | **前端不直连 HCS**。所有 C 系列接口由 tms-api 代理:`Authorization`/`Key-Auth` 静态双头只存在于服务端,浏览器不可见,也无跨域问题 | +| P2 | **自动推送不动**。C102-1/2、C103-1/11 仍走"审批通过 → 置 unsynced → 扫描任务推送"链路(零埋点,ADR-0001),前端只补**状态展示 + 手动重推 + 对账回查** | +| P3 | **附件主存储仍在 TMS OSS**。表单上传逻辑不改;HCS 转传由后端推送链路自动完成(HcsAttachmentSupport 已实现)。前端新增的是**手动转传**(特批材料、确定性上传)与**HCS 附件回下载** | +| P4 | **前端结算币种/合同分类不改**。两个下拉继续用本地字典(`currency_type`/`contractCategory`),存量值与交互零变化;C103-12 币种、C103-7 分类只在后端推送侧映射(`currency-name-mapping`/`template-mapping`,已实现),前端无触点 | +| P5 | UI 照**"同步金蝶"按钮模式**(参考 `customer-archive.vue`、`formal-settlement-table-panel.vue` 的 kingdeeSyncStatus 列 + 推送按钮),HCS 用 `hcsSyncStatus` 等同构字段 | + +--- + +## 2. 接口 → 前端触点映射总表 + +| HCS 接口 | 后端现状 | 面向前端端点 | 前端触点 | +|---|---|---|---| +| C101-1 客商风险等级 | Feign 已有,合同推送/付款提交时服务端调用 | **`GET /hcs/risk`(新增)** | 合同表单选甲乙方后展示风险标签;高风险+黑名单给"发起特批"入口 | +| C102-1 项目立项新增 | 扫描任务自动推送 | — | 无直接触点(列表展示同步结果) | +| C102-2 项目立项更新 | 变更审批通过自动推送 | — | 同上 | +| C102-3 项目立项查询 | `GET /hcs/recon/project` 已有 | 已有 | 立项列表"合规对账"弹窗 | +| C103-12 币种列表 | Feign + Redis 缓存已有(推送侧映射用) | **移出前端范围**(2026-10-09 确认:前端结算币种沿用本地字典,无触点) | — | +| C103-6 模板列表 | Feign + Redis 缓存已有 | **`GET /hcs/master-data/template`(新增)** | 管理端"合规主数据/映射"查看页(表单不选模板,template-mapping 在 Nacos) | +| ~~C103-7 分类列表~~ | Feign + 缓存已有 | **移出前端范围**(2026-10-09 确认:分类为推送侧 Nacos 映射的前置,前端无界面触点) | — | +| C103-1 合同同步 | 审批通过自动推送 | `POST /hcs/sync/contract/{id}` 已有 | 合同列表"推送合规"按钮 | +| C103-11 合同信息更新 | 变更审批通过自动推送 | 同上(重推入口) | 同上 | +| C103-2 附件上传 | Feign 已有,推送链路自动转传 | **`POST /hcs/attachment/upload`(新增)** | 合同/特批材料"上传到合同系统"手动操作,返回 fdId 落库 | +| C103-3 合同列表查询 | `GET /hcs/recon/contract` 已有 | 已有 | 合同列表"合规对账"弹窗 | +| C103-4 合同详情查询 | `GET /hcs/recon/contract/detail` 已有 | 已有 | 对账弹窗"查看合规详情" | +| C103-5 合同附件下载 | 仅 Feign 端点 | **`GET /hcs/attachment/download`(新增)** | 对账弹窗/合同详情中下载 HCS 侧附件 | +| C103-8 合同发起特批 | **本期正式接入**(业务闭环见集成流程梳理:高风险客商签约必走;B103 结果回传) | **`POST /hcs/contract/spec-apply`(新增)+ `POST /hcs/callback/spec-result`(B103 接收,新增)** | 合同详情"发起特批"、特批状态展示、回传后自动恢复推送 | + +--- + +## 3. 后端补充端点设计(tms-api) + +全部挂在 `HcsSyncController`(`/hcs` 前缀,与既有端点同文件),复用 `HcsMasterDataSupport`、`HcsAttachmentSupport`、`IHcsClient`,不新建 Support。 + +### 3.1 主数据查询(走 Redis 缓存,未命中自动拉取) + +``` +GET /hcs/master-data/template +返回 R>:直接序列化 +``` + +仅模板一个端点;币种/分类已在 `HcsMasterDataSupport` 内部缓存供推送映射,不暴露前端。 + +### 3.2 附件代理 + +``` +POST /hcs/attachment/upload (multipart:fdFile + bizType 可选) + → 服务端包装 fdLoginName=当前登录名、fdAnonymous=false,调 C103-2 + → 返回 R<{ fdId }>;同时写 HcsAttachmentSupport 的 Redis 映射缓存(attachmentKey → fdId), + 使后续 C103-1 推送链路命中缓存不再重传 + → 文件限制与 TMS OSS 现行一致:pdf/bmp/jpeg/png/jpg/doc/docx/ppt/pptx/xlsx/xls/eml/msg/zip,≤50M + +GET /hcs/attachment/download?fdId=... + → 调 C103-5,文件流透传(Content-Disposition attachment,文件名从附件元数据或 fdId 兜底) + → axios 需 responseType: 'blob' +``` + +### 3.3 客商风险查询(C101-1) + +``` +GET /hcs/risk?customerCode=... + → 调 IHcsClient.relativeRisk(C101-1) + → 返回 R:{ fdId, fdNumber, fdBlackStatus, fdRiskLevel } + → 结果写 blade_hcs_check_log(biz_type=risk,留痕与合同推送链路同表) +``` + +> 前端仅用于**展示与提示**,不作为安全边界:强制校验仍在合同推送链路(`risk.block-blacklist`)与付款提交事务内。 + +### 3.4 合同发起特批(C103-8)+ 结果回传(B103)——本期正式接入 + +**业务闭环**(依据《TMS业财融合-集成流程图文字版与业务流程梳理.md》§3.3/§8): + +``` +合同审批通过 → C101-1 查甲乙方风险 + ├─ 非高风险 → 常规链路:C103-2 附件转传 → C103-1 推送(现状不变) + └─ 高风险 → 合同链路挂起(hcs_spec_status=need) + → TMS 内部特批审批(按原审批流) + → 前端补特批申请材料 + 内部审批流程附件 → C103-8 发起特批(hcs_spec_status=processing) + → 合同系统集团审批(流程在合同系统预配置) + → B103 特批结果回传 TMS(hcs_spec_status=approved/rejected) + → approved → 自动恢复 C103-1 推送 → 完成签订;rejected → 前端提示,重新发起 +``` + +**数据模型**:`blade_contract_manage` 追加特批字段组(照付款申请 `hcs_spec_*` 惯例),SQL 落 `doc/sql/transport/`: + +```sql +hcs_spec_fd_id varchar(64) COMMENT '合规特批流程ID(C103-8 返回)', +hcs_spec_status varchar(16) DEFAULT 'none' COMMENT '特批状态 none/need/processing/approved/rejected', +hcs_spec_time datetime COMMENT '最近特批动作时间', +hcs_spec_msg varchar(512) COMMENT '特批结果/失败原因', +hcs_spec_files_json text COMMENT '特批申请材料+内部审批附件(含C103-2 fdId)' +``` + +**端点设计**: + +``` +POST /hcs/contract/spec-apply (body:{ contractId, attachments: [{fdId, name}] }) + 校验:合同审批通过 && hcs_spec_status ∈ {need, rejected} && 特批材料非空 + 组装报文调 C103-8(报文模式预估照 C106-3:fd_contract_id=hcs_fd_id、fd_contract_no、 + fd_doc_subject="合同特批-"+contractNo、特批附件 mechanisms.attachment 带 fdBindType=ADD) + → 返回 data.fdId → hcs_spec_fd_id,状态置 processing;失败置 need 并记 hcs_spec_msg + → C103-8 v4 未含报文,联调前按上述预估实现并加 TODO 标注(§6-U1) + +POST /hcs/callback/spec-result (B103 合规→TMS 回调接收端点) + 公开端点(@PreAuth(AuthConstant.PERMIT_ALL) + 报文验签字段待合规方口径,先记录原文留痕) + body:{ 合同标识/特批流程fdId, 审批结果, 审批意见 } ← 字段名待 B103 报文(§6-U1) + 处理:定位合同 → 回写 hcs_spec_status=approved/rejected + hcs_spec_msg + → approved 时把合同 hcs_sync_status 重置 unsynced,由既有扫描任务自动走 C103-1(零新增链路) + → B103 报文未到位前端点先落库留痕不置状态,联调时接线 +``` + +**状态展示与操作权限**: + +| hcs_spec_status | 前端表现 | +|---|---| +| none | 无特批相关 UI | +| need(高风险待特批) | 合同详情警告条 +【发起特批】按钮可用;推送合规按钮禁用并提示"高风险客商,需先完成特批" | +| processing | "特批中"标签(橙);发起按钮禁用 | +| approved | "特批通过"标签(绿);推送恢复 | +| rejected | "特批驳回"标签(红)+ 驳回原因;可重新发起 | + +### 3.5 权限 + +`/hcs/**` 补 `@PreAuth`(菜单权限码,随菜单 SQL 一起落 `doc/sql/transport/`): + +| 权限码 | 控制点 | +|---|---| +| `hcs_sync_push` | 推送合规/重推按钮 | +| `hcs_sync_status` | 合规状态列/筛选(登录可见即可时不建) | +| `hcs_recon` | 合规对账弹窗 | +| `hcs_attachment` | 上传到合同系统 / 合规附件下载 | +| `hcs_master_data` | 主数据/映射查看页 | +| `hcs_spec_apply` | 发起特批按钮 | + +--- + +## 4. 前端设计(tms-erp-web) + +### 4.1 新增 API 模块 `src/api/business/hcs.js` + +集中一个文件,不拆散到各业务 api(对齐 `api/payment/paymentApplication.js` 的超时覆盖惯例): + +```js +import request from '@/axios'; + +const baseUrl = '/blade-transport/hcs'; + +// 合规推送涉及 HCS 远程多次调用(风险校验+附件转传+起草),可达 20s+,覆盖全局 10s 超时 +export const repush = (bizType, id) => + request({ url: `${baseUrl}/sync/${bizType}/${id}`, method: 'post', timeout: 60000 }); + +export const getTemplates = () => + request({ url: `${baseUrl}/master-data/template`, method: 'get' }); + +export const getRisk = customerCode => + request({ url: `${baseUrl}/risk`, method: 'get', params: { customerCode } }); + +export const uploadAttachment = formData => + request({ url: `${baseUrl}/attachment/upload`, method: 'post', data: formData, timeout: 60000 }); + +export const downloadAttachment = fdId => + request({ url: `${baseUrl}/attachment/download`, method: 'get', params: { fdId }, responseType: 'blob' }); + +export const reconProject = projectCode => + request({ url: `${baseUrl}/recon/project`, method: 'get', params: { projectCode } }); +export const reconContract = contractNo => + request({ url: `${baseUrl}/recon/contract`, method: 'get', params: { contractNo } }); +export const reconContractDetail = params => + request({ url: `${baseUrl}/recon/contract/detail`, method: 'get', params }); + +export const applyContractSpec = data => + request({ url: `${baseUrl}/contract/spec-apply`, method: 'post', data }); +``` + +### 4.2 结算币种(C103-12)——前端不改 + +前端"结算币种"下拉继续用本地字典 `currency_type`(`loadSettlementDictionaries()` 现状不动),存储值、编辑回显、下游运单/结算取值全部维持现状。C103-12 币种列表仅在后端推送 C103-1 时经 `currency-name-mapping`(`RMB→人民币`)映射,已实现,无前端工作。 + +### 4.3 合同模板(C103-6) + +- **表单"合同类别"保留本地字典 `contractCategory`**:它是 TMS 业务主数据,推送侧靠 Nacos `template-mapping` 转模板ID。C103-7 已移出前端范围(2026-10-09 确认)。 +- 新增**管理端"合规主数据"查看页**(`views/business/hcs-master-data.vue`,模板列表 + "刷新缓存"按钮,`POST /hcs/master-data/refresh` 已有)。菜单挂系统管理或合规管理目录下。 + +### 4.4 客商风险等级(C101-1) + +合同表单(新增/变更)选择甲方/乙方后: + +- 调 `getRisk(customerCode)`,在甲乙方字段旁展示风险标签:无风险/低/中/高 + 黑名单红标(`fdBlackStatus === 'yes'`)。 +- 高风险或黑名单时,表单顶部警告条:"该客商为高风险/黑名单客商,按集团规定不可签约,如需签约请发起特批",并提供【发起特批】按钮(走 §4.7)。 +- 项目立项表单不做强制校验(业务流程:风险校验在合同签订与付款环节),立项页不加。 +- 失败静默(HCS 不可达不阻塞填写,强校验在后端推送/付款链路)。 + +### 4.5 附件上传到合同系统(C103-2) + +- **表单附件流程不变**:仍传 TMS OSS,推送时后端自动转传(已实现,含 7 天 fdId 映射缓存)。 +- 新增**手动转传入口**:合同详情页附件区(`contract-attachment-section.vue`)加"上传到合同系统"操作(仅已审批通过的合同显示): + 1. 选中附件行 → `uploadAttachment(formData)`(前端从 OSS url 拉文件或直接复用原始 File); + 2. 返回 `fdId` 写入附件行 `hcsFdId` 字段(后端 `update-attachments` 已有,行结构加一字段即可); + 3. 已转传的行显示"已上传合规"标记。 +- 特批材料(C103-8 占位)也走此端点先取得 fdId。 + +### 4.6 合同附件下载(C103-5) + +- 对账弹窗(§4.7)中展示 HCS 侧附件列表(来自 C103-4 详情),点击下载调 `downloadAttachment(fdId)`,blob 落地文件。 +- `contract-attachment-section.vue` 的行内"下载"仍走 TMS OSS url,不改。 + +### 4.7 列表页合规状态 + 推送/对账(照"同步金蝶"模式) + +`project-apply.vue` 与 `contract-manage.vue` 各加: + +1. **状态列**:`合规状态`(prop `hcsSyncStatus`)——`unsynced 待推送`(灰)/`synced 已推送`(绿)/`failed 推送失败`(红);失败时 tooltip 显示 `hcsSyncMsg`;已推送的可附 `hcsFdId`。 + - 列配置加在 `src/option/business/project-apply.js`、`contract-manage.js`(或页面内 column 定义,与两页现状一致)。 + - 筛选区加"合规状态"下拉(unsynced/synced/failed,复用 settlement 模块 kingdeeSyncStatusOptions 的写法)。 +2. **操作按钮**:行操作"推送合规"(`repush(bizType, id)`,成功后刷新行;按钮文案照 customer-archive 的"推送中…"防重态);权限码 `hcs_sync_push`。 +3. **对账弹窗**:行操作/工具栏"合规对账"——立项按 `projectCode` 调 `reconProject`,合同按 `contractNo` 调 `reconContract`;弹窗内 JSON 树/描述列表展示 HCS 返回,附"查看合规详情"(C103-4,合同页专属)与 HCS 附件下载(§4.6)。权限码 `hcs_recon`。 + +### 4.8 合同发起特批(C103-8,本期接入) + +- **入口**:合同详情页【发起特批】按钮,仅 `hcsSpecStatus ∈ {need, rejected}` 时可用;权限码 `hcs_spec_apply`。 +- **交互**:弹窗选择/确认特批申请材料(先经 §4.5 `uploadAttachment` 取 fdId,弹窗内表格展示已传材料,含内部审批流程附件)→ 确认调 `applyContractSpec({ contractId, attachments })` → 成功后详情刷新为"特批中"。 +- **状态展示**:合同列表与详情按 §3.4 状态表展示特批标签(need/processing/approved/rejected);`need` 时列表"推送合规"按钮禁用并 tooltip 提示。 +- **结果回传**:B103 回调由后端接收并自动恢复推送,前端无需轮询;详情页打开时实时拉取最新状态即可,`rejected` 时展示 `hcsSpecMsg` 驳回原因。 + +--- + +## 5. 实施拆分 + +| 阶段 | tms-api | tms-erp-web | 依赖 | +|---|---|---|---| +| F1 基础 | `GET /hcs/master-data/template` + `@PreAuth`/菜单 SQL | `api/business/hcs.js`;管理端主数据页 | 无 | +| F2 状态与推送 | 无(端点已有) | 两列表页:状态列/筛选 + 推送合规按钮 | F1(hcs.js) | +| F3 对账与附件 | `/hcs/risk`、`/hcs/attachment/upload`、`/hcs/attachment/download` | 对账弹窗 + 合规附件下载 + 手动转传 + 附件行 `hcsFdId` | F2 | +| F4 特批 | 合同特批字段组 SQL;`POST /hcs/contract/spec-apply` + `POST /hcs/callback/spec-result`(B103);合同推送链路加 need 挂起判断 | 发起特批弹窗 + 特批状态标签 + 按钮联动 | C103-8/B103 报文(§6-U1,可先按预估模式实现联调替换) | + +--- + +## 6. 未决事项 + +| # | 事项 | 影响 | 当前处理 | +|---|---|---|---| +| U1 | **C103-8 / B103 报文 v4 未提供**(业务闭环已在集成流程梳理中明确) | 特批发起与结果回传的报文字段 | 按 C106-3 模式预估实现 + 回调端点先落库留痕;联调拿到报文后替换(代码已留 TODO) | +| U2 | **C103-5 返回流是否带文件名**(v4 仅写"文件流") | 下载文件命名 | 后端以附件元数据/`fdId` 兜底命名,联调校准 | +| U3 | 合规状态列/菜单权限是否需要按租户差异化 | 菜单 SQL | 先按统一菜单落地 | diff --git a/doc/sql/transport/blade_hcs_contract_spec_fields_20261009.sql b/doc/sql/transport/blade_hcs_contract_spec_fields_20261009.sql new file mode 100644 index 00000000..a7d0fc9b --- /dev/null +++ b/doc/sql/transport/blade_hcs_contract_spec_fields_20261009.sql @@ -0,0 +1,41 @@ +-- 桂物合同合规系统(HCS)接入:合同特批字段组(C103-8 发起特批 / B103 结果回传,前端接入设计 §3.4)。 +-- blade_contract_manage 追加特批流程ID/状态/时间/原因/材料字段;可重复执行。 +SET @db_name = DATABASE(); + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_spec_fd_id'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_spec_fd_id varchar(64) DEFAULT NULL COMMENT ''合规特批流程ID(C103-8 返回)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_spec_status'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_spec_status varchar(16) DEFAULT ''none'' COMMENT ''合规特批状态 none/need/processing/approved/rejected''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_spec_time'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_spec_time datetime DEFAULT NULL COMMENT ''合规最近特批动作时间''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_spec_msg'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_spec_msg varchar(512) DEFAULT NULL COMMENT ''合规特批结果/发起失败原因''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'hcs_spec_files_json'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN hcs_spec_files_json text COMMENT ''特批申请材料+内部审批附件JSON(含C103-2 合规附件ID)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- 存量合同的特批状态初始化为 none(新增列带 DEFAULT 'none' 已覆盖;此处兜底历史执行场景) +UPDATE blade_contract_manage SET hcs_spec_status = 'none' WHERE hcs_spec_status IS NULL AND is_deleted = 0; diff --git a/doc/sql/transport/blade_hcs_menu_20261009.sql b/doc/sql/transport/blade_hcs_menu_20261009.sql new file mode 100644 index 00000000..bebc8238 --- /dev/null +++ b/doc/sql/transport/blade_hcs_menu_20261009.sql @@ -0,0 +1,11 @@ +-- 桂物合同合规系统(HCS)前端接入:合规主数据菜单(前端接入设计 §4.3,照 AGENTS §15 菜单 SQL 规范)。 +-- 合规主数据页(模板列表 + 刷新缓存);字符集 utf8mb4_general_ci。ID 为雪花段占位,如与现有数据冲突请调整。 +-- 注意:/hcs/** 端点当前登录即可访问(照 HcsSyncController 现状),菜单落地后可按需补 @PreAuth(menu) 注解。 + +DELETE FROM blade_menu WHERE code IN ('hcs_master_data', 'hcs_master_data_refresh'); + +INSERT INTO blade_menu (id, parent_id, code, name, alias, path, source, sort, category, action, is_open, component, remark, is_deleted) +VALUES (2075432100100000001, 1164733399668962201, 'hcs_master_data', '合规主数据', 'hcs_master_data', '/business/hcs-master-data', 'iconfont icon-caidan', 40, 1, 0, 1, '', '', 0); + +INSERT INTO blade_menu (id, parent_id, code, name, alias, path, source, sort, category, action, is_open, component, remark, is_deleted) +VALUES (2075432100100000002, 2075432100100000001, 'hcs_master_data_refresh', '刷新缓存', 'hcs_master_data_refresh', '', '', 1, 2, 0, 1, '', '', 0); From 2ea590123821edc04b597b53d49cf09d3a06c678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 10 Oct 2026 18:24:05 +0800 Subject: [PATCH 034/124] =?UTF-8?q?:feat:=20=E9=A1=B9=E7=9B=AE=E7=AB=8B?= =?UTF-8?q?=E9=A1=B9=E3=80=81=E5=90=88=E5=90=8C=E5=AE=A1=E6=89=B9=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=90=8E=E5=8D=B3=E6=97=B6=E6=8E=A8=E9=80=81HCS?= =?UTF-8?q?=E5=90=88=E8=A7=84=E7=B3=BB=E7=BB=9F=EF=BC=88=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E5=8D=95=E6=9D=A1=E9=87=8D=E6=8E=A8=E9=93=BE=E8=B7=AF=EF=BC=8C?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E4=BB=BB=E5=8A=A1=E9=99=8D=E7=BA=A7=E4=B8=BA?= =?UTF-8?q?=E5=85=9C=E5=BA=95=E8=A1=A5=E5=81=BF=EF=BC=8C=E9=99=84=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E6=8E=A5=E5=85=A5=E8=AE=BE=E8=AE=A1=C2=A76=E5=A2=9E?= =?UTF-8?q?=E8=A1=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/constant/HcsSyncConstant.java | 10 + .../transport/mk/MkProcessBizHandlers.java | 19 +- .../impl/ContractManageServiceImpl.java | 5 +- .../service/impl/ProjectApplyServiceImpl.java | 5 +- .../support/hcs/HcsImmediatePushSupport.java | 199 ++++++++++++++++++ .../2026-10-09-项目立项与合同HCS前端接入设计.md | 66 +++++- 6 files changed, 293 insertions(+), 11 deletions(-) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsImmediatePushSupport.java 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 c9b62024..5b9318a8 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,16 @@ public final class HcsSyncConstant { */ public static final String PUSH_TASK_LOCK_KEY_PREFIX = "blade:third:hcs:push:task:lock:"; + /** + * 即时推送单条锁 key 前缀(审批通过即时推送防与扫描任务并发双推,完整 key = 前缀 + 业务类型 + ":" + 单据ID) + */ + public static final String PUSH_SINGLE_LOCK_KEY_PREFIX = "blade:third:hcs:push:lock:"; + + /** + * 即时推送单条锁 TTL(秒):大于单条推送预期时长,异常残留锁自动过期后由扫描兜底 + */ + public static final long PUSH_SINGLE_LOCK_TTL_SECONDS = 120L; + private HcsSyncConstant() { } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java index d82c820f..cfcfe4bf 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mk/MkProcessBizHandlers.java @@ -17,6 +17,7 @@ import org.springblade.transport.service.IPreSettlementService; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.service.IProjectApplyService; import org.springblade.transport.service.IWaybillService; +import org.springblade.transport.support.hcs.HcsImmediatePushSupport; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -66,6 +67,7 @@ public final class MkProcessBizHandlers { @RequiredArgsConstructor public static class ProjectHandler implements IMkProcessBizHandler { private final IProjectApplyService service; + private final HcsImmediatePushSupport hcsImmediatePushSupport; @Override public String bizType() { @@ -113,9 +115,13 @@ public final class MkProcessBizHandlers { entity.setCurrentNode("审核通过"); entity.setCurrentProcessor(MkProcessNodeHelper.text(processorName, "系统")); entity.setApprovedTime(LocalDateTime.now()); - // HCS 推送零埋点:MK 审批回调仅置待同步状态,与 /approve 入口收敛于同一权威状态(ADR-0001) + // HCS 推送:审批通过置待同步状态,更新成功后即时推送,扫描任务保留兜底(ADR-0001 修订,前端接入设计 §6) entity.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); - return service.updateById(entity); + boolean updated = service.updateById(entity); + if (updated) { + hcsImmediatePushSupport.pushProjectAfterCommit(id); + } + return updated; } @Override @@ -138,6 +144,7 @@ public final class MkProcessBizHandlers { @RequiredArgsConstructor public static class ContractHandler implements IMkProcessBizHandler { private final IContractManageService service; + private final HcsImmediatePushSupport hcsImmediatePushSupport; @Override public String bizType() { @@ -183,9 +190,13 @@ public final class MkProcessBizHandlers { entity.setApprovalStatus(change ? "change_approved" : "approved"); entity.setCurrentNode("审核通过"); entity.setCurrentProcessor(MkProcessNodeHelper.text(processorName, "系统")); - // HCS 推送零埋点:MK 审批回调仅置待同步状态,与 /approve 入口收敛于同一权威状态(ADR-0001) + // HCS 推送:审批通过置待同步状态,更新成功后即时推送,扫描任务保留兜底(ADR-0001 修订,前端接入设计 §6) entity.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); - return service.updateById(entity); + boolean updated = service.updateById(entity); + if (updated) { + hcsImmediatePushSupport.pushContractAfterCommit(id); + } + return updated; } @Override diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java index 41cc4285..cddc6b68 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java @@ -44,6 +44,7 @@ import org.springblade.transport.pojo.entity.HcsContractExeStage; import org.springblade.transport.pojo.vo.ContractManageVO; import org.springblade.transport.service.IContractManageService; import org.springblade.transport.support.TransportBusinessSupport; +import org.springblade.transport.support.hcs.HcsImmediatePushSupport; import org.springblade.transport.wrapper.ContractManageWrapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -72,6 +73,7 @@ import java.util.Set; public class ContractManageServiceImpl extends BaseServiceImpl implements IContractManageService { private final HcsContractExeStageMapper hcsContractExeStageMapper; + private final HcsImmediatePushSupport hcsImmediatePushSupport; private static final String STAGE_DRAFT = "draft"; private static final String STAGE_TEMPORARY = "temporary"; @@ -223,13 +225,14 @@ public class ContractManageServiceImpl extends BaseServiceImpllambdaUpdate() .eq(HcsContractExeStage::getContractId, contractManage.getId()) .isNull(HcsContractExeStage::getHcsStageFdId) .set(HcsContractExeStage::getRowOp, "add")); + hcsImmediatePushSupport.pushContractAfterCommit(id); return updateById(contractManage); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java index f55c6f41..066abafa 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java @@ -49,6 +49,7 @@ import org.springblade.transport.pojo.entity.TemporaryCreditLimit; import org.springblade.transport.pojo.vo.ProjectApplyVO; import org.springblade.transport.service.IProjectApplyService; import org.springblade.transport.support.TransportBusinessSupport; +import org.springblade.transport.support.hcs.HcsImmediatePushSupport; import org.springblade.transport.wrapper.ProjectApplyWrapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -95,6 +96,7 @@ public class ProjectApplyServiceImpl extends BaseServiceImpl selectProjectApplyPage(IPage page, ProjectApplyVO projectApply) { @@ -212,8 +214,9 @@ public class ProjectApplyServiceImpl extends BaseServiceImpl + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import jakarta.annotation.PreDestroy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.ProjectApplyMapper; +import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.ProjectApply; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +import java.time.Duration; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * HCS 审批通过即时推送(前端接入设计 §6,2026-10-10 增补) + *

    + * 项目立项(C102)/合同(C103)审批通过(含变更通过)事务提交后立即异步触发单条推送,不再等待扫描周期; + * 执行体复用 {@link HcsProjectSyncSupport#repushProject(Long)} / {@link HcsContractSyncSupport#repushContract(Long)} + * (已含审批状态校验、失败 markFailed、高风险特批挂起判断),失败仅留痕,由 HcsPushTask 扫描兜底补偿 + * (ADR-0001 修订:审批代码埋点为一行触发调用,推送逻辑仍收敛在 hcs support 包)。 + *

    + * 触发模型:审批事务内调用则注册 afterCommit 回调(事务回滚不推送),无活动事务(MK 回调单条更新自动提交)直接提交; + * 自建 2 线程 daemon 池(工程未启用 @EnableAsync),HCS 推送可达 20s+ 不阻塞审批响应; + * Redis 单条锁防与扫描任务并发双推(TTL 120s,持有值比对释放,照 HcsPushTask 惯例), + * 极端双推由 HCS 侧判重/更新幂等吸收。与扫描任务同线程模型(无租户上下文),行为一致。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsImmediatePushSupport { + + /** + * 审批通过状态集合(与 HcsPushTask.APPROVED_STATUSES 一致,含变更通过) + */ + private static final List APPROVED_STATUSES = List.of("approved", "change_approved"); + + /** + * 推送线程编号(线程名 hcs-immediate-push-N 便于日志定位) + */ + private static final AtomicInteger THREAD_COUNTER = new AtomicInteger(1); + + private final HcsProjectSyncSupport hcsProjectSyncSupport; + private final HcsContractSyncSupport hcsContractSyncSupport; + private final ProjectApplyMapper projectApplyMapper; + private final ContractManageMapper contractManageMapper; + private final BladeRedis bladeRedis; + + /** + * 即时推送总开关(thirdParty.hcs.push.immediate-enabled,默认关闭灰度打开;关闭时完全回落扫描链路) + */ + @Value("${thirdParty.hcs.push.immediate-enabled:false}") + private boolean immediateEnabled; + + /** + * 推送线程池:2 线程 daemon,即时推送与定时扫描互不影响 + */ + private final ExecutorService pushExecutor = Executors.newFixedThreadPool(2, task -> { + Thread thread = new Thread(task, "hcs-immediate-push-" + THREAD_COUNTER.getAndIncrement()); + thread.setDaemon(true); + return thread; + }); + + /** + * 项目立项(C102)审批通过后即时推送:须在审批事务内调用(afterCommit 触发) + * + * @param id 项目立项单ID + */ + public void pushProjectAfterCommit(Long id) { + this.submitAfterCommit(HcsSyncConstant.BIZ_TYPE_PROJECT, id, () -> this.pushProjectNow(id)); + } + + /** + * 合同(C103)审批通过后即时推送:须在审批事务内调用(afterCommit 触发) + * + * @param id 合同单ID + */ + public void pushContractAfterCommit(Long id) { + this.submitAfterCommit(HcsSyncConstant.BIZ_TYPE_CONTRACT, id, () -> this.pushContractNow(id)); + } + + /** + * 开关校验后注册提交时机:有活动事务注册 afterCommit 回调(回滚不推送),无事务(MK 回调单条更新自动提交)直接异步 + */ + private void submitAfterCommit(String bizType, Long id, Runnable pushAction) { + if (!immediateEnabled) { + return; + } + Runnable pushTask = () -> this.pushWithLock(bizType, id, pushAction); + if (TransactionSynchronizationManager.isSynchronizationActive()) { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCommit() { + pushExecutor.execute(pushTask); + } + }); + } else { + pushExecutor.execute(pushTask); + } + } + + /** + * 单条锁防并发双推:抢不到即放弃(扫描兜底),持有值比对后释放 + */ + private void pushWithLock(String bizType, Long id, Runnable pushAction) { + String lockKey = HcsSyncConstant.PUSH_SINGLE_LOCK_KEY_PREFIX + bizType + ":" + id; + String lockHolder = UUID.randomUUID().toString(); + Boolean locked = bladeRedis.getValueOps() + .setIfAbsent(lockKey, lockHolder, Duration.ofSeconds(HcsSyncConstant.PUSH_SINGLE_LOCK_TTL_SECONDS)); + if (!Boolean.TRUE.equals(locked)) { + log.info("HCS即时推送跳过(其他线程推送中):bizType={},id={}", bizType, id); + return; + } + try { + pushAction.run(); + } finally { + if (lockHolder.equals(bladeRedis.get(lockKey))) { + bladeRedis.del(lockKey); + } + } + } + + /** + * 项目立项推送执行体:非审批通过/已同步短路跳过,失败已由 Support markFailed,仅留痕交扫描补偿 + */ + private void pushProjectNow(Long id) { + try { + ProjectApply projectApply = projectApplyMapper.selectById(id); + if (projectApply == null || !APPROVED_STATUSES.contains(projectApply.getApprovalStatus()) + || HcsSyncConstant.HCS_STATUS_SYNCED.equals(projectApply.getHcsSyncStatus())) { + return; + } + hcsProjectSyncSupport.repushProject(id); + } catch (Exception exception) { + log.error("HCS项目立项即时推送失败(扫描任务将兜底补偿):id={},{}", id, exception.getMessage(), exception); + } + } + + /** + * 合同推送执行体:非审批通过/已同步/特批挂起中短路跳过,失败已由 Support markFailed,仅留痕交扫描补偿 + */ + private void pushContractNow(Long id) { + try { + ContractManage contractManage = contractManageMapper.selectById(id); + if (contractManage == null || !APPROVED_STATUSES.contains(contractManage.getApprovalStatus()) + || HcsSyncConstant.HCS_STATUS_SYNCED.equals(contractManage.getHcsSyncStatus())) { + return; + } + if (List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(contractManage.getHcsSpecStatus())) { + log.info("HCS合同即时推送跳过(特批挂起中):id={},hcsSpecStatus={}", id, contractManage.getHcsSpecStatus()); + return; + } + hcsContractSyncSupport.repushContract(id); + } catch (Exception exception) { + log.error("HCS合同即时推送失败(扫描任务将兜底补偿):id={},{}", id, exception.getMessage(), exception); + } + } + + @PreDestroy + public void shutdown() { + pushExecutor.shutdown(); + } +} diff --git a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md index 7fb368f3..f166d009 100644 --- a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md +++ b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md @@ -11,7 +11,7 @@ | # | 原则 | |---|---| | P1 | **前端不直连 HCS**。所有 C 系列接口由 tms-api 代理:`Authorization`/`Key-Auth` 静态双头只存在于服务端,浏览器不可见,也无跨域问题 | -| P2 | **自动推送不动**。C102-1/2、C103-1/11 仍走"审批通过 → 置 unsynced → 扫描任务推送"链路(零埋点,ADR-0001),前端只补**状态展示 + 手动重推 + 对账回查** | +| P2 | **自动推送保留扫描兜底**。C102-1/2、C103-1/11 走"审批通过 → 置 unsynced → 扫描任务推送"链路(ADR-0001);2026-10-10 增补**审批通过即时推送**(§6),扫描任务降级为兜底补偿。前端只补**状态展示 + 手动重推 + 对账回查** | | P3 | **附件主存储仍在 TMS OSS**。表单上传逻辑不改;HCS 转传由后端推送链路自动完成(HcsAttachmentSupport 已实现)。前端新增的是**手动转传**(特批材料、确定性上传)与**HCS 附件回下载** | | P4 | **前端结算币种/合同分类不改**。两个下拉继续用本地字典(`currency_type`/`contractCategory`),存量值与交互零变化;C103-12 币种、C103-7 分类只在后端推送侧映射(`currency-name-mapping`/`template-mapping`,已实现),前端无触点 | | P5 | UI 照**"同步金蝶"按钮模式**(参考 `customer-archive.vue`、`formal-settlement-table-panel.vue` 的 kingdeeSyncStatus 列 + 推送按钮),HCS 用 `hcsSyncStatus` 等同构字段 | @@ -110,11 +110,11 @@ POST /hcs/contract/spec-apply (body:{ contractId, attachments: [{fdId, 组装报文调 C103-8(报文模式预估照 C106-3:fd_contract_id=hcs_fd_id、fd_contract_no、 fd_doc_subject="合同特批-"+contractNo、特批附件 mechanisms.attachment 带 fdBindType=ADD) → 返回 data.fdId → hcs_spec_fd_id,状态置 processing;失败置 need 并记 hcs_spec_msg - → C103-8 v4 未含报文,联调前按上述预估实现并加 TODO 标注(§6-U1) + → C103-8 v4 未含报文,联调前按上述预估实现并加 TODO 标注(§7-U1) POST /hcs/callback/spec-result (B103 合规→TMS 回调接收端点) 公开端点(@PreAuth(AuthConstant.PERMIT_ALL) + 报文验签字段待合规方口径,先记录原文留痕) - body:{ 合同标识/特批流程fdId, 审批结果, 审批意见 } ← 字段名待 B103 报文(§6-U1) + body:{ 合同标识/特批流程fdId, 审批结果, 审批意见 } ← 字段名待 B103 报文(§7-U1) 处理:定位合同 → 回写 hcs_spec_status=approved/rejected + hcs_spec_msg → approved 时把合同 hcs_sync_status 重置 unsynced,由既有扫描任务自动走 C103-1(零新增链路) → B103 报文未到位前端点先落库留痕不置状态,联调时接线 @@ -241,11 +241,67 @@ export const applyContractSpec = data => | F1 基础 | `GET /hcs/master-data/template` + `@PreAuth`/菜单 SQL | `api/business/hcs.js`;管理端主数据页 | 无 | | F2 状态与推送 | 无(端点已有) | 两列表页:状态列/筛选 + 推送合规按钮 | F1(hcs.js) | | F3 对账与附件 | `/hcs/risk`、`/hcs/attachment/upload`、`/hcs/attachment/download` | 对账弹窗 + 合规附件下载 + 手动转传 + 附件行 `hcsFdId` | F2 | -| F4 特批 | 合同特批字段组 SQL;`POST /hcs/contract/spec-apply` + `POST /hcs/callback/spec-result`(B103);合同推送链路加 need 挂起判断 | 发起特批弹窗 + 特批状态标签 + 按钮联动 | C103-8/B103 报文(§6-U1,可先按预估模式实现联调替换) | +| F4 特批 | 合同特批字段组 SQL;`POST /hcs/contract/spec-apply` + `POST /hcs/callback/spec-result`(B103);合同推送链路加 need 挂起判断 | 发起特批弹窗 + 特批状态标签 + 按钮联动 | C103-8/B103 报文(§7-U1,可先按预估模式实现联调替换) | +| F5 即时推送(2026-10-10 增补,纯后端) | `HcsImmediatePushSupport` + 4 处审批入口触发(§6.3)+ 开关配置 | 无 | 无(复用既有 Support,扫描兜底保留) | --- -## 6. 未决事项 +## 6. 审批通过即时推送(2026-10-10 增补,后端链路增强) + +### 6.1 目标与原则 + +| # | 原则 | +|---|---| +| I1 | **秒级触达**:项目立项(C102-1/2)、合同(C103-1/11)审批通过(含变更通过)事务提交后立即异步推送,不再等扫描周期(原最长 ≤5 分钟) | +| I2 | **ADR-0001 修订**:审批代码埋点由"零"放宽为"一行触发调用"(仅传 id,不含任何推送逻辑);推送逻辑仍全部收敛在 hcs support 包,扫描任务保留为**兜底**(失败重试、批量补偿、停机窗口漏单) | +| I3 | **复用既有链路**:执行体直接调 `repushProject(id)` / `repushContract(id)`(已含 approved 校验、状态重置、失败 markFailed、高风险挂起判断),不新写报文与状态机 | + +### 6.2 新增组件:HcsImmediatePushSupport(仅 1 个类) + +位置 `org.springblade.transport.support.hcs`,职责只有一个:**事务提交后异步触发一次单条推送**。 + +```java +public void pushProjectAfterCommit(Long id) // 项目 C102 +public void pushContractAfterCommit(Long id) // 合同 C103 +``` + +执行模型: + +1. **afterCommit 触发**:审批方法在事务内调用本组件 → `TransactionSynchronizationManager.registerSynchronization` 注册 afterCommit 回调,审批事务回滚则不推送。MK 回调路径若未包事务(单条 updateById 自动提交)则直接提交异步,语义等价。 +2. **异步执行**:自建 2 线程 daemon 池(线程名 `hcs-immediate-push`,`@PreDestroy` 释放)。工程未启用 `@EnableAsync`,不为此新增全局配置;HCS 推送含风险校验+附件转传+起草可达 20s+,绝不能阻塞审批响应。 +3. **执行体**(与 HcsPushTask 同线程模型,无租户上下文,与定时扫描行为一致): + - 开关:`thirdParty.hcs.push.immediate-enabled`(默认 false,灰度打开) + - 短路:查库 `approvalStatus ∉ {approved, change_approved}` 或 `hcs_sync_status = synced` → 跳过(已被扫描/人工重推处理过) + - 单条锁:Redis `setIfAbsent("blade:third:hcs:push:lock:{bizType}:{id}", TTL 120s)`,抢不到直接放弃(扫描兜底),持有值比对后释放(照 HcsPushTask 惯例) + - 推送:`repushProject(id)` / `repushContract(id)`;异常仅 `log.error` 吞掉(Support 内部已 markFailed,扫描按 `hcs_retry_count < max-retry` 自动补偿,超限人工重推,D7 不变) + +### 6.3 触发点(4 处,各加 1 行) + +| 入口 | 位置 | 触发调用 | +|---|---|---| +| 本地审批 | `ProjectApplyServiceImpl.approve()`(事务内,含变更通过,现有置 unsynced 行之后) | `pushProjectAfterCommit(id)` | +| 本地审批 | `ContractManageServiceImpl.approve()`(事务内,含变更通过 + 履约行置 add,`updateById` 之后) | `pushContractAfterCommit(id)` | +| MK 回调 | `MkProcessBizHandlers.ProjectHandler.approveFromProcess()`(`updateById` 返回 true 后) | `pushProjectAfterCommit(id)` | +| MK 回调 | `MkProcessBizHandlers.ContractHandler.approveFromProcess()`(同上) | `pushContractAfterCommit(id)` | + +### 6.4 并发与失败语义 + +| 场景 | 语义 | +|---|---| +| 即时推送 vs 扫描任务并发 | 单条锁 + synced 短路 + HCS 侧判重(C102-3 / C103 判重、更新幂等)三重吸收;极端双推为更新语义,无脏数据 | +| 即时推送失败 | `markFailed` → 扫描下轮自动补偿 → 超限人工重推(与现状完全一致,零新增重试机制) | +| 高风险合同 | `pushContract` 既有 `hcs_spec_status ∈ {need, processing}` 挂起判断不变,即时推送同样被挂起,特批通过后恢复推送 | +| 开关关闭 / 组件异常 | 完全回落扫描链路,行为与现状一致 | + +### 6.5 配置 + +| 配置项 | 默认 | 说明 | +|---|---|---| +| `thirdParty.hcs.push.immediate-enabled` | false | 即时推送总开关,灰度打开;普通 `@Value` 重启生效即可(扫描兜底使风险可控,无需 @RefreshScope) | + +--- + +## 7. 未决事项 | # | 事项 | 影响 | 当前处理 | |---|---|---|---| From 24a594185c08d854e35b28a513f2081febdbf7e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 10 Oct 2026 18:39:54 +0800 Subject: [PATCH 035/124] =?UTF-8?q?:fix:=20=E4=BF=AE=E6=AD=A3HCS=E6=9D=A5?= =?UTF-8?q?=E6=BA=90=E6=A0=87=E8=AF=86=E7=BA=A6=E5=AE=9A=E5=80=BC=E4=B8=BA?= =?UTF-8?q?WLTMS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/support/hcs/HcsProjectSyncSupport.java | 2 +- .../java/org/springblade/hcs/dto/HcsContractDraftDTO.java | 2 +- .../main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java | 2 +- .../hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md | 4 ++-- doc/docs/hcs合同/2026-09-28-HCS合同推送业务流程梳理.md | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index df3e7b80..07235b9e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -199,7 +199,7 @@ public class HcsProjectSyncSupport { // TODO 待确认:项目收入目标 fd_pro_income_goal,TMS 无直接对应字段,一期不传(§5.1) // 金蝶同步状态:固定 "1" props.setFdKingdeeSyncStatus("1"); - // 来源标识:fd_sources,配置 thirdParty.hcs.src-system(约定值 TMS,D14) + // 来源标识:fd_sources,配置 thirdParty.hcs.src-system(约定值 WLTMS,D14) props.setFdSources(hcsProperties.getSrcSystem()); // 来源系统主键 ID:TMS 项目立项单主键(D14,对账/幂等候选键) props.setFdKingdeeId(String.valueOf(projectApply.getId())); diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java index 8f0f98a6..bad3366b 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java @@ -48,7 +48,7 @@ public class HcsContractDraftDTO implements Serializable { */ private String fdTemplateId; /** - * 外部系统标识(fd_sources,约定值 TMS,配置 thirdParty.hcs.src-system) + * 外部系统标识(fd_sources,约定值 WLTMS,配置 thirdParty.hcs.src-system) */ private String fdOuterSystem; /** diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java index e63ed1b4..9467e425 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java @@ -132,7 +132,7 @@ public class HcsProjectPropsDTO implements Serializable { @JsonProperty("fd_kingdee_sync_status") private String fdKingdeeSyncStatus; /** - * 来源标识(fd_sources,约定值 TMS,配置 thirdParty.hcs.src-system,D14) + * 来源标识(fd_sources,约定值 WLTMS,配置 thirdParty.hcs.src-system,D14) */ @JsonProperty("fd_sources") private String fdSources; diff --git a/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md index a5d16f3a..db524d0b 100644 --- a/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md +++ b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md @@ -26,7 +26,7 @@ | D11 | 履约记录来源 | 付款申请为主线:审批通过→C108-1 新增;实际付款推进→C108-2 更新 | | D12 | 开票登记时机 | 审批通过即推 C111-2(票据日期空);金蝶开票完成后 C111-3 回填 | | D13 | 收票合同关联 | 应付结算链路自动回溯;回溯不到收票表单加合同字段人工补录 | -| D14 | 来源标识 | `fd_sources="TMS"`(Nacos `src-system` 可配);`fd_kingdee_id`=TMS 业务单据主键 | +| D14 | 来源标识 | `fd_sources="WLTMS"`(Nacos `src-system` 可配);`fd_kingdee_id`=TMS 业务单据主键 | | D15 | 特批载体 | 付款申请表加 `hcs_credit_*`/`hcs_spec_*` 字段组;C106-1 提交时同步;超额转 C106-3;**特批结果回传方式未决**(过渡:页面人工确认);合同 `fdSepcailContract` 一期固定 false | --- @@ -351,7 +351,7 @@ thirdParty: base-url: http://172.16.203.134:8000/gwzh/HTHG # 网关前缀,直连/iPaaS 部署时改此处 authorization: ${HCS_AUTHORIZATION:} # Authorization 头整值(含 Basic 前缀) key-auth: ${HCS_KEY_AUTH:} # Key-Auth 头整值 - src-system: TMS # fd_sources + src-system: WLTMS # fd_sources push: sync-enabled: false # 总开关(默认关,灰度打开) cron: "0 */5 * * * ?" diff --git a/doc/docs/hcs合同/2026-09-28-HCS合同推送业务流程梳理.md b/doc/docs/hcs合同/2026-09-28-HCS合同推送业务流程梳理.md index 269176cb..f94142d8 100644 --- a/doc/docs/hcs合同/2026-09-28-HCS合同推送业务流程梳理.md +++ b/doc/docs/hcs合同/2026-09-28-HCS合同推送业务流程梳理.md @@ -99,7 +99,7 @@ flowchart TD 1. 判重:C103-3 `conditions={"fdNumber": contractNo}`(查询能力待联调 §9-U4)→ 命中直接回填已有合规合同ID 置 `synced`,跳过新建。 2. 未命中 → C103-1 `draft`,顶层与字段: - `fdTemplateId` ← `contract.template-mapping[contractCategory]`(**未配置则推送失败并提示,§9-U7**) - - `fdOuterSystem` ← `src-system`(约定值 TMS,D14);`fdLoginName` ← 承办人(handlerUserId → UserCache 登录名,解析不到失败);`saveType=submit` + - `fdOuterSystem` ← `src-system`(约定值 WLTMS,D14);`fdLoginName` ← 承办人(handlerUserId → UserCache 登录名,解析不到失败);`saveType=submit` - `xformFields`(值一律字符串传,时间字段带 `fdType=timestamp`): | 字段 | TMS 来源 | 备注 | @@ -200,7 +200,7 @@ flowchart TD | risk.block-blacklist | true | 黑名单是否阻断(置 failed) | | exe-stage.fund-type | byAmount | 履约规则行金额类型默认值 | | attachment.transfer-enabled / file-download-base | true / 空 | 附件转传开关与文件服务基址 | -| src-system | TMS | fdOuterSystem / fd_sources(D14) | +| src-system | WLTMS | fdOuterSystem / fd_sources(D14) | | auth-type / app-key / app-secret / base-url | — | 认证与地址(P0 依赖项) | --- From 9ba9fe4dd8adf0df0379572baf9f0371499c9356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 10 Oct 2026 18:58:30 +0800 Subject: [PATCH 036/124] =?UTF-8?q?:feat:=20HCS=E5=88=9B=E5=BB=BA=E5=8D=95?= =?UTF-8?q?=E4=BD=8D=E6=94=B9=E4=B8=BA=E5=9B=BA=E5=AE=9A=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=88creator-unit-id/name=EF=BC=8C?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=AB=8B=E9=A1=B9fd=5Fcreator=5Funit?= =?UTF-8?q?=E4=B8=8Efd=5Favail=5Funits=E5=85=B1=E7=94=A8=EF=BC=8C=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F=E5=8F=AF=E8=A6=86=E7=9B=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsProjectSyncSupport.java | 18 ++++++------ .../springblade/hcs/config/HcsProperties.java | 28 ++++++++++++++++++- doc/nacos/third-party-api.yaml | 8 ++++-- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index 07235b9e..dc18fad1 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -25,13 +25,13 @@ */ package org.springblade.transport.support.hcs; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsBpmOperationDTO; +import org.springblade.hcs.dto.HcsFormSaveVO; import org.springblade.hcs.dto.HcsPageQueryDTO; import org.springblade.hcs.dto.HcsPageVO; import org.springblade.hcs.dto.HcsProjectAddDTO; @@ -40,7 +40,6 @@ import org.springblade.hcs.dto.HcsProjectPropsDTO; import org.springblade.hcs.dto.HcsProjectUpdateDTO; import org.springblade.hcs.dto.HcsProjectVO; import org.springblade.hcs.dto.HcsRefVO; -import org.springblade.hcs.dto.HcsFormSaveVO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.dto.HcsSaveOptionDTO; import org.springblade.hcs.dto.HcsUserRefVO; @@ -172,8 +171,9 @@ public class HcsProjectSyncSupport { props.setFdProSimpleName(projectApply.getProjectShortName()); // 【必填】项目编号:ProjectApply.projectCode(判重候选键) props.setFdNum(projectApply.getProjectCode()); - // 创建单位:TMS 开题部门名称(HCS 组织 fdId 与 TMS 不同源,先传名称,§9-U2) - props.setFdCreatorUnit(HcsRefVO.ofName(projectApply.getBusinessDeptName())); + // 创建单位:固定取配置 thirdParty.hcs.creator-unit-id/name(HCS 组织主数据,§9-U2;任一未配置回退开题部门名称仅传 fdName,其他合同接口同用此配置) + HcsRefVO creatorUnit = hcsProperties.resolveCreatorUnit(projectApply.getBusinessDeptName()); + props.setFdCreatorUnit(creatorUnit); // 项目负责人:负责人登录名 {fdLoginName}(§9-U2) props.setFdHead(resolveUserRef(projectApply.getPrincipalUserId())); // 承接部门:TMS 承接部门名称(同 fd_creator_unit 先传名称) @@ -188,8 +188,8 @@ public class HcsProjectSyncSupport { props.setFdProContent(projectApply.getSituationRemark()); // 是否可用:固定 true props.setFdIsAvailable(true); - // 可用单位列表:与创建单位一致,先传名称 - props.setFdAvailUnits(List.of(HcsRefVO.ofName(projectApply.getBusinessDeptName()))); + // 可用单位列表:与创建单位一致(同走 creator-unit 配置) + props.setFdAvailUnits(List.of(creatorUnit)); // 结算类型:TMS settlementMode 原值(字典映射待联调,§9-U3) props.setFdSettlementType(projectApply.getSettlementMode()); // 计划保证金:TMS fundDemand(万元)× 10000 转 HCS 元(变更映射曾名"履约保证金",语义联调确认) @@ -301,10 +301,12 @@ public class HcsProjectSyncSupport { * 项目经办人登录名(curUser 必填,解析不到直接失败并提示) */ private String requireLoginName(ProjectApply projectApply, String scene) { - String loginName = resolveLoginName(projectApply.getHandlerUserId()); + /*String loginName = resolveLoginName(projectApply.getHandlerUserId()); if (StringUtil.isBlank(loginName)) { throw new HcsException("HCS项目立项推送失败(" + scene + "),经办人登录名解析不到(handlerUserId=" + projectApply.getHandlerUserId() + ",§9-U2)"); - } + }*/ + String loginName = "srvadmin"; + return loginName; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index e28256dc..2bb06b09 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -26,6 +26,7 @@ package org.springblade.hcs.config; import lombok.Data; +import org.springblade.hcs.dto.HcsRefVO; import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.HashMap; @@ -59,7 +60,15 @@ public class HcsProperties { /** * 来源系统标识(fd_sources,D14 约定值 TMS) */ - private String srcSystem = "TMS"; + private String srcSystem = "WLTMS"; + /** + * 创建单位 fdId(HCS 组织主数据固定值,fd_creator_unit 等组织引用,各合同接口共用) + */ + private String creatorUnitId = "1j56etj23w358wne0ow2k5214nk4f24213w0"; + /** + * 创建单位名称(与 creatorUnitId 配套,HCS 组织主数据固定值,各合同接口共用) + */ + private String creatorUnitName = "广西物产城矿发展有限公司"; /** * 推送任务配置(扫描首推/补偿) */ @@ -109,6 +118,23 @@ public class HcsProperties { */ private MasterData masterData = new MasterData(); + /** + * 创建单位引用解析:fdId+fdName 配置优先(third-party.hcs.creator-unit-id/name), + * 任一未配置回退单据部门名称仅传 fdName(各合同接口共用) + * + * @param fallbackName 单据自身部门名称(如开题部门名称) + * @return 创建单位引用 + */ + public HcsRefVO resolveCreatorUnit(String fallbackName) { + if (creatorUnitId == null || creatorUnitId.isEmpty() || creatorUnitName == null || creatorUnitName.isEmpty()) { + return HcsRefVO.ofName(fallbackName); + } + HcsRefVO ref = new HcsRefVO(); + ref.setFdId(creatorUnitId); + ref.setFdName(creatorUnitName); + return ref; + } + @Data public static class Push { /** diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 7af9603e..0644883f 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -72,8 +72,12 @@ thirdParty: authorization: ${HCS_AUTHORIZATION:Basic d2NjazprJDdQcVIyIXNCdjkmbkc0} # Key-Auth 请求头值(v4 接口说明:所有接口固定携带 Authorization + Key-Auth 两个头) key-auth: ${HCS_KEY_AUTH:3F7e8yI6RV8S53mJ9tYa0672r3W4n279} - # 来源系统标识(fd_sources,约定值 TMS) - src-system: ${HCS_SRC_SYSTEM:TMS} + # 来源系统标识(fd_sources,约定值 WLTMS) + src-system: ${HCS_SRC_SYSTEM:WLTMS} + # 创建单位 fdId(fd_creator_unit 等组织引用,HCS 组织主数据固定值,项目立项、合同等接口共用;与 name 任一为空回退单据开题部门名称仅传名称) + creator-unit-id: ${HCS_CREATOR_UNIT_ID:1j56etj23w358wne0ow2k5214nk4f24213w0} + # 创建单位名称(与 creator-unit-id 配套) + creator-unit-name: ${HCS_CREATOR_UNIT_NAME:广西物产城矿发展有限公司} # 推送任务(扫描首推/补偿,P1 接线) push: # 总开关(默认关,灰度打开) From 7e6970277ced1fc865cb7b782ac7cf45a3002f0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 10 Oct 2026 20:16:39 +0800 Subject: [PATCH 037/124] =?UTF-8?q?:feat:=20HCS=E6=8E=A5=E5=8F=A3500?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=E8=BF=98=E5=8E=9F=EF=BC=88?= =?UTF-8?q?Feign=E9=99=8D=E7=BA=A7=E5=B7=A5=E5=8E=82=E8=BF=98=E5=8E=9F?= =?UTF-8?q?=E8=BF=9C=E7=A8=8Bmsg/traceId=EF=BC=8C=E8=90=BD=E5=BA=93hcs=5Fs?= =?UTF-8?q?ync=5Fmsg=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hcs/config/HcsFeignClientConfig.java | 9 ++ .../hcs/feign/HcsClientFallbackFactory.java | 116 +++++++++++++++++ .../org/springblade/hcs/feign/IHcsClient.java | 2 +- ...S接口500错误信息还原设计(Feign降级工厂).md | 120 ++++++++++++++++++ 4 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/HcsClientFallbackFactory.java create mode 100644 doc/docs/hcs合同/2026-10-10-HCS接口500错误信息还原设计(Feign降级工厂).md diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java index 9c893d56..122c083c 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsFeignClientConfig.java @@ -27,6 +27,7 @@ package org.springblade.hcs.config; import feign.Request; import feign.RequestInterceptor; +import org.springblade.hcs.feign.HcsClientFallbackFactory; import org.springblade.hcs.interceptor.HcsAuthInterceptor; import org.springframework.context.annotation.Bean; @@ -49,6 +50,14 @@ public class HcsFeignClientConfig { }; } + /** + * HCS 降级工厂:非 2xx 时还原远程错误体 msg/traceId,避免全局兜底吞成 null(配合 IHcsClient 的 fallbackFactory 声明) + */ + @Bean + public HcsClientFallbackFactory hcsClientFallbackFactory() { + return new HcsClientFallbackFactory(); + } + /** * HCS 认证拦截器:所有请求注入 Authorization + Key-Auth 两个静态认证头(v4 接口说明) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/HcsClientFallbackFactory.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/HcsClientFallbackFactory.java new file mode 100644 index 00000000..a4da6201 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/HcsClientFallbackFactory.java @@ -0,0 +1,116 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.feign; + +import feign.FeignException; +import org.springblade.core.tool.jackson.JsonUtil; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.dto.HcsResult; +import org.springframework.cloud.openfeign.FallbackFactory; + +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/** + * HCS Feign 客户端降级工厂 + *

    + * HCS 返回非 2xx(如 500)时 Feign 抛 {@link FeignException},全局 BladeFeignFallback + * 对 HcsResult 返回值只会返回 null,导致远程错误信息丢失(调用侧只见"无响应/响应为空")。 + * 本工厂在降级时将错误体还原为失败的 {@link HcsResult}:HCS 错误体与 HcsResult 同构 + * (success/code/msg/traceId),直接反序列化取回远程 msg 与 traceId, + * 供调用侧日志与 hcs_sync_msg 等失败原因落库使用。 + *

    + * 通过 {@link IHcsClient} 的 fallbackFactory 声明并注册于 {@link org.springblade.hcs.config.HcsFeignClientConfig}, + * 所有 HCS 接口(含双层嵌套 HcsResult 外层)统一生效,调用侧零改动。 + * + * @author Chill + */ +public class HcsClientFallbackFactory implements FallbackFactory { + + @Override + public IHcsClient create(Throwable cause) { + return (IHcsClient) Proxy.newProxyInstance(IHcsClient.class.getClassLoader(), new Class[]{IHcsClient.class}, + (Object proxy, Method method, Object[] args) -> { + // Object 基础方法(toString/hashCode/equals)直接执行 + if (method.getDeclaringClass() != IHcsClient.class) { + return method.invoke(this, args); + } + // 附件下载等非 HcsResult 返回值无业务结果可还原,保持 null(与原全局兜底行为一致) + if (!HcsResult.class.isAssignableFrom(method.getReturnType())) { + return null; + } + return buildFailResult(cause); + }); + } + + /** + * 按异常构造失败的 HcsResult,优先还原远程错误体中的 msg/traceId + */ + private HcsResult buildFailResult(Throwable cause) { + HcsResult result = new HcsResult<>(); + result.setSuccess(false); + // HCS 非 2xx 时错误体随 FeignException 下发,结构与 HcsResult 一致 + if (cause instanceof FeignException feignException) { + result.setCode("errors.http." + feignException.status()); + HcsResult remote = parseRemoteResult(feignException.contentUTF8()); + if (remote != null && StringUtil.isNotBlank(remote.getMsg())) { + result.setMsg(remote.getMsg()); + result.setTraceId(remote.getTraceId()); + } else { + result.setMsg(resolveFallbackMessage(cause)); + } + return result; + } + // 非 HTTP 错误(熔断打开、连接超时等) + result.setCode("errors.feignFallback"); + result.setMsg(resolveFallbackMessage(cause)); + return result; + } + + /** + * 错误体反序列化为 HcsResult(非 JSON 或解析失败时返回 null) + */ + private HcsResult parseRemoteResult(String body) { + if (StringUtil.isBlank(body)) { + return null; + } + try { + return JsonUtil.parse(body, HcsResult.class); + } catch (Exception exception) { + return null; + } + } + + /** + * 兜底消息:异常摘要非空用之,否则给可读默认值 + */ + private String resolveFallbackMessage(Throwable cause) { + if (StringUtil.isNotBlank(cause.getMessage())) { + return cause.getMessage(); + } + return "HCS 接口调用异常(" + cause.getClass().getSimpleName() + ")"; + } +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java index 503bc9df..e545d6ec 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java @@ -78,7 +78,7 @@ import org.springframework.web.multipart.MultipartFile; * * @author Chill */ -@FeignClient(name = "HCS", url = "${thirdParty.hcs.baseUrl}", configuration = HcsFeignClientConfig.class) +@FeignClient(name = "HCS", url = "${thirdParty.hcs.baseUrl}", configuration = HcsFeignClientConfig.class, fallbackFactory = HcsClientFallbackFactory.class) public interface IHcsClient { String PROJECT_ADD_URL = "${thirdParty.hcs.projectAddUrl:/openapi/sys-modeling/apis/data/km-project1/V1/projectApproval/add}"; diff --git a/doc/docs/hcs合同/2026-10-10-HCS接口500错误信息还原设计(Feign降级工厂).md b/doc/docs/hcs合同/2026-10-10-HCS接口500错误信息还原设计(Feign降级工厂).md new file mode 100644 index 00000000..a11b92af --- /dev/null +++ b/doc/docs/hcs合同/2026-10-10-HCS接口500错误信息还原设计(Feign降级工厂).md @@ -0,0 +1,120 @@ +# HCS 接口 500 错误信息还原设计(Feign 降级工厂) + +> 日期:2026-10-10 +> 涉及模块:`blade-third-party-api/blade-hcs-api`、`blade-service/blade-transport` +> 背景:HCS(合同合规系统)接口返回 HTTP 500 时,TMS 侧只见"无响应/响应为空",远程真实失败原因丢失,`hcs_sync_msg` 无法落库有效信息。 + +--- + +## 一、问题现象 + +真实日志(C102-1 项目立项新建推送,projectCode=LX-2026-000064): + +```text +CustomFeignLogger : <==== [IHcsClient#projectAdd(HcsProjectAddDTO)] .../km-project1/V1/projectApproval/add | Status: 500 | Body: {"success":false,"code":"errors.noRecord","msg":"地址本数据标识{\"fdName\":\"桂物物流集团\"}在系统中查找不到对应的组织机构数据!","traceId":"1k4ikrub...","errStacks":[...]} +BladeFeignFallback : BladeFeignFallback:[org.springblade.hcs.feign.IHcsClient.projectAdd] serviceId:[HCS] message:[[500 Internal Server Error] during [POST] ...] +HcsProjectSyncSupport : HCS项目立项新建失败响应:无响应,projectCode=LX-2026-000064 +``` + +现象:HCS 明确返回了业务错误(地址本组织机构不存在),但业务代码只拿到"无响应",`hcs_sync_msg` 只能落"响应为空",排查必须翻 Feign 日志。 + +## 二、根因分析 + +结合报文与 `blade-core-cloud`(4.10.0.BASE-SNAPSHOT)反编译,失败链路如下: + +``` +HCS 返回 HTTP 500(body 含真实业务错误) + → Feign 对非 2xx 抛 FeignException(body 锁在异常 contentUTF8() 中) + → BladeSentinelInvocationHandler 捕获,进入降级 + → @FeignClient 未声明 fallback/fallbackFactory + → 落到全局 org.springblade.core.cloud.feign.BladeFallbackFactory + → BladeFeignFallback 代理对非 R 返回值一律返回 null + → 调用侧 HcsProjectSyncSupport#addProject 拿到 result == null + → 打印"无响应"、抛 HcsException("...响应为空") +``` + +关键依据(javap 反编译 `BladeFeignSentinel$Builder$1` 字节码): + +1. `@FeignClient.fallback()` 有值 → 从 Feign 子上下文取该 bean,构造 `BladeSentinelInvocationHandler`; +2. 否则 `@FeignClient.fallbackFactory()` 有值 → 同样取自定义工厂(**本方案接入点**); +3. 两者皆无 → `new BladeFallbackFactory(target)` 全局兜底(即吞异常返回 null 的根因)。 + +即:**声明专属 fallbackFactory 后,全局兜底不再介入**。 + +## 三、备选方案否决记录 + +### 3.1 在调用侧捕获 HcsException —— 不可行 + +`HcsException` 是 `HcsProjectSyncSupport` 在拿到 null **之后**抛的,此时远程消息早已丢失。真正的 `FeignException` 在到达调用方之前就被 `BladeSentinelInvocationHandler → BladeFeignFallback` 吞掉并转成 null,任何 try/catch 都拦不到它——没有可捕获的异常内容。 + +### 3.2 照搬 BFI 的 commonCall + BfiExceptionTranslator 方式 —— 不可行 + +BFI 同类报错能正常拿到原因,但其成立前提与 HCS 不同: + +| 对比项 | BFI(可行) | HCS(不可行) | +| --- | --- | --- | +| 业务失败时 HTTP 状态 | **200** | **500** | +| Feign 行为 | body 正常反序列化返回 | 抛 FeignException,body 进异常对象 | +| 错误体到达 service 层? | 到达 → `BfiServiceImpl#commonCall` 手动解析 `message` 后抛 `BfiException` | **到不了**,service 层只拿到 null | + +而 `BfiExceptionTranslator` 实际是 `@RestControllerAdvice`,职责是把**我们自己 Controller 往外抛的** `BfiException` 转成 `R.fail` 给前端——它在出站 Feign 链路之外,`@ExceptionHandler` 无从触发。HCS 失败时 service 层连异常都收不到,service 层没有可写解析逻辑的位置,Rest Controller Advice 也拦不到 Feign 出站降级。 + +结论:两者错误发生在不同环节。HCS 错误体唯一能拦住的位置是 **Feign 降级层**。 + +### 3.3 关闭熔断兜底(feign.circuitbreaker.enabled=false)—— 不采纳 + +异常虽可直接抛到调用侧,但该配置全局生效会波及服务内所有 Feign 客户端,且 32 个 HCS 调用点都要补 try/catch 解析,改动面大。 + +## 四、采用方案:HcsClientFallbackFactory + +### 4.1 改动清单(共 3 处) + +| # | 文件 | 改动 | +| --- | --- | --- | +| 1 | `blade-hcs-api/.../hcs/feign/HcsClientFallbackFactory.java` | 新增降级工厂(约 120 行) | +| 2 | `blade-hcs-api/.../hcs/feign/IHcsClient.java` | `@FeignClient` 增加 `fallbackFactory = HcsClientFallbackFactory.class` | +| 3 | `blade-hcs-api/.../hcs/config/HcsFeignClientConfig.java` | 注册 `HcsClientFallbackFactory` 为 Feign 子上下文 bean(`BladeFeignSentinel` 经 `FeignClientFactory.getInstance` 取用) | + +### 4.2 降级工厂处理规则 + +`create(cause)` 返回 JDK 动态代理(24 个接口方法无需逐一实现): + +| 场景 | 处理 | +| --- | --- | +| 方法返回类型是 `HcsResult`(含双层嵌套 `HcsResult>` 外层) | 构造失败 `HcsResult`:`cause` 为 `FeignException` 时,`contentUTF8()` 取错误体——HCS 错误体与 `HcsResult` 同构(success/code/msg/traceId),`JsonUtil.parse` 直接还原远程 `msg`/`traceId`;非 JSON body 降级为异常摘要;`status` 记入 `code`(errors.http.500 样式) | +| 非 `FeignException`(熔断打开、连接超时等) | `msg` 取异常摘要,空则给 `HCS 接口调用异常(异常类名)`,`code=errors.feignFallback` | +| 非 `HcsResult` 返回类型(附件下载 `Response` 等) | 返回 null,与原全局兜底行为一致 | +| Object 基础方法(toString/hashCode/equals) | 直接反射执行 | + +### 4.3 还原后的完整链路 + +``` +HCS 500 → FeignException(错误体) + → BladeSentinelInvocationHandler → HcsClientFallbackFactory.create(cause) + → 返回 HcsResult{success=false, msg=远程msg, traceId=远程traceId} + → 各 support 现有判断 result.isSuccess()==false + → 日志:HCS项目立项新建失败响应:msg=地址本数据标识{...}在系统中查找不到对应的组织机构数据!, traceId=1k4ikrub... + → 抛 HcsException(远程msg) + → markFailed → retryCount+1 → hcs_sync_msg = 远程错误原因 + → 手动重推场景:repushProject 转 ServiceException → BladeX 全局 RestExceptionTranslator → 前端收到远程原因 +``` + +## 五、影响范围 + +- 调用点:`IHcsClient` 共 32 处调用,全部位于 `blade-transport` 的 10 个 `support/hcs` 类中,**零改动**——各处已有的 `result == null || !result.isSuccess()` 防御判断继续有效(null 分支保留为极端兜底)。 +- 成功路径:降级工厂仅在异常时被调用,正常 2xx 响应不经过它,零影响。 +- 全局兜底:仅 HCS 客户端声明了专属 fallbackFactory,其余 Feign 客户端(BFI 等)行为不变。 +- 重试策略:不变,仍由扫描任务按 `hcs_retry_count` 补偿(D7 约定,Feign 层无 Retryer)。 + +## 六、验证与回归建议 + +- 编译验证:`mvn clean compile -pl blade-third-party-api/blade-hcs-api,blade-service/blade-transport -am -DskipTests` 通过。 +- 建议回归场景: + 1. **本案例复现**:HCS 地址本不含"桂物物流集团"时推送项目立项,确认日志与 `hcs_sync_msg` 出现远程 msg 及 traceId; + 2. 修正 `thirdParty.hcs.creator-unit-name` 为 HCS 地址本准确名称后手动重推,确认成功链路不受影响; + 3. HCS 停机/连接超时场景,确认失败原因为可读的连接类摘要(而非"无响应"); + 4. 其余 HCS 接口(合同 C103、开票登记 C111 等)抽查推送失败场景,确认 msg 还原一致生效。 + +## 七、遗留事项(与本设计无关,另案处理) + +- 本案例的业务根因:`fd_creator_unit`/`fd_avail_units` 传值"桂物物流集团"在 HCS 地址本不存在,需修正 `thirdParty.hcs.creator-unit-name` 配置或由合规方在地址本新建该组织后重推。 From 78dd523e2fd9034f19eab5eaafe9b9f11051408d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 10 Oct 2026 20:19:17 +0800 Subject: [PATCH 038/124] =?UTF-8?q?:memo:=20=E6=96=B0=E5=A2=9EC102-1?= =?UTF-8?q?=E4=B8=8EC103-1=E6=8E=A5=E5=8F=A3=E9=A1=B5=E9=9D=A2=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=8F=96=E5=80=BC=E8=AF=B4=E6=98=8E=E6=96=87=E6=A1=A3?= =?UTF-8?q?=EF=BC=88=E5=90=AB=E5=BF=85=E5=A1=AB=E9=A1=B9=E6=A0=87=E8=AE=B0?= =?UTF-8?q?=E4=B8=8E=E8=87=AA=E6=A3=80=E6=B8=85=E5=8D=95=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...-10-10-C102-1与C103-1接口页面字段取值说明.md | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 doc/docs/hcs合同/2026-10-10-C102-1与C103-1接口页面字段取值说明.md diff --git a/doc/docs/hcs合同/2026-10-10-C102-1与C103-1接口页面字段取值说明.md b/doc/docs/hcs合同/2026-10-10-C102-1与C103-1接口页面字段取值说明.md new file mode 100644 index 00000000..038b97f0 --- /dev/null +++ b/doc/docs/hcs合同/2026-10-10-C102-1与C103-1接口页面字段取值说明.md @@ -0,0 +1,134 @@ +# C102-1 项目立项新建 / C103-1 合同新建 —— 页面字段取值说明 + +> 数据组装代码: +> - C102-1:`HcsProjectSyncSupport#addProject` / `buildFormData`(blade-service/blade-transport/.../support/hcs/HcsProjectSyncSupport.java) +> - C103-1:`HcsContractSyncSupport#draftContract` / `buildDraftParam`(blade-service/blade-transport/.../support/hcs/HcsContractSyncSupport.java) +> +> 触发链路:审批通过(approved)自动即时推送,扫描任务兜底;页面"推送合规/重推"按钮可手动触发。 +> +> 必填标记图例:✅必填(HCS 接口文档 required)|⚠️TMS必传(文档未强校验,TMS 业务必传)|选填|固定(代码写死)|不传 + +--- + +## 一、C102-1 项目立项新建 + +数据源:**项目立项单页面**(ProjectApply / blade_project_apply),整单审批通过后推送。 + +### 1. 表头固定项(非页面字段) + +| HCS 入参 | 取值 | 页面字段 | 必填 | 说明 | +| --- | --- | --- | --- | --- | +| bpmOperation | 流程操作节点 | — | ✅ | 节点整体必填 | +| bpmOperation.operationType | `drafter_submit` | — | ✅ | 固定,以起草人身份直接提交 | +| bpmOperation.templateCode | 配置 `thirdParty.hcs.project.template-code` | — | ✅ | 立项表单模板编码,未配置直接失败 | +| checkAuth | `false` | — | 选填 | 固定 | +| curUser.fdLoginName | 经办人登录名 | 经办人 handlerUserId | ✅ | ⚠️ 当前代码临时写死 `srvadmin`(requireLoginName 内原逻辑被注释,联调需恢复) | +| formData | 表单数据节点 | — | ✅ | 节点整体必填 | +| saveOption.saveDraft | `false` | — | ✅ | 固定,直接提交 | + +### 2. 表单业务字段(formData.dynamicProps) + +HCS 文档 required 仅列:`fd_pro_name`、`fd_is_available`、`fd_sources`;其余为选填。 + +| HCS 字段 | HCS 含义 | 页面字段(ProjectApply) | 必填 | 取值 / 转换规则 | +| --- | --- | --- | --- | --- | +| fd_pro_name | 项目名称 | 项目名称 projectName | ✅ | 原值 | +| fd_pro_simple_name | 项目简称 | 项目简称 projectShortName | 选填 | 原值 | +| fd_num | 项目编号 | 项目编号 projectCode | ⚠️TMS必传 | 原值;HCS 文档未列 required,但为 C102-3 判重键,TMS 侧必传 | +| fd_creator_unit | 创建单位 | —(无页面字段) | 选填 | 固定取配置 `creator-unit-id/name`;任一未配置时回退"开题部门名称 businessDeptName"仅传 fdName | +| fd_head | 项目负责人 | 负责人 principalUserId | 选填 | 按用户ID查登录名,传 `{fdLoginName: 登录名}` | +| fd_taker_dept | 承接部门 | 承接部门 undertakeDeptName | 选填 | 传部门名称 | +| fd_taker | 承接人 | 经办人 handlerUserId | 选填 | 登录名 `{fdLoginName}` | +| fd_pay_limit | 付款额度 | 付款额度(万元) fundLimit | 选填 | × 10000 换算为元 | +| fd_out_invoice_limit | 开票额度 | 开票额度(万元) receivableLimit | 选填 | × 10000 换算为元 | +| fd_pro_content | 项目建设内容 | 项目建设内容/情况说明 situationRemark | 选填 | 原值 | +| fd_settlement_type | 结算类型 | 结算方式 settlementMode | 选填 | 字典原值直传(字典映射待联调 §9-U3) | +| fd_pro_plan_deposit | 计划保证金 | 资金需求(万元) fundDemand | 选填 | × 10000 换算为元 | +| fd_is_available | 是否可用 | — | ✅ | 固定 `true` | +| fd_avail_units | 可用单位列表 | — | 选填 | 与创建单位一致(同走 creator-unit 配置) | +| fd_is_self_pro | 是否自营项目 | — | 选填 | 固定 `"1"`(联调确认) | +| fd_kingdee_sync_status | 金蝶同步状态 | — | 选填 | 固定 `"1"` | +| fd_sources | 来源标识 | — | ✅ | 配置 `src-system`(约定值 WLTMS) | +| fd_kingdee_id | 来源系统主键 | — | 选填 | TMS 立项单主键 id(对账/幂等候选键) | +| fd_creator | 创建人 | 经办人 handlerUserId | 选填 | 登录名(扫描推送无登录上下文,取单据承办人) | +| fd_pro_income_goal | 项目收入目标 | — | 不传 | TMS 无对应字段,一期不传 | + +--- + +## 二、C103-1 合同发起(合同新建) + +数据源:**合同新建页面**(ContractManage / blade_contract_manage),合同审批通过后推送。 +推送前置:① 客商风险校验(C101-1,甲乙双方)→ ② 附件转传(C103-2,仅缓存不挂载)→ ③ 判重(C103-3)→ ④ C103-1 发起。 + +### 1. 顶层字段 + +HCS 文档 required:`fdTemplateId`、`fdOuterSystem`、`fdLoginName`、`saveType`、`fdFieldJson` 全部必填。 + +| HCS 入参 | HCS 含义 | 页面字段(ContractManage) | 必填 | 取值 / 转换规则 | +| --- | --- | --- | --- | --- | +| fdTemplateId | 合同模板ID | 合同类别 contractCategory | ✅ | 经配置 `contract.template-mapping[合同类别]` 映射为 HCS 模板ID(§9-U7),未配置直接失败 | +| fdOuterSystem | 外部系统标识 | — | ✅ | 配置 `src-system`(WLTMS) | +| fdLoginName | 操作人登录名 | 经办人 handlerUserId | ✅ | 按用户ID查登录名(§9-U2),解析不到直接失败 | +| saveType | 保存类型 | — | ✅ | 固定 `submit` | +| fdFieldJson | 合同字段节点 | — | ✅ | 节点整体必填(内含 xformFields + signer) | + +### 2. xformFields 模板字段 + +HCS 文档未对 xformFields 单项列 required;下表"✅"为 TMS 按合同模板必填项标注(缺失会被 HCS 模板校验拦截)。 + +| HCS 字段 | HCS 含义 | 页面字段(ContractManage) | 必填 | 取值 / 转换规则 | +| --- | --- | --- | --- | --- | +| fdNumber / CONTRACT_NO | 合同编号 | 合同编号 contractNo | ✅ | 原值(双字段同值传) | +| fdSubject | 合同标题 | 合同名称 contractName | ✅ | 原值 | +| CONTRACT_NAME | 合同名称 | 合同名称 contractName | 选填 | 原值(与 fdSubject 同值) | +| fdAmount / AMOUNT | 合同金额 | 合同金额 contractAmount | ✅ | 原值,字符串传值(双字段同值传) | +| fdCurrencyId / CURRENCY | 币种 | 结算币种 settlementCurrency | 选填 | 经 `currency-name-mapping` 映射(默认 RMB→人民币),未命中传原值 | +| fdSettlementType | 合同结算类型 | 结算方式 settlementMode | 选填 | 经 `settlement-type-mapping` 映射(付款/收款,待联调 §9-U3),未配置不传 | +| fdSepcailContract | 特批流程 | — | 选填 | 固定 `false`(配置项预留,原文拼写笔误必须沿用) | +| CONTRACT_TYPE | 合同类型 | 合同类别 contractCategory | 选填 | 字典原值 | +| PARTY_A | 甲方名称 | 甲方 partyA | 选填 | 名称原值 | +| PARTY_B | 乙方名称 | 乙方 partyB | 选填 | 名称原值 | +| SIGN_DATE | 签订日期 | 签订日期 signDate | ✅ | `yyyy-MM-dd`,fdType=timestamp | +| fdEstimateStartTime | 预计开始时间 | 开始日期 startDate | 选填 | fdType=timestamp | +| fdEstimateEndTime | 预计结束时间 | 结束日期 endDate | 选填 | fdType=timestamp | +| CREATE_TIME / fdCreateTime | 创建时间 | —(系统字段 createTime) | 选填 | `yyyy-MM-dd HH:mm:ss`,fdType=timestamp | +| fd_syn_time | 同步时间 | — | 选填 | 推送时刻 | +| CREATE_USER_NAME | 承办人名称 | 经办人 handlerUserName | 选填 | 名称原值 | + +### 3. signer 相对方(签署方) + +HCS 文档未对 signer 单项列 required,均按选填处理;TMS 固定传甲、乙两方。 + +| HCS 字段 | 甲方 | 乙方 | 必填 | +| --- | --- | --- | --- | +| fdStanding | `甲` | `乙` | 选填(TMS 固定传) | +| fdName | 页面"甲方" partyA | 页面"乙方" partyB | 选填(TMS 必传,业务标识) | +| fdNumber | 按甲方名称反查客商档案 CustomerArchive.customerCode(全称/简称匹配) | 按乙方名称反查 | 选填(反查不到留空,§9-U6) | +| fdType | — | — | 不传(inner/外部判定规则待联调 §9-U6) | + +### 4. 不传项说明 + +| HCS 字段 | 原因 | +| --- | --- | +| CONTRACT_STATUS 合同状态 | TMS 无直接对应,一期不传(是否必传待联调 §9-U3) | +| 附件字段 | C103-1 入参未定义附件字段;附件已先经 C103-2 转传并缓存合规ID,挂载方式待合规方确认(§9-U8) | + +--- + +## 三、必填项汇总(推送前自检清单) + +**C102-1 必填**:templateCode(配置)、curUser.fdLoginName、fd_pro_name(页面:项目名称)、fd_is_available(固定)、fd_sources(配置);fd_num 建议按必传对待(判重键)。 + +**C103-1 必填**:fdTemplateId(页面:合同类别 → template-mapping 必须有映射)、fdOuterSystem(配置)、fdLoginName(页面:经办人,必须能解析登录名)、saveType(固定)、fdFieldJson;模板字段中合同编号(fdNumber)、合同标题(fdSubject)、合同金额(fdAmount)、签订日期(SIGN_DATE)按模板必填传。 + +## 四、两个接口取值差异速览 + +| 维度 | C102-1 项目立项 | C103-1 合同 | +| --- | --- | --- | +| 页面数据源 | 项目立项单 ProjectApply | 合同单 ContractManage | +| 金额单位换算 | 万元 × 10000 转元(付款/开票额度、资金需求) | 原值字符串直传(合同金额) | +| 字典/映射 | 结算方式原值直传 | 合同类别→模板ID、币种→名称映射、结算方式→结算类型映射 | +| 人员取值 | 负责人/经办人 → 登录名(fdLoginName 结构) | 经办人 → 登录名(顶层 fdLoginName)+ 经办人名称原值 | +| 相对方 | 无 | 甲乙方名称 + 反查客商编号 | +| 操作人 curUser | ⚠️ 临时写死 srvadmin | 承办人真实登录名(解析不到直接失败) | +| 必填校验 | required 集中在表头 + 3 个业务字段 | 顶层 5 项全部必填,模板字段按模板校验 | From 242b203a680559f4dc208eca645374c1016207e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 10 Oct 2026 20:22:58 +0800 Subject: [PATCH 039/124] =?UTF-8?q?:feat:=20=E6=8C=89=E6=A1=82=E7=89=A9?= =?UTF-8?q?=E5=90=88=E5=90=8C=E9=9B=86=E6=88=90v4=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=AF=B4=E6=98=8E=E8=A1=A5=E9=BD=90HCS=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=B8=8E=E5=BF=85=E5=A1=AB=E6=A0=87=E6=B3=A8=EF=BC=88=E5=90=88?= =?UTF-8?q?=E5=90=8C=E6=9B=B4=E6=96=B0=E9=A1=B6=E5=B1=82fdId=E3=80=81C103-?= =?UTF-8?q?4=E8=AF=A6=E6=83=85=E5=AD=97=E6=AE=B5=E8=A1=A8VO=E3=80=81fdFiel?= =?UTF-8?q?dJson.attachment=E9=99=84=E4=BB=B6=E6=8C=82=E8=BD=BD=E3=80=81xf?= =?UTF-8?q?ormFields=E5=BF=85=E5=A1=AB=E5=AD=97=E6=AE=B5=E8=B5=8B=E5=80=BC?= =?UTF-8?q?=E4=B8=8Efd=5Fsyn=5Ftime=E6=97=A5=E6=9C=9F=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E3=80=81C111=E5=90=88=E5=90=8C=E5=BC=95=E7=94=A8fdContract?= =?UTF-8?q?=E3=80=81C108=E4=B8=9A=E5=8A=A1ID=EF=BC=8C=E6=96=B0=E5=A2=9EHcs?= =?UTF-8?q?ContractFieldConstant=E5=B8=B8=E9=87=8F=E7=B1=BB=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/HcsContractFieldConstant.java | 179 ++++++ .../support/hcs/HcsContractSyncSupport.java | 136 +++-- .../support/hcs/HcsExeStageSyncSupport.java | 10 +- .../support/hcs/HcsInvoiceRegSyncSupport.java | 30 +- .../support/hcs/HcsMasterDataSupport.java | 3 +- .../support/hcs/HcsPerfRecordSyncSupport.java | 24 +- .../support/hcs/HcsProjectSyncSupport.java | 14 +- .../hcs/HcsReceiptBillSyncSupport.java | 12 +- .../support/hcs/HcsReconSupport.java | 2 +- .../support/hcs/HcsSpecPaySyncSupport.java | 20 +- .../springblade/hcs/config/HcsProperties.java | 4 + .../springblade/hcs/dto/HcsCategoryVO.java | 18 +- .../hcs/dto/HcsContractDetailVO.java | 519 ++++++++++++++++++ .../hcs/dto/HcsContractDraftDTO.java | 4 + .../hcs/dto/HcsContractFieldJsonDTO.java | 6 +- .../springblade/hcs/dto/HcsCurrencyVO.java | 8 + .../hcs/dto/HcsInvoiceRegAddDTO.java | 4 + .../hcs/dto/HcsPerfRecordPropsDTO.java | 10 + .../springblade/hcs/dto/HcsTemplateVO.java | 16 + .../org/springblade/hcs/feign/IHcsClient.java | 7 +- 20 files changed, 929 insertions(+), 97 deletions(-) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java new file mode 100644 index 00000000..b937c7b7 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java @@ -0,0 +1,179 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.constant; + +/** + * HCS(合同合规系统)C103-1/C103-11 合同发起 xformFields 字段名常量 + *

    + * 字段名取自 v4 接口文档「合同字段说明」,fdSepcailContract 为文档原文拼写(Special 笔误,必须沿用); + * 命名照 {@link HcsSyncConstant} 惯例。 + * + * @author Chill + */ +public final class HcsContractFieldConstant { + + // ==================== 合同发起 xformFields 字段名(fdXformField.name) ==================== + + /** + * 合同ID(更新时传 C103-1 返回的 fdContractId) + */ + public static final String FIELD_FD_ID = "fdId"; + + /** + * 合同编号(fd 模板字段) + */ + public static final String FIELD_FD_NUMBER = "fdNumber"; + + /** + * 合同编号(CONTRACT 模板字段) + */ + public static final String FIELD_CONTRACT_NO = "CONTRACT_NO"; + + /** + * 合同标题(fd 模板字段) + */ + public static final String FIELD_FD_SUBJECT = "fdSubject"; + + /** + * 合同名称(CONTRACT 模板字段) + */ + public static final String FIELD_CONTRACT_NAME = "CONTRACT_NAME"; + + /** + * 合同金额(fd 模板字段) + */ + public static final String FIELD_FD_AMOUNT = "fdAmount"; + + /** + * 合同金额(AMOUNT 模板字段) + */ + public static final String FIELD_AMOUNT = "AMOUNT"; + + /** + * 币种(fd 模板字段) + */ + public static final String FIELD_FD_CURRENCY_ID = "fdCurrencyId"; + + /** + * 币种(CURRENCY 模板字段) + */ + public static final String FIELD_CURRENCY = "CURRENCY"; + + /** + * 合同结算类型:payment=付款,payment_collection=收支双向,collection=收款,none=不结算 + */ + public static final String FIELD_FD_SETTLEMENT_TYPE = "fdSettlementType"; + + /** + * 特批流程(文档原文拼写笔误,必须沿用) + */ + public static final String FIELD_FD_SEPCAIL_CONTRACT = "fdSepcailContract"; + + /** + * 合同类型 + */ + public static final String FIELD_CONTRACT_TYPE = "CONTRACT_TYPE"; + + /** + * 甲方名称 + */ + public static final String FIELD_PARTY_A = "PARTY_A"; + + /** + * 乙方名称 + */ + public static final String FIELD_PARTY_B = "PARTY_B"; + + /** + * 签订日期(yyyy-MM-dd,fdType=timestamp) + */ + public static final String FIELD_SIGN_DATE = "SIGN_DATE"; + + /** + * 预计开始时间(合同开始期限为指定日期时必填) + */ + public static final String FIELD_FD_ESTIMATE_START_TIME = "fdEstimateStartTime"; + + /** + * 预计结束时间(合同结束期限为指定日期时必填) + */ + public static final String FIELD_FD_ESTIMATE_END_TIME = "fdEstimateEndTime"; + + /** + * 合同开始期限:signDate=签订之日起算,specifiedDate=指定日期 + */ + public static final String FIELD_FD_START_TERM = "fdStartTerm"; + + /** + * 合同结束期限:signTerm=按签订后期限,specifiedDate=指定日期,noTerm=无固定期限 + */ + public static final String FIELD_FD_END_TERM = "fdEndTerm"; + + /** + * 创建时间(yyyy-MM-dd,fdType=timestamp) + */ + public static final String FIELD_CREATE_TIME = "CREATE_TIME"; + + /** + * 创建时间(fd 模板字段,yyyy-MM-dd,fdType=timestamp) + */ + public static final String FIELD_FD_CREATE_TIME = "fdCreateTime"; + + /** + * 同步时间(yyyy-MM-dd,fdType=timestamp) + */ + public static final String FIELD_FD_SYN_TIME = "fd_syn_time"; + + /** + * 承办人名称 + */ + public static final String FIELD_CREATE_USER_NAME = "CREATE_USER_NAME"; + + /** + * 合同状态:draft/approving/approved 等(v4 必填) + */ + public static final String FIELD_CONTRACT_STATUS = "CONTRACT_STATUS"; + + /** + * 合同份数(v4 必填) + */ + public static final String FIELD_FD_SERVINGS = "fdServings"; + + /** + * 合同说明(选填) + */ + public static final String FIELD_FD_DESC = "fdDesc"; + + // ==================== 期限枚举值 ==================== + + /** + * 期限取值:指定日期(fdStartTerm/fdEndTerm,TMS 固定按指定日期起算) + */ + public static final String TERM_SPECIFIED_DATE = "specifiedDate"; + + private HcsContractFieldConstant() { + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 6ade9dc4..80667201 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -31,6 +31,7 @@ import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsAttachmentRefDTO; import org.springblade.hcs.dto.HcsContractDraftDTO; import org.springblade.hcs.dto.HcsContractDraftVO; import org.springblade.hcs.dto.HcsContractFieldJsonDTO; @@ -47,6 +48,7 @@ import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; import org.springblade.system.cache.UserCache; import org.springblade.system.pojo.entity.User; +import org.springblade.transport.constant.HcsContractFieldConstant; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.CustomerArchiveMapper; @@ -68,7 +70,7 @@ import java.util.Objects; /** * HCS 合同同步支撑组件(C103-1 发起 / C103-11 更新,设计文档 §5.2) *

    - * 扫描任务按序执行:① 客商风险校验(可配开关,黑名单阻断)→ ② 附件转传(挂载点待 §9-U8 确认,先转传缓存)→ + * 扫描任务按序执行:① 客商风险校验(可配开关,黑名单阻断)→ ② 附件转传(v4 挂载点 fdFieldJson.attachment,随 C103-1 挂载)→ * ③ C103-3 判重(§9-U4 查询能力联调确认)→ ④ C103-1 起草 / 变更单 C103-11 更新(§9-U5 定位方式待联调)→ * ⑤ 履约规则 C103-9 行级同步({@link HcsExeStageSyncSupport})。 * 结果留痕:风险校验写 blade_hcs_check_log 与合同 hcs_risk_* 字段;推送结果回填 hcs_fd_id/hcs_sync_status。 @@ -81,10 +83,9 @@ import java.util.Objects; public class HcsContractSyncSupport { /** - * 合同金额等 xformFields 值一律字符串传值 + * 合同金额等 xformFields 值一律字符串传值;时间字段 v4 要求 yyyy-MM-dd(fdType=timestamp) */ private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); /** * C101-1 黑名单状态取值(示例 no 表示非黑名单,§9-U3 字典值联调确认) @@ -117,8 +118,8 @@ public class HcsContractSyncSupport { return "高风险客商,合同已挂起待特批(C103-8)"; } } - // ② 附件转传(先转传并缓存合规附件ID,C103-1 挂载方式待 §9-U8 确认后接线) - transferAttachmentsIfEnabled(contractManage); + // ② 附件转传(v4 已明确挂载点:C103-1 fdFieldJson.attachment,转传取得合规附件ID 后随发起报文挂载) + List attachmentFdIds = transferAttachmentsIfEnabled(contractManage); // ③④ 首推判重后起草(C103-1);已有合规ID(变更单)走更新(C103-11) String resultMessage; if (StringUtil.isBlank(contractManage.getHcsFdId())) { @@ -127,7 +128,7 @@ public class HcsContractSyncSupport { markSynced(contractManage, existFdId, "判重命中,回填已有合规合同ID"); resultMessage = "判重命中,回填已有合规合同ID"; } else { - String fdContractId = draftContract(contractManage); + String fdContractId = draftContract(contractManage, attachmentFdIds); // 先持久化合规合同ID(调用方必须保存),履约规则同步失败时下轮凭其走更新补偿 markSynced(contractManage, fdContractId, "C103-1 合同发起成功"); resultMessage = "C103-1 合同发起成功"; @@ -232,19 +233,19 @@ public class HcsContractSyncSupport { /** * C103-1 合同发起,返回合规合同 fdContractId */ - private String draftContract(ContractManage contractManage) { - HcsContractDraftDTO param = buildDraftParam(contractManage); - log.info("HCS合同推送开始:{}(C103-1 发起)", contractManage.getContractNo()); + private String draftContract(ContractManage contractManage, List attachmentFdIds) { + HcsContractDraftDTO param = buildDraftParam(contractManage, attachmentFdIds); + log.info("HCS合同推送开始:{}(C103-1 发起,挂载附件 {} 个)", contractManage.getContractNo(), attachmentFdIds.size()); HcsResult result = hcsClient.contractDraft(param); return validateDraftResult(contractManage, result); } /** - * C103-11 合同更新(入参同发起;TODO 待联调(§9-U5):HCS 侧如何定位已有合同 v4 未说明) + * C103-11 合同更新(入参同发起,v4 新增顶层 fdId 定位已有合同) */ private void updateContract(ContractManage contractManage) { - HcsContractDraftDTO param = buildDraftParam(contractManage); - log.info("HCS合同推送开始:{}(C103-11 更新,§9-U5 定位方式待联调)", contractManage.getContractNo()); + HcsContractDraftDTO param = buildDraftParam(contractManage, null); + log.info("HCS合同推送开始:{}(C103-11 更新,附件不重复挂载待联调确认)", contractManage.getContractNo()); HcsResult result = hcsClient.contractUpdate(param); if (result == null || !result.isSuccess()) { log.error("HCS合同更新失败响应:{},contractNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo()); @@ -253,10 +254,13 @@ public class HcsContractSyncSupport { } /** - * 组装 C103-1/C103-11 入参(字段标注照 §3.4 规范,映射表见设计文档 §5.2) + * 组装 C103-1/C103-11 入参(字段标注照 §3.4 规范,映射表见设计文档 §5.2); + * attachmentFdIds 新建传合规附件ID 列表(必填,无附件传空列表),更新传 null 不挂载 */ - private HcsContractDraftDTO buildDraftParam(ContractManage contractManage) { + private HcsContractDraftDTO buildDraftParam(ContractManage contractManage, List attachmentFdIds) { HcsContractDraftDTO param = new HcsContractDraftDTO(); + // 【必填】合同ID:C103-11 更新顶层必填(传 C103-1 返回的 fdContractId),C103-1 新建不传(v4 新增) + param.setFdId(contractManage.getHcsFdId()); // 【必填】合同模板ID:template-mapping[contractCategory](§9-U7 待合规方提供模板ID清单) param.setFdTemplateId(requireTemplateId(contractManage)); // 【必填】外部系统标识:fd_sources,配置 thirdParty.hcs.src-system(D14) @@ -269,54 +273,84 @@ public class HcsContractSyncSupport { fieldJson.setXformFields(buildXformFields(contractManage)); // 相对方(签署方):甲方/乙方,编号按名称反查 CustomerArchive(§9-U6) fieldJson.setSigner(buildSigners(contractManage)); + // 【必填】附件数据:C103-1 必填(无附件传空列表),fdBindType=ADD;更新不挂载(传 null) + if (attachmentFdIds != null) { + fieldJson.setAttachment(attachmentFdIds.stream().map(fdId -> { + HcsAttachmentRefDTO attachment = new HcsAttachmentRefDTO(); + // 【必填】附件ID(C103-2 转传返回) + attachment.setFdId(fdId); + // 【必填】操作类型:ADD 新增 + attachment.setFdBindType("ADD"); + return attachment; + }).toList()); + } param.setFdFieldJson(fieldJson); return param; } /** - * xformFields 模板字段(字段名/中文名取自《桂物合同集成接口逻辑梳理》§5.1 合同字段说明) + * xformFields 模板字段(字段名取 {@link HcsContractFieldConstant},中文名取自《桂物合同集成接口逻辑梳理》§5.1 合同字段说明) */ private List buildXformFields(ContractManage contractManage) { List fields = new ArrayList<>(); + // 【必填】合同ID:更新时传合同发起返回的 fdContractId 的值(v4 合同字段说明) + fields.add(field(HcsContractFieldConstant.FIELD_FD_ID, "合同ID", contractManage.getHcsFdId())); // 【必填】合同编号:ContractManage.contractNo - fields.add(field("fdNumber", "合同编号", contractManage.getContractNo())); - fields.add(field("CONTRACT_NO", "合同编号", contractManage.getContractNo())); + fields.add(field(HcsContractFieldConstant.FIELD_FD_NUMBER, "合同编号", contractManage.getContractNo())); + fields.add(field(HcsContractFieldConstant.FIELD_CONTRACT_NO, "合同编号", contractManage.getContractNo())); // 【必填】合同标题:ContractManage.contractName - fields.add(field("fdSubject", "合同标题", contractManage.getContractName())); - fields.add(field("CONTRACT_NAME", "合同名称", contractManage.getContractName())); + fields.add(field(HcsContractFieldConstant.FIELD_FD_SUBJECT, "合同标题", contractManage.getContractName())); + fields.add(field(HcsContractFieldConstant.FIELD_CONTRACT_NAME, "合同名称", contractManage.getContractName())); // 【必填】合同金额:contractAmount(字符串传值) - fields.add(field("fdAmount", "合同金额", toPlainString(contractManage.getContractAmount()))); - fields.add(field("AMOUNT", "合同金额", toPlainString(contractManage.getContractAmount()))); + fields.add(field(HcsContractFieldConstant.FIELD_FD_AMOUNT, "合同金额", toPlainString(contractManage.getContractAmount()))); + fields.add(field(HcsContractFieldConstant.FIELD_AMOUNT, "合同金额", toPlainString(contractManage.getContractAmount()))); // 币种:TMS 结算币种经 currency-name-mapping 映射(默认 RMB→人民币,照金蝶惯例) - fields.add(field("fdCurrencyId", "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); - fields.add(field("CURRENCY", "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); - // 合同结算类型:settlement-type-mapping[settlementMode](映射到"付款/收款"待联调,§9-U3,未配置不传) + fields.add(field(HcsContractFieldConstant.FIELD_FD_CURRENCY_ID, "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); + fields.add(field(HcsContractFieldConstant.FIELD_CURRENCY, "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); + // 合同结算类型:settlement-type-mapping[settlementMode](必填:payment/payment_collection/collection/none,映射到"付款/收款"待联调,§9-U3,未配置不传) String settlementType = hcsProperties.getContract().getSettlementTypeMapping().get(contractManage.getSettlementMode()); if (StringUtil.isNotBlank(settlementType)) { - fields.add(field("fdSettlementType", "合同结算类型", settlementType)); + fields.add(field(HcsContractFieldConstant.FIELD_FD_SETTLEMENT_TYPE, "合同结算类型", settlementType)); } else { log.warn("HCS合同结算类型映射缺失:settlementMode=[{}] 不在 contract.settlement-type-mapping,fdSettlementType 不传(§9-U3)", contractManage.getSettlementMode()); } // 特批流程:fdSepcailContract 固定 false(原文拼写笔误必须沿用,D15,配置项预留) - fields.add(field("fdSepcailContract", "特批流程", hcsProperties.getContract().isSpecialContractEnabled() ? "true" : "false")); + fields.add(field(HcsContractFieldConstant.FIELD_FD_SEPCAIL_CONTRACT, "特批流程", hcsProperties.getContract().isSpecialContractEnabled() ? "true" : "false")); // 合同类型:ContractManage.contractCategory - fields.add(field("CONTRACT_TYPE", "合同类型", contractManage.getContractCategory())); + fields.add(field(HcsContractFieldConstant.FIELD_CONTRACT_TYPE, "合同类型", contractManage.getContractCategory())); // 甲方名称/乙方名称:TMS 存名称字符串 - fields.add(field("PARTY_A", "甲方名称", contractManage.getPartyA())); - fields.add(field("PARTY_B", "乙方名称", contractManage.getPartyB())); - // 【必填】签订日期:signDate(fdType=timestamp) - fields.add(timestampField("SIGN_DATE", "签订日期", contractManage.getSignDate())); - // 预计开始/结束时间:startDate/endDate(fdType=timestamp) - fields.add(timestampField("fdEstimateStartTime", "预计开始时间", contractManage.getStartDate())); - fields.add(timestampField("fdEstimateEndTime", "预计结束时间", contractManage.getEndDate())); - // 创建时间:createTime(fdType=timestamp) - fields.add(timestampField("CREATE_TIME", "创建时间", contractManage.getCreateTime())); - fields.add(timestampField("fdCreateTime", "创建时间", contractManage.getCreateTime())); - // 同步时间:推送时刻(fdType=timestamp) - fields.add(timestampField("fd_syn_time", "同步时间", LocalDateTime.now())); - // 承办人名称:handlerUserName - fields.add(field("CREATE_USER_NAME", "承办人名称", contractManage.getHandlerUserName())); - // TODO 待确认:合同状态 CONTRACT_STATUS,TMS 无直接对应,是否必传联调确认(§9-U3),一期不传 + fields.add(field(HcsContractFieldConstant.FIELD_PARTY_A, "甲方名称", contractManage.getPartyA())); + fields.add(field(HcsContractFieldConstant.FIELD_PARTY_B, "乙方名称", contractManage.getPartyB())); + // 【必填】签订日期:signDate(yyyy-MM-dd,fdType=timestamp) + fields.add(timestampField(HcsContractFieldConstant.FIELD_SIGN_DATE, "签订日期", contractManage.getSignDate())); + // 预计开始/结束时间:startDate/endDate(fdType=timestamp,期限为指定日期时必填) + fields.add(timestampField(HcsContractFieldConstant.FIELD_FD_ESTIMATE_START_TIME, "预计开始时间", contractManage.getStartDate())); + fields.add(timestampField(HcsContractFieldConstant.FIELD_FD_ESTIMATE_END_TIME, "预计结束时间", contractManage.getEndDate())); + // 【必填】合同开始期限:TMS 固定指定日期起算,日期取 fdEstimateStartTime(v4 合同字段说明) + fields.add(field(HcsContractFieldConstant.FIELD_FD_START_TERM, "合同开始期限", contractManage.getStartDate() == null ? null : HcsContractFieldConstant.TERM_SPECIFIED_DATE)); + // 【必填】合同结束期限:TMS 固定指定日期,日期取 fdEstimateEndTime(v4 合同字段说明) + fields.add(field(HcsContractFieldConstant.FIELD_FD_END_TERM, "合同结束期限", contractManage.getEndDate() == null ? null : HcsContractFieldConstant.TERM_SPECIFIED_DATE)); + // 【必填】创建时间:createTime(yyyy-MM-dd,fdType=timestamp) + fields.add(timestampField(HcsContractFieldConstant.FIELD_CREATE_TIME, "创建时间", contractManage.getCreateTime())); + fields.add(timestampField(HcsContractFieldConstant.FIELD_FD_CREATE_TIME, "创建时间", contractManage.getCreateTime())); + // 【必填】同步时间:推送时刻(yyyy-MM-dd,fdType=timestamp) + fields.add(timestampField(HcsContractFieldConstant.FIELD_FD_SYN_TIME, "同步时间", LocalDateTime.now())); + // 【必填】承办人名称:handlerUserName + fields.add(field(HcsContractFieldConstant.FIELD_CREATE_USER_NAME, "承办人名称", contractManage.getHandlerUserName())); + // 【必填】合同状态:status-mapping[approvalStatus](v4 必填,draft/approving/approved 等,§9-U3 待联调后配置,未配置不传) + String contractStatus = hcsProperties.getContract().getStatusMapping().get(contractManage.getApprovalStatus()); + if (StringUtil.isNotBlank(contractStatus)) { + fields.add(field(HcsContractFieldConstant.FIELD_CONTRACT_STATUS, "合同状态", contractStatus)); + } else { + log.warn("HCS合同状态映射缺失:approvalStatus=[{}] 不在 contract.status-mapping,CONTRACT_STATUS 不传(§9-U3)", contractManage.getApprovalStatus()); + } + // 【必填】合同份数:copyCount(v4 合同字段说明) + fields.add(field(HcsContractFieldConstant.FIELD_FD_SERVINGS, "合同份数", contractManage.getCopyCount() == null ? null : String.valueOf(contractManage.getCopyCount()))); + // 合同说明:remark(选填) + fields.add(field(HcsContractFieldConstant.FIELD_FD_DESC, "合同说明", contractManage.getRemark())); + // TODO 待联调(v4 选填字段,暂不传):fdCoTakers 协办人(TMS 无对应)、fdUnderTaker/fdUnderTakerDept 承办人及部门(组织架构对象传值方式待确认)、 + // fdRelations 关联合同(数组)、fdProject 关联项目 {"fdId": 合规项目ID}(对象传值方式待确认,TMS projectId 可经立项 hcs_fd_id 关联)、 + // fdContractGwNature 结算模式 open/close、fdContractAttribute 合同属性(枚举值文档未给出,TMS 无对应)、fdUrgencyLevel 紧急程度(TMS 无对应) return fields; } @@ -347,16 +381,16 @@ public class HcsContractSyncSupport { } /** - * 附件转传(可配开关):合同主文件 approved=true + 其它附件,合规附件ID 走映射缓存 + * 附件转传(可配开关):合同主文件 approved=true + 其它附件,返回合规附件ID 列表(挂载 C103-1 fdFieldJson.attachment) */ - private void transferAttachmentsIfEnabled(ContractManage contractManage) { + private List transferAttachmentsIfEnabled(ContractManage contractManage) { if (!hcsProperties.getAttachment().isTransferEnabled()) { - return; + return List.of(); } List attachmentFdIds = hcsAttachmentSupport.transferContractAttachments( contractManage.getContractFileJson(), contractManage.getAttachmentsJson(), requireLoginName(contractManage)); - // TODO 待联调(§9-U8):C103-1 未定义附件字段,转传后的合规附件ID 暂存映射缓存,挂载方式确认后接线 - log.info("HCS合同附件转传完成:contractNo={},共 {} 个附件(挂载点待 §9-U8 确认)", contractManage.getContractNo(), attachmentFdIds.size()); + log.info("HCS合同附件转传完成:contractNo={},共 {} 个附件(随 C103-1 挂载)", contractManage.getContractNo(), attachmentFdIds.size()); + return attachmentFdIds; } /** @@ -487,7 +521,7 @@ public class HcsContractSyncSupport { } /** - * 时间模板字段(fdType=timestamp,日期传 yyyy-MM-dd,时间传 yyyy-MM-dd HH:mm:ss) + * 时间模板字段(fdType=timestamp,v4 要求传 yyyy-MM-dd) */ private HcsXformFieldDTO timestampField(String name, String label, Object value) { if (value == null) { @@ -497,11 +531,11 @@ public class HcsContractSyncSupport { if (value instanceof LocalDate localDate) { text = localDate.format(DATE_FORMATTER); } else if (value instanceof LocalDateTime localDateTime) { - text = localDateTime.format(DATETIME_FORMATTER); + text = localDateTime.format(DATE_FORMATTER); } else { // BaseEntity.createTime 为 Date 类型 - text = DATETIME_FORMATTER.format(((java.util.Date) value).toInstant() - .atZone(java.time.ZoneId.systemDefault()).toLocalDateTime()); + text = DATE_FORMATTER.format(((java.util.Date) value).toInstant() + .atZone(java.time.ZoneId.systemDefault()).toLocalDate()); } HcsXformFieldDTO field = field(name, label, text); // 时间字段需带 fdType=timestamp diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java index 9c1cbf6e..089bd915 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java @@ -133,15 +133,15 @@ public class HcsExeStageSyncSupport { stage.setFdEopExeplanOperateType(row.getRowOp()); // 【必填】履约类型:payment=付款 / collection=收款 stage.setFdPerformType(row.getPerformType()); - // 款项性质:prepayment/progress/acceptance/retention + // 【必填】款项性质:prepayment/progress/acceptance/retention stage.setFdFundNature(row.getFundNature()); - // 计划金额(元) + // 【必填】计划金额(元) stage.setFdFundAmount(row.getFundAmount()); - // 资金日期(毫秒时间戳) + // 【必填】资金日期(毫秒时间戳) stage.setFdFundDate(toMillis(row.getFundDate())); - // 开票规则(如 payFirst) + // 【必填】开票规则:payFirst=先款后票 / invoiceFirst=先票后款 stage.setFdInvoiceRule(row.getInvoiceRule()); - // 账期 + // 【必填】账期(天) stage.setFdInvoiceCycle(row.getInvoiceCycle()); // 金额类型:行维护值,空取配置 thirdParty.hcs.exe-stage.fund-type(默认 byAmount) stage.setFdFundType(StringUtil.isBlank(row.getFundType()) ? hcsProperties.getExeStage().getFundType() : row.getFundType()); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java index b130a851..59466cf8 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java @@ -38,6 +38,7 @@ import org.springblade.hcs.dto.HcsInvoiceRegUpdateDTO; import org.springblade.hcs.dto.HcsPageQueryDTO; import org.springblade.hcs.dto.HcsPageVO; import org.springblade.hcs.dto.HcsInvoiceRegVO; +import org.springblade.hcs.dto.HcsRefVO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; @@ -47,10 +48,12 @@ import org.springblade.system.cache.UserCache; import org.springblade.system.pojo.entity.Dept; import org.springblade.system.pojo.entity.User; import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.InvoiceApplicationInvoiceMapper; import org.springblade.transport.mapper.InvoiceApplicationMapper; import org.springblade.transport.mapper.InvoiceApplicationSettlementMapper; import org.springblade.transport.mapper.FormalSettlementMapper; +import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.FormalSettlement; import org.springblade.transport.pojo.entity.InvoiceApplication; import org.springblade.transport.pojo.entity.InvoiceApplicationInvoice; @@ -83,6 +86,7 @@ public class HcsInvoiceRegSyncSupport { private final InvoiceApplicationSettlementMapper invoiceApplicationSettlementMapper; private final InvoiceApplicationInvoiceMapper invoiceApplicationInvoiceMapper; private final FormalSettlementMapper formalSettlementMapper; + private final ContractManageMapper contractManageMapper; private final HcsAttachmentSupport hcsAttachmentSupport; /** @@ -149,7 +153,10 @@ public class HcsInvoiceRegSyncSupport { // 登记日期:applicationDate(毫秒时间戳) param.setFdRegisterDate(toMillis(application.getApplicationDate())); // 【必填】合同编号:经应收结算链路回溯(§9-U10 关联字段确认后细化) - param.setFdContractNumber(requireContractNumber(application)); + ContractRef contractRef = requireContractRef(application); + param.setFdContractNumber(contractRef.contractNo()); + // 合同 {fdId, fdName}:fdId 传合规合同ID(未推送不传),名称取结算单合同名称(v4 新增) + param.setFdContract(contractRef.contract()); // 发票类型:invoice-type-mapping 字典映射(§9-U3,未配置不传) param.setFdInvoiceType(hcsProperties.getInvoice().getInvoiceTypeMapping().get(application.getInvoiceType())); if (param.getFdInvoiceType() == null) { @@ -228,22 +235,37 @@ public class HcsInvoiceRegSyncSupport { } /** - * 应收结算链路回溯合同编号:开票申请 → 应收结算关联 → 正式结算单合同编号(§9-U10) + * 应收结算链路回溯合同引用:开票申请 → 应收结算关联 → 正式结算单合同(§9-U10); + * fdContractNumber 必填,fdContract 随链路回填(fdId 为合规合同ID,未推送不传) */ - private String requireContractNumber(InvoiceApplication application) { + private ContractRef requireContractRef(InvoiceApplication application) { InvoiceApplicationSettlement relation = invoiceApplicationSettlementMapper.selectOne(Wrappers.lambdaQuery() .eq(InvoiceApplicationSettlement::getInvoiceApplicationId, application.getId()) .last("limit 1")); if (relation != null && relation.getFormalSettlementId() != null) { FormalSettlement settlement = formalSettlementMapper.selectById(relation.getFormalSettlementId()); if (settlement != null && StringUtil.isNotBlank(settlement.getContractNo())) { - return settlement.getContractNo(); + HcsRefVO contract = new HcsRefVO(); + contract.setFdName(settlement.getContractName()); + if (settlement.getContractId() != null) { + ContractManage contractManage = contractManageMapper.selectById(settlement.getContractId()); + if (contractManage != null) { + contract.setFdId(contractManage.getHcsFdId()); + } + } + return new ContractRef(settlement.getContractNo(), contract); } } throw new HcsException("C111 开票登记推送失败,应收结算链路回溯不到合同编号(applicationNo=" + application.getApplicationNo() + ",§9-U10 待确认关联字段)"); } + /** + * 合同引用(fdContractNumber / fdContract) + */ + private record ContractRef(String contractNo, HcsRefVO contract) { + } + /** * 结算币种ID(currency-id-mapping,必填;TMS 无币种字段按 RMB 取映射) */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsMasterDataSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsMasterDataSupport.java index d09c6836..0c123fd8 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsMasterDataSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsMasterDataSupport.java @@ -177,10 +177,11 @@ public class HcsMasterDataSupport { } /** - * 分页查询基础参数(columns 必填) + * 分页查询基础参数(offset/pageSize 必填,columns 各主数据接口选填) */ private HcsPageQueryDTO baseQuery() { HcsPageQueryDTO query = new HcsPageQueryDTO(); + // 【必填】每页条数 query.setPageSize(PAGE_SIZE); return query; } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java index 0ed6a3b1..740cfbc7 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java @@ -122,8 +122,13 @@ public class HcsPerfRecordSyncSupport { // 【必填】当前操作人 {fdLoginName}(付款申请创建人,§9-U2) param.setCurUser(HcsUserRefVO.ofLoginName(operatorLoginName)); param.setFormData(buildFormData(payment)); - // 附件挂载:attachmentsJson 转传,fdEntityKey=fd_plan_att - param.setMechanisms(buildMechanisms(payment, operatorLoginName)); + // 【必填】机制数据(附件):C108-1 必填,无附件传空列表(附件转传开关关闭或无附件时) + HcsMechanismsDTO mechanisms = buildMechanisms(payment, operatorLoginName); + if (mechanisms == null) { + mechanisms = new HcsMechanismsDTO(); + mechanisms.setAttachment(List.of()); + } + param.setMechanisms(mechanisms); return param; } @@ -152,9 +157,9 @@ public class HcsPerfRecordSyncSupport { props.setFdApplyAmount(payment.getAppliedAmount() == null ? null : payment.getAppliedAmount().toPlainString()); // 实际金额:paidAmount(实际付款推进后更新) props.setFdFactAmount(payment.getPaidAmount() == null ? null : payment.getPaidAmount().toPlainString()); - // 申请编号:付款申请单号(接口文档 §8.3 字段) + // 【必填】申请编号:付款申请单号 props.setFdApplyNo(payment.getPaymentNo()); - // 计划日期:applyDate(毫秒时间戳) + // 【必填】计划日期:applyDate(毫秒时间戳) props.setFdPlanDate(toMillis(payment.getApplyDate())); // 计划类型:paymentType(原文拼写 fd_paln_type 必须沿用) props.setFdPalnType(payment.getPaymentType()); @@ -162,10 +167,17 @@ public class HcsPerfRecordSyncSupport { props.setFdProperty(stageRow == null ? null : stageRow.getFundNature()); // 来源履约计划项ID:关联履约阶段 hcs_stage_fd_id(无关联则不传,§5.6) props.setFdId(stageRow == null ? null : stageRow.getHcsStageFdId()); - // 合同ID:HCS 合同ID(合同未推送时不传) + // 【必填】合同ID:HCS 合同ID(合同未推送时为空,联调确认兜底口径) props.setFdContractId(contractManage == null ? null : contractManage.getHcsFdId()); + // 业务ID:TMS 付款申请单主键(方便溯源,v4 新增) + props.setFdBusinessId(payment.getId() == null ? null : String.valueOf(payment.getId())); + // 创建时间:createTime(毫秒时间戳,v4 新增) + props.setFdCreateTime(payment.getCreateTime() == null ? null : payment.getCreateTime().toInstant().toEpochMilli()); // 表单模板ID:配置 perf-record.xform-id(环境值,§9-U9,未配置不传) - props.setFdXformId(StringUtil.isBlank(hcsProperties.getPerfRecord().getXformId()) ? null : hcsProperties.getPerfRecord().getXformId()); + String xformId = StringUtil.isBlank(hcsProperties.getPerfRecord().getXformId()) ? null : hcsProperties.getPerfRecord().getXformId(); + props.setFdXformId(xformId); + // 【必填】表单模板ID(formData 顶层 fd_xform_id,v4 必填) + formData.setFdXformId(xformId); formData.setDynamicProps(props); return formData; } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index dc18fad1..a946cbfe 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -45,8 +45,6 @@ import org.springblade.hcs.dto.HcsSaveOptionDTO; import org.springblade.hcs.dto.HcsUserRefVO; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; -import org.springblade.system.cache.UserCache; -import org.springblade.system.pojo.entity.User; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ProjectApplyMapper; import org.springblade.transport.pojo.entity.ProjectApply; @@ -112,7 +110,7 @@ public class HcsProjectSyncSupport { HcsProjectAddDTO param = new HcsProjectAddDTO(); HcsBpmOperationDTO bpmOperation = new HcsBpmOperationDTO(); - // 操作类型:固定 drafter_submit(以起草人身份直接提交流程) + // 【必填】操作类型:固定 drafter_submit(以起草人身份直接提交流程) bpmOperation.setOperationType("drafter_submit"); // 【必填】立项表单模板编码:配置 thirdParty.hcs.project.template-code(环境值,§9-U9) bpmOperation.setTemplateCode(requireTemplateCode()); @@ -123,7 +121,7 @@ public class HcsProjectSyncSupport { param.setCurUser(HcsUserRefVO.ofLoginName(operatorLoginName)); param.setFormData(buildFormData(projectApply, null)); HcsSaveOptionDTO saveOption = new HcsSaveOptionDTO(); - // saveDraft=false 直接提交 + // 【必填】是否保存草稿:saveDraft=false 直接提交 saveOption.setSaveDraft(false); param.setSaveOption(saveOption); @@ -176,8 +174,8 @@ public class HcsProjectSyncSupport { props.setFdCreatorUnit(creatorUnit); // 项目负责人:负责人登录名 {fdLoginName}(§9-U2) props.setFdHead(resolveUserRef(projectApply.getPrincipalUserId())); - // 承接部门:TMS 承接部门名称(同 fd_creator_unit 先传名称) - props.setFdTakerDept(HcsRefVO.ofName(projectApply.getUndertakeDeptName())); + // 承接部门:与创建单位一致,取配置 thirdParty.hcs.creator-unit-id/name(测试线联调固定广西物产城矿发展有限公司) + props.setFdTakerDept(creatorUnit); // 承接人:项目经办人登录名 {fdLoginName} props.setFdTaker(resolveUserRef(projectApply.getHandlerUserId())); // 付款额度:TMS fundLimit(万元)× 10000 转 HCS 元 @@ -186,7 +184,7 @@ public class HcsProjectSyncSupport { props.setFdOutInvoiceLimit(toYuan(projectApply.getReceivableLimit())); // 项目建设内容:ProjectApply.situationRemark props.setFdProContent(projectApply.getSituationRemark()); - // 是否可用:固定 true + // 【必填】是否可用:固定 true props.setFdIsAvailable(true); // 可用单位列表:与创建单位一致(同走 creator-unit 配置) props.setFdAvailUnits(List.of(creatorUnit)); @@ -199,7 +197,7 @@ public class HcsProjectSyncSupport { // TODO 待确认:项目收入目标 fd_pro_income_goal,TMS 无直接对应字段,一期不传(§5.1) // 金蝶同步状态:固定 "1" props.setFdKingdeeSyncStatus("1"); - // 来源标识:fd_sources,配置 thirdParty.hcs.src-system(约定值 WLTMS,D14) + // 【必填】来源标识:fd_sources,配置 thirdParty.hcs.src-system(约定值 WLTMS,D14) props.setFdSources(hcsProperties.getSrcSystem()); // 来源系统主键 ID:TMS 项目立项单主键(D14,对账/幂等候选键) props.setFdKingdeeId(String.valueOf(projectApply.getId())); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java index 143d94e8..af7cdf54 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java @@ -161,21 +161,21 @@ public class HcsReceiptBillSyncSupport { param.setFdLoginName(operatorLoginName); HcsReceiptBillFormDataDTO formData = new HcsReceiptBillFormDataDTO(); HcsReceiptBillPropsDTO props = new HcsReceiptBillPropsDTO(); - // 发票号码:invoiceNo + // 【必填】发票号码:invoiceNo props.setFdInvoiceCode(invoiceReceipt.getInvoiceNo()); - // 开票/收票日期:invoiceDate(YYYY-MM-DD 字符串) + // 【必填】开票/收票日期:invoiceDate(YYYY-MM-DD 字符串) props.setFdBillDate(formatBillDate(invoiceReceipt.getInvoiceDate())); // 开票方(销方):issuerName props.setFdInvoicer(invoiceReceipt.getIssuerName()); // 收票方(购方):receiverName props.setFdBuyer(invoiceReceipt.getReceiverName()); - // 价税合计金额:invoiceAmount + // 【必填】价税合计金额:invoiceAmount props.setFdInvoiceAmtTaxIncl(invoiceReceipt.getInvoiceAmount()); - // 税率(小数):TMS taxRate(如 13)÷ 100 → 0.13 + // 【必填】税率(小数):TMS taxRate(如 13)÷ 100 → 0.13 props.setFdTaxRate(toTaxRate(invoiceReceipt.getTaxRate())); - // 发票类型:receipt-bill.invoice-type-mapping 字典映射(§9-U3,未配置不传) + // 【必填】发票类型:receipt-bill.invoice-type-mapping 字典映射(§9-U3,未配置不传) props.setFdInvoiceType(hcsProperties.getReceiptBill().getInvoiceTypeMapping().get(invoiceReceipt.getInvoiceType())); - // 合同主题/编号:应付结算链路回溯,回溯不到取人工补录(D13) + // 【必填】合同主题/编号:应付结算链路回溯,回溯不到取人工补录(D13,均为空不传待联调兜底口径) ContractReference contractReference = resolveContract(invoiceReceipt); props.setFdContractSubject(contractReference.subject()); props.setFdContractNo(contractReference.contractNo()); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java index 8b45eb5c..fdf1765b 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java @@ -92,7 +92,7 @@ public class HcsReconSupport { /** * 合同详情回查(C103-4,fdId 与 fdNumber 二选一) *

    - * TODO 待联调确认:出参 data 结构 v4 未定义,原样返回实际响应(设计文档 §5.9) + * v4 已定义详情响应字段表(HcsContractDetailVO),级联/集合字段内部结构以实际返回为准(设计文档 §5.9) * * @param fdId 合同ID(可空) * @param fdNumber 合同编号(可空) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java index 98370a1d..40ea1383 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java @@ -123,30 +123,30 @@ public class HcsSpecPaySyncSupport { props.setFdContractName(requireContractFdId(payment, contractManage)); // 合同编号 props.setFdContractNo(payment.getContractNo()); - // 单据编号:付款申请单号(来源付款单标识) + // 【必填】单据编号:付款申请单号(来源付款单标识) props.setFdDocNo(payment.getPaymentNo()); - // 单据主题:"结算付款特批-" + 付款单号 + // 【必填】单据主题:"结算付款特批-" + 付款单号 props.setFdDocSubject("结算付款特批-" + payment.getPaymentNo()); // 来源付款单ID:付款申请单号(§5.5 映射表) props.setFdId(payment.getPaymentNo()); - // 付款金额:appliedAmount + // 【必填】付款金额:appliedAmount props.setFdPayAmount(payment.getAppliedAmount()); - // 合计金额:settlementAmount + // 【必填】合计金额:settlementAmount props.setFdTotalAmount(payment.getSettlementAmount() == null ? BigDecimal.ZERO : payment.getSettlementAmount()); - // 付款人 / 收款人 + // 【必填】付款人 / 收款方 props.setFdPayer(payment.getPayerName()); props.setFdPayee(payment.getPayeeName()); - // 收款账户名 / 收款账号 / 开户行 + // 【必填】收款账户名 / 收款账号 / 开户行名称 props.setFdReceiveAccountName(payment.getReceiptAccountName()); props.setFdReceiveAccount(payment.getBankAccount()); props.setFdBankName(payment.getBankName()); - // 结算币种:TMS 无币种字段,按 currency-name-mapping 默认值(人民币) + // 【必填】结算币种:TMS 无币种字段,按 currency-name-mapping 默认值(人民币) props.setFdSettleCurrency(hcsProperties.getContract().getCurrencyNameMapping().getOrDefault("RMB", "人民币")); - // 付款用途 / 付款性质 / 付款类型:字典值配置(§9-U3 待联调后配置) + // 【必填】付款用途 / 款项性质 / 款项类型:字典值配置(§9-U3 待联调后配置) props.setFdPaymentPurpose(hcsProperties.getSpecPay().getPaymentPurpose()); props.setFdPaymentNature(hcsProperties.getSpecPay().getPaymentNature()); props.setFdPaymentType(hcsProperties.getSpecPay().getPaymentType()); - // 事由 / 补充说明:remark + // 【必填】事由 / 补充说明:remark props.setFdReason(payment.getRemark()); props.setFdSupplementNote(payment.getRemark()); // 单据状态:配置 spec-pay.doc-status(示例 10) @@ -154,7 +154,7 @@ public class HcsSpecPaySyncSupport { // 特批附件字段标识:固定 fd_spc_approval_attach props.setFdSpcApprovalAttach(SPEC_ATTACH_ENTITY_KEY); formData.setDynamicProps(props); - // 表单层单据主题 + // 【必填】表单层单据主题 formData.setFdDocSubject("结算付款特批-" + payment.getPaymentNo()); // 表单层单据状态:配置 spec-pay.doc-status formData.setFdDocStatus(hcsProperties.getSpecPay().getDocStatus()); diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 2bb06b09..72a3876b 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -165,6 +165,10 @@ public class HcsProperties { * TMS 结算方式 -> 付款|收款(fdSettlementType,§9-U3 字典映射待联调) */ private Map settlementTypeMapping = new HashMap<>(); + /** + * TMS 审核状态 -> HCS 合同状态(xformFields CONTRACT_STATUS 必填,draft/approving/approved 等,§9-U3 待联调后配置) + */ + private Map statusMapping = new HashMap<>(); /** * TMS 币种码 -> HCS 币种名称(照金蝶 RMB->CNY 映射惯例) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCategoryVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCategoryVO.java index a477400e..e497b40c 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCategoryVO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCategoryVO.java @@ -56,7 +56,23 @@ public class HcsCategoryVO implements Serializable { */ private HcsRefVO fdParent; /** - * 状态:enable / disable + * 状态:enable=启用 / disable=停用 */ private String fdStatus; + /** + * 层级ID:由各级分类 fdId 以 x 包裹拼接(x+上级fdId+x+fdId+x,v4 新增) + */ + private String fdHierarchyId; + /** + * 创建人 + */ + private HcsRefVO fdCreator; + /** + * 创建人部门 + */ + private HcsRefVO fdCreatorDept; + /** + * 创建时间(毫秒时间戳) + */ + private Long fdCreateTime; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java new file mode 100644 index 00000000..6b841977 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java @@ -0,0 +1,519 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 合同合规系统(HCS)C103-4 合同详情出参(v4 字段表) + *

    + * 级联/集合类字段(对象/数组)内部结构 v4 标注以实际返回为准,暂以 Object/List<Object> 承接, + * 联调确认后细化。fdSepcailContract 为接口文档原文拼写(Special 笔误,必须沿用)。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsContractDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 合同ID + */ + private String fdId; + /** + * 租户ID + */ + private String fdTenantId; + /** + * 可阅读标示 + */ + private String fdReaderFlag; + /** + * 不可阅读标记(可阅读者在文档发布前生效) + */ + private String fdNotReaderFlag; + /** + * 可阅读者(在文档发布前生效) + */ + private String fdRBPFlag; + /** + * 修改人 + */ + private String fdAlter; + /** + * 修改时间(毫秒时间戳) + */ + private Long fdAlterTime; + /** + * 描述 + */ + private String fdDesc; + /** + * 是否隐藏 + */ + private Boolean fdIsHidden; + /** + * 最后修改时间(毫秒时间戳) + */ + private Long fdLastModifiedTime; + /** + * 合同名称 + */ + private String fdSubject; + /** + * 合同分类(层级ID) + */ + private String fdCateHierarchyId; + /** + * 编号 + */ + private String fdNumber; + /** + * 状态:draft=草稿; approving=审批中; approved=已审批; tosign=待签订; signing=签订中; signerror=签订异常; signed=已签订等 + */ + private String fdStatus; + /** + * 合同发起ID + */ + private String fdDraftMainId; + /** + * 合同模板ID + */ + private String fdTemplateId; + /** + * 审批状态:approving=审批中; approved=已审批; approvalinvalid=审批作废 + */ + private String fdApprovalStatus; + /** + * 签订状态:tosign=待签订; signing=签订中; signerror=签订异常; signed=已签订; signinvalid=签订作废 + */ + private String fdSignStatus; + /** + * 签订异常信息 + */ + private String fdSignErrorMsg; + /** + * 进入待签订时间(毫秒时间戳) + */ + private Long fdToSignTime; + /** + * 签订发起时间(毫秒时间戳) + */ + private Long fdSignCreateTime; + /** + * 完成签订时间(毫秒时间戳) + */ + private Long fdSignedTime; + /** + * 归档状态:toarchive=待归档; archiving=归档中; archived=已归档; archiveerror=归档异常 + */ + private String fdArchiveStatus; + /** + * 变更状态:changing=变更中; changed=已变更; terminated=已终止 + */ + private String fdChangeStatus; + /** + * 履约状态:toplan=待履约; planing=履约中; planerror=履约异常; planed=已履约; planterminate=履约终止 + */ + private String fdPlanStatus; + /** + * 进入待履约时间(毫秒时间戳) + */ + private Long fdToPlanTime; + /** + * 完成履约时间(毫秒时间戳) + */ + private Long fdPlanedTime; + /** + * 关闭状态:toclose=待关闭; closing=关闭中; closed=已关闭 + */ + private String fdCloseStatus; + /** + * 进入待关闭时间(毫秒时间戳) + */ + private Long fdToCloseTime; + /** + * 关闭时间(毫秒时间戳) + */ + private Long fdClosedTime; + /** + * 签署提供者:psign=物理签署; esign=电子签署; qjsign=智能用印签署 + */ + private String fdSignProvider; + /** + * 签署实体ID + */ + private String fdSignEntityId; + /** + * 归档方式:auto=一键申请; review=流程申请 + */ + private String fdFileWay; + /** + * 归档实体ID + */ + private String fdArchiveEntityId; + /** + * 进入待归档时间(毫秒时间戳) + */ + private Long fdToArchiveTime; + /** + * 完成归档时间(毫秒时间戳) + */ + private Long fdArchivedTime; + /** + * 履约计划创建时机:draft=起草环节创建; toplan=履约环节创建 + */ + private String fdPlanCreateMoment; + /** + * 关闭方式:auto=一键关闭; review=流程关闭 + */ + private String fdCloseWay; + /** + * 关闭实体ID + */ + private String fdCloseEntityId; + /** + * 是否锁定 + */ + private Boolean fdIsLocked; + /** + * 锁定原因:invalid=合同作废; change=合同变更; termination=合同终止 + */ + private String fdLockReason; + /** + * 合同作废实体ID + */ + private String fdInvalidEntityId; + /** + * 上次合同变动发起实体ID + */ + private String fdLastChangeEntityId; + /** + * 合同终止发起实体ID + */ + private String fdTerminationEntityId; + /** + * 批量发起任务ID + */ + private String fdBatchTaskId; + /** + * 是否关联交易 + */ + private Boolean fdIsRelaDeal; + /** + * 是否补录 + */ + private Boolean fdIsRecord; + /** + * 履约计划(级联字段,结构以实际返回为准) + */ + private Object fdPlan; + /** + * 验收计划(级联字段,结构以实际返回为准) + */ + private Object fdAcptPlan; + /** + * 外部合同数据(级联字段,结构以实际返回为准) + */ + private Object fdOuterAttr; + /** + * 订单明细配置ID + */ + private String fdOrderDetailConfigId; + /** + * 收付款进度(结构以实际返回为准) + */ + private Object fdPayColProgress; + /** + * 开票进度(结构以实际返回为准) + */ + private Object fdInvoiceProgress; + /** + * 履约状态(新):0=正常; 1=低风险; 2=中风险; 3=高风险 + */ + private Integer fdPlanStatusNew; + /** + * 是否冻结 + */ + private Boolean fdIsFreeze; + /** + * 解冻表单关联ID + */ + private String fdUnfreezeFormId; + /** + * 合同履约流程状态:00/01/02/10/11/12/20/21/29/30/39 + */ + private String fdPlanFlowStatus; + /** + * 合同履约流程ID + */ + private String fdPlanFlowId; + /** + * 是否评分 + */ + private Boolean fdRated; + /** + * 完成审批时间(毫秒时间戳) + */ + private Long fdApprovedTime; + /** + * 是否同步金蝶 + */ + private Boolean fdIsSyncJd; + /** + * 同步金蝶状态:0/1/2 + */ + private Integer fdSyncJdStatus; + /** + * 特批合同(字段名原文拼写笔误,必须沿用) + */ + private Boolean fdSepcailContract; + /** + * 合同结算模式:open=开口合同; close=闭口合同 + */ + private String fdContractGwNature; + /** + * 合同类型:standard=标准合同; halfstandard=半标准合同; notstandard=非标准合同 + */ + private String fdContractCharacter; + /** + * 合同性质:general=普通合同; framework=框架协议 + */ + private String fdContractNature; + /** + * 引用范本ID + */ + private String fdModelId; + /** + * 合同属性:main=主合同; child=子合同; common=普通 + */ + private String fdContractAttribute; + /** + * 承办人 + */ + private HcsRefVO fdUnderTaker; + /** + * 承办人部门 + */ + private HcsRefVO fdUnderTakerDept; + /** + * 预计开始时间(毫秒时间戳) + */ + private Long fdEstimateStartTime; + /** + * 预计结束时间(毫秒时间戳) + */ + private Long fdEstimateEndTime; + /** + * 实际开始时间(毫秒时间戳) + */ + private Long fdStartTime; + /** + * 实际结束时间(毫秒时间戳) + */ + private Long fdEndTime; + /** + * 合同发起来源:inner=内部发起; outer=外部发起 + */ + private String fdContractSource; + /** + * 外部来源系统 + */ + private String fdOuterSystem; + /** + * 合同结算类型:payment=付款; payment_collection=收支双向; collection=收款; none=不结算 + */ + private String fdSettlementType; + /** + * 合同金额 + */ + private BigDecimal fdAmount; + /** + * 币种 + */ + private String fdCurrencyId; + /** + * 是否原始合同 + */ + private Boolean fdIsOrigin; + /** + * 原始合同ID + */ + private String fdOriginContractId; + /** + * 合同变更类型:change=合同变更; termination=合同终止 + */ + private String fdChangeType; + /** + * 是否含税 + */ + private Boolean fdIncludeTax; + /** + * 是否引用范本 + */ + private Boolean fdUseModel; + /** + * 引用范本名称 + */ + private String fdModelName; + /** + * 引用范本版本 + */ + private String fdModelVersion; + /** + * 是否固定期限 + */ + private Boolean fdIsFixedTerm; + /** + * 合同开始期限 + */ + private String fdStartTerm; + /** + * 合同结束期限 + */ + private String fdEndTerm; + /** + * 有效期限 + */ + private String fdValidTerm; + /** + * 项目立项ID + */ + private String fdProjectId; + /** + * 合同份数 + */ + private Integer fdServings; + /** + * 合同说明 + */ + private String fdContractDescription; + /** + * 合同的变更流程状态:changing=变更中; changed=已变更; noChangeProcess=无变更流程 + */ + private String fdChangeLbpmStatus; + /** + * 紧急程度:1=普通; 2=急件; 3=特急 + */ + private Integer fdUrgencyLevel; + /** + * 创建人 + */ + private HcsRefVO fdCreator; + /** + * 创建时间(毫秒时间戳) + */ + private Long fdCreateTime; + /** + * 创建者部门 + */ + private HcsRefVO fdCreatorDept; + /** + * 权限(级联字段,结构以实际返回为准) + */ + private Object fdPermissions; + /** + * 可阅读者(结构以实际返回为准) + */ + private List fdReaders; + /** + * 所有可阅读者(结构以实际返回为准) + */ + private List fdAllReaders; + /** + * 所有可阅读者ID(结构以实际返回为准) + */ + private List fdAllReaderIds; + /** + * 可维护者(结构以实际返回为准) + */ + private List fdEditors; + /** + * 所有可编辑者(结构以实际返回为准) + */ + private List fdAllEditors; + /** + * 协办人(结构以实际返回为准) + */ + private List fdCoTakers; + /** + * 合同时间线(结构以实际返回为准) + */ + private List fdTimeLines; + /** + * 合同关联(结构以实际返回为准) + */ + private List fdRelations; + /** + * 合同签约方及地位(结构以实际返回为准) + */ + private List fdStandingSigners; + /** + * 签印文件(结构以实际返回为准) + */ + private List fdSignFiles; + /** + * 业务明细(结构以实际返回为准) + */ + private List fdBusinessDetails; + /** + * 付款记录(结构以实际返回为准) + */ + private List fdPaymentRecords; + /** + * 收款记录(结构以实际返回为准) + */ + private List fdCollectionRecords; + /** + * 收票记录(结构以实际返回为准) + */ + private List fdInInvoices; + /** + * 开票记录(结构以实际返回为准) + */ + private List fdOutInvoices; + /** + * 预填写物理签印信息(结构以实际返回为准) + */ + private List fdPsignContents; + /** + * 审批人(结构以实际返回为准) + */ + private List fdApprovers; + /** + * 履约规则(结构以实际返回为准) + */ + private List fdExePlanRules; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java index bad3366b..d105f8ba 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java @@ -43,6 +43,10 @@ import java.io.Serializable; public class HcsContractDraftDTO implements Serializable { @Serial private static final long serialVersionUID = 1L; + /** + * 合同ID(C103-11 合同更新顶层必填,传 C103-1 返回的 fdContractId;C103-1 新建不传) + */ + private String fdId; /** * 合同模板ID(C103-6 模板列表获取,配置 template-mapping,§9-U7) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java index 702bcbea..718c39b4 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java @@ -36,7 +36,7 @@ import java.util.List; /** * 合同合规系统(HCS)C103-1 合同发起 fdFieldJson 节点(C103-1 新建 / C103-11 更新共用) *

    - * §9-U8 待联调确认:v4 未定义合同附件传递字段,附件挂载方式待合规方确认后补充。 + * v4 文档已定义 attachment 附件挂载(fdId/fdBindType 必填,fdEntityKey 仅给出特批附件枚举 eopCdraftSpecial)。 * * @author Chill */ @@ -54,4 +54,8 @@ public class HcsContractFieldJsonDTO implements Serializable { * 签署方(相对方)列表 */ private List signer; + /** + * 附件数据(C103-1 必填,C103-11 更新不传;fdEntityKey 普通附件枚举待合规方给出,暂不传) + */ + private List attachment; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCurrencyVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCurrencyVO.java index 09d2a3fe..f3f98a61 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCurrencyVO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCurrencyVO.java @@ -75,4 +75,12 @@ public class HcsCurrencyVO implements Serializable { * 是否本位币 */ private Boolean fdIsStandardCurrency; + /** + * 创建人 + */ + private HcsRefVO fdCreator; + /** + * 创建时间(毫秒时间戳) + */ + private Long fdCreateTime; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegAddDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegAddDTO.java index e1d90bf1..705b5207 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegAddDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsInvoiceRegAddDTO.java @@ -60,6 +60,10 @@ public class HcsInvoiceRegAddDTO implements Serializable { * 合同编号(必填,经应收结算链路回溯,§9-U10) */ private String fdContractNumber; + /** + * 合同 {fdId, fdName}(v4 新增,fdId 为合规合同ID,随编号一并回溯) + */ + private HcsRefVO fdContract; /** * 发票类型(字典映射 invoice-type-mapping,§9-U3) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java index 799bb389..20fcbcf3 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java @@ -97,6 +97,16 @@ public class HcsPerfRecordPropsDTO implements Serializable { */ @JsonProperty("fd_contract_id") private String fdContractId; + /** + * 创建时间(毫秒时间戳,v4 新增) + */ + @JsonProperty("fd_create_time") + private Long fdCreateTime; + /** + * 业务ID(方便溯源用,v4 新增,TMS 传付款申请单ID) + */ + @JsonProperty("fd_business_id") + private String fdBusinessId; /** * 附件不可下载 */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTemplateVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTemplateVO.java index c0270741..8b738772 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTemplateVO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsTemplateVO.java @@ -59,6 +59,10 @@ public class HcsTemplateVO implements Serializable { * 合同性质(如 standard) */ private String fdContractCharacter; + /** + * 分类层级ID(v4 新增) + */ + private String fdCateHierarchyId; /** * 创建时间(毫秒时间戳) */ @@ -71,6 +75,18 @@ public class HcsTemplateVO implements Serializable { * 创建部门 */ private HcsRefVO fdCreatorDept; + /** + * 是否禁止更新主数据权限 + */ + private Boolean fdDisableUpdateMainAuth; + /** + * 主数据授权时间点(如 afterapproved) + */ + private String fdAuthToMainTime; + /** + * 是否强制自动编号 + */ + private Boolean fdForceAutoNumber; /** * 模板扩展属性(含中文名) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java index e545d6ec..f3bee019 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java @@ -31,6 +31,7 @@ import org.springblade.hcs.dto.HcsAttachmentDownloadDTO; import org.springblade.hcs.dto.HcsAttachmentVO; import org.springblade.hcs.dto.HcsCategoryVO; import org.springblade.hcs.dto.HcsContractDetailQueryDTO; +import org.springblade.hcs.dto.HcsContractDetailVO; import org.springblade.hcs.dto.HcsContractDraftDTO; import org.springblade.hcs.dto.HcsContractDraftVO; import org.springblade.hcs.dto.HcsContractVO; @@ -173,13 +174,13 @@ public interface IHcsClient { /** * C103-4 合同详情(fdId 与 fdNumber 二选一) *

    - * TODO 待联调确认:出参 data 结构 v4 未定义,暂以对象承接,联调后补充(设计文档 §5.9) + * v4 已定义详情响应字段表({@link HcsContractDetailVO});级联/集合字段内部结构以实际返回为准。 * * @param param 请求参数 - * @return 合同详情(结构待联调确认) + * @return 合同详情 */ @PostMapping(CONTRACT_DETAIL_URL) - HcsResult contractDetail(@RequestBody HcsContractDetailQueryDTO param); + HcsResult contractDetail(@RequestBody HcsContractDetailQueryDTO param); /** * C103-9(新) 合同履约规则同步(行级增删改,与废弃旧接口同路径不同入参,务必用本新版结构) From 7dce25b7bdbfb84dad5f860139b59c36c82e843c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 10 Oct 2026 21:01:00 +0800 Subject: [PATCH 040/124] =?UTF-8?q?fix:=20=E9=A1=B9=E7=9B=AE=E7=AB=8B?= =?UTF-8?q?=E9=A1=B9=E6=8E=A5=E5=8F=A3=E5=AD=97=E6=AE=B5=E6=A0=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsProjectSyncSupport.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index a946cbfe..0154bff2 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -174,7 +174,7 @@ public class HcsProjectSyncSupport { props.setFdCreatorUnit(creatorUnit); // 项目负责人:负责人登录名 {fdLoginName}(§9-U2) props.setFdHead(resolveUserRef(projectApply.getPrincipalUserId())); - // 承接部门:与创建单位一致,取配置 thirdParty.hcs.creator-unit-id/name(测试线联调固定广西物产城矿发展有限公司) + // todo 承接部门:与创建单位一致,取配置 thirdParty.hcs.creator-unit-id/name(测试线联调固定广西物产城矿发展有限公司) props.setFdTakerDept(creatorUnit); // 承接人:项目经办人登录名 {fdLoginName} props.setFdTaker(resolveUserRef(projectApply.getHandlerUserId())); @@ -186,21 +186,24 @@ public class HcsProjectSyncSupport { props.setFdProContent(projectApply.getSituationRemark()); // 【必填】是否可用:固定 true props.setFdIsAvailable(true); - // 可用单位列表:与创建单位一致(同走 creator-unit 配置) - props.setFdAvailUnits(List.of(creatorUnit)); + // 可用单位列表:与创建单位一致(同走 creator-unit 配置)(废弃) + // props.setFdAvailUnits(List.of(creatorUnit)); + // 结算类型:TMS settlementMode 原值(字典映射待联调,§9-U3) props.setFdSettlementType(projectApply.getSettlementMode()); // 计划保证金:TMS fundDemand(万元)× 10000 转 HCS 元(变更映射曾名"履约保证金",语义联调确认) props.setFdProPlanDeposit(toYuan(projectApply.getFundDemand())); - // 是否自营项目:一期固定 "1"(联调确认) - props.setFdIsSelfPro("1"); + // 是否自营项目:一期固定 "2"。是|1, 否|2 + props.setFdIsSelfPro("2"); // TODO 待确认:项目收入目标 fd_pro_income_goal,TMS 无直接对应字段,一期不传(§5.1) - // 金蝶同步状态:固定 "1" - props.setFdKingdeeSyncStatus("1"); + // 金蝶同步状态:固定 "1" 推送成功|1 + // props.setFdKingdeeSyncStatus("1"); // 【必填】来源标识:fd_sources,配置 thirdParty.hcs.src-system(约定值 WLTMS,D14) props.setFdSources(hcsProperties.getSrcSystem()); - // 来源系统主键 ID:TMS 项目立项单主键(D14,对账/幂等候选键) - props.setFdKingdeeId(String.valueOf(projectApply.getId())); + + // 金蝶项目立项ID 来源系统主键 ID:TMS 项目立项单主键(D14,对账/幂等候选键) + // props.setFdKingdeeId(String.valueOf(projectApply.getId())); + // 创建人:项目经办人登录名(扫描推送无登录上下文,取单据承办人,§9-U2) props.setFdCreator(resolveUserRef(projectApply.getHandlerUserId())); formData.setDynamicProps(props); @@ -296,16 +299,11 @@ public class HcsProjectSyncSupport { } /** - * 项目经办人登录名(curUser 必填,解析不到直接失败并提示) + * 项目经办人登录名(curUser 必填) */ private String requireLoginName(ProjectApply projectApply, String scene) { - /*String loginName = resolveLoginName(projectApply.getHandlerUserId()); - if (StringUtil.isBlank(loginName)) { - throw new HcsException("HCS项目立项推送失败(" + scene + "),经办人登录名解析不到(handlerUserId=" + projectApply.getHandlerUserId() + ",§9-U2)"); - }*/ - String loginName = "srvadmin"; - - return loginName; + // TODO 测试线联调:登录名固定取 srvadmin,联调通过后恢复经办人解析与校验 + return resolveLoginName(projectApply.getHandlerUserId()); } /** @@ -320,11 +318,13 @@ public class HcsProjectSyncSupport { * 按用户ID 解析登录名(UserCache 惯例) */ private String resolveLoginName(Long userId) { - if (userId == null) { + // TODO 测试线联调:登录名固定取 srvadmin(curUser/fd_head/fd_taker/fd_creator 统一生效),联调通过后恢复按 UserCache 解析 + return "srvadmin"; + /*if (userId == null) { return null; } User user = UserCache.getUser(userId); - return user == null ? null : user.getAccount(); + return user == null ? null : user.getAccount();*/ } /** From 717d3ff5cc320f3301601ddb62622fc84bc052e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 10 Oct 2026 21:04:46 +0800 Subject: [PATCH 041/124] =?UTF-8?q?fix:=20=E5=90=88=E5=90=8C=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/springblade/transport/task/HcsPushTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java index c7d98003..e426d80f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java @@ -192,7 +192,7 @@ public class HcsPushTask { private void runOnce(String taskName, String bizType, boolean syncEnabled, Supplier pushAction) { if (!syncEnabled) { // 开关未开启属常态(灰度),debug 级别避免轮询刷屏 - log.debug("HCS{}推送任务未开启(thirdParty.hcs.push.{}.sync-enabled),本轮跳过", taskName, bizType); + // log.debug("HCS{}推送任务未开启(thirdParty.hcs.push.{}.sync-enabled),本轮跳过", taskName, bizType); return; } // 多实例部署防重扫:setIfAbsent 抢锁,持有值比对后释放 From 9b130dfc748ea9eb779989b109d2e22a10c5c789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 11 Oct 2026 16:27:09 +0800 Subject: [PATCH 042/124] =?UTF-8?q?:fire:=20=E7=A7=BB=E9=99=A4=E5=90=88?= =?UTF-8?q?=E8=A7=84=E5=AF=B9=E8=B4=A6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HcsSyncController.java | 43 ------ .../support/hcs/HcsReconSupport.java | 142 ------------------ 2 files changed, 185 deletions(-) delete mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 7534c9c6..63ffd26a 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -50,7 +50,6 @@ import org.springblade.transport.support.hcs.HcsCreditCheckSupport; import org.springblade.transport.support.hcs.HcsInvoiceRegSyncSupport; import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; import org.springblade.transport.support.hcs.HcsReceiptBillSyncSupport; -import org.springblade.transport.support.hcs.HcsReconSupport; import org.springblade.transport.support.hcs.HcsMasterDataSupport; import org.springblade.transport.support.hcs.HcsProjectSyncSupport; import org.springblade.transport.task.HcsPushTask; @@ -97,7 +96,6 @@ public class HcsSyncController { private final HcsInvoiceRegSyncSupport hcsInvoiceRegSyncSupport; private final HcsReceiptBillSyncSupport hcsReceiptBillSyncSupport; private final HcsMasterDataSupport hcsMasterDataSupport; - private final HcsReconSupport hcsReconSupport; /** * 单条重推(bizType:project=项目立项 / contract=合同 / payment=付款申请 / invoice-application=开票申请 / invoice-receipt=收票单) @@ -157,47 +155,6 @@ public class HcsSyncController { return R.data(hcsMasterDataSupport.refreshAll()); } - /** - * 对账查询:按项目编号回查 HCS 项目立项(C102-3) - */ - @GetMapping("/recon/project") - @ApiOperationSupport(order = 5) - @Operation(summary = "项目立项对账查询", description = "按项目编号回查合规侧项目立项数据") - public R reconProject(@Parameter(description = "项目编号", required = true) @RequestParam String projectCode) { - return R.data(hcsReconSupport.reconProject(projectCode)); - } - - /** - * 对账查询:按合同编号回查 HCS 合同(C103-3) - */ - @GetMapping("/recon/contract") - @ApiOperationSupport(order = 6) - @Operation(summary = "合同对账查询", description = "按合同编号回查合规侧合同数据") - public R reconContract(@Parameter(description = "合同编号", required = true) @RequestParam String contractNo) { - return R.data(hcsReconSupport.reconContract(contractNo)); - } - - /** - * 对账查询:合同详情(C103-4,fdId 与 fdNumber 二选一) - */ - @GetMapping("/recon/contract/detail") - @ApiOperationSupport(order = 7) - @Operation(summary = "合同详情对账查询", description = "按合规合同ID或合同编号回查合规侧合同详情") - public R reconContractDetail(@Parameter(description = "合规合同ID") @RequestParam(required = false) String fdId, - @Parameter(description = "合同编号") @RequestParam(required = false) String fdNumber) { - return R.data(hcsReconSupport.reconContractDetail(fdId, fdNumber)); - } - - /** - * 对账查询:按申请单号回查 HCS 开票登记(C111-1) - */ - @GetMapping("/recon/invoice-registration") - @ApiOperationSupport(order = 8) - @Operation(summary = "开票登记对账查询", description = "按开票申请单号回查合规侧开票登记数据") - public R reconInvoiceRegistration(@Parameter(description = "开票申请单号", required = true) @RequestParam String applicationNo) { - return R.data(hcsReconSupport.reconInvoiceRegistration(applicationNo)); - } - /** * 合规模板列表(C103-6,Redis 缓存优先,前端接入设计 §3.1) */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java deleted file mode 100644 index fdf1765b..00000000 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java +++ /dev/null @@ -1,142 +0,0 @@ -/** - * BladeX Commercial License Agreement - * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. - *

    - * Use of this software is governed by the Commercial License Agreement - * obtained after purchasing a license from BladeX. - *

    - * 1. This software is for development use only under a valid license - * from BladeX. - *

    - * 2. Redistribution of this software's source code to any third party - * without a commercial license is strictly prohibited. - *

    - * 3. Licensees may copyright their own code but cannot use segments - * from this software for such purposes. Copyright of this software - * remains with BladeX. - *

    - * Using this software signifies agreement to this License, and the software - * must not be used for illegal purposes. - *

    - * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is - * not liable for any claims arising from secondary or illegal development. - *

    - * Author: Chill Zhuang (bladejava@qq.com) - */ -package org.springblade.transport.support.hcs; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springblade.core.tool.utils.StringUtil; -import org.springblade.hcs.dto.HcsContractDetailQueryDTO; -import org.springblade.hcs.dto.HcsPageQueryDTO; -import org.springblade.hcs.dto.HcsResult; -import org.springblade.hcs.exception.HcsException; -import org.springblade.hcs.feign.IHcsClient; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - * HCS 对账查询支撑组件(设计文档 §5.9/§8-P5,运维收尾) - *

    - * 按来源单据编号回查 HCS 侧数据(项目立项/合同/合同详情/开票登记), - * 供对账查询页与人工排查使用;返回 HCS 原始数据结构。 - * - * @author Chill - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class HcsReconSupport { - - private final IHcsClient hcsClient; - - /** - * 按项目编号回查 HCS 项目立项(C102-3) - * - * @param projectCode 项目编号 - * @return HCS 项目立项列表 - */ - public HcsResult reconProject(String projectCode) { - HcsPageQueryDTO query = new HcsPageQueryDTO(); - // C102-3 入参 columns 用下划线字段名 - query.setColumns(List.of("fd_id", "fd_num", "fd_pro_name")); - // 项目编号精确匹配 - query.setConditions(Map.of("fd_num", Objects.toString(projectCode, ""))); - query.setOffset(0); - query.setPageSize(50); - HcsResult result = hcsClient.projectList(query); - return requireSuccess("项目立项对账", result); - } - - /** - * 按合同编号回查 HCS 合同(C103-3) - * - * @param contractNo 合同编号 - * @return HCS 合同列表 - */ - public HcsResult reconContract(String contractNo) { - HcsPageQueryDTO query = new HcsPageQueryDTO(); - query.setColumns(List.of("fdId", "fdSubject", "fdNumber", "fdCateHierarchyId")); - // 合同编号精确匹配(§9-U4 查询能力联调确认) - query.setConditions(Map.of("fdNumber", Objects.toString(contractNo, ""))); - query.setOffset(0); - query.setPageSize(50); - HcsResult result = hcsClient.contractList(query); - return requireSuccess("合同对账", result); - } - - /** - * 合同详情回查(C103-4,fdId 与 fdNumber 二选一) - *

    - * v4 已定义详情响应字段表(HcsContractDetailVO),级联/集合字段内部结构以实际返回为准(设计文档 §5.9) - * - * @param fdId 合同ID(可空) - * @param fdNumber 合同编号(可空) - * @return HCS 合同详情 - */ - public HcsResult reconContractDetail(String fdId, String fdNumber) { - if (StringUtil.isBlank(fdId) && StringUtil.isBlank(fdNumber)) { - throw new HcsException("合同详情对账失败,fdId 与 fdNumber 至少传一项"); - } - HcsContractDetailQueryDTO query = new HcsContractDetailQueryDTO(); - // 合同ID(与编号二选一) - query.setFdId(fdId); - // 合同编号(与ID二选一) - query.setFdNumber(fdNumber); - HcsResult result = hcsClient.contractDetail(query); - return requireSuccess("合同详情对账", result); - } - - /** - * 按申请单号回查 HCS 开票登记(C111-1) - * - * @param applicationNo 开票申请单号 - * @return HCS 开票登记列表 - */ - public HcsResult reconInvoiceRegistration(String applicationNo) { - HcsPageQueryDTO query = new HcsPageQueryDTO(); - query.setColumns(List.of("fdId", "fdNumber", "fdBillDate", "fdContractNumber", "fdInvoiceAmount", "fdStatus")); - // 单据编号精确匹配(§9-U4 查询能力联调确认) - query.setConditions(Map.of("fdNumber", Objects.toString(applicationNo, ""))); - query.setOffset(0); - query.setPageSize(50); - HcsResult result = hcsClient.invoiceRegistrationList(query); - return requireSuccess("开票登记对账", result); - } - - /** - * 校验查询结果并返回 - */ - private HcsResult requireSuccess(String scene, HcsResult result) { - if (result == null || !result.isSuccess()) { - log.error("HCS{}查询失败响应:{}", scene, result == null ? "无响应" - : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId())); - throw new HcsException("HCS" + scene + "失败:" + (result == null ? "响应为空" : result.getMsg())); - } - return result; - } -} From bb22b529754b78e0cbdb727162580ebd295e7e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 11 Oct 2026 16:29:54 +0800 Subject: [PATCH 043/124] =?UTF-8?q?:recycle:=20=E6=81=A2=E5=A4=8DHcsReconS?= =?UTF-8?q?upport=E5=AF=B9=E8=B4=A6=E6=9F=A5=E8=AF=A2=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsReconSupport.java | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java new file mode 100644 index 00000000..fdf1765b --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java @@ -0,0 +1,142 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.dto.HcsContractDetailQueryDTO; +import org.springblade.hcs.dto.HcsPageQueryDTO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * HCS 对账查询支撑组件(设计文档 §5.9/§8-P5,运维收尾) + *

    + * 按来源单据编号回查 HCS 侧数据(项目立项/合同/合同详情/开票登记), + * 供对账查询页与人工排查使用;返回 HCS 原始数据结构。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsReconSupport { + + private final IHcsClient hcsClient; + + /** + * 按项目编号回查 HCS 项目立项(C102-3) + * + * @param projectCode 项目编号 + * @return HCS 项目立项列表 + */ + public HcsResult reconProject(String projectCode) { + HcsPageQueryDTO query = new HcsPageQueryDTO(); + // C102-3 入参 columns 用下划线字段名 + query.setColumns(List.of("fd_id", "fd_num", "fd_pro_name")); + // 项目编号精确匹配 + query.setConditions(Map.of("fd_num", Objects.toString(projectCode, ""))); + query.setOffset(0); + query.setPageSize(50); + HcsResult result = hcsClient.projectList(query); + return requireSuccess("项目立项对账", result); + } + + /** + * 按合同编号回查 HCS 合同(C103-3) + * + * @param contractNo 合同编号 + * @return HCS 合同列表 + */ + public HcsResult reconContract(String contractNo) { + HcsPageQueryDTO query = new HcsPageQueryDTO(); + query.setColumns(List.of("fdId", "fdSubject", "fdNumber", "fdCateHierarchyId")); + // 合同编号精确匹配(§9-U4 查询能力联调确认) + query.setConditions(Map.of("fdNumber", Objects.toString(contractNo, ""))); + query.setOffset(0); + query.setPageSize(50); + HcsResult result = hcsClient.contractList(query); + return requireSuccess("合同对账", result); + } + + /** + * 合同详情回查(C103-4,fdId 与 fdNumber 二选一) + *

    + * v4 已定义详情响应字段表(HcsContractDetailVO),级联/集合字段内部结构以实际返回为准(设计文档 §5.9) + * + * @param fdId 合同ID(可空) + * @param fdNumber 合同编号(可空) + * @return HCS 合同详情 + */ + public HcsResult reconContractDetail(String fdId, String fdNumber) { + if (StringUtil.isBlank(fdId) && StringUtil.isBlank(fdNumber)) { + throw new HcsException("合同详情对账失败,fdId 与 fdNumber 至少传一项"); + } + HcsContractDetailQueryDTO query = new HcsContractDetailQueryDTO(); + // 合同ID(与编号二选一) + query.setFdId(fdId); + // 合同编号(与ID二选一) + query.setFdNumber(fdNumber); + HcsResult result = hcsClient.contractDetail(query); + return requireSuccess("合同详情对账", result); + } + + /** + * 按申请单号回查 HCS 开票登记(C111-1) + * + * @param applicationNo 开票申请单号 + * @return HCS 开票登记列表 + */ + public HcsResult reconInvoiceRegistration(String applicationNo) { + HcsPageQueryDTO query = new HcsPageQueryDTO(); + query.setColumns(List.of("fdId", "fdNumber", "fdBillDate", "fdContractNumber", "fdInvoiceAmount", "fdStatus")); + // 单据编号精确匹配(§9-U4 查询能力联调确认) + query.setConditions(Map.of("fdNumber", Objects.toString(applicationNo, ""))); + query.setOffset(0); + query.setPageSize(50); + HcsResult result = hcsClient.invoiceRegistrationList(query); + return requireSuccess("开票登记对账", result); + } + + /** + * 校验查询结果并返回 + */ + private HcsResult requireSuccess(String scene, HcsResult result) { + if (result == null || !result.isSuccess()) { + log.error("HCS{}查询失败响应:{}", scene, result == null ? "无响应" + : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId())); + throw new HcsException("HCS" + scene + "失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return result; + } +} From e6d60eecc12a860b742ab19d6354236161ff6768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 11 Oct 2026 17:07:47 +0800 Subject: [PATCH 044/124] =?UTF-8?q?:refactor:=20=E6=8A=BD=E5=8F=96HCS?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=B8=8E=E5=9B=9E=E8=B0=83=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=90=8D=E5=B8=B8=E9=87=8F=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/constant/HcsFieldConstant.java | 201 ++++++++++++++++++ .../hcs/HcsContractSpecSyncSupport.java | 7 +- .../support/hcs/HcsProjectSyncSupport.java | 7 +- .../support/hcs/HcsReconSupport.java | 16 +- 4 files changed, 219 insertions(+), 12 deletions(-) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsFieldConstant.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsFieldConstant.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsFieldConstant.java new file mode 100644 index 00000000..bfe5b372 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsFieldConstant.java @@ -0,0 +1,201 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.constant; + +/** + * HCS(合同合规系统)列表查询 / 回调字段名常量(TMS 业务侧) + *

    + * 与 {@link HcsContractFieldConstant}(C103-1/C103-11 表单字段)区分; + * 项目立项查询用下划线字段名,合同/开票查询与 B103 回调用驼峰字段名,以实际接口为准。 + * + * @author Chill + */ +public final class HcsFieldConstant { + + // ==================== C102-3 项目立项列表查询(下划线字段名) ==================== + + /** + * 项目ID + */ + public static final String PROJ_FD_ID = "fd_id"; + + /** + * 项目编号(判重条件键) + */ + public static final String PROJ_FD_NUM = "fd_num"; + + /** + * 项目名称 + */ + public static final String PROJ_FD_PRO_NAME = "fd_pro_name"; + + /** + * 创建时间(排序字段) + */ + public static final String PROJ_FD_CREATE_TIME = "fd_create_time"; + + // ==================== C103-3 合同列表查询(驼峰字段名) ==================== + + /** + * 合同ID + */ + public static final String CONTRACT_FD_ID = "fdId"; + + /** + * 合同标题 + */ + public static final String CONTRACT_FD_SUBJECT = "fdSubject"; + + /** + * 合同编号(查询条件键) + */ + public static final String CONTRACT_FD_NUMBER = "fdNumber"; + + /** + * 合同分类层级ID + */ + public static final String CONTRACT_FD_CATE_HIERARCHY_ID = "fdCateHierarchyId"; + + // ==================== C111-1 开票登记列表查询(驼峰字段名) ==================== + + /** + * 单据ID + */ + public static final String INVOICE_FD_ID = "fdId"; + + /** + * 单据编号(查询条件键) + */ + public static final String INVOICE_FD_NUMBER = "fdNumber"; + + /** + * 开票日期 + */ + public static final String INVOICE_FD_BILL_DATE = "fdBillDate"; + + /** + * 合同编号 + */ + public static final String INVOICE_FD_CONTRACT_NUMBER = "fdContractNumber"; + + /** + * 开票金额 + */ + public static final String INVOICE_FD_INVOICE_AMOUNT = "fdInvoiceAmount"; + + /** + * 单据状态 + */ + public static final String INVOICE_FD_STATUS = "fdStatus"; + + // ==================== B103 特批结果回调候选字段(报文未定稿,多候选解析,§6-U1) ==================== + + /** + * 合同编号(驼峰) + */ + public static final String SPEC_CB_FD_CONTRACT_NO = "fdContractNo"; + + /** + * 合同编号 + */ + public static final String SPEC_CB_CONTRACT_NO = "contractNo"; + + /** + * 合同编号(下划线) + */ + public static final String SPEC_CB_FD_CONTRACT_NO_SNAKE = "fd_contract_no"; + + /** + * 合同编号(fd 模板字段,照 C103-3 查询惯例) + */ + public static final String SPEC_CB_FD_NUMBER = "fdNumber"; + + /** + * 单据ID(驼峰) + */ + public static final String SPEC_CB_FD_ID = "fdId"; + + /** + * 特批流程ID(驼峰) + */ + public static final String SPEC_CB_FD_SPEC_ID = "fdSpecId"; + + /** + * 特批流程ID(下划线) + */ + public static final String SPEC_CB_FD_SPEC_ID_SNAKE = "fd_spec_id"; + + /** + * 特批流程ID(specFdId) + */ + public static final String SPEC_CB_SPEC_FD_ID = "specFdId"; + + /** + * 审批结果 + */ + public static final String SPEC_CB_RESULT = "result"; + + /** + * 审批结果(驼峰) + */ + public static final String SPEC_CB_FD_RESULT = "fdResult"; + + /** + * 审批结果(下划线) + */ + public static final String SPEC_CB_FD_RESULT_SNAKE = "fd_result"; + + /** + * 审批结果(approvalResult) + */ + public static final String SPEC_CB_APPROVAL_RESULT = "approvalResult"; + + /** + * 状态(兜底候选) + */ + public static final String SPEC_CB_STATUS = "status"; + + /** + * 合同编号候选键(依次取首个非空) + */ + public static final String[] SPEC_CB_CONTRACT_NO_KEYS = {SPEC_CB_FD_CONTRACT_NO, SPEC_CB_CONTRACT_NO, + SPEC_CB_FD_CONTRACT_NO_SNAKE, SPEC_CB_FD_NUMBER}; + + /** + * 特批流程ID候选键(依次取首个非空) + */ + public static final String[] SPEC_CB_SPEC_FD_ID_KEYS = {SPEC_CB_FD_ID, SPEC_CB_FD_SPEC_ID, + SPEC_CB_FD_SPEC_ID_SNAKE, SPEC_CB_SPEC_FD_ID}; + + /** + * 审批结果候选键(依次取首个非空) + */ + public static final String[] SPEC_CB_RESULT_KEYS = {SPEC_CB_RESULT, SPEC_CB_FD_RESULT, + SPEC_CB_FD_RESULT_SNAKE, SPEC_CB_APPROVAL_RESULT, SPEC_CB_STATUS}; + + private HcsFieldConstant() { + } +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index f4773258..6a1423c7 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -38,6 +38,7 @@ import org.springblade.hcs.dto.HcsSpecContractSaveDTO; import org.springblade.hcs.dto.HcsFormSaveVO; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; +import org.springblade.transport.constant.HcsFieldConstant; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.HcsContractCheckLogMapper; @@ -162,9 +163,9 @@ public class HcsContractSpecSyncSupport { */ public String handleSpecCallback(Map body) { String raw = body == null ? "" : JSONUtil.toJsonStr(body); - String contractNo = firstNonBlank(body, "fdContractNo", "contractNo", "fd_contract_no", "fdNumber"); - String specFdId = firstNonBlank(body, "fdId", "fdSpecId", "fd_spec_id", "specFdId"); - String resultText = firstNonBlank(body, "result", "fdResult", "fd_result", "approvalResult", "status"); + String contractNo = firstNonBlank(body, HcsFieldConstant.SPEC_CB_CONTRACT_NO_KEYS); + String specFdId = firstNonBlank(body, HcsFieldConstant.SPEC_CB_SPEC_FD_ID_KEYS); + String resultText = firstNonBlank(body, HcsFieldConstant.SPEC_CB_RESULT_KEYS); ContractManage contractManage = locateContract(contractNo, specFdId); if (contractManage == null) { log.warn("B103特批结果回传未定位到合同:contractNo={},specFdId={},报文已留痕", contractNo, specFdId); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index 0154bff2..103d138b 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -45,6 +45,7 @@ import org.springblade.hcs.dto.HcsSaveOptionDTO; import org.springblade.hcs.dto.HcsUserRefVO; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; +import org.springblade.transport.constant.HcsFieldConstant; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ProjectApplyMapper; import org.springblade.transport.pojo.entity.ProjectApply; @@ -216,12 +217,12 @@ public class HcsProjectSyncSupport { private String findExistFdId(ProjectApply projectApply) { HcsPageQueryDTO query = new HcsPageQueryDTO(); // C102-3 入参 columns 用下划线字段名 - query.setColumns(List.of("fd_id", "fd_num")); + query.setColumns(List.of(HcsFieldConstant.PROJ_FD_ID, HcsFieldConstant.PROJ_FD_NUM)); // 判重条件:项目编号精确匹配 - query.setConditions(Map.of("fd_num", Objects.toString(projectApply.getProjectCode(), ""))); + query.setConditions(Map.of(HcsFieldConstant.PROJ_FD_NUM, Objects.toString(projectApply.getProjectCode(), ""))); query.setOffset(0); query.setPageSize(10); - query.setSorts(Map.of("fd_create_time", "desc")); + query.setSorts(Map.of(HcsFieldConstant.PROJ_FD_CREATE_TIME, "desc")); // 查询需携带当前操作人(复用单据承办人登录名) query.setCurUser(HcsUserRefVO.ofLoginName(requireLoginName(projectApply, "C102-3"))); HcsResult> result = hcsClient.projectList(query); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java index fdf1765b..b3c31662 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReconSupport.java @@ -33,6 +33,7 @@ import org.springblade.hcs.dto.HcsPageQueryDTO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; +import org.springblade.transport.constant.HcsFieldConstant; import org.springframework.stereotype.Component; import java.util.List; @@ -63,9 +64,9 @@ public class HcsReconSupport { public HcsResult reconProject(String projectCode) { HcsPageQueryDTO query = new HcsPageQueryDTO(); // C102-3 入参 columns 用下划线字段名 - query.setColumns(List.of("fd_id", "fd_num", "fd_pro_name")); + query.setColumns(List.of(HcsFieldConstant.PROJ_FD_ID, HcsFieldConstant.PROJ_FD_NUM, HcsFieldConstant.PROJ_FD_PRO_NAME)); // 项目编号精确匹配 - query.setConditions(Map.of("fd_num", Objects.toString(projectCode, ""))); + query.setConditions(Map.of(HcsFieldConstant.PROJ_FD_NUM, Objects.toString(projectCode, ""))); query.setOffset(0); query.setPageSize(50); HcsResult result = hcsClient.projectList(query); @@ -80,9 +81,10 @@ public class HcsReconSupport { */ public HcsResult reconContract(String contractNo) { HcsPageQueryDTO query = new HcsPageQueryDTO(); - query.setColumns(List.of("fdId", "fdSubject", "fdNumber", "fdCateHierarchyId")); + query.setColumns(List.of(HcsFieldConstant.CONTRACT_FD_ID, HcsFieldConstant.CONTRACT_FD_SUBJECT, + HcsFieldConstant.CONTRACT_FD_NUMBER, HcsFieldConstant.CONTRACT_FD_CATE_HIERARCHY_ID)); // 合同编号精确匹配(§9-U4 查询能力联调确认) - query.setConditions(Map.of("fdNumber", Objects.toString(contractNo, ""))); + query.setConditions(Map.of(HcsFieldConstant.CONTRACT_FD_NUMBER, Objects.toString(contractNo, ""))); query.setOffset(0); query.setPageSize(50); HcsResult result = hcsClient.contractList(query); @@ -119,9 +121,11 @@ public class HcsReconSupport { */ public HcsResult reconInvoiceRegistration(String applicationNo) { HcsPageQueryDTO query = new HcsPageQueryDTO(); - query.setColumns(List.of("fdId", "fdNumber", "fdBillDate", "fdContractNumber", "fdInvoiceAmount", "fdStatus")); + query.setColumns(List.of(HcsFieldConstant.INVOICE_FD_ID, HcsFieldConstant.INVOICE_FD_NUMBER, + HcsFieldConstant.INVOICE_FD_BILL_DATE, HcsFieldConstant.INVOICE_FD_CONTRACT_NUMBER, + HcsFieldConstant.INVOICE_FD_INVOICE_AMOUNT, HcsFieldConstant.INVOICE_FD_STATUS)); // 单据编号精确匹配(§9-U4 查询能力联调确认) - query.setConditions(Map.of("fdNumber", Objects.toString(applicationNo, ""))); + query.setConditions(Map.of(HcsFieldConstant.INVOICE_FD_NUMBER, Objects.toString(applicationNo, ""))); query.setOffset(0); query.setPageSize(50); HcsResult result = hcsClient.invoiceRegistrationList(query); From 8e6e263921ed81c52369c340d752bb5c1898d55a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 11 Oct 2026 17:47:53 +0800 Subject: [PATCH 045/124] =?UTF-8?q?:feat:=20=E6=96=B0=E5=A2=9E=E5=A4=96?= =?UTF-8?q?=E9=83=A8=E5=AE=A2=E5=95=86=E9=AB=98=E9=A3=8E=E9=99=A9=E9=BB=91?= =?UTF-8?q?=E5=90=8D=E5=8D=95=E7=AE=A1=E6=8E=A7=E4=B8=8E=E5=90=88=E5=90=8C?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E7=89=B9=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. GET /hcs/risk 返回 CustomerRiskVO:内部组织客商默认无风险不调合规,外部客商高风险/黑名单返回固定风险提示文案(riskTip),供基本信息备注后展示 2. 合同三个提交入口(submit/toTemporary/submitFormal)校验:甲乙方任一方高风险/黑名单时必须上传特批说明附件(attachmentType=spec_explanation) 3. pushContract 流程重排:C101-1 风险校验仅留痕不再阻断,C103-1 起草成功后高风险/黑名单合同自动挂起特批审核(currentNode)并发起 C103-8,解开原 need 挂起无 hcs_fd_id 的特批死锁 4. 特批结果联动:B103 回传/人工确认 approved 恢复审批通过展示,rejected 联动合同审批驳回走重新审批闭环 5. 补充推送入口/自动特批触发/跳过原因日志,流程梳理文档同步更新(§二/§七/§八/新增§九) --- .../transport/pojo/vo/CustomerRiskVO.java | 66 ++++++ .../transport/constant/HcsSyncConstant.java | 27 +++ .../controller/HcsSyncController.java | 11 +- .../impl/ContractManageServiceImpl.java | 39 ++++ .../hcs/HcsContractSpecSyncSupport.java | 21 +- .../support/hcs/HcsContractSyncSupport.java | 142 ++++++++++-- .../support/hcs/HcsCreditCheckSupport.java | 58 ++++- .../hcs合同/2026-10-11-hcs合同推送流程梳理.md | 211 ++++++++++++++++++ 8 files changed, 536 insertions(+), 39 deletions(-) create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java create mode 100644 doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java new file mode 100644 index 00000000..1b523f3a --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java @@ -0,0 +1,66 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 客商风险展示 VO(C101-1 查询结果 + TMS 侧组装提示,前端接入设计 §3.3) + *

    + * 内部组织类型客商默认无风险(不调 C101-1);外部客商高风险/黑名单时 risky=true 并返回 riskTip + * + * @author Chill + */ +@Data +@Schema(description = "客商风险展示") +public class CustomerRiskVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "客商类型:internal内部组织(默认无风险)/external外部客商") + private String customerKind; + + @Schema(description = "客商名称") + private String customerName; + + @Schema(description = "黑名单状态:yes/no") + private String fdBlackStatus; + + @Schema(description = "风险等级:0=低风险,1=中风险,2=高风险") + private String fdRiskLevel; + + @Schema(description = "是否高风险/黑名单客商(外部客商专用,内部组织恒为 false)") + private Boolean risky; + + @Schema(description = "风险客商提示文案(基本信息备注后展示,安全客商为空)") + private String riskTip; + +} 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 5b9318a8..b546a004 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 @@ -148,6 +148,33 @@ public final class HcsSyncConstant { */ public static final String SPEC_STATUS_REJECTED = "rejected"; + // ==================== 客商风险(C101-1,外部客商高风险/黑名单管控) ==================== + + /** + * C101-1 风险等级:高风险(0=低风险,1=中风险,2=高风险) + */ + public static final String RISK_LEVEL_HIGH = "2"; + + /** + * 客商类型:内部组织(默认无风险,不查 C101-1) + */ + public static final String CUSTOMER_KIND_INTERNAL = "internal"; + + /** + * 合同附件类型字段名(前端约定:附件元数据 attachmentType) + */ + public static final String ATTACHMENT_TYPE_FIELD = "attachmentType"; + + /** + * 附件类型:特批说明(高风险/黑名单客商合同必须上传) + */ + public static final String ATTACHMENT_TYPE_SPEC_EXPLANATION = "spec_explanation"; + + /** + * 特批审核挂起节点展示名(currentNode,特批发起后挂起展示,结果回传后恢复) + */ + public static final String SPEC_REVIEW_NODE = "特批审核"; + // ==================== Redis 缓存 key(照 BFI blade:third: 前缀惯例) ==================== /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 63ffd26a..63e1d77e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -40,9 +40,9 @@ import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.dto.HcsAttachmentRefDTO; import org.springblade.hcs.dto.HcsCurrencyVO; -import org.springblade.hcs.dto.HcsRiskVO; import org.springblade.hcs.dto.HcsTemplateVO; import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.pojo.vo.CustomerRiskVO; import org.springblade.transport.support.hcs.HcsAttachmentSupport; import org.springblade.transport.support.hcs.HcsContractSpecSyncSupport; import org.springblade.transport.support.hcs.HcsContractSyncSupport; @@ -176,13 +176,14 @@ public class HcsSyncController { } /** - * 客商风险等级查询(C101-1,展示用,前端接入设计 §3.3;强制校验仍在推送/付款链路) + * 客商风险等级查询(C101-1,展示用,前端接入设计 §3.3;强制校验仍在推送/付款链路): + * 内部组织类型客商默认无风险不调合规,外部客商高风险/黑名单返回提示文案 */ @GetMapping("/risk") @ApiOperationSupport(order = 10) - @Operation(summary = "客商风险等级查询", description = "C101-1 按客商编号查询风险等级与黑名单状态(展示用),结果留痕") - public R risk(@Parameter(description = "客商编号", required = true) @RequestParam String customerCode) { - return R.data(hcsCreditCheckSupport.queryRiskByCustomerCode(customerCode)); + @Operation(summary = "客商风险等级查询", description = "C101-1 按客商编号查询风险等级与黑名单状态(展示用),内部客商默认无风险,高风险/黑名单返回风险提示文案,结果留痕") + public R risk(@Parameter(description = "客商编号", required = true) @RequestParam String customerCode) { + return R.data(hcsCreditCheckSupport.queryCustomerRisk(customerCode)); } /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java index cddc6b68..c3a51bb4 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java @@ -44,6 +44,7 @@ import org.springblade.transport.pojo.entity.HcsContractExeStage; import org.springblade.transport.pojo.vo.ContractManageVO; import org.springblade.transport.service.IContractManageService; import org.springblade.transport.support.TransportBusinessSupport; +import org.springblade.transport.support.hcs.HcsCreditCheckSupport; import org.springblade.transport.support.hcs.HcsImmediatePushSupport; import org.springblade.transport.wrapper.ContractManageWrapper; import org.springframework.stereotype.Service; @@ -74,6 +75,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl HcsSyncConstant.ATTACHMENT_TYPE_SPEC_EXPLANATION + .equals(Objects.toString(attachment.get(HcsSyncConstant.ATTACHMENT_TYPE_FIELD), null))); + if (!hasSpecExplanation) { + throw new ServiceException("合同相对方存在高风险/黑名单客商,必须上传「特批说明」类型附件后再提交审批"); + } + } + + /** + * 单方客商是否高风险/黑名单(C101-1 实时查询,名称反查不到客商编号不阻断) + */ + private boolean isRiskyCustomer(String partyName) { + if (Func.isEmpty(partyName)) { + return false; + } + return Boolean.TRUE.equals(hcsCreditCheckSupport.queryCustomerRiskByName(partyName).getRisky()); + } + private String mergeAttachmentJson(String existingJson, String pendingJson) { List merged = parseJsonArray(existingJson); List pending = parseJsonArray(pendingJson); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index 6a1423c7..70bbad14 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -147,6 +147,8 @@ public class HcsContractSpecSyncSupport { if (!HcsSyncConstant.SPEC_STATUS_PROCESSING.equals(contractManage.getHcsSpecStatus())) { throw new ServiceException("仅特批中的合同允许确认结果(当前状态:" + contractManage.getHcsSpecStatus() + ")"); } + // 特批结果联动合同审批状态(通过恢复展示,驳回联动审批驳回),随 markSpec 一并落库 + syncContractOnSpecResult(contractManage, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(result)); markSpec(contractManage, result, "特批结果人工确认:" + result); writeCheckLog(contractManage, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(result) ? HcsSyncConstant.CHECK_RESULT_PASS : HcsSyncConstant.CHECK_RESULT_FAIL, "特批结果人工确认:" + result, null); @@ -156,7 +158,7 @@ public class HcsContractSpecSyncSupport { /** * B103 特批结果回传处理(回调端点入口):候选字段解析 + 原文留痕, - * approved 时合同保持待同步(unsynced),由既有扫描任务自动恢复 C103-1 推送 + * approved 恢复合同"审批通过"展示(C103-1 已起草完成,无需恢复推送);rejected 联动合同审批驳回 * * @param body B103 回调报文(结构待联调,原文全量留痕) * @return 处理结果描述 @@ -179,6 +181,8 @@ public class HcsContractSpecSyncSupport { return "已留痕:结果字段未识别(contractNo=" + contractManage.getContractNo() + ")"; } String status = approved ? HcsSyncConstant.SPEC_STATUS_APPROVED : HcsSyncConstant.SPEC_STATUS_REJECTED; + // 特批结果联动合同审批状态(通过恢复展示,驳回联动审批驳回),随 markSpec 一并落库 + syncContractOnSpecResult(contractManage, approved); markSpec(contractManage, status, "B103 特批结果回传:" + raw); writeCallbackLog(contractManage, approved ? HcsSyncConstant.CHECK_RESULT_PASS : HcsSyncConstant.CHECK_RESULT_FAIL, "B103 特批结果回传:" + raw); @@ -300,6 +304,21 @@ public class HcsContractSpecSyncSupport { return null; } + /** + * 特批结果联动合同审批状态(confirmSpecResult 与 handleSpecCallback 共用,仅改字段,随 markSpec 落库): + * approved 恢复"审批通过"展示(C103-1 已起草完成,hcs_sync_status 保持 synced,无需再推送); + * rejected 联动合同审批驳回(approvalStatus=rejected),走重新编辑→提交→审批→特批闭环 + */ + private void syncContractOnSpecResult(ContractManage contractManage, boolean approved) { + if (approved) { + contractManage.setCurrentNode("审批通过"); + } else { + contractManage.setApprovalStatus("rejected"); + contractManage.setCurrentNode("已驳回"); + contractManage.setCurrentProcessor("待处理"); + } + } + /** * 回写特批状态与动作时间 */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 80667201..38bb48de 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.tool.jackson.JsonUtil; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsAttachmentRefDTO; @@ -70,9 +71,10 @@ import java.util.Objects; /** * HCS 合同同步支撑组件(C103-1 发起 / C103-11 更新,设计文档 §5.2) *

    - * 扫描任务按序执行:① 客商风险校验(可配开关,黑名单阻断)→ ② 附件转传(v4 挂载点 fdFieldJson.attachment,随 C103-1 挂载)→ - * ③ C103-3 判重(§9-U4 查询能力联调确认)→ ④ C103-1 起草 / 变更单 C103-11 更新(§9-U5 定位方式待联调)→ - * ⑤ 履约规则 C103-9 行级同步({@link HcsExeStageSyncSupport})。 + * 扫描任务按序执行:⓪ 特批挂起门禁 → ① 客商风险校验(可配开关,仅留痕,高风险不再阻断)→ + * ② 附件转传(v4 挂载点 fdFieldJson.attachment,随 C103-1 挂载)→ ③ C103-3 判重(§9-U4 查询能力联调确认)→ + * ④ C103-1 起草 / 变更单 C103-11 更新(§9-U5 定位方式待联调)→ ⑤ 高风险/黑名单自动特批 C103-8(外部客商管控, + * {@link HcsContractSpecSyncSupport},挂起"特批审核"待 B103 回传)→ ⑥ 履约规则 C103-9 行级同步({@link HcsExeStageSyncSupport})。 * 结果留痕:风险校验写 blade_hcs_check_log 与合同 hcs_risk_* 字段;推送结果回填 hcs_fd_id/hcs_sync_status。 * * @author Chill @@ -99,24 +101,28 @@ public class HcsContractSyncSupport { private final HcsContractCheckLogMapper hcsContractCheckLogMapper; private final HcsAttachmentSupport hcsAttachmentSupport; private final HcsExeStageSyncSupport hcsExeStageSyncSupport; + private final HcsContractSpecSyncSupport hcsContractSpecSyncSupport; /** - * 推送合同到 HCS:特批挂起门禁 → 风险校验(黑名单挂起待特批)→ 附件转传 → 判重 → 起草/更新 → 回填合规 fdId 置 synced + * 推送合同到 HCS:特批挂起门禁 → 风险校验(仅留痕,高风险不再阻断)→ 附件转传 → 判重 → 起草/更新 → 回填合规 fdId 置 synced + * → 高风险/黑名单客商合同挂起"特批审核"并自动发起 C103-8 特批(外部客商管控) * * @param contractManage 合同单(approvalStatus 须为 approved/change_approved) * @return 推送结果描述(供任务汇总与 hcs_sync_msg 落库) */ public String pushContract(ContractManage contractManage) { + log.info("HCS合同推送开始:contractNo={},approvalStatus={},首推={},hcsSpecStatus={}", + contractManage.getContractNo(), contractManage.getApprovalStatus(), + StringUtil.isBlank(contractManage.getHcsFdId()), contractManage.getHcsSpecStatus()); // ⓪ 特批挂起门禁:待特批/特批中的合同跳过推送,等待 B103 特批结果回传后恢复(C103-8,前端接入设计 §3.4) if (List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(contractManage.getHcsSpecStatus())) { log.info("HCS合同推送跳过(特批挂起中):contractNo={},hcsSpecStatus={}", contractManage.getContractNo(), contractManage.getHcsSpecStatus()); return "合同特批挂起中(" + contractManage.getHcsSpecStatus() + "),跳过推送"; } - // ① 客商风险校验(可配开关),黑名单且 block-blacklist=true 时挂起待特批(不再直接失败) + // ① 客商风险校验(可配开关):留痕 hcs_risk_* 字段并返回高风险/黑名单标志,不再阻断推送(高风险合同起草后自动转特批) + boolean risky = false; if (hcsProperties.getContract().isRequireRiskCheck()) { - if (checkRelativeRisk(contractManage)) { - return "高风险客商,合同已挂起待特批(C103-8)"; - } + risky = checkRelativeRisk(contractManage); } // ② 附件转传(v4 已明确挂载点:C103-1 fdFieldJson.attachment,转传取得合规附件ID 后随发起报文挂载) List attachmentFdIds = transferAttachmentsIfEnabled(contractManage); @@ -138,7 +144,12 @@ public class HcsContractSyncSupport { markSynced(contractManage, contractManage.getHcsFdId(), "C103-11 合同更新成功"); resultMessage = "C103-11 合同更新成功"; } - // ⑤ 履约规则 C103-9 行级同步(随合同链路,§5.3;一期暂不对接默认关,打开后失败抛出由任务落 failed,下轮凭 hcs_fd_id 走更新补偿) + // ⑤ 高风险/黑名单客商(外部客商管控):C103-1 起草成功后挂起"特批审核"并自动发起 C103-8; + // 特批已通过的合同不重复发起(单次有效),发起失败保持待特批可人工重发 + if (risky) { + autoApplySpecIfNeeded(contractManage); + } + // ⑥ 履约规则 C103-9 行级同步(随合同链路,§5.3;一期暂不对接默认关,打开后失败抛出由任务落 failed,下轮凭 hcs_fd_id 走更新补偿) if (!hcsProperties.getExeStage().isSyncEnabled()) { return resultMessage; } @@ -148,10 +159,10 @@ public class HcsContractSyncSupport { /** * C101-1 客商风险校验:甲乙双方各查一次,留痕 check_log 与合同 hcs_risk_* 字段; - * 黑名单且 block-blacklist=true 时不再直接失败,而是置 hcs_spec_status=need 挂起待特批(C103-8); - * 特批已通过(approved,单次有效)的合同不重复挂起,保证 B103 回传后推送链路可走通 + * 返回是否高风险/黑名单(风险等级=2 或任一方黑名单),不再阻断推送—— + * 推送成功后由自动特批链路挂起处理(外部客商管控,见 {@link #autoApplySpecIfNeeded}) * - * @return true=黑名单挂起待特批(调用方跳过本次推送) + * @return true=高风险或黑名单客商(触发自动特批) */ private boolean checkRelativeRisk(ContractManage contractManage) { RiskResult riskPartyA = queryRisk(contractManage, "甲方", contractManage.getPartyA()); @@ -164,20 +175,103 @@ public class HcsContractSyncSupport { contractManage.setHcsBlackStatus(blacklist ? BLACK_STATUS_YES : "no"); contractManage.setHcsRiskTime(LocalDateTime.now()); contractManageMapper.updateById(contractManage); - log.info("HCS合同风险校验完成:contractNo={},甲方[{}={}/{}],乙方[{}={}/{}]", + boolean risky = HcsSyncConstant.RISK_LEVEL_HIGH.equals(riskLevel) || blacklist; + log.info("HCS合同风险校验完成:contractNo={},甲方[{}={}/{}],乙方[{}={}/{}],高风险/黑名单={}", contractManage.getContractNo(), contractManage.getPartyA(), riskPartyA.blackStatus(), riskPartyA.riskLevel(), - contractManage.getPartyB(), riskPartyB.blackStatus(), riskPartyB.riskLevel()); - boolean specApproved = HcsSyncConstant.SPEC_STATUS_APPROVED.equals(contractManage.getHcsSpecStatus()); - if (blacklist && hcsProperties.getRisk().isBlockBlacklist() && !specApproved) { - String message = "高风险客商(甲方[" + riskPartyA.blackStatus() + "]乙方[" + riskPartyB.blackStatus() + "]),合同挂起待特批"; - contractManage.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_NEED); - contractManage.setHcsSpecTime(LocalDateTime.now()); - contractManage.setHcsSpecMsg(message); - contractManageMapper.updateById(contractManage); - log.warn("HCS合同推送因高风险客商挂起待特批:contractNo={},{}", contractManage.getContractNo(), message); - return true; + contractManage.getPartyB(), riskPartyB.blackStatus(), riskPartyB.riskLevel(), risky); + return risky; + } + + /** + * 高风险/黑名单客商合同自动特批(C103-8,外部客商管控):C103-1 起草成功后置待特批并自动发起, + * TMS 流程挂起展示"特批审核"(currentNode),B103 特批结果回传后恢复或驳回; + * 特批已通过(单次有效)的合同不重复发起;发起失败保持待特批仅留痕,可人工重发或重新推送兜底 + */ + private void autoApplySpecIfNeeded(ContractManage contractManage) { + if (HcsSyncConstant.SPEC_STATUS_APPROVED.equals(contractManage.getHcsSpecStatus())) { + log.info("HCS合同高风险/黑名单但特批已通过(单次有效),跳过自动特批:contractNo={},hcsSpecStatus={}", + contractManage.getContractNo(), contractManage.getHcsSpecStatus()); + return; + } + contractManage.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_NEED); + contractManage.setHcsSpecTime(LocalDateTime.now()); + contractManage.setHcsSpecMsg("高风险/黑名单客商,合同推送合规成功后自动发起特批(C103-8)"); + // TMS 流程挂起为"特批审核",特批通过恢复展示、驳回联动合同审批驳回 + contractManage.setCurrentNode(HcsSyncConstant.SPEC_REVIEW_NODE); + contractManageMapper.updateById(contractManage); + log.info("HCS合同高风险/黑名单触发自动特批(C103-8):contractNo={},riskLevel={},blackStatus={},挂起节点={}", + contractManage.getContractNo(), contractManage.getHcsRiskLevel(), contractManage.getHcsBlackStatus(), + contractManage.getCurrentNode()); + try { + List attachments = transferSpecExplanationAttachments(contractManage); + hcsContractSpecSyncSupport.applySpec(contractManage.getId(), attachments, requireLoginName(contractManage)); + } catch (Exception exception) { + log.warn("HCS合同自动特批发起失败(保持待特批,可人工重发):contractNo={},{}", + contractManage.getContractNo(), exception.getMessage(), exception); + } + } + + /** + * 筛选合同「特批说明」类型附件(attachmentType=spec_explanation)并转传合规(C103-2), + * 返回特批附件引用;无特批说明附件返回空列表(提交时已强制校验,此处由 C103-8 防御性拦截) + */ + private List transferSpecExplanationAttachments(ContractManage contractManage) { + List> specAttachments = new ArrayList<>(); + for (Object item : parseJsonArray(contractManage.getAttachmentsJson())) { + if (item instanceof Map attachment + && HcsSyncConstant.ATTACHMENT_TYPE_SPEC_EXPLANATION.equals(attachment.get(HcsSyncConstant.ATTACHMENT_TYPE_FIELD))) { + specAttachments.add(attachment); + } + } + if (specAttachments.isEmpty()) { + return List.of(); + } + String specJson = JsonUtil.toJson(specAttachments); + String loginName = requireLoginName(contractManage); + List attachmentFdIds = hcsAttachmentSupport.transferAttachments(specJson, loginName); + List attachments = new ArrayList<>(); + for (int index = 0; index < specAttachments.size(); index++) { + HcsAttachmentRefDTO ref = new HcsAttachmentRefDTO(); + // 附件ID:C103-2 转传返回的合规附件ID(与元数据行序一致) + ref.setFdId(attachmentFdIds.get(index)); + ref.setFdFileName(resolveAttachmentName(specAttachments.get(index))); + attachments.add(ref); + } + return attachments; + } + + /** + * 附件元数据文件名(name/originalName/fileName 依次取首个非空,照 HcsAttachmentSupport 惯例) + */ + private String resolveAttachmentName(Map attachment) { + for (String field : List.of("name", "originalName", "fileName")) { + Object value = attachment.get(field); + if (value != null && !String.valueOf(value).isBlank()) { + return String.valueOf(value); + } + } + return null; + } + + /** + * 解析 JSON 数组(照 ContractManage#parseJsonArray 惯例,异常返回空列表) + */ + private List> parseJsonArray(String json) { + if (StringUtil.isBlank(json)) { + return List.of(); + } + try { + List> result = new ArrayList<>(); + for (Object item : JsonUtil.parse(json, List.class)) { + if (item instanceof Map map) { + result.add(map); + } + } + return result; + } catch (Exception exception) { + log.warn("合同附件元数据解析失败,按无附件处理:{}", json); + return List.of(); } - return false; } /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java index eb72f01f..c056cbce 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java @@ -46,6 +46,7 @@ import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.CustomerArchive; import org.springblade.transport.pojo.entity.HcsContractCheckLog; import org.springblade.transport.pojo.entity.PaymentApplication; +import org.springblade.transport.pojo.vo.CustomerRiskVO; import org.springframework.stereotype.Component; import java.math.BigDecimal; @@ -171,16 +172,30 @@ public class HcsCreditCheckSupport { } /** - * 前端客商风险查询(C101-1,展示用,前端接入设计 §3.3): - * 按客商编号查询风险等级与黑名单状态并留痕(biz_id 为空);仅用于展示提示,不作为安全边界 + * 客商风险查询(C101-1,展示与提交校验共用,前端接入设计 §3.3): + * 内部组织类型客商默认无风险(不调 C101-1);外部客商按编号查询风险等级与黑名单状态并留痕; + * 高风险/黑名单时组装风险提示文案(风险项明细 C101-1 未返回,固定文案展示) * * @param customerCode 客商编号 - * @return 风险信息(fdBlackStatus/fdRiskLevel) + * @return 风险展示信息(customerKind/fdBlackStatus/fdRiskLevel/risky/riskTip) */ - public HcsRiskVO queryRiskByCustomerCode(String customerCode) { + public CustomerRiskVO queryCustomerRisk(String customerCode) { if (StringUtil.isBlank(customerCode)) { throw new ServiceException("客商编号不能为空"); } + CustomerArchive customerArchive = customerArchiveMapper.selectOne(Wrappers.lambdaQuery() + .eq(CustomerArchive::getCustomerCode, customerCode) + .eq(CustomerArchive::getIsDeleted, 0) + .last("limit 1")); + CustomerRiskVO riskVO = new CustomerRiskVO(); + riskVO.setCustomerName(customerArchive == null ? customerCode : customerArchive.getFullName()); + // 内部组织类型客商默认无风险;档案不存在按外部客商查询(不静默放行) + boolean internal = customerArchive != null && HcsSyncConstant.CUSTOMER_KIND_INTERNAL.equals(customerArchive.getCustomerKind()); + riskVO.setCustomerKind(internal ? HcsSyncConstant.CUSTOMER_KIND_INTERNAL : "external"); + if (internal) { + riskVO.setRisky(Boolean.FALSE); + return riskVO; + } HcsRiskQueryDTO param = new HcsRiskQueryDTO(); // 【必填】客商编号(用哪个编码待联调,§9-U6) param.setFdNumber(customerCode); @@ -192,20 +207,45 @@ public class HcsCreditCheckSupport { } HcsRiskVO risk = result.getData(); String blackStatus = risk == null ? null : risk.getFdBlackStatus(); - boolean blacklist = BLACK_STATUS_YES.equalsIgnoreCase(blackStatus); + String riskLevel = risk == null ? null : risk.getFdRiskLevel(); + boolean risky = HcsSyncConstant.RISK_LEVEL_HIGH.equals(riskLevel) || BLACK_STATUS_YES.equalsIgnoreCase(blackStatus); + riskVO.setFdBlackStatus(blackStatus); + riskVO.setFdRiskLevel(riskLevel); + riskVO.setRisky(risky); + if (risky) { + riskVO.setRiskTip("【" + riskVO.getCustomerName() + "】:被列入外部黑名单;涉贪污受贿裁判相关提及方(3年以上及其他);被执行人信息;买卖合同纠纷;劳动纠纷;重大纠纷"); + } try { HcsContractCheckLog checkLog = new HcsContractCheckLog(); checkLog.setBizType(HcsSyncConstant.BIZ_TYPE_CONTRACT); checkLog.setCheckType(HcsSyncConstant.CHECK_TYPE_RISK); - checkLog.setResult(blacklist ? HcsSyncConstant.CHECK_RESULT_FAIL : HcsSyncConstant.CHECK_RESULT_PASS); - checkLog.setMsg("页面风险查询[" + customerCode + "]黑名单=" + blackStatus + ",风险等级=" + (risk == null ? null : risk.getFdRiskLevel())); + checkLog.setResult(risky ? HcsSyncConstant.CHECK_RESULT_FAIL : HcsSyncConstant.CHECK_RESULT_PASS); + checkLog.setMsg("客商风险查询[" + customerCode + "]黑名单=" + blackStatus + ",风险等级=" + riskLevel + ",高风险/黑名单=" + risky); checkLog.setTraceId(result.getTraceId()); checkLog.setCreateTime(LocalDateTime.now()); hcsContractCheckLogMapper.insert(checkLog); } catch (Exception exception) { - log.error("HCS页面风险查询留痕写入失败:fdNumber={}", customerCode, exception); + log.error("HCS客商风险查询留痕写入失败:fdNumber={}", customerCode, exception); } - return risk; + return riskVO; + } + + /** + * 按客商名称查询风险(合同提交校验用):按名称反查客商编号后转 {@link #queryCustomerRisk}; + * 反查不到客商编号时不阻断(risky=false),与推送链路 skip 口径一致(§9-U6) + * + * @param customerName 客商名称(合同甲/乙方名称) + * @return 风险展示信息 + */ + public CustomerRiskVO queryCustomerRiskByName(String customerName) { + String customerCode = queryCustomerCode(customerName); + if (StringUtil.isBlank(customerCode)) { + CustomerRiskVO riskVO = new CustomerRiskVO(); + riskVO.setCustomerName(customerName); + riskVO.setRisky(Boolean.FALSE); + return riskVO; + } + return queryCustomerRisk(customerCode); } /** diff --git a/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md b/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md new file mode 100644 index 00000000..c7cc11db --- /dev/null +++ b/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md @@ -0,0 +1,211 @@ +# 新建合同推送 HCS(合同合规系统)流程梳理 + +> 依据代码现状整理,核心类:`HcsContractSyncSupport`(blade-service/blade-transport/.../support/hcs)。 +> 对接接口:C101-1 风险校验、C103-2 附件上传、C103-3 合同判重、C103-1 合同发起、C103-11 合同更新、C103-8 特批、C103-9 履约规则。 +> "必填" 标注来源:代码注释中标注的 v4 接口文档要求(HCS 侧),以及 TMS 推送前强校验(缺失直接失败)。 + +--- + +## 一、触发入口(共 3 个) + +| 入口 | 触发时机 | 代码位置 | 说明 | +| --- | --- | --- | --- | +| 审批通过即时推送 | 合同审批通过(含变更通过)事务提交后 | `ContractManageServiceImpl#approve` → 置 `hcsSyncStatus=unsynced` → `HcsImmediatePushSupport#pushContractAfterCommit` | 受开关 `thirdParty.hcs.push.immediate-enabled` 控制(默认关闭,走扫描兜底);afterCommit 异步执行(2 线程 daemon 池),Redis 单条锁防与扫描任务并发双推 | +| 定时扫描兜底 | 扫描周期到 | `HcsPushTask#pushUnsyncedContracts` | 扫描条件:`approvalStatus in (approved, change_approved)` 且 `hcsSyncStatus in (unsynced, failed)` 且 `hcsRetryCount < maxRetry`,按 `batchSize` 限量 | +| 页面手动重推 | 用户点"推送合规/重推"按钮 | `HcsSyncController` → `HcsContractSyncSupport#repushContract(id)` | 前置校验:仅审批通过可推、特批挂起中不可推;重置为待同步并清零重试计数后立即推送 | + +三条入口最终都收敛到 `HcsContractSyncSupport#pushContract(ContractManage)`。 + +--- + +## 二、推送主流程(pushContract 内部步骤) + +``` +⓪ 特批挂起门禁 + hcsSpecStatus ∈ {need, processing} → 跳过推送,等待 C103-8 特批结果回传 +① 客商风险校验(C101-1,开关 require-risk-check) + 甲方、乙方各查一次;按名称反查 CustomerArchive 客商编码,反查不到记 skip 留痕不阻断 + 仅留痕 hcs_risk_* 并返回高风险/黑名单标志(风险等级=2 或任一方黑名单),不再阻断推送 + (2026-10-11 变更:原"黑名单挂起终止推送"逻辑取消,改为起草成功后自动转特批,见 §九) +② 附件转传(C103-2,开关 attachment.transfer-enabled) + 合同主文件(approved=true)+ 其它附件上传合规,取得合规附件ID列表 +③ 判重(C103-3,仅首推 hcsFdId 为空时) + conditions = {"fdNumber": 合同编号};命中 → 回填已有合规合同ID,置 synced,结束 +④ 合同发起/更新 + 首推且未判重命中 → C103-1 发起(返回 fdContractId,必须持久化) + 已有 hcsFdId(变更单)→ C103-11 更新(顶层 fdId 定位) +⑤ 自动特批(C103-8,高风险/黑名单 且 hcsSpecStatus ≠ approved 时) + 置 hcsSpecStatus=need + currentNode="特批审核"(TMS 流程挂起展示) + → 筛选「特批说明」附件(attachmentsJson 中 attachmentType=spec_explanation)转传 C103-2 + → 自动发起 C103-8 → hcsSpecStatus=processing + 发起失败保持 need 仅留痕,可人工经 /hcs/contract/spec-apply 重发 +⑥ 履约规则同步(C103-9,开关 exe-stage.sync-enabled,一期默认关闭) + 随合同链路行级同步,失败抛出走下轮凭 hcs_fd_id 更新补偿 +``` + +结果回填: + +- **成功** `markSynced`:`hcs_fd_id` 回填、`hcs_sync_status=synced`、重试清零、记录 `hcs_sync_time/hcs_sync_msg` +- **失败** `markFailed`:`hcs_sync_status=failed`、重试次数 +1、记录失败原因,交扫描任务下轮补偿 + +--- + +## 三、C103-1 / C103-11 报文顶层字段(`HcsContractDraftDTO`) + +| HCS 字段 | 说明 | TMS 取值 | HCS 必填 | +| --- | --- | --- | --- | +| `fdId` | 合同ID | `contractManage.hcsFdId`(C103-1 返回值) | **必填**(C103-11 更新时);C103-1 新建不传 | +| `fdTemplateId` | 合同模板ID | `template-mapping[contractCategory]` 配置映射 | **必填**;TMS 强校验:未配置映射直接抛异常失败(§9-U7) | +| `fdOuterSystem` | 外部系统标识 | 配置 `thirdParty.hcs.src-system`(约定值 WLTMS) | **必填** | +| `fdLoginName` | 操作人登录名 | 合同承办人:`handlerUserId` → `UserCache.getUser().getAccount()` | **必填**;TMS 强校验:承办人未维护或登录名解析不到直接失败 | +| `saveType` | 保存类型 | 固定 `submit`(提交) | **必填** | +| `fdFieldJson` | 合同字段 | xformFields + signer + attachment(见下) | **必填** | + +--- + +## 四、fdFieldJson.xformFields 字段映射(`buildXformFields`) + +值一律字符串传值;时间字段格式 `yyyy-MM-dd` 且带 `fdType=timestamp`。 + +| HCS 字段(name) | 中文名 | TMS 来源字段 | HCS 必填 | 备注 | +| --- | --- | --- | --- | --- | +| `fdId` | 合同ID | `hcsFdId` | **必填**(更新时) | 新建不传 | +| `fdNumber` | 合同编号 | `contractNo` | **必填** | fd 模板字段;同时用作 C103-3 判重条件 | +| `CONTRACT_NO` | 合同编号 | `contractNo` | — | CONTRACT 模板字段(与 fdNumber 同值双传) | +| `fdSubject` | 合同标题 | `contractName` | **必填** | fd 模板字段 | +| `CONTRACT_NAME` | 合同名称 | `contractName` | — | CONTRACT 模板字段 | +| `fdAmount` | 合同金额 | `contractAmount` | **必填** | 字符串传值(`toPlainString`) | +| `AMOUNT` | 合同金额 | `contractAmount` | — | CONTRACT 模板字段 | +| `fdCurrencyId` | 币种 | `settlementCurrency` 经 `currency-name-mapping` | — | 默认 RMB→人民币;映射未命中传原值并告警 | +| `CURRENCY` | 币种 | 同上 | — | CONTRACT 模板字段 | +| `fdSettlementType` | 合同结算类型 | `settlement-type-mapping[settlementMode]` | **必填** | 枚举:payment=付款 / payment_collection=收支双向 / collection=收款 / none=不结算;未配置映射则不传并告警(§9-U3 待联调) | +| `fdSepcailContract` | 特批流程 | 固定 `false` | — | 文档原文拼写笔误必须沿用(D15);开关 `contract.special-contract-enabled` 预留 | +| `CONTRACT_TYPE` | 合同类型 | `contractCategory` | — | | +| `PARTY_A` | 甲方名称 | `partyA` | — | TMS 存名称字符串 | +| `PARTY_B` | 乙方名称 | `partyB` | — | | +| `SIGN_DATE` | 签订日期 | `signDate` | **必填** | yyyy-MM-dd,fdType=timestamp | +| `fdEstimateStartTime` | 预计开始时间 | `startDate` | 期限为指定日期时必填 | fdType=timestamp | +| `fdEstimateEndTime` | 预计结束时间 | `endDate` | 期限为指定日期时必填 | fdType=timestamp | +| `fdStartTerm` | 合同开始期限 | 固定 `specifiedDate`(指定日期) | **必填** | 日期取 `startDate`;startDate 为空则传空 | +| `fdEndTerm` | 合同结束期限 | 固定 `specifiedDate`(指定日期) | **必填** | 日期取 `endDate`;endDate 为空则传空 | +| `CREATE_TIME` | 创建时间 | `createTime` | **必填** | yyyy-MM-dd,fdType=timestamp;CONTRACT 模板字段 | +| `fdCreateTime` | 创建时间 | `createTime` | **必填** | fd 模板字段(与 CREATE_TIME 同值双传) | +| `fd_syn_time` | 同步时间 | 推送时刻(`LocalDateTime.now()`) | **必填** | yyyy-MM-dd,fdType=timestamp | +| `CREATE_USER_NAME` | 承办人名称 | `handlerUserName` | **必填** | | +| `CONTRACT_STATUS` | 合同状态 | `status-mapping[approvalStatus]` | **必填**(v4) | draft/approving/approved 等;未配置映射则不传并告警(§9-U3) | +| `fdServings` | 合同份数 | `copyCount` | **必填** | 字符串传值 | +| `fdDesc` | 合同说明 | `remark` | 选填 | | + +**v4 选填字段暂不传(待联调)**:`fdCoTakers` 协办人、`fdUnderTaker`/`fdUnderTakerDept` 承办人及部门(组织架构对象传值待确认)、`fdRelations` 关联合同、`fdProject` 关联项目(可经立项 hcs_fd_id 关联,对象传值待确认)、`fdContractGwNature` 结算模式、`fdContractAttribute` 合同属性、`fdUrgencyLevel` 紧急程度。 + +--- + +## 五、fdFieldJson.signer 签署方(相对方) + +固定传两条:甲方(`fdStanding=甲`)、乙方(`fdStanding=乙`)。 + +| HCS 字段 | 说明 | TMS 取值 | HCS 必填 | 备注 | +| --- | --- | --- | --- | --- | +| `fdStanding` | 签署地位 | 固定 甲 / 乙 | — | | +| `fdName` | 相对方名称 | `partyA` / `partyB` | — | | +| `fdNumber` | 相对方编号 | 按名称反查 `CustomerArchive.customerCode`(全称或简称精确匹配) | — | 反查不到留空不阻断(§9-U6) | +| `fdType` | 单位类型(inner=内部单位) | 暂不传 | — | inner/外部判定规则待联调(§9-U6) | + +--- + +## 六、fdFieldJson.attachment 附件(C103-2 转传后挂载) + +| HCS 字段 | 说明 | TMS 取值 | HCS 必填 | 备注 | +| --- | --- | --- | --- | --- | +| 列表本体 | 附件数据 | C103-2 转传返回的合规附件ID列表 | **必填**(C103-1 时,无附件传空列表) | C103-11 更新传 null 不重复挂载 | +| `fdId` | 附件ID | C103-2 返回 | **必填** | | +| `fdBindType` | 操作类型 | 固定 `ADD`(新增) | **必填** | | + +附件来源:合同主文件 `contractFileJson`(仅 approved=true 的)+ 其它附件 `attachmentsJson`;操作人登录名同 `fdLoginName`;受开关 `attachment.transfer-enabled` 控制。 + +--- + +## 七、依赖配置项(`thirdParty.hcs.*`) + +| 配置 | 用途 | 缺失影响 | +| --- | --- | --- | +| `src-system` | 顶层 fdOuterSystem | 报文缺系统标识 | +| `push.immediate-enabled` | 审批通过即时推送开关(默认 false) | 关闭时仅走扫描兜底 | +| `push.max-retry` / `push.batch-size` | 扫描重试上限 / 批量大小 | — | +| `contract.template-mapping` | contractCategory → HCS 模板ID | **缺失直接推送失败** | +| `contract.settlement-type-mapping` | settlementMode → 结算类型枚举 | 未配置不传 fdSettlementType 并告警 | +| `contract.status-mapping` | approvalStatus → 合同状态 | 未配置不传 CONTRACT_STATUS 并告警 | +| `contract.currency-name-mapping` | 币种名称映射(默认 RMB→人民币) | 未命中传原值 | +| `contract.require-risk-check` | 推送前客商风险校验开关 | — | +| `risk.block-blacklist` | 黑名单阻断付款提交(付款链路);合同链路不再阻断推送,高风险/黑名单转自动特批(§九) | — | +| `attachment.transfer-enabled` | 附件转传开关 | 关闭时不挂附件 | +| `exe-stage.sync-enabled` | C103-9 履约规则同步开关(一期默认关) | — | + +--- + +## 八、TMS 侧留痕字段(`blade_contract_manage`) + +| 字段 | 含义 | +| --- | --- | +| `hcs_fd_id` | 合规合同ID(C103-1 返回的 fdContractId,判重命中也回填) | +| `hcs_sync_status` | unsynced / synced / failed | +| `hcs_retry_count` | 推送重试次数 | +| `hcs_sync_time` / `hcs_sync_msg` | 最近推送时间 / 结果描述 | +| `hcs_risk_level` / `hcs_black_status` / `hcs_risk_time` | 风险校验结果(甲乙双方取先查到的非空风险等级;任一方黑名单即为是) | +| `hcs_spec_status` / `hcs_spec_time` / `hcs_spec_msg` | 特批状态(none/need/processing/approved/rejected)及留痕 | +| `hcs_spec_fd_id` | 特批流程ID(C103-8 返回) | +| `hcs_spec_files_json` | 特批申请材料JSON(含 C103-2 合规附件ID) | +| `current_node` | 挂起展示节点:自动特批后置"特批审核",B103 通过恢复"审批通过",驳回置"已驳回" | + +风险校验明细另写 `blade_hcs_check_log`(甲方/乙方各一条,含 traceId)。 + +--- + +## 九、外部客商高风险/黑名单管控(2026-10-11 增补) + +**管控口径**:内部组织类型客商(`CustomerArchive.customerKind=internal`)默认无风险,不调 C101-1;外部客商(external,含档案不存在兜底按外部处理)命中 **高风险(fdRiskLevel=2)或黑名单(fdBlackStatus=yes)** 时进入管控。甲/乙任一方命中即整单管控。 + +### 9.1 签约前风险查询(展示用) + +`GET /hcs/risk?customerCode=` → `HcsCreditCheckSupport#queryCustomerRisk` → `CustomerRiskVO`: + +| 字段 | 说明 | +| --- | --- | +| `customerKind` | internal / external | +| `fdBlackStatus` / `fdRiskLevel` | C101-1 原值透传 | +| `risky` | 高风险/黑名单判定结果 | +| `riskTip` | 风险提示文案(前端展示在基本信息备注后) | + +提示文案固定模板:`【公司名称】:被列入外部黑名单;涉贪污受贿裁判相关提及方(3年以上及其他);被执行人信息;买卖合同纠纷;劳动纠纷;重大纠纷`(C101-1 未返回风险项明细,联调后如有明细字段再替换)。结果留痕 `blade_hcs_check_log`。 + +### 9.2 提交校验(特批说明附件必传) + +`ContractManageServiceImpl` 三个提交入口(`submit` / `toTemporary` / `submitFormal`)统一调 `validateSpecExplanationOnSubmit`: + +- 甲/乙方按名称反查客商编号(反查不到不阻断,与推送链路 skip 口径一致)→ 调 C101-1 实时查风险; +- 任一方高风险/黑名单 → `attachmentsJson` 必须存在 `attachmentType=spec_explanation` 的附件,否则抛"合同相对方存在高风险/黑名单客商,必须上传「特批说明」类型附件后再提交审批"。 +- **前端配合**:特批说明附件上传时元数据须带 `attachmentType: "spec_explanation"` 字段。 + +### 9.3 审批通过后自动特批链路 + +``` +TMS 审批通过(approved / change_approved) + → 即时推送 / 扫描兜底 → pushContract + → ① 风险校验留痕(risky 标志,不阻断) + → ④ C103-1 起草成功(hcs_sync_status=synced,回填 hcs_fd_id) + → ⑤ 置 hcs_spec_status=need + currentNode="特批审核"(TMS 流程挂起) + → 筛「特批说明」附件转传 C103-2 → 自动发起 C103-8 → hcs_spec_status=processing +``` + +- 原设计"黑名单挂起不推送、人工发起特批"存在死锁(挂起时无 `hcs_fd_id`,C103-8 报文必填合规合同ID 永远失败),本次变更为 **先 C103-1 起草、后 C103-8 特批**,特批通过即合规侧放行签约,无需恢复推送; +- 特批已通过(approved,单次有效)的合同推送/变更不重复发起特批; +- C103-8 发起失败保持 need 仅留痕,人工经 `/hcs/contract/spec-apply`(详情页"发起特批"按钮)重发。 + +### 9.4 特批结果联动(B103 回传 / 人工确认等效) + +| 特批结果 | 合同联动 | +| --- | --- | +| approved | `currentNode` 恢复"审批通过"(C103-1 已起草,hcs_sync_status 保持 synced,无需再推送) | +| rejected | `approvalStatus=rejected` + `currentNode="已驳回"`,走重新编辑 → 提交 → 审批 → 重新特批闭环(重新推送时 C103-11 更新后再次自动特批) | + +> 缺口:v4 无特批结果主动查询接口(§9-U1),结果依赖 B103 回调(`POST /hcs/callback/spec-result`)或页面人工确认(`POST /hcs/contract/spec/confirm`),合规方提供查询能力后可增轮询兜底。 From ebd215baf83486b1f333add1a8a029571337ef9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 11 Oct 2026 17:56:44 +0800 Subject: [PATCH 046/124] =?UTF-8?q?fix:=20HCS=E9=99=8D=E7=BA=A7=E8=BF=98?= =?UTF-8?q?=E5=8E=9F=E9=94=99=E8=AF=AF=E4=BD=93=E6=97=B6=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E9=9D=9EJSON=E5=93=8D=E5=BA=94=EF=BC=8C=E6=B6=88=E9=99=A4?= =?UTF-8?q?=E8=AF=AF=E5=AF=BC=E6=80=A7=E8=A7=A3=E6=9E=90=E5=A0=86=E6=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/springblade/hcs/feign/HcsClientFallbackFactory.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/HcsClientFallbackFactory.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/HcsClientFallbackFactory.java index a4da6201..76b817a2 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/HcsClientFallbackFactory.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/HcsClientFallbackFactory.java @@ -92,9 +92,12 @@ public class HcsClientFallbackFactory implements FallbackFactory { /** * 错误体反序列化为 HcsResult(非 JSON 或解析失败时返回 null) + *

    + * 网关层错误(如 404 页面)的响应体是纯文本/HTML 而非 JSON, + * 需先行排除,否则 JsonUtil.parse 内部会打印误导性的 ERROR 解析堆栈 */ private HcsResult parseRemoteResult(String body) { - if (StringUtil.isBlank(body)) { + if (StringUtil.isBlank(body) || !body.trim().startsWith("{")) { return null; } try { From 0985e4df336be387753edffa61ca69d15d93b3c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sun, 11 Oct 2026 18:08:27 +0800 Subject: [PATCH 047/124] =?UTF-8?q?fix:=20=E7=89=B9=E6=89=B9=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=E9=99=84=E4=BB=B6=E8=AF=86=E5=88=AB=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E7=BA=A6=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 附件类型字段由 attachmentType=spec_explanation 调整为前端附件元数据已有的 fileType=特批说明(业务字典 contract_attachment_type,中文匹配沿用 FILE_TYPE_SEAL_ARCHIVE 惯例),提交校验与自动特批筛选两处引用常量同步生效 --- .../springblade/transport/constant/HcsSyncConstant.java | 8 ++++---- .../transport/service/impl/ContractManageServiceImpl.java | 2 +- .../transport/support/hcs/HcsContractSyncSupport.java | 2 +- 3 files changed, 6 insertions(+), 6 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 b546a004..3533f1fb 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 @@ -161,14 +161,14 @@ public final class HcsSyncConstant { public static final String CUSTOMER_KIND_INTERNAL = "internal"; /** - * 合同附件类型字段名(前端约定:附件元数据 attachmentType) + * 合同附件类型字段名(与前端附件元数据 fileType 字段对齐,值取业务字典 contract_attachment_type) */ - public static final String ATTACHMENT_TYPE_FIELD = "attachmentType"; + public static final String ATTACHMENT_TYPE_FIELD = "fileType"; /** - * 附件类型:特批说明(高风险/黑名单客商合同必须上传) + * 附件类型:特批说明(高风险/黑名单客商合同必须上传;中文匹配沿用 FILE_TYPE_SEAL_ARCHIVE="双章归档文件" 惯例) */ - public static final String ATTACHMENT_TYPE_SPEC_EXPLANATION = "spec_explanation"; + public static final String ATTACHMENT_TYPE_SPEC_EXPLANATION = "特批说明"; /** * 特批审核挂起节点展示名(currentNode,特批发起后挂起展示,结果回传后恢复) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java index c3a51bb4..ec25728e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java @@ -1041,7 +1041,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl transferSpecExplanationAttachments(ContractManage contractManage) { From c98051465c5b5c1deaeba8f60d71afbd14a7e345 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 11:18:18 +0800 Subject: [PATCH 048/124] =?UTF-8?q?:feat:=20=E6=96=B0=E5=A2=9E=E5=90=88?= =?UTF-8?q?=E5=90=8C=E4=B8=8E=E4=BB=98=E6=AC=BE=E7=89=B9=E6=89=B9=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E5=9B=9E=E4=BC=A0=E6=8E=A5=E6=94=B6=E7=AB=AF=E7=82=B9?= =?UTF-8?q?=EF=BC=8C=E6=9B=BF=E4=BB=A3=E6=9C=AA=E5=BB=BA=E8=AE=BE=E7=9A=84?= =?UTF-8?q?B103=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/constant/HcsFieldConstant.java | 87 +------------ .../transport/constant/HcsSyncConstant.java | 12 +- .../controller/HcsSyncController.java | 32 +++-- .../hcs/HcsContractSpecSyncSupport.java | 122 ++++++------------ .../support/hcs/HcsContractSyncSupport.java | 6 +- .../support/hcs/HcsPaymentSyncSupport.java | 48 ++++++- .../hcs/dto/HcsLegalResultDTO.java | 65 ++++++++++ 7 files changed, 193 insertions(+), 179 deletions(-) create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsFieldConstant.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsFieldConstant.java index bfe5b372..749aed1c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsFieldConstant.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsFieldConstant.java @@ -29,7 +29,7 @@ package org.springblade.transport.constant; * HCS(合同合规系统)列表查询 / 回调字段名常量(TMS 业务侧) *

    * 与 {@link HcsContractFieldConstant}(C103-1/C103-11 表单字段)区分; - * 项目立项查询用下划线字段名,合同/开票查询与 B103 回调用驼峰字段名,以实际接口为准。 + * 项目立项查询用下划线字段名,合同/开票查询用驼峰字段名,以实际接口为准。 * * @author Chill */ @@ -111,91 +111,6 @@ public final class HcsFieldConstant { */ public static final String INVOICE_FD_STATUS = "fdStatus"; - // ==================== B103 特批结果回调候选字段(报文未定稿,多候选解析,§6-U1) ==================== - - /** - * 合同编号(驼峰) - */ - public static final String SPEC_CB_FD_CONTRACT_NO = "fdContractNo"; - - /** - * 合同编号 - */ - public static final String SPEC_CB_CONTRACT_NO = "contractNo"; - - /** - * 合同编号(下划线) - */ - public static final String SPEC_CB_FD_CONTRACT_NO_SNAKE = "fd_contract_no"; - - /** - * 合同编号(fd 模板字段,照 C103-3 查询惯例) - */ - public static final String SPEC_CB_FD_NUMBER = "fdNumber"; - - /** - * 单据ID(驼峰) - */ - public static final String SPEC_CB_FD_ID = "fdId"; - - /** - * 特批流程ID(驼峰) - */ - public static final String SPEC_CB_FD_SPEC_ID = "fdSpecId"; - - /** - * 特批流程ID(下划线) - */ - public static final String SPEC_CB_FD_SPEC_ID_SNAKE = "fd_spec_id"; - - /** - * 特批流程ID(specFdId) - */ - public static final String SPEC_CB_SPEC_FD_ID = "specFdId"; - - /** - * 审批结果 - */ - public static final String SPEC_CB_RESULT = "result"; - - /** - * 审批结果(驼峰) - */ - public static final String SPEC_CB_FD_RESULT = "fdResult"; - - /** - * 审批结果(下划线) - */ - public static final String SPEC_CB_FD_RESULT_SNAKE = "fd_result"; - - /** - * 审批结果(approvalResult) - */ - public static final String SPEC_CB_APPROVAL_RESULT = "approvalResult"; - - /** - * 状态(兜底候选) - */ - public static final String SPEC_CB_STATUS = "status"; - - /** - * 合同编号候选键(依次取首个非空) - */ - public static final String[] SPEC_CB_CONTRACT_NO_KEYS = {SPEC_CB_FD_CONTRACT_NO, SPEC_CB_CONTRACT_NO, - SPEC_CB_FD_CONTRACT_NO_SNAKE, SPEC_CB_FD_NUMBER}; - - /** - * 特批流程ID候选键(依次取首个非空) - */ - public static final String[] SPEC_CB_SPEC_FD_ID_KEYS = {SPEC_CB_FD_ID, SPEC_CB_FD_SPEC_ID, - SPEC_CB_FD_SPEC_ID_SNAKE, SPEC_CB_SPEC_FD_ID}; - - /** - * 审批结果候选键(依次取首个非空) - */ - public static final String[] SPEC_CB_RESULT_KEYS = {SPEC_CB_RESULT, SPEC_CB_FD_RESULT, - SPEC_CB_FD_RESULT_SNAKE, SPEC_CB_APPROVAL_RESULT, SPEC_CB_STATUS}; - private HcsFieldConstant() { } } 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 3533f1fb..7eed4fed 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 @@ -85,7 +85,7 @@ public final class HcsSyncConstant { public static final String CHECK_TYPE_CREDIT = "credit"; /** - * 校验类型:合同特批(C103-8 发起 / B103 结果回传留痕) + * 校验类型:合同特批(C103-8 发起 / 合规特批结果推送留痕) */ public static final String CHECK_TYPE_SPEC = "spec"; @@ -148,6 +148,16 @@ public final class HcsSyncConstant { */ public static final String SPEC_STATUS_REJECTED = "rejected"; + /** + * 合规侧特批结果回传状态:通过(contractLegal/paymentLegal result 接口 status,D15 回传机制) + */ + public static final String LEGAL_RESULT_APPROVED = "APPROVED"; + + /** + * 合规侧特批结果回传状态:驳回 + */ + public static final String LEGAL_RESULT_REJECTED = "REJECTED"; + // ==================== 客商风险(C101-1,外部客商高风险/黑名单管控) ==================== /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 63e1d77e..dd48c78c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -40,6 +40,7 @@ import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.dto.HcsAttachmentRefDTO; import org.springblade.hcs.dto.HcsCurrencyVO; +import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.hcs.dto.HcsTemplateVO; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.pojo.vo.CustomerRiskVO; @@ -246,7 +247,7 @@ public class HcsSyncController { } /** - * 合同特批结果人工确认(§6-U1 过渡方案:B103 报文未到位前与回调等效) + * 合同特批结果人工确认(§6-U1 过渡方案:与合规推送等效) */ @PostMapping("/contract/spec/confirm") @ApiOperationSupport(order = 14) @@ -257,16 +258,31 @@ public class HcsSyncController { } /** - * B103 特批结果回传接收(合规系统→TMS 回调,公开端点 + 原文留痕,前端接入设计 §3.4) + * 合同特批结果回传接收(合规系统 contractLegal/result 推送,替代未建设的 B103,公开端点 + 原文留痕) *

    - * TODO 待联调(§6-U1):B103 报文未定,当前按候选字段(contractNo/fdId/result 等)解析, - * 解析失败仅留痕不置状态,报文口径确认后完善解析。 + * iPaaS 网关注册映射:/gwzh/HTHG/contractLegal/result → /hcs/contractLegal/result; + * 报文 {sourceSystem, requestId=TMS合同ID, status=APPROVED/REJECTED, reason}, + * approved 恢复流程展示,rejected 联动合同审批驳回。 */ - @PostMapping("/callback/spec-result") + @PostMapping("/contractLegal/result") @PreAuth(AuthConstant.PERMIT_ALL) @ApiOperationSupport(order = 15) - @Operation(summary = "B103特批结果回传", description = "合规系统回调:合同特批结果回传接收,原文留痕并回写合同特批状态") - public R specResultCallback(@RequestBody(required = false) Map body) { - return R.data(hcsContractSpecSyncSupport.handleSpecCallback(body)); + @Operation(summary = "合同特批结果回传接收", description = "合规系统推送合同特批结果,按合同ID定位并联动特批状态,原文留痕") + public R contractLegalResult(@RequestBody(required = false) HcsLegalResultDTO param) { + return R.data(hcsContractSpecSyncSupport.handleLegalResult(param)); + } + + /** + * 付款特批结果回传接收(合规系统 paymentLegal/result 推送,公开端点) + *

    + * iPaaS 网关注册映射:/gwzh/HTHG/paymentLegal/result → /hcs/paymentLegal/result; + * 报文同合同接口(requestId=TMS付款申请ID),付款特批结果不联动付款审批状态(§4.4)。 + */ + @PostMapping("/paymentLegal/result") + @PreAuth(AuthConstant.PERMIT_ALL) + @ApiOperationSupport(order = 16) + @Operation(summary = "付款特批结果回传接收", description = "合规系统推送付款特批结果,按付款申请ID定位并回写特批状态") + public R paymentLegalResult(@RequestBody(required = false) HcsLegalResultDTO param) { + return R.data(hcsPaymentSyncSupport.handleLegalResult(param)); } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index 70bbad14..9c223755 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -26,19 +26,18 @@ package org.springblade.transport.support.hcs; import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.dto.HcsAttachmentRefDTO; +import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.hcs.dto.HcsMechanismsDTO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.dto.HcsSpecContractSaveDTO; import org.springblade.hcs.dto.HcsFormSaveVO; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; -import org.springblade.transport.constant.HcsFieldConstant; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.HcsContractCheckLogMapper; @@ -48,17 +47,17 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; -import java.util.Map; /** - * HCS 合同特批同步支撑组件(C103-8 发起特批 / B103 特批结果回传,前端接入设计 §3.4) + * HCS 合同特批同步支撑组件(C103-8 发起特批 / 合规特批结果推送接收,前端接入设计 §3.4) *

    * 业务闭环:合同推送时 C101-1 风险校验发现黑名单 → 置 hcs_spec_status=need 挂起(推送链路门禁跳过)→ * 内部特批审批通过后,前端上传特批材料(C103-2 取合规附件ID)并发起 C103-8 → 状态 processing(流程挂起)→ - * 集团审批结果经 B103 回传 TMS → approved 后既有扫描任务自动恢复 C103-1 推送,rejected 可重新发起。 + * 集团审批结果经合规 contractLegal/result 接口推送 TMS(替代未建设的 B103)→ + * approved 恢复流程,rejected 可重新发起。 *

    - * TODO 待联调确认(前端接入设计 §6-U1):C103-8 与 B103 报文 v4 均未提供, - * C103-8 按 C106-3 模式预估(双层嵌套返回),B103 回调按候选字段解析、原文留痕 blade_hcs_check_log。 + * TODO 待联调确认(前端接入设计 §6-U1):C103-8 报文 v4 未提供,按 C106-3 模式预估(双层嵌套返回); + * 结果推送报文 {sourceSystem, requestId=合同ID, status=APPROVED/REJECTED, reason},原文留痕 blade_hcs_check_log。 * * @author Chill */ @@ -73,7 +72,7 @@ public class HcsContractSpecSyncSupport { private static final String SPEC_ATTACH_ENTITY_KEY = "fd_spc_approval_attach"; /** - * B103 原文留痕最大长度(blade_hcs_check_log.msg 为 varchar(512)) + * 结果推送原文留痕最大长度(blade_hcs_check_log.msg 为 varchar(512)) */ private static final int CALLBACK_MSG_MAX_LENGTH = 500; @@ -130,7 +129,7 @@ public class HcsContractSpecSyncSupport { } /** - * 特批结果人工确认(§6-U1 过渡方案:B103 报文未到位前,页面确认与回调等效) + * 特批结果人工确认(§6-U1 过渡方案:页面确认与合规推送等效) * * @param id 合同ID * @param result approved/rejected @@ -157,36 +156,40 @@ public class HcsContractSpecSyncSupport { } /** - * B103 特批结果回传处理(回调端点入口):候选字段解析 + 原文留痕, - * approved 恢复合同"审批通过"展示(C103-1 已起草完成,无需恢复推送);rejected 联动合同审批驳回 + * 合同特批结果接收处理(合规 contractLegal/result 推送,替代未建设的 B103,D15 回传机制): + * requestId=TMS 合同ID、status=APPROVED/REJECTED, + * approved 恢复合同"审批通过"展示;rejected 联动合同审批驳回;原文全量留痕 * - * @param body B103 回调报文(结构待联调,原文全量留痕) + * @param param 合规推送报文 * @return 处理结果描述 */ - public String handleSpecCallback(Map body) { - String raw = body == null ? "" : JSONUtil.toJsonStr(body); - String contractNo = firstNonBlank(body, HcsFieldConstant.SPEC_CB_CONTRACT_NO_KEYS); - String specFdId = firstNonBlank(body, HcsFieldConstant.SPEC_CB_SPEC_FD_ID_KEYS); - String resultText = firstNonBlank(body, HcsFieldConstant.SPEC_CB_RESULT_KEYS); - ContractManage contractManage = locateContract(contractNo, specFdId); + public String handleLegalResult(HcsLegalResultDTO param) { + String raw = param == null ? "" : JSONUtil.toJsonStr(param); + String requestId = param == null ? null : param.getRequestId(); + ContractManage contractManage = locateContract(requestId); if (contractManage == null) { - log.warn("B103特批结果回传未定位到合同:contractNo={},specFdId={},报文已留痕", contractNo, specFdId); - writeCallbackLog(null, HcsSyncConstant.CHECK_RESULT_SKIP, "B103 回传未定位到合同:" + raw); - return "已留痕:未定位到合同(contractNo=" + contractNo + ")"; + log.warn("合同特批结果推送未定位到合同:requestId={},报文已留痕", requestId); + writeCallbackLog(null, HcsSyncConstant.CHECK_RESULT_SKIP, "合同特批结果推送未定位到合同:" + raw); + return "已留痕:未定位到合同(requestId=" + requestId + ")"; } - Boolean approved = parseSpecResult(resultText); - if (approved == null) { - log.warn("B103特批结果字段未识别:contractNo={},resultText={},报文已留痕", contractManage.getContractNo(), resultText); - writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, "B103 回传结果字段未识别:" + raw); - return "已留痕:结果字段未识别(contractNo=" + contractManage.getContractNo() + ")"; + String normalizedStatus = param.getStatus() == null ? "" : param.getStatus().trim(); + boolean approved; + if (HcsSyncConstant.LEGAL_RESULT_APPROVED.equalsIgnoreCase(normalizedStatus)) { + approved = true; + } else if (HcsSyncConstant.LEGAL_RESULT_REJECTED.equalsIgnoreCase(normalizedStatus)) { + approved = false; + } else { + log.warn("合同特批结果状态未识别:contractNo={},status={},报文已留痕", contractManage.getContractNo(), param.getStatus()); + writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, "合同特批结果推送状态未识别:" + raw); + return "已留痕:状态字段未识别(contractNo=" + contractManage.getContractNo() + ")"; } String status = approved ? HcsSyncConstant.SPEC_STATUS_APPROVED : HcsSyncConstant.SPEC_STATUS_REJECTED; - // 特批结果联动合同审批状态(通过恢复展示,驳回联动审批驳回),随 markSpec 一并落库 + // 特批结果联动合同审批状态(通过恢复展示,驳回联动审批驳回),随 markSpec 一并落库(reason 随原文留痕) syncContractOnSpecResult(contractManage, approved); - markSpec(contractManage, status, "B103 特批结果回传:" + raw); + markSpec(contractManage, status, "合同特批结果推送:" + raw); writeCallbackLog(contractManage, approved ? HcsSyncConstant.CHECK_RESULT_PASS : HcsSyncConstant.CHECK_RESULT_FAIL, - "B103 特批结果回传:" + raw); - log.info("B103特批结果回传处理完成:contractNo={},结果={}", contractManage.getContractNo(), status); + "合同特批结果推送:" + raw); + log.info("合同特批结果推送处理完成:contractNo={},结果={},reason={}", contractManage.getContractNo(), status, param.getReason()); return "特批结果已处理:" + status; } @@ -250,62 +253,21 @@ public class HcsContractSpecSyncSupport { } /** - * 按合同编号/特批流程ID 定位合同(B103 报文候选键) + * 按 TMS 合同ID 定位合同(合规推送 requestId) */ - private ContractManage locateContract(String contractNo, String specFdId) { - if (StringUtil.isNotBlank(contractNo)) { - ContractManage contractManage = contractManageMapper.selectOne(Wrappers.lambdaQuery() - .eq(ContractManage::getContractNo, contractNo) - .eq(ContractManage::getIsDeleted, 0) - .last("limit 1")); - if (contractManage != null) { - return contractManage; - } - } - if (StringUtil.isNotBlank(specFdId)) { - return contractManageMapper.selectOne(Wrappers.lambdaQuery() - .eq(ContractManage::getHcsSpecFdId, specFdId) - .eq(ContractManage::getIsDeleted, 0) - .last("limit 1")); - } - return null; - } - - /** - * 解析特批结果文本:approved/通过/pass/true → true;rejected/驳回/refuse/false → false;未识别 → null - */ - private Boolean parseSpecResult(String resultText) { - if (StringUtil.isBlank(resultText)) { + private ContractManage locateContract(String requestId) { + if (StringUtil.isBlank(requestId)) { return null; } - String text = resultText.trim().toLowerCase(); - if (List.of("approved", "pass", "true", "通过", "审批通过", "同意").contains(text)) { - return Boolean.TRUE; - } - if (List.of("rejected", "refuse", "refused", "false", "驳回", "不通过", "不同意").contains(text)) { - return Boolean.FALSE; - } - return null; - } - - /** - * 从候选字段名依次取首个非空字符串值 - */ - private String firstNonBlank(Map body, String... keys) { - if (body == null) { + try { + return contractManageMapper.selectById(Long.valueOf(requestId.trim())); + } catch (NumberFormatException exception) { return null; } - for (String key : keys) { - Object value = body.get(key); - if (value != null && StringUtil.isNotBlank(String.valueOf(value))) { - return String.valueOf(value); - } - } - return null; } /** - * 特批结果联动合同审批状态(confirmSpecResult 与 handleSpecCallback 共用,仅改字段,随 markSpec 落库): + * 特批结果联动合同审批状态(handleLegalResult 与 confirmSpecResult 共用,仅改字段,随 markSpec 落库): * approved 恢复"审批通过"展示(C103-1 已起草完成,hcs_sync_status 保持 synced,无需再推送); * rejected 联动合同审批驳回(approvalStatus=rejected),走重新编辑→提交→审批→特批闭环 */ @@ -350,7 +312,7 @@ public class HcsContractSpecSyncSupport { } /** - * B103 回传留痕(合同未定位到时 bizId 为空,原文留痕便于联调解析) + * 结果推送留痕(合同未定位到时 bizId 为空,原文留痕便于联调解析) */ private void writeCallbackLog(ContractManage contractManage, String result, String msg) { if (contractManage == null) { @@ -363,7 +325,7 @@ public class HcsContractSpecSyncSupport { checkLog.setCreateTime(LocalDateTime.now()); hcsContractCheckLogMapper.insert(checkLog); } catch (Exception exception) { - log.error("B103回传留痕写入失败", exception); + log.error("合同特批结果推送留痕写入失败", exception); } return; } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 72c935b0..375ecb7b 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -74,7 +74,7 @@ import java.util.Objects; * 扫描任务按序执行:⓪ 特批挂起门禁 → ① 客商风险校验(可配开关,仅留痕,高风险不再阻断)→ * ② 附件转传(v4 挂载点 fdFieldJson.attachment,随 C103-1 挂载)→ ③ C103-3 判重(§9-U4 查询能力联调确认)→ * ④ C103-1 起草 / 变更单 C103-11 更新(§9-U5 定位方式待联调)→ ⑤ 高风险/黑名单自动特批 C103-8(外部客商管控, - * {@link HcsContractSpecSyncSupport},挂起"特批审核"待 B103 回传)→ ⑥ 履约规则 C103-9 行级同步({@link HcsExeStageSyncSupport})。 + * {@link HcsContractSpecSyncSupport},挂起"特批审核"待合规推送结果)→ ⑥ 履约规则 C103-9 行级同步({@link HcsExeStageSyncSupport})。 * 结果留痕:风险校验写 blade_hcs_check_log 与合同 hcs_risk_* 字段;推送结果回填 hcs_fd_id/hcs_sync_status。 * * @author Chill @@ -114,7 +114,7 @@ public class HcsContractSyncSupport { log.info("HCS合同推送开始:contractNo={},approvalStatus={},首推={},hcsSpecStatus={}", contractManage.getContractNo(), contractManage.getApprovalStatus(), StringUtil.isBlank(contractManage.getHcsFdId()), contractManage.getHcsSpecStatus()); - // ⓪ 特批挂起门禁:待特批/特批中的合同跳过推送,等待 B103 特批结果回传后恢复(C103-8,前端接入设计 §3.4) + // ⓪ 特批挂起门禁:待特批/特批中的合同跳过推送,等待合规推送特批结果后恢复(C103-8,前端接入设计 §3.4) if (List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(contractManage.getHcsSpecStatus())) { log.info("HCS合同推送跳过(特批挂起中):contractNo={},hcsSpecStatus={}", contractManage.getContractNo(), contractManage.getHcsSpecStatus()); return "合同特批挂起中(" + contractManage.getHcsSpecStatus() + "),跳过推送"; @@ -184,7 +184,7 @@ public class HcsContractSyncSupport { /** * 高风险/黑名单客商合同自动特批(C103-8,外部客商管控):C103-1 起草成功后置待特批并自动发起, - * TMS 流程挂起展示"特批审核"(currentNode),B103 特批结果回传后恢复或驳回; + * TMS 流程挂起展示"特批审核"(currentNode),合规推送特批结果(contractLegal/result)后恢复或驳回; * 特批已通过(单次有效)的合同不重复发起;发起失败保持待特批仅留痕,可人工重发或重新推送兜底 */ private void autoApplySpecIfNeeded(ContractManage contractManage) { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java index dab33eb7..239b56da 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java @@ -30,6 +30,7 @@ import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.pojo.entity.PaymentApplication; @@ -39,7 +40,7 @@ import java.time.LocalDateTime; import java.util.List; /** - * HCS 付款链推送编排支撑组件(结算付款特批 C106-3/4 + 履约记录 C108-1/2,设计文档 §5.0/§5.5/§5.6) + * HCS 付款链推送编排支撑组件(结算付款特批 C106-3/4 + 履约记录 C108-1/2 + 特批结果推送接收,设计文档 §5.0/§5.5/§5.6) *

    * 编排顺序:特批(额度超额标记 need 时发起)→ 履约记录(审批通过新建 / 实际付款推进更新)。 * 特批流程ID 与履约记录ID 在各自 Support 内即时持久化;整体同步状态(hcs_sync_status)由本组件统一回写。 @@ -136,6 +137,51 @@ public class HcsPaymentSyncSupport { return "特批结果已确认:" + result; } + /** + * 付款特批结果接收处理(合规 paymentLegal/result 推送,替代未建设的 B103,D15 回传机制): + * requestId=TMS 付款申请ID、status=APPROVED/REJECTED; + * 付款特批结果不联动付款审批状态(§4.4),仅回写 hcs_spec_status + * + * @param param 合规推送报文 + * @return 处理结果描述 + */ + public String handleLegalResult(HcsLegalResultDTO param) { + String requestId = param == null ? null : param.getRequestId(); + PaymentApplication payment = locatePayment(requestId); + if (payment == null) { + log.warn("付款特批结果推送未定位到付款申请:requestId={},reason={}", requestId, param == null ? null : param.getReason()); + return "未定位到付款申请(requestId=" + requestId + ")"; + } + String normalizedStatus = param.getStatus() == null ? "" : param.getStatus().trim(); + String status; + if (HcsSyncConstant.LEGAL_RESULT_APPROVED.equalsIgnoreCase(normalizedStatus)) { + status = HcsSyncConstant.SPEC_STATUS_APPROVED; + } else if (HcsSyncConstant.LEGAL_RESULT_REJECTED.equalsIgnoreCase(normalizedStatus)) { + status = HcsSyncConstant.SPEC_STATUS_REJECTED; + } else { + log.warn("付款特批结果状态未识别:paymentNo={},status={},reason={}", payment.getPaymentNo(), param.getStatus(), param.getReason()); + return "状态字段未识别(paymentNo=" + payment.getPaymentNo() + ")"; + } + payment.setHcsSpecStatus(status); + paymentApplicationMapper.updateById(payment); + log.info("付款特批结果推送处理完成:paymentNo={},结果={},reason={}", payment.getPaymentNo(), status, param.getReason()); + return "特批结果已处理:" + status; + } + + /** + * 按 TMS 付款申请ID 定位付款申请(合规推送 requestId) + */ + private PaymentApplication locatePayment(String requestId) { + if (StringUtil.isBlank(requestId)) { + return null; + } + try { + return paymentApplicationMapper.selectById(Long.valueOf(requestId.trim())); + } catch (NumberFormatException exception) { + return null; + } + } + /** * 回填整体同步状态置 synced */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java new file mode 100644 index 00000000..eb0604a2 --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java @@ -0,0 +1,65 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 合同合规系统(HCS)特批结果回传报文 + *

    + * 合规系统审批完成后经 iPaaS 网关推送 TMS:合同走 /hcs/contractLegal/result, + * 付款走 /hcs/paymentLegal/result,通过 status=APPROVED、驳回 status=REJECTED,报文两接口共用。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsLegalResultDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 来源系统标识(约定 WLTMS,配置 thirdParty.hcs.src-system) + */ + private String sourceSystem; + /** + * 业务单据ID(合同特批=TMS 合同ID,付款特批=TMS 付款申请ID) + */ + private String requestId; + /** + * 审批结果:APPROVED 通过 / REJECTED 驳回 + */ + private String status; + /** + * 结果说明(驳回原因等,非必传) + */ + private String reason; +} From 6f774d50c7cfd211ad672d1c78df155252e82e9b 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 11:18:35 +0800 Subject: [PATCH 049/124] =?UTF-8?q?:docs:=20=E6=9B=B4=E6=96=B0HCS=E7=89=B9?= =?UTF-8?q?=E6=89=B9=E7=BB=93=E6=9E=9C=E5=9B=9E=E4=BC=A0=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...026-09-27-桂物合同合规系统HCS接入技术设计.md | 6 +- .../2026-09-28-HCS接入实施状态与确认清单.md | 4 +- .../2026-10-09-项目立项与合同HCS前端接入设计.md | 26 +- .../hcs合同/2026-10-11-hcs合同推送流程梳理.md | 19 +- ...2026-10-12-合同特批与结算付款特批流程梳理.md | 272 ++++++++++++++++++ 5 files changed, 305 insertions(+), 22 deletions(-) create mode 100644 doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md diff --git a/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md index db524d0b..dde633b5 100644 --- a/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md +++ b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md @@ -27,7 +27,7 @@ | D12 | 开票登记时机 | 审批通过即推 C111-2(票据日期空);金蝶开票完成后 C111-3 回填 | | D13 | 收票合同关联 | 应付结算链路自动回溯;回溯不到收票表单加合同字段人工补录 | | D14 | 来源标识 | `fd_sources="WLTMS"`(Nacos `src-system` 可配);`fd_kingdee_id`=TMS 业务单据主键 | -| D15 | 特批载体 | 付款申请表加 `hcs_credit_*`/`hcs_spec_*` 字段组;C106-1 提交时同步;超额转 C106-3;**特批结果回传方式未决**(过渡:页面人工确认);合同 `fdSepcailContract` 一期固定 false | +| D15 | 特批载体 | 付款申请表加 `hcs_credit_*`/`hcs_spec_*` 字段组;C106-1 提交时同步;超额转 C106-3;~~特批结果回传方式未决~~ **已决(2026-10-12):合规经 contractLegal/paymentLegal result 接口推送 TMS**;合同 `fdSepcailContract` 一期固定 false | --- @@ -306,7 +306,7 @@ flowchart LR `mechanisms.attachment`:`attachmentsJson` 经 C103-2 转传,特批附件 `fdEntityKey=fd_spc_approval_attach` 且带 `fdBindType=ADD`。更新(C106-4):单据变更且特批流程存在时调用,顶层 `fdId=hcs_spec_fd_id`,附件不带 fdBindType。 -**特批结果**:v4 无结果查询/回调接口 → `approved/rejected` 一期由页面人工确认(未决 §9-U1)。 +**特批结果**:v4 无结果查询/回调接口 → 一期由页面人工确认;**2026-10-12 已决**:合规审批完成后经 `POST /hcs/paymentLegal/result` 主动推送 TMS(`requestId`=付款申请ID,`status=APPROVED/REJECTED`),人工确认保留等效兜底(§9-U1 闭环)。 ### 5.6 履约记录(C108-1/2 ← PaymentApplication,D11) @@ -415,7 +415,7 @@ thirdParty: | # | 事项 | 影响 | |---|---|---| -| U1 | **特批流程结果回传方式**:v4 无查询/回调接口 | 特批 approved/rejected 一期人工确认 | +| U1 | **特批流程结果回传方式**:v4 无查询/回调接口 → **已决(2026-10-12)**:合规经 `contractLegal/result`(合同)/`paymentLegal/result`(付款)主动推送 TMS | 推送接收端点已实现(PERMIT_ALL);人工确认保留等效兜底 | | U2 | 组织/人员引用体系:HCS `{fdId,fdName}` 的 fdId 与 TMS 部门ID 不同源;登录名是否同源(见原文登录名截图) | 立项/合同操作人字段解析方式 | | U3 | 字典值映射:fd_settlement_type、fd_invoice_type、付款用途/性质/类型、CONTRACT_STATUS 是否必传 | 各映射配置 | | U4 | C103-3/C102-3/C111-1 conditions 是否支持 fdNumber/fd_num/fdKingdeeId 精确查询;HCS 是否按 fd_kingdee_id 幂等 | 判重与防重方案 | diff --git a/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md b/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md index ed57b841..31285bef 100644 --- a/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md +++ b/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md @@ -62,6 +62,8 @@ | `POST /hcs/sync/{bizType}/{id}` | 单条重推(bizType:project / contract / payment / invoice-application / invoice-receipt),重置 unsynced+清零计数后立即推送 | | `POST /hcs/sync/{bizType}` | 批量推送一轮(复用扫描逻辑) | | `POST /hcs/spec-pay/confirm?id=&result=approved|rejected` | 特批结果人工确认(仅 processing 可确认) | +| `POST /hcs/contractLegal/result` | 合同特批结果回传接收(合规推送,PERMIT_ALL,2026-10-12 替代 B103) | +| `POST /hcs/paymentLegal/result` | 付款特批结果回传接收(合规推送,PERMIT_ALL) | | `POST /hcs/master-data/refresh` | 刷新主数据缓存并校验模板映射 | | `GET /hcs/recon/project?projectCode=` | 项目立项对账(C102-3) | | `GET /hcs/recon/contract?contractNo=` | 合同对账(C103-3) | @@ -126,7 +128,7 @@ | # | 事项 | 当前代码/配置占位 | |---|---|---| -| U1 | 特批流程结果回传方式 | 人工确认端点 `POST /hcs/spec-pay/confirm`(过渡方案);若有回调/查询接口需改造 | +| U1 | ~~特批流程结果回传方式~~ **已决(2026-10-12)**:合规经 `POST /hcs/contractLegal/result`、`POST /hcs/paymentLegal/result` 主动推送结果(报文 `{sourceSystem, requestId, status=APPROVED/REJECTED, reason}`) | 人工确认端点保留作等效兜底;原 B103 推测性回调端点 `/hcs/callback/spec-result` 已删除 | | U2 | 组织/人员 fdId 体系与登录名同源性 | 引用一律先传名称或登录名(经办人/创建人经 UserCache 解析 account) | | U3 | 字典值映射:fd_settlement_type、fd_invoice_type、付款用途/性质/类型、CONTRACT_STATUS 是否必传、fdBlackStatus 取值(示例 no) | Nacos 各 mapping 空占位;未配置时该字段不传并 warn(黑名单判定按 "yes" 等值,联调校准);CONTRACT_STATUS 一期不传 | | U4 | 判重 conditions 是否支持 fd_num/fdNumber 精确查询;HCS 是否按 fd_kingdee_id 幂等 | 按文档 conditions 精确匹配实现,联调验证;判重查询 C102-3 额外携带 curUser(文档示例如此) | diff --git a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md index f166d009..b23a0d7a 100644 --- a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md +++ b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md @@ -35,7 +35,7 @@ | C103-3 合同列表查询 | `GET /hcs/recon/contract` 已有 | 已有 | 合同列表"合规对账"弹窗 | | C103-4 合同详情查询 | `GET /hcs/recon/contract/detail` 已有 | 已有 | 对账弹窗"查看合规详情" | | C103-5 合同附件下载 | 仅 Feign 端点 | **`GET /hcs/attachment/download`(新增)** | 对账弹窗/合同详情中下载 HCS 侧附件 | -| C103-8 合同发起特批 | **本期正式接入**(业务闭环见集成流程梳理:高风险客商签约必走;B103 结果回传) | **`POST /hcs/contract/spec-apply`(新增)+ `POST /hcs/callback/spec-result`(B103 接收,新增)** | 合同详情"发起特批"、特批状态展示、回传后自动恢复推送 | +| C103-8 合同发起特批 | **本期正式接入**(业务闭环见集成流程梳理:高风险客商签约必走;结果经 contractLegal/result 推送,2026-10-12 替代 B103) | **`POST /hcs/contract/spec-apply`(新增)+ `POST /hcs/contractLegal/result`(结果推送接收,新增)** | 合同详情"发起特批"、特批状态展示、结果推送后自动恢复展示 | --- @@ -77,7 +77,7 @@ GET /hcs/risk?customerCode=... > 前端仅用于**展示与提示**,不作为安全边界:强制校验仍在合同推送链路(`risk.block-blacklist`)与付款提交事务内。 -### 3.4 合同发起特批(C103-8)+ 结果回传(B103)——本期正式接入 +### 3.4 合同发起特批(C103-8)+ 结果推送接收(contractLegal/result)——本期正式接入 **业务闭环**(依据《TMS业财融合-集成流程图文字版与业务流程梳理.md》§3.3/§8): @@ -88,8 +88,8 @@ GET /hcs/risk?customerCode=... → TMS 内部特批审批(按原审批流) → 前端补特批申请材料 + 内部审批流程附件 → C103-8 发起特批(hcs_spec_status=processing) → 合同系统集团审批(流程在合同系统预配置) - → B103 特批结果回传 TMS(hcs_spec_status=approved/rejected) - → approved → 自动恢复 C103-1 推送 → 完成签订;rejected → 前端提示,重新发起 + → 合规推送特批结果 TMS:POST /hcs/contractLegal/result(hcs_spec_status=approved/rejected) + → approved → 恢复"审批通过"展示(C103-1 已起草,无需再推送)→ 完成签订;rejected → 前端提示,重新发起 ``` **数据模型**:`blade_contract_manage` 追加特批字段组(照付款申请 `hcs_spec_*` 惯例),SQL 落 `doc/sql/transport/`: @@ -112,12 +112,12 @@ POST /hcs/contract/spec-apply (body:{ contractId, attachments: [{fdId, → 返回 data.fdId → hcs_spec_fd_id,状态置 processing;失败置 need 并记 hcs_spec_msg → C103-8 v4 未含报文,联调前按上述预估实现并加 TODO 标注(§7-U1) -POST /hcs/callback/spec-result (B103 合规→TMS 回调接收端点) - 公开端点(@PreAuth(AuthConstant.PERMIT_ALL) + 报文验签字段待合规方口径,先记录原文留痕) - body:{ 合同标识/特批流程fdId, 审批结果, 审批意见 } ← 字段名待 B103 报文(§7-U1) - 处理:定位合同 → 回写 hcs_spec_status=approved/rejected + hcs_spec_msg - → approved 时把合同 hcs_sync_status 重置 unsynced,由既有扫描任务自动走 C103-1(零新增链路) - → B103 报文未到位前端点先落库留痕不置状态,联调时接线 +POST /hcs/contractLegal/result (合规系统推送特批结果,2026-10-12 替代未建设的 B103) + 公开端点(@PreAuth(AuthConstant.PERMIT_ALL)),iPaaS 网关注册映射 /gwzh/HTHG/contractLegal/result → 本端点 + body(HcsLegalResultDTO):{ sourceSystem="WLTMS", requestId=TMS合同ID, status=APPROVED|REJECTED, reason } + 处理:按 requestId 定位合同 → status 大小写不敏感识别 → 回写 hcs_spec_status + 原文(含 reason)留痕 blade_hcs_check_log + → approved 恢复 currentNode="审批通过"(C103-1 已起草,无需再推送);rejected 联动审批驳回,reason 随原文见 hcs_spec_msg + → 未定位到合同/状态未识别仅留痕返回,不报错 ``` **状态展示与操作权限**: @@ -230,7 +230,7 @@ export const applyContractSpec = data => - **入口**:合同详情页【发起特批】按钮,仅 `hcsSpecStatus ∈ {need, rejected}` 时可用;权限码 `hcs_spec_apply`。 - **交互**:弹窗选择/确认特批申请材料(先经 §4.5 `uploadAttachment` 取 fdId,弹窗内表格展示已传材料,含内部审批流程附件)→ 确认调 `applyContractSpec({ contractId, attachments })` → 成功后详情刷新为"特批中"。 - **状态展示**:合同列表与详情按 §3.4 状态表展示特批标签(need/processing/approved/rejected);`need` 时列表"推送合规"按钮禁用并 tooltip 提示。 -- **结果回传**:B103 回调由后端接收并自动恢复推送,前端无需轮询;详情页打开时实时拉取最新状态即可,`rejected` 时展示 `hcsSpecMsg` 驳回原因。 +- **结果推送**:合规推送(`/hcs/contractLegal/result`)由后端接收并自动联动状态,前端无需轮询;详情页打开时实时拉取最新状态即可,`rejected` 时展示 `hcsSpecMsg` 驳回原因。 --- @@ -241,7 +241,7 @@ export const applyContractSpec = data => | F1 基础 | `GET /hcs/master-data/template` + `@PreAuth`/菜单 SQL | `api/business/hcs.js`;管理端主数据页 | 无 | | F2 状态与推送 | 无(端点已有) | 两列表页:状态列/筛选 + 推送合规按钮 | F1(hcs.js) | | F3 对账与附件 | `/hcs/risk`、`/hcs/attachment/upload`、`/hcs/attachment/download` | 对账弹窗 + 合规附件下载 + 手动转传 + 附件行 `hcsFdId` | F2 | -| F4 特批 | 合同特批字段组 SQL;`POST /hcs/contract/spec-apply` + `POST /hcs/callback/spec-result`(B103);合同推送链路加 need 挂起判断 | 发起特批弹窗 + 特批状态标签 + 按钮联动 | C103-8/B103 报文(§7-U1,可先按预估模式实现联调替换) | +| F4 特批 | 合同特批字段组 SQL;`POST /hcs/contract/spec-apply` + `POST /hcs/contractLegal/result`(合规结果推送接收,2026-10-12 替代 B103);合同推送链路加 need 挂起判断 | 发起特批弹窗 + 特批状态标签 + 按钮联动 | C103-8 报文(§7-U1,可先按预估模式实现联调替换);结果推送报文已定(requestId/status/reason) | | F5 即时推送(2026-10-10 增补,纯后端) | `HcsImmediatePushSupport` + 4 处审批入口触发(§6.3)+ 开关配置 | 无 | 无(复用既有 Support,扫描兜底保留) | --- @@ -305,6 +305,6 @@ public void pushContractAfterCommit(Long id) // 合同 C103 | # | 事项 | 影响 | 当前处理 | |---|---|---|---| -| U1 | **C103-8 / B103 报文 v4 未提供**(业务闭环已在集成流程梳理中明确) | 特批发起与结果回传的报文字段 | 按 C106-3 模式预估实现 + 回调端点先落库留痕;联调拿到报文后替换(代码已留 TODO) | +| U1 | ~~C103-8 / B103 报文 v4 未提供~~ → **C103-8 报文仍待联调;结果回传已决(2026-10-12)**:B103 不建设,合规经 `contractLegal/result`/`paymentLegal/result` 推送结果(报文已定) | C103-8 发起报文字段 | 发起仍按 C106-3 模式预估(代码留 TODO);结果接收已按定稿报文实现(`HcsLegalResultDTO`) | | U2 | **C103-5 返回流是否带文件名**(v4 仅写"文件流") | 下载文件命名 | 后端以附件元数据/`fdId` 兜底命名,联调校准 | | U3 | 合规状态列/菜单权限是否需要按租户差异化 | 菜单 SQL | 先按统一菜单落地 | diff --git a/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md b/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md index c7cc11db..59c361d1 100644 --- a/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md +++ b/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md @@ -1,7 +1,7 @@ # 新建合同推送 HCS(合同合规系统)流程梳理 > 依据代码现状整理,核心类:`HcsContractSyncSupport`(blade-service/blade-transport/.../support/hcs)。 -> 对接接口:C101-1 风险校验、C103-2 附件上传、C103-3 合同判重、C103-1 合同发起、C103-11 合同更新、C103-8 特批、C103-9 履约规则。 +> 对接接口:C101-1 风险校验、C103-2 附件上传、C103-3 合同判重、C103-1 合同发起、C103-11 合同更新、C103-8 特批、C103-9 履约规则;特批结果接收 `/hcs/contractLegal/result`(合规推送,替代未建设的 B103,见 §9.4)。 > "必填" 标注来源:代码注释中标注的 v4 接口文档要求(HCS 侧),以及 TMS 推送前强校验(缺失直接失败)。 --- @@ -155,7 +155,7 @@ | `hcs_spec_status` / `hcs_spec_time` / `hcs_spec_msg` | 特批状态(none/need/processing/approved/rejected)及留痕 | | `hcs_spec_fd_id` | 特批流程ID(C103-8 返回) | | `hcs_spec_files_json` | 特批申请材料JSON(含 C103-2 合规附件ID) | -| `current_node` | 挂起展示节点:自动特批后置"特批审核",B103 通过恢复"审批通过",驳回置"已驳回" | +| `current_node` | 挂起展示节点:自动特批后置"特批审核",合规推送特批通过恢复"审批通过",驳回置"已驳回" | 风险校验明细另写 `blade_hcs_check_log`(甲方/乙方各一条,含 traceId)。 @@ -201,11 +201,20 @@ TMS 审批通过(approved / change_approved) - 特批已通过(approved,单次有效)的合同推送/变更不重复发起特批; - C103-8 发起失败保持 need 仅留痕,人工经 `/hcs/contract/spec-apply`(详情页"发起特批"按钮)重发。 -### 9.4 特批结果联动(B103 回传 / 人工确认等效) +### 9.4 特批结果联动(合规推送 contractLegal/result / 人工确认等效) + +**结果接收机制(2026-10-12 变更)**:原计划的 B103 推送合规方未建设,改为合规系统审批完成后经 iPaaS 网关调用 TMS 接收回传结果: + +| 接口 | 定位方式 | 处理 | +| --- | --- | --- | +| `POST /hcs/contractLegal/result`(公开端点,网关注册映射 `/gwzh/HTHG/contractLegal/result`) | `requestId` = TMS 合同ID | 合同特批结果联动 | +| `POST /hcs/paymentLegal/result`(公开端点,网关注册映射 `/gwzh/HTHG/paymentLegal/result`) | `requestId` = TMS 付款申请ID | 付款特批回写 `hcs_spec_status`(不联动付款审批状态) | + +报文两接口共用(`HcsLegalResultDTO`):`{sourceSystem, requestId, status, reason}`;`status=APPROVED`(通过)/ `REJECTED`(驳回,reason 为驳回原因如"特批说明材料不完整,请补充"),大小写不敏感识别,其他值仅留痕不落状态。报文原文(含 reason)全量留痕 `blade_hcs_check_log`;未定位到单据或状态未识别时仅留痕返回,不报错。 | 特批结果 | 合同联动 | | --- | --- | | approved | `currentNode` 恢复"审批通过"(C103-1 已起草,hcs_sync_status 保持 synced,无需再推送) | -| rejected | `approvalStatus=rejected` + `currentNode="已驳回"`,走重新编辑 → 提交 → 审批 → 重新特批闭环(重新推送时 C103-11 更新后再次自动特批) | +| rejected | `approvalStatus=rejected` + `currentNode="已驳回"`,走重新编辑 → 提交 → 审批 → 重新特批闭环(重新推送时 C103-11 更新后再次自动特批),reason 随原文见 `hcs_spec_msg` | -> 缺口:v4 无特批结果主动查询接口(§9-U1),结果依赖 B103 回调(`POST /hcs/callback/spec-result`)或页面人工确认(`POST /hcs/contract/spec/confirm`),合规方提供查询能力后可增轮询兜底。 +> 等效兜底:页面人工确认(`POST /hcs/contract/spec/confirm`,合同)与(`POST /hcs/spec-pay/confirm`,付款)与合规推送等效,二者均以先到为准。原推测性接收端点 `POST /hcs/callback/spec-result`(B103 候选键解析)已删除。 diff --git a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md new file mode 100644 index 00000000..9f2f67c5 --- /dev/null +++ b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md @@ -0,0 +1,272 @@ +# 合同特批与付款(结算付款)特批流程梳理 + +> 梳理日期:2026-10-12 +> 涉及模块:`blade-service/blade-transport`(业务编排/状态留痕)、`blade-third-party-api/blade-hcs-api`(Feign 客户端 + DTO + 配置) +> 关联设计文档:`doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md`(§九)、`2026-09-27-桂物合同合规系统HCS接入技术设计.md`(§5.4/§5.5) +> 关联提交:`8e6e263`(外部客商高风险黑名单管控与合同自动特批) +> +> **2026-10-12 变更**:原计划的 B103 推送合规方未建设,特批结果改为合规审批完成后经 iPaaS 主动推送 TMS:合同 `POST /hcs/contractLegal/result`、付款 `POST /hcs/paymentLegal/result`(报文 `{sourceSystem, requestId, status=APPROVED/REJECTED, reason}`);原推测性回调端点 `/hcs/callback/spec-result` 及 `HcsFieldConstant.SPEC_CB_*` 候选键解析已删除。见 §2.5/§4.4/§五。 + +--- + +## 一、总览:特批的业务含义 + +本文所述"特批"**不是 TMS 本地审批流**(本地审批走 `approvalStatus`/`currentNode`),而是**向集团合规系统 HCS 发起的特殊审批流程**:TMS 侧仅负责发起、留痕、挂起展示并接收结果,审批动作本身在 HCS 内完成。 + +### 1.1 触发条件(仅两类,与金额阈值、超权限无关) + +| 触发线 | HCS 接口 | 判定条件 | 触发的特批 | 作用对象 | +| --- | --- | --- | --- | --- | +| 外部客商高风险/黑名单 | C101-1 风险查询 | `fdRiskLevel=2`(高风险)或 `fdBlackStatus=yes`(黑名单) | 合同特批(C103-8 发起 / contractLegal/result 结果推送) | `ContractManage`(合同) | +| 合同额度超额 | C106-1 额度校验 | `fdIsCredit=false`(超额) | 结算付款特批(C106-3 发起 / C106-4 更新) | `PaymentApplication`(付款申请) | + +补充规则: + +- **内部组织客商不查**:`CustomerArchive.customerKind=internal` 默认无风险(`HcsSyncConstant.CUSTOMER_KIND_INTERNAL`)。 +- **甲/乙任一方命中即整单管控**(`HcsSyncConstant.java:151-176`)。 +- **付款链路中黑名单不是特批而是直接阻断**:`risk.block-blacklist=true`(默认)时提交付款申请直接抛异常,不走特批。 + +### 1.2 与普通审批的关系 + +特批挂在 TMS 审批**之后**(合同须先审批通过并成功推送 HCS 起草,拿到 `hcs_fd_id` 后才能发起特批)。特批期间 TMS 用 `hcs_spec_status ∈ {need, processing}` + `currentNode="特批审核"` 挂起展示,推送门禁跳过;特批通过即放行,驳回则联动本地审批驳回(仅合同链路)。 + +### 1.3 特批状态机(两条链路共用 `HcsSyncConstant.SPEC_STATUS_*`) + +``` +none(默认) ──触发──▶ need(挂起"特批审核")──发起成功──▶ processing(HCS 流程进行中)──结果──▶ approved / rejected + └─发起失败──▶ 回落 need(仅留痕,可人工重发) +``` + +- 合同特批 `approved` **单次有效**:再次推送时若已 approved 不重复发起。 +- 付款特批 `approved/rejected` **不联动付款审批状态**(无驳回联动),仅人工确认。 + +--- + +## 二、合同特批(C103-8 发起 / contractLegal/result 结果推送) + +### 2.1 触发条件 + +外部客商高风险(风险等级=2)或黑名单,甲方或乙方任一方命中。风险判定:`HcsContractSyncSupport#checkRelativeRisk`(`HcsContractSyncSupport.java:167-183`,`risky` 判定在 :178)。 + +### 2.2 阶段 A:提交校验(特批说明附件必传) + +入口 `ContractManageController`(`@RequestMapping("/contract-manage")`): + +| 接口 | Service 方法 | 校验调用 | +| --- | --- | --- | +| `POST /contract-manage/submit` | `ContractManageServiceImpl#submit`(:146) | :161 | +| `POST /contract-manage/to-temporary` | `#toTemporary`(:178) | :185 | +| `POST /contract-manage/submit-formal` | `#submitFormal`(:198) | :205 | + +三处均调用 `validateSpecExplanationOnSubmit`(:1048-1061): + +1. `isRiskyCustomer`(:1066-1071)→ `HcsCreditCheckSupport#queryCustomerRiskByName`(:240)→ `queryCustomerRisk`(:182-231)**实时调 C101-1**(`hcsClient.getRelativeRisk`);内部组织客商直接返回不命中;名称反查不到客商编号不阻断(:242-248)。 +2. 命中且 `attachmentsJson` 中无 `fileType=特批说明`(`attachmentType=spec_explanation`)附件 → 抛出:"合同相对方存在高风险/黑名单客商,必须上传「特批说明」类型附件后再提交审批"。 + +> 已知缺口:`submitChange`(:303)未调用该校验;`submit()` 中"变更驳回重提交"分支(:150-155)转入 `submitChange`,会绕过附件强校验——推送后自动特批链路仍会兜底挂起,但附件缺失会导致特批发起失败。 + +### 2.3 阶段 B:审批通过 → 推送 → 自动特批 + +审批通过:`POST /contract-manage/approve` → `ContractManageServiceImpl#approve`(:217-245):置 `hcsSyncStatus=unsynced`(:237,推送零埋点 ADR-0001)→ `hcsImmediatePushSupport.pushContractAfterCommit(id)`(:243)。 + +合同推送共 3 个入口,收敛到 `HcsContractSyncSupport#pushContract`(:113-158): + +| 入口 | 位置 | 说明 | +| --- | --- | --- | +| 即时推送 | `HcsImmediatePushSupport#pushContractAfterCommit`(:114) | afterCommit 异步(2 线程 daemon 池),开关 `push.immediate-enabled` 默认 false;`pushContractNow`(:178)对特批挂起中(need/processing)短路跳过(:185-188) | +| 定时扫描 | `HcsPushTask#pushHcsContract`(:155,cron 默认 `0 1/5 * * * ?`) | `pushUnsyncedContracts`(:254-278):`approvalStatus ∈ {approved, change_approved}` 且 `hcs_sync_status ∈ {unsynced, failed}` 且重试未超限 | +| 手动重推 | `HcsSyncController POST /hcs/sync/contract/{id}`(:110)→ `repushContract`(:509-530) | 特批挂起中不可推(:517-519) | + +`pushContract` 内部步骤(与本文相关的 ⑤): + +``` +⓪ 特批挂起门禁(need/processing 直接返回,:118-121) +① 风险校验仅留痕(:124-126,回写 hcs_risk_level / hcs_black_status / hcs_risk_time) +②③④ 附件转传 C103-2 / 判重 / C103-1 起草或 C103-11 更新,markSynced 回填 hcs_fd_id(:535) +⑤ risky 时 autoApplySpecIfNeeded(:190-212)——自动特批链路 +``` + +`autoApplySpecIfNeeded`(:190-212): + +1. 特批已通过(`hcs_spec_status=approved`,单次有效)→ 跳过(:191-195); +2. 置 `hcsSpecStatus=need` + `currentNode="特批审核"`(`SPEC_REVIEW_NODE`,:196-201)——**先挂起后特批**; +3. `transferSpecExplanationAttachments`(:218-242)筛选「特批说明」附件转传 C103-2(合规附件 ID 存入 `hcs_spec_files_json`); +4. 调 `hcsContractSpecSyncSupport.applySpec(...)`(:207)发起 C103-8;失败保持 `need` 仅留痕(:208-211),可人工经 `POST /hcs/contract/spec-apply` 重发。 + +> 设计要点(`HcsContractSyncSupport.java:56-58` 注释):C103-8 必须携带已起草合同的 `hcs_fd_id`,因此顺序是 **先 C103-1 起草、后 C103-8 特批**(8e6e263 调整)。 + +### 2.4 阶段 C:发起特批 C103-8 + +`HcsContractSpecSyncSupport#applySpec`(`HcsContractSpecSyncSupport.java:92-130`): + +- 前置:`requireAppliableContract`(:196-208,须审批通过 + 特批状态 need/rejected)、附件非空(:94-96)、`requireContractFdId`(:213-218,须已有 `hcs_fd_id`); +- 组装 `HcsSpecContractSaveDTO`:`fdDocSubject="合同特批-{合同编号}"`、`fdReason=合同名称`、附件 `fdEntityKey=fd_spc_approval_attach`(:97-111); +- `hcsClient.addSpecContract`(`IHcsClient.java:281`,`SPEC_CONTRACT_ADD_URL`)响应双层嵌套 `data.data.fdId` → 回填 `hcs_spec_fd_id`(:117),`markSpec` 置 `processing`(:118); +- 留痕 `blade_hcs_check_log`(biz_type=`contract`,check_type=`spec`,:335-350);失败回 `need`(:125)。 + +### 2.5 阶段 D:结果联动(两条等效路径) + +| 路径 | 接口 | 实现 | +| --- | --- | --- | +| 合规推送 | `POST /hcs/contractLegal/result`(`HcsSyncController`,`@PreAuth(PERMIT_ALL)`,网关注册 `/gwzh/HTHG/contractLegal/result`) | `handleLegalResult`:`requestId`=合同ID(selectById)定位 → `status=APPROVED/REJECTED` 大小写不敏感识别(其他值仅留痕)→ 原文(含 reason)留痕,报文模型 `HcsLegalResultDTO` | +| 人工确认 | `POST /hcs/contract/spec/confirm`(:251-257) | `confirmSpecResult`(:139-157,仅 processing 可确认) | + +联动 `syncContractOnSpecResult`(:312-320): + +- `approved` → `currentNode="审批通过"`(C103-1 已起草,无需再推送,流程放行); +- `rejected` → `approvalStatus=rejected` + `currentNode="已驳回"`,走"重新编辑 → 提交 → 审批 → 重新特批"闭环。 + +`markSpec`(:325-330)回写 `hcs_spec_status`/`hcs_spec_time`/`hcs_spec_msg`,回调原文留痕。 + +### 2.6 TMS 侧留痕字段(`blade_contract_manage`,`ContractManage.java:45`) + +| 字段 | 位置 | 含义 | +| --- | --- | --- | +| `hcs_fd_id` | :213 | HCS 合同 ID(C103-1 起草回填) | +| `hcs_risk_level` / `hcs_black_status` / `hcs_risk_time` | :233/:236/:239 | C101-1 风险留痕 | +| `hcs_spec_fd_id` | :242 | HCS 特批流程 ID(C103-8 回填) | +| `hcs_spec_status` | :246 | `none/need/processing/approved/rejected` | +| `hcs_spec_time` / `hcs_spec_msg` | :249/:253 | 特批时间/信息 | +| `hcs_spec_files_json` | :256 | 特批材料(含 C103-2 合规附件 ID) | +| `current_node` | — | 挂起展示:`特批审核` / `审批通过` / `已驳回` | + +--- + +## 三、付款特批(付款申请提交触发侧) + +### 3.1 入口与触发 + +`PaymentApplicationController`(`/payment-application`)`POST /submit` → `PaymentApplicationServiceImpl#submit`(`PaymentApplicationServiceImpl.java:316-335`),事务内 :329 调 `HcsCreditCheckSupport#checkOnSubmit(entity)`(`HcsCreditCheckSupport.java:89-99`),依次执行两项校验: + +**① C101-1 收款方风险校验**(开关 `risk.check-on-payment` 默认 true,:91) + +- `checkRelativeRisk`(:104-131):按收款方 `payeeName` 反查 `CustomerArchive` 客商编号 → C101-1 实时查询; +- **黑名单且 `risk.block-blacklist=true`(默认 true)→ 直接阻断**:抛"收款方客商黑名单,禁止提交付款申请"(:127-129)——付款链路黑名单不走特批; +- 反查不到客商编号记 skip 留痕、不阻断(:106-110)。 + +**② C106-1 合同额度校验**(开关 `credit.check-enabled` 默认 false,**一期未对接**,:95-97) + +- `checkCredit`(:136-172):要求合同已推送(有 `hcs_fd_id`,:138-145)→ `hcsClient.contractCreditCheck`(:151); +- `fdIsCredit=true`(额度内)→ `hcs_credit_status=pass`(:160); +- **超额不拦截提交** → `hcs_credit_status=over` + `hcs_credit_msg` + **`hcs_spec_status=need`**(:167-169)——这是付款特批的唯一自动触发点。 + +### 3.2 后续流转 + +- 审批通过:`#approve`(:353-362)置 `hcs_sync_status=unsynced`(:359,零埋点 ADR-0001); +- **付款链没有即时推送**(`HcsImmediatePushSupport` 仅覆盖 project/contract),完全依赖定时扫描/手动端点(见 §四)。 + +### 3.3 TMS 侧留痕字段(`blade_payment_application`,`PaymentApplication.java:41`) + +| 字段 | 位置 | 含义 | +| --- | --- | --- | +| `hcs_fd_id` / `hcs_sync_status` / `hcs_retry_count` | :125/:127/:129 | HCS 同步主状态 | +| `hcs_credit_status` | :135 | `pass`(额度内)/ `over`(超额) | +| `hcs_credit_msg` / `hcs_credit_time` | :137/:139 | 额度校验信息 | +| `hcs_spec_fd_id` / `hcs_spec_status` | :141/:142 | 特批流程 ID / `none/need/pushing/processing/approved/rejected` | +| `hcs_perf_fd_id` | :145 | 履约记录(C108,默认关,不在本文范围) | + +### 3.4 与合同特批的关联 + +- 付款特批报文中的合同取 `ContractManage.hcs_fd_id` 传值(`requireContractFdId`,`HcsSpecPaySyncSupport.java:210-215`),额度校验也是按合同维度(C106-1 `fdContractId`); +- 二者共用 `HcsSyncConstant.SPEC_STATUS_*` 状态机与 `blade_hcs_check_log` 留痕表(biz_type=`payment`,check_type=`risk`/`credit`/`spec`)。 + +--- + +## 四、结算付款特批(C106-3 发起 / C106-4 更新) + +### 4.1 概念澄清 + +代码库中**不存在独立的"结算单付款"特批实体**。"结算付款特批"是**付款申请(PaymentApplication)的 HCS 特批流程在 HCS 侧的表单名称**——单据主题固定 `结算付款特批-{paymentNo}`(`HcsSpecPaySyncSupport.java:129/158`)。即: + +- §三(付款特批)= **触发侧**:提交时 C106-1 超额置 `need`; +- 本节(结算付款特批)= **推送侧**:审批通过后发起 C106-3 / 更新 C106-4。 + +佐证:`PaymentApplication.paymentType` 含 `settlement_payment`(`TransportBusiConstant.PAYMENT_TYPE_SETTLEMENT`,:35),BFI 申请事由即称"结算付款申请"(`PaymentApplicationServiceImpl.java:1207-1213`);`FormalSettlementPayment`(正式结算付款记录,`blade_formal_settlement_payment`)**没有任何 hcs/特批字段**,仅在付款完成后联动生成,不参与特批。 + +### 4.2 推送链路 + +| 入口 | 位置 | 说明 | +| --- | --- | --- | +| 定时扫描 | `HcsPushTask#pushHcsPayment`(:163,cron 默认 `0 2/5 * * * ?`,开关 `push.payment.sync-enabled` 默认 false) | `pushUnsyncedPayments`(:285-309):`approvalStatus=approved` 且 `hcs_sync_status ∈ {unsynced, failed}` 且重试未超限 → `HcsPaymentSyncSupport#pushPayment` | +| 手动重推 | `POST /hcs/sync/payment/{id}`(`HcsSyncController.java:111`)→ `repushPayment`(:95-113);批量 `POST /hcs/sync/payment`(:129) | — | + +`HcsPaymentSyncSupport#pushPayment`(`HcsPaymentSyncSupport.java:70-87`): + +1. **① 结算付款特批**:`hcs_spec_status=need` 且未发起时(:72-74)调 `HcsSpecPaySyncSupport#pushSpecPay`; +2. ② 履约记录 C108(默认关); +3. 最后统一 `markSynced`(:142)/ `markFailed`(:154)回写整体同步状态。 + +> 当前 `credit.check-enabled=false`(C106-1 未对接),`need` 无自动触发源,"仅历史数据/人工场景可达"(`HcsPaymentSyncSupport.java:72` 注释)。 + +### 4.3 C106-3/4 实现(`HcsSpecPaySyncSupport`) + +`pushSpecPay`(:86-108): + +- `hcs_spec_fd_id` 为空 → **C106-3 发起**:`hcsClient.addSpecApplyPay`(:92,`IHcsClient.java:259`)双层嵌套 `data.data.fdId` → 回填 `hcs_spec_fd_id` + 状态 `processing`(:94-96); +- 非空 → **C106-4 更新**:`updateSpecApplyPay`(:102,`IHcsClient.java:268`,顶层 `fdId` 定位,内层 `success` 判断)。 + +报文组装 `buildSpecPayParam`(:113-166):`HcsSpecPaySaveDTO` → `HcsSpecPayFormDataDTO` → `HcsSpecPayPropsDTO`,关键字段: + +| HCS 字段 | 取值 | +| --- | --- | +| `fdDocSubject` | `结算付款特批-{paymentNo}`(:129/:158) | +| `fdContractName` | 合同 `hcs_fd_id`(:123) | +| `fdDocNo` / `fdId` | `paymentNo`(:127/:131) | +| `fdPayAmount` | `appliedAmount` 申请金额(:133) | +| `fdTotalAmount` | `settlementAmount` 结算金额(:135) | +| `fdPayer` / `fdPayee` | 付款方/收款方(:137-138) | +| 收款账户/账号/开户行 | :140-142 | +| `fdSettleCurrency` | 默认"人民币"(:144) | +| `fdPaymentPurpose`/`fdPaymentNature`/`fdPaymentType` | 来自 `thirdParty.hcs.spec-pay.*` 配置(:146-148) | +| `fdReason` / `fdSupplementNote` | `remark`(:150-151) | +| `fdSpcApprovalAttach` | `fd_spc_approval_attach`(:155) | + +操作人 = 付款申请创建人登录名(`resolveLoginName`,:220-229)。 + +附件 `buildMechanisms`(:171-193):`attachmentsJson` 经 `HcsAttachmentSupport#transferAttachments`(C103-2)转传;**发起时带 `fdBindType=ADD`、更新时不带**(:181-189)。 + +### 4.4 结果确认 + +特批结果由合规系统审批完成后主动推送(2026-10-12 起,替代原计划的 B103,§9-U1 已闭环): + +- `POST /hcs/paymentLegal/result`(`HcsSyncController`,`@PreAuth(PERMIT_ALL)`,网关注册 `/gwzh/HTHG/paymentLegal/result`)→ `HcsPaymentSyncSupport#handleLegalResult`:`requestId`=付款申请ID 定位,`status=APPROVED/REJECTED` 回写 `hcs_spec_status`,不联动付款审批状态; +- 等效兜底:页面人工确认 `POST /hcs/spec-pay/confirm`(仅 `processing` 可确认,置 `approved/rejected`); +- **付款特批结果不联动付款审批状态**(与合同特批的 `syncContractOnSpecResult` 不同,无驳回联动)。 + +--- + +## 五、推送时机与结果接收机制汇总 + +| 机制 | 合同特批(C103-8/contractLegal/result) | 付款/结算付款特批(C106-3/4/paymentLegal/result) | +| --- | --- | --- | +| 定时扫描 | `HcsPushTask#pushHcsContract`(默认 `0 1/5 * * * ?`) | `HcsPushTask#pushHcsPayment`(默认 `0 2/5 * * * ?`);Redis 任务锁 TTL 240s(:92)、分钟位错峰(:75-77) | +| 即时推送 | `HcsImmediatePushSupport#pushContractAfterCommit`(afterCommit 异步,开关默认 false,单条锁 TTL 120s) | 无 | +| 结果推送接收 | `POST /hcs/contractLegal/result`(PERMIT_ALL,requestId=合同ID,原文留痕+联动审批状态) | `POST /hcs/paymentLegal/result`(PERMIT_ALL,requestId=付款申请ID,回写特批状态) | +| 人工确认 | `POST /hcs/contract/spec/confirm` | `POST /hcs/spec-pay/confirm` | +| 手动发起/重推 | `POST /hcs/contract/spec-apply`(:226)、`POST /hcs/sync/contract/{id}`(:110) | `POST /hcs/sync/payment/{id}`(:111)、`POST /hcs/sync/payment`(:129) | + +--- + +## 六、依赖配置项(`thirdParty.hcs.*`,`HcsProperties.java`) + +| 配置 | 默认 | 说明 | +| --- | --- | --- | +| `contract.require-risk-check` | true | 提交时特批说明附件强校验 | +| `risk.check-on-contract` | — | 合同链路 C101-1 查询开关 | +| `risk.check-on-payment` | true | 付款提交 C101-1 校验开关 | +| `risk.block-blacklist` | true | 付款链路黑名单阻断(合同链路已不用于阻断) | +| `credit.check-enabled` | **false** | C106-1 额度校验,一期未对接(付款特批自动触发源关闭) | +| `contract.special-contract-enabled` | false | C103-1 报文特批流程字段 `fdSepcailContract`(固定 false,D15) | +| `push.immediate-enabled` | false | 审批通过后即时推送 | +| `push.contract.sync-enabled` / `push.contract.cron` | — / `0 1/5 * * * ?` | 合同定时扫描 | +| `push.payment.sync-enabled` / `push.payment.cron` | — / `0 2/5 * * * ?` | 付款定时扫描 | +| `spec-pay.payment-purpose/nature/type` | — | C106 报文付款用途/性质/类型 | + +--- + +## 七、留痕与常量速查 + +- **留痕表**:`blade_hcs_check_log`(`HcsContractCheckLog.java:44`):`biz_type=contract/payment`、`check_type=risk/credit/spec`、`result`、`msg`(≤500)、`trace_id`。 +- **关键常量**(`HcsSyncConstant`):`SPEC_STATUS_NONE/NEED/PROCESSING/APPROVED/REJECTED`(:119-149)、`RISK_LEVEL_HIGH="2"`(:156)、`ATTACHMENT_TYPE_SPEC_EXPLANATION="特批说明"`(:171)、`SPEC_REVIEW_NODE="特批审核"`(:176)。 +- **合规推送结果状态**(`HcsSyncConstant`):`LEGAL_RESULT_APPROVED="APPROVED"` / `LEGAL_RESULT_REJECTED="REJECTED"`(原 B103 回调候选键常量 `HcsFieldConstant.SPEC_CB_*` 已随旧回调端点删除)。 +- **特批附件挂载键**:`fd_spc_approval_attach`(合同 C103-8 与付款 C106-3/4 共用)。 From e44270e6f0fbc93c7deffd31eb62e93f9db3de8a 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 11:36:54 +0800 Subject: [PATCH 050/124] =?UTF-8?q?:fix:=20=E7=89=B9=E6=89=B9=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E5=9B=9E=E4=BC=A0=E6=8E=A5=E5=8F=A3=E6=94=B9=E4=B8=BA?= =?UTF-8?q?secure=E7=99=BD=E5=90=8D=E5=8D=95=E6=94=BE=E8=A1=8C=EF=BC=8C?= =?UTF-8?q?=E7=A7=BB=E9=99=A4PERMIT=5FALL=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HcsSyncController.java | 9 ++++----- ...2026-09-27-桂物合同合规系统HCS接入技术设计.md | 2 +- .../2026-09-28-HCS接入实施状态与确认清单.md | 4 ++-- .../2026-10-09-项目立项与合同HCS前端接入设计.md | 2 +- .../2026-10-12-合同特批与结算付款特批流程梳理.md | 6 +++--- doc/nacos/blade.yaml | 18 ++++++++++++++++++ 6 files changed, 29 insertions(+), 12 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index dd48c78c..ef580dba 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -34,7 +34,6 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.secure.annotation.PreAuth; -import org.springblade.core.secure.constant.AuthConstant; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; @@ -258,14 +257,14 @@ public class HcsSyncController { } /** - * 合同特批结果回传接收(合规系统 contractLegal/result 推送,替代未建设的 B103,公开端点 + 原文留痕) + * 合同特批结果回传接收(合规系统 contractLegal/result 推送,替代未建设的 B103,原文留痕) *

    + * 免登免授权:blade.secure skip-url + auth permitAll 放行(doc/nacos/blade.yaml); * iPaaS 网关注册映射:/gwzh/HTHG/contractLegal/result → /hcs/contractLegal/result; * 报文 {sourceSystem, requestId=TMS合同ID, status=APPROVED/REJECTED, reason}, * approved 恢复流程展示,rejected 联动合同审批驳回。 */ @PostMapping("/contractLegal/result") - @PreAuth(AuthConstant.PERMIT_ALL) @ApiOperationSupport(order = 15) @Operation(summary = "合同特批结果回传接收", description = "合规系统推送合同特批结果,按合同ID定位并联动特批状态,原文留痕") public R contractLegalResult(@RequestBody(required = false) HcsLegalResultDTO param) { @@ -273,13 +272,13 @@ public class HcsSyncController { } /** - * 付款特批结果回传接收(合规系统 paymentLegal/result 推送,公开端点) + * 付款特批结果回传接收(合规系统 paymentLegal/result 推送) *

    + * 免登免授权同合同接口(blade.secure 放行); * iPaaS 网关注册映射:/gwzh/HTHG/paymentLegal/result → /hcs/paymentLegal/result; * 报文同合同接口(requestId=TMS付款申请ID),付款特批结果不联动付款审批状态(§4.4)。 */ @PostMapping("/paymentLegal/result") - @PreAuth(AuthConstant.PERMIT_ALL) @ApiOperationSupport(order = 16) @Operation(summary = "付款特批结果回传接收", description = "合规系统推送付款特批结果,按付款申请ID定位并回写特批状态") public R paymentLegalResult(@RequestBody(required = false) HcsLegalResultDTO param) { diff --git a/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md index dde633b5..a37ddc36 100644 --- a/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md +++ b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md @@ -415,7 +415,7 @@ thirdParty: | # | 事项 | 影响 | |---|---|---| -| U1 | **特批流程结果回传方式**:v4 无查询/回调接口 → **已决(2026-10-12)**:合规经 `contractLegal/result`(合同)/`paymentLegal/result`(付款)主动推送 TMS | 推送接收端点已实现(PERMIT_ALL);人工确认保留等效兜底 | +| U1 | **特批流程结果回传方式**:v4 无查询/回调接口 → **已决(2026-10-12)**:合规经 `contractLegal/result`(合同)/`paymentLegal/result`(付款)主动推送 TMS | 推送接收端点已实现(blade.secure 放行,免登免授权);人工确认保留等效兜底 | | U2 | 组织/人员引用体系:HCS `{fdId,fdName}` 的 fdId 与 TMS 部门ID 不同源;登录名是否同源(见原文登录名截图) | 立项/合同操作人字段解析方式 | | U3 | 字典值映射:fd_settlement_type、fd_invoice_type、付款用途/性质/类型、CONTRACT_STATUS 是否必传 | 各映射配置 | | U4 | C103-3/C102-3/C111-1 conditions 是否支持 fdNumber/fd_num/fdKingdeeId 精确查询;HCS 是否按 fd_kingdee_id 幂等 | 判重与防重方案 | diff --git a/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md b/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md index 31285bef..c838e533 100644 --- a/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md +++ b/doc/docs/hcs合同/2026-09-28-HCS接入实施状态与确认清单.md @@ -62,8 +62,8 @@ | `POST /hcs/sync/{bizType}/{id}` | 单条重推(bizType:project / contract / payment / invoice-application / invoice-receipt),重置 unsynced+清零计数后立即推送 | | `POST /hcs/sync/{bizType}` | 批量推送一轮(复用扫描逻辑) | | `POST /hcs/spec-pay/confirm?id=&result=approved|rejected` | 特批结果人工确认(仅 processing 可确认) | -| `POST /hcs/contractLegal/result` | 合同特批结果回传接收(合规推送,PERMIT_ALL,2026-10-12 替代 B103) | -| `POST /hcs/paymentLegal/result` | 付款特批结果回传接收(合规推送,PERMIT_ALL) | +| `POST /hcs/contractLegal/result` | 合同特批结果回传接收(合规推送,blade.secure 放行,2026-10-12 替代 B103) | +| `POST /hcs/paymentLegal/result` | 付款特批结果回传接收(合规推送,blade.secure 放行) | | `POST /hcs/master-data/refresh` | 刷新主数据缓存并校验模板映射 | | `GET /hcs/recon/project?projectCode=` | 项目立项对账(C102-3) | | `GET /hcs/recon/contract?contractNo=` | 合同对账(C103-3) | diff --git a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md index b23a0d7a..22796a11 100644 --- a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md +++ b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md @@ -113,7 +113,7 @@ POST /hcs/contract/spec-apply (body:{ contractId, attachments: [{fdId, → C103-8 v4 未含报文,联调前按上述预估实现并加 TODO 标注(§7-U1) POST /hcs/contractLegal/result (合规系统推送特批结果,2026-10-12 替代未建设的 B103) - 公开端点(@PreAuth(AuthConstant.PERMIT_ALL)),iPaaS 网关注册映射 /gwzh/HTHG/contractLegal/result → 本端点 + 免登免授权端点(blade.secure skip-url + auth permitAll 放行),iPaaS 网关注册映射 /gwzh/HTHG/contractLegal/result → 本端点 body(HcsLegalResultDTO):{ sourceSystem="WLTMS", requestId=TMS合同ID, status=APPROVED|REJECTED, reason } 处理:按 requestId 定位合同 → status 大小写不敏感识别 → 回写 hcs_spec_status + 原文(含 reason)留痕 blade_hcs_check_log → approved 恢复 currentNode="审批通过"(C103-1 已起草,无需再推送);rejected 联动审批驳回,reason 随原文见 hcs_spec_msg diff --git a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md index 9f2f67c5..828d22b4 100644 --- a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md +++ b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md @@ -108,7 +108,7 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 | 路径 | 接口 | 实现 | | --- | --- | --- | -| 合规推送 | `POST /hcs/contractLegal/result`(`HcsSyncController`,`@PreAuth(PERMIT_ALL)`,网关注册 `/gwzh/HTHG/contractLegal/result`) | `handleLegalResult`:`requestId`=合同ID(selectById)定位 → `status=APPROVED/REJECTED` 大小写不敏感识别(其他值仅留痕)→ 原文(含 reason)留痕,报文模型 `HcsLegalResultDTO` | +| 合规推送 | `POST /hcs/contractLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/contractLegal/result`) | `handleLegalResult`:`requestId`=合同ID(selectById)定位 → `status=APPROVED/REJECTED` 大小写不敏感识别(其他值仅留痕)→ 原文(含 reason)留痕,报文模型 `HcsLegalResultDTO` | | 人工确认 | `POST /hcs/contract/spec/confirm`(:251-257) | `confirmSpecResult`(:139-157,仅 processing 可确认) | 联动 `syncContractOnSpecResult`(:312-320): @@ -229,7 +229,7 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 特批结果由合规系统审批完成后主动推送(2026-10-12 起,替代原计划的 B103,§9-U1 已闭环): -- `POST /hcs/paymentLegal/result`(`HcsSyncController`,`@PreAuth(PERMIT_ALL)`,网关注册 `/gwzh/HTHG/paymentLegal/result`)→ `HcsPaymentSyncSupport#handleLegalResult`:`requestId`=付款申请ID 定位,`status=APPROVED/REJECTED` 回写 `hcs_spec_status`,不联动付款审批状态; +- `POST /hcs/paymentLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/paymentLegal/result`)→ `HcsPaymentSyncSupport#handleLegalResult`:`requestId`=付款申请ID 定位,`status=APPROVED/REJECTED` 回写 `hcs_spec_status`,不联动付款审批状态; - 等效兜底:页面人工确认 `POST /hcs/spec-pay/confirm`(仅 `processing` 可确认,置 `approved/rejected`); - **付款特批结果不联动付款审批状态**(与合同特批的 `syncContractOnSpecResult` 不同,无驳回联动)。 @@ -241,7 +241,7 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 | --- | --- | --- | | 定时扫描 | `HcsPushTask#pushHcsContract`(默认 `0 1/5 * * * ?`) | `HcsPushTask#pushHcsPayment`(默认 `0 2/5 * * * ?`);Redis 任务锁 TTL 240s(:92)、分钟位错峰(:75-77) | | 即时推送 | `HcsImmediatePushSupport#pushContractAfterCommit`(afterCommit 异步,开关默认 false,单条锁 TTL 120s) | 无 | -| 结果推送接收 | `POST /hcs/contractLegal/result`(PERMIT_ALL,requestId=合同ID,原文留痕+联动审批状态) | `POST /hcs/paymentLegal/result`(PERMIT_ALL,requestId=付款申请ID,回写特批状态) | +| 结果推送接收 | `POST /hcs/contractLegal/result`(blade.secure 放行,requestId=合同ID,原文留痕+联动审批状态) | `POST /hcs/paymentLegal/result`(blade.secure 放行,requestId=付款申请ID,回写特批状态) | | 人工确认 | `POST /hcs/contract/spec/confirm` | `POST /hcs/spec-pay/confirm` | | 手动发起/重推 | `POST /hcs/contract/spec-apply`(:226)、`POST /hcs/sync/contract/{id}`(:110) | `POST /hcs/sync/payment/{id}`(:111)、`POST /hcs/sync/payment`(:129) | diff --git a/doc/nacos/blade.yaml b/doc/nacos/blade.yaml index d73eb7db..dedb8470 100644 --- a/doc/nacos/blade.yaml +++ b/doc/nacos/blade.yaml @@ -231,6 +231,11 @@ blade: - /feign/client/businessProcess/getProcessInfo - /feign/client/customerArchive/syncProcessNode - /feign/client/mkProcess/** + # HCS 合同/付款特批结果回传:合规系统经 iPaaS 网关无令牌调用,免登免授权 + - /blade-transport/hcs/contractLegal/result + - /hcs/contractLegal/result + - /blade-transport/hcs/paymentLegal/result + - /hcs/paymentLegal/result #授权认证配置 auth: - method: ALL @@ -251,6 +256,19 @@ blade: - method: POST pattern: /dashboard/submit expression: "hasAnyRole('administrator', 'admin', 'user')" + # HCS 合同/付款特批结果回传:合规系统经 iPaaS 网关无令牌调用,免登免授权 + - method: POST + pattern: /blade-transport/hcs/contractLegal/result + expression: "permitAll()" + - method: POST + pattern: /hcs/contractLegal/result + expression: "permitAll()" + - method: POST + pattern: /blade-transport/hcs/paymentLegal/result + expression: "permitAll()" + - method: POST + pattern: /hcs/paymentLegal/result + expression: "permitAll()" #基础认证配置 basic: - method: ALL From b8d93bc92159bdc32dbe4f3aaa55ffc2a7a1c51c 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 11:48:13 +0800 Subject: [PATCH 051/124] =?UTF-8?q?:feat:=20=E7=89=B9=E6=89=B9=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E5=9B=9E=E4=BC=A0=E6=A0=A1=E9=AA=8C=E6=9D=A5=E6=BA=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=A0=87=E8=AF=86=EF=BC=8C=E4=B8=8D=E7=AC=A6?= =?UTF-8?q?=E6=8A=9B=E5=87=BA=E6=9D=A5=E6=BA=90=E7=B3=BB=E7=BB=9F=E6=A0=87?= =?UTF-8?q?=E8=AF=86=E9=94=99=E8=AF=AF=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsContractSpecSyncSupport.java | 9 +++++++++ .../transport/support/hcs/HcsPaymentSyncSupport.java | 7 +++++++ doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md | 2 +- .../hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md | 4 ++-- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index 9c223755..63933d32 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -25,11 +25,13 @@ */ package org.springblade.transport.support.hcs; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsAttachmentRefDTO; import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.hcs.dto.HcsMechanismsDTO; @@ -77,6 +79,7 @@ public class HcsContractSpecSyncSupport { private static final int CALLBACK_MSG_MAX_LENGTH = 500; private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; private final ContractManageMapper contractManageMapper; private final HcsContractCheckLogMapper hcsContractCheckLogMapper; @@ -157,6 +160,7 @@ public class HcsContractSpecSyncSupport { /** * 合同特批结果接收处理(合规 contractLegal/result 推送,替代未建设的 B103,D15 回传机制): + * sourceSystem 须与 third-party.hcs.src-system 配置一致(不符抛出"来源系统标识错误"异常), * requestId=TMS 合同ID、status=APPROVED/REJECTED, * approved 恢复合同"审批通过"展示;rejected 联动合同审批驳回;原文全量留痕 * @@ -164,6 +168,11 @@ public class HcsContractSpecSyncSupport { * @return 处理结果描述 */ public String handleLegalResult(HcsLegalResultDTO param) { + // 来源系统校验:仅接受 third-party.hcs.src-system 配置的来源,防伪造回传 + if (!StrUtil.equalsIgnoreCase(param == null ? null : param.getSourceSystem(), hcsProperties.getSrcSystem())) { + log.warn("合同特批结果推送来源系统标识错误:sourceSystem={}", param == null ? null : param.getSourceSystem()); + throw new ServiceException("来源系统标识错误"); + } String raw = param == null ? "" : JSONUtil.toJsonStr(param); String requestId = param == null ? null : param.getRequestId(); ContractManage contractManage = locateContract(requestId); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java index 239b56da..1b5aeaf6 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java @@ -25,6 +25,7 @@ */ package org.springblade.transport.support.hcs; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; @@ -139,6 +140,7 @@ public class HcsPaymentSyncSupport { /** * 付款特批结果接收处理(合规 paymentLegal/result 推送,替代未建设的 B103,D15 回传机制): + * sourceSystem 须与 third-party.hcs.src-system 配置一致(不符抛出"来源系统标识错误"异常), * requestId=TMS 付款申请ID、status=APPROVED/REJECTED; * 付款特批结果不联动付款审批状态(§4.4),仅回写 hcs_spec_status * @@ -146,6 +148,11 @@ public class HcsPaymentSyncSupport { * @return 处理结果描述 */ public String handleLegalResult(HcsLegalResultDTO param) { + // 来源系统校验:仅接受 third-party.hcs.src-system 配置的来源,防伪造回传 + if (!StrUtil.equalsIgnoreCase(param == null ? null : param.getSourceSystem(), hcsProperties.getSrcSystem())) { + log.warn("付款特批结果推送来源系统标识错误:sourceSystem={}", param == null ? null : param.getSourceSystem()); + throw new ServiceException("来源系统标识错误"); + } String requestId = param == null ? null : param.getRequestId(); PaymentApplication payment = locatePayment(requestId); if (payment == null) { diff --git a/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md b/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md index 59c361d1..6bdeb710 100644 --- a/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md +++ b/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md @@ -210,7 +210,7 @@ TMS 审批通过(approved / change_approved) | `POST /hcs/contractLegal/result`(公开端点,网关注册映射 `/gwzh/HTHG/contractLegal/result`) | `requestId` = TMS 合同ID | 合同特批结果联动 | | `POST /hcs/paymentLegal/result`(公开端点,网关注册映射 `/gwzh/HTHG/paymentLegal/result`) | `requestId` = TMS 付款申请ID | 付款特批回写 `hcs_spec_status`(不联动付款审批状态) | -报文两接口共用(`HcsLegalResultDTO`):`{sourceSystem, requestId, status, reason}`;`status=APPROVED`(通过)/ `REJECTED`(驳回,reason 为驳回原因如"特批说明材料不完整,请补充"),大小写不敏感识别,其他值仅留痕不落状态。报文原文(含 reason)全量留痕 `blade_hcs_check_log`;未定位到单据或状态未识别时仅留痕返回,不报错。 +报文两接口共用(`HcsLegalResultDTO`):`{sourceSystem, requestId, status, reason}`;先校验 `sourceSystem` 与 `third-party.hcs.src-system` 配置一致(不符抛出"来源系统标识错误"异常,不落库不留痕);`status=APPROVED`(通过)/ `REJECTED`(驳回,reason 为驳回原因如"特批说明材料不完整,请补充"),大小写不敏感识别,其他值仅留痕不落状态。报文原文(含 reason)全量留痕 `blade_hcs_check_log`;未定位到单据或状态未识别时仅留痕返回,不报错。 | 特批结果 | 合同联动 | | --- | --- | diff --git a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md index 828d22b4..236e18f2 100644 --- a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md +++ b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md @@ -108,7 +108,7 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 | 路径 | 接口 | 实现 | | --- | --- | --- | -| 合规推送 | `POST /hcs/contractLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/contractLegal/result`) | `handleLegalResult`:`requestId`=合同ID(selectById)定位 → `status=APPROVED/REJECTED` 大小写不敏感识别(其他值仅留痕)→ 原文(含 reason)留痕,报文模型 `HcsLegalResultDTO` | +| 合规推送 | `POST /hcs/contractLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/contractLegal/result`) | `handleLegalResult`:先校验 `sourceSystem`(不符抛"来源系统标识错误"异常)→ `requestId`=合同ID(selectById)定位 → `status=APPROVED/REJECTED` 大小写不敏感识别(其他值仅留痕)→ 原文(含 reason)留痕,报文模型 `HcsLegalResultDTO` | | 人工确认 | `POST /hcs/contract/spec/confirm`(:251-257) | `confirmSpecResult`(:139-157,仅 processing 可确认) | 联动 `syncContractOnSpecResult`(:312-320): @@ -229,7 +229,7 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 特批结果由合规系统审批完成后主动推送(2026-10-12 起,替代原计划的 B103,§9-U1 已闭环): -- `POST /hcs/paymentLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/paymentLegal/result`)→ `HcsPaymentSyncSupport#handleLegalResult`:`requestId`=付款申请ID 定位,`status=APPROVED/REJECTED` 回写 `hcs_spec_status`,不联动付款审批状态; +- `POST /hcs/paymentLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/paymentLegal/result`)→ `HcsPaymentSyncSupport#handleLegalResult`:先校验 `sourceSystem`(不符抛"来源系统标识错误"异常),`requestId`=付款申请ID 定位,`status=APPROVED/REJECTED` 回写 `hcs_spec_status`,不联动付款审批状态; - 等效兜底:页面人工确认 `POST /hcs/spec-pay/confirm`(仅 `processing` 可确认,置 `approved/rejected`); - **付款特批结果不联动付款审批状态**(与合同特批的 `syncContractOnSpecResult` 不同,无驳回联动)。 From 9e4b8a6d58d4abbe7671ef4b01307d39846e80cc 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:51:04 +0800 Subject: [PATCH 052/124] =?UTF-8?q?:feat:=20HCS=E9=99=84=E4=BB=B6=E8=BD=AC?= =?UTF-8?q?=E4=BC=A0=E6=98=A0=E5=B0=84=E8=90=BD=E5=BA=93=EF=BC=8CRedis?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=88=A4=E9=87=8D=E6=94=B9=E4=B8=BAblade=5Fh?= =?UTF-8?q?cs=5Fattachment=5Fsync=E6=8C=81=E4=B9=85=E5=8C=96=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 HcsAttachmentSync 实体与 Mapper(biz_type+biz_id+attachment_key 唯一,照金蝶附件同步表设计,仅落成功记录) - HcsAttachmentSupport 移除 BladeRedis 依赖,transferOne 查表命中即复用合规附件ID,未命中上传后落行 - transferAttachments/transferContractAttachments 增加 bizType/bizId 入参,六个调用点(合同主附件/特批说明/特批付款/履约记录/开票登记/收票单)传入业务上下文 - HcsSyncConstant 删除 ATTACHMENT_CACHE_KEY_PREFIX/ATTACHMENT_CACHE_TTL_DAYS 缓存常量 - 新增建表脚本 blade_hcs_attachment_sync_20261012.sql,技术设计文档 §6 映射缓存表述同步更新 --- .../pojo/entity/HcsAttachmentSync.java | 78 +++++++++++++++++++ .../mapper/HcsAttachmentSyncMapper.java | 39 ++++++++++ .../blade_hcs_attachment_sync_20261012.sql | 32 ++++++++ 3 files changed, 149 insertions(+) create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsAttachmentSync.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsAttachmentSyncMapper.java create mode 100644 doc/sql/transport/blade_hcs_attachment_sync_20261012.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsAttachmentSync.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsAttachmentSync.java new file mode 100644 index 00000000..4fa7fb40 --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsAttachmentSync.java @@ -0,0 +1,78 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +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; +import java.time.LocalDateTime; + +/** + * HCS 附件转传映射实体类(C103-2 转传取得合规附件ID,单附件行级,照金蝶附件同步表设计) + *

    + * 仅落成功记录:HCS 转传任一附件失败即抛异常整单重试(失败原因落单据 hcs_sync_msg),故无失败态字段。 + * + * @author Chill + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("blade_hcs_attachment_sync") +@Schema(description = "HCS附件转传映射") +public class HcsAttachmentSync extends TenantEntity { + @Serial + private static final long serialVersionUID = 1L; + /** + * 业务单据类型(contract/payment/invoice-application/invoice-receipt) + */ + private String bizType; + /** + * 业务单据id + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long bizId; + /** + * 附件幂等键(url|link|fileUrl|downloadUrl|uid|originalName|name 依次取首个非空) + */ + private String attachmentKey; + /** + * 附件名称(展示/排查用) + */ + private String attachmentName; + /** + * 合规附件ID(C103-2 返回 fdId) + */ + private String fdId; + /** + * 最近转传时间 + */ + private LocalDateTime syncTime; +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsAttachmentSyncMapper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsAttachmentSyncMapper.java new file mode 100644 index 00000000..637862ed --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/HcsAttachmentSyncMapper.java @@ -0,0 +1,39 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springblade.transport.pojo.entity.HcsAttachmentSync; + +/** + * HCS 附件转传映射 Mapper + * + * @author Chill + */ +@Mapper +public interface HcsAttachmentSyncMapper extends BaseMapper { +} diff --git a/doc/sql/transport/blade_hcs_attachment_sync_20261012.sql b/doc/sql/transport/blade_hcs_attachment_sync_20261012.sql new file mode 100644 index 00000000..4db61dd7 --- /dev/null +++ b/doc/sql/transport/blade_hcs_attachment_sync_20261012.sql @@ -0,0 +1,32 @@ +-- blade_hcs_attachment_sync 建表(HCS 附件转传映射,照金蝶附件同步表 blade_kingdee_attachment_sync 设计: +-- biz_type+biz_id+attachment_key 唯一,C103-2 转传前查命中即复用合规附件ID,仅落成功记录) +SET @ddl_sql = ( + SELECT IF(COUNT(*) = 0, + 'CREATE TABLE `blade_hcs_attachment_sync` ( + `id` bigint NOT NULL COMMENT ''主键'', + `tenant_id` varchar(12) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''租户ID'', + `biz_type` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT ''业务单据类型(contract/payment/invoice-application/invoice-receipt)'', + `biz_id` bigint NOT NULL COMMENT ''业务单据id'', + `attachment_key` varchar(768) COLLATE utf8mb4_general_ci NOT NULL COMMENT ''附件幂等键(url|link|fileUrl|downloadUrl|uid|originalName|name 依次取首个非空)'', + `attachment_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''附件名称(展示/排查用)'', + `fd_id` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''合规附件ID(C103-2 返回 fdId)'', + `sync_time` datetime DEFAULT NULL COMMENT ''最近转传时间'', + `create_user` bigint DEFAULT NULL COMMENT ''创建人'', + `create_dept` bigint DEFAULT NULL COMMENT ''创建部门'', + `create_time` datetime DEFAULT NULL COMMENT ''创建时间'', + `update_user` bigint DEFAULT NULL COMMENT ''修改人'', + `update_time` datetime DEFAULT NULL COMMENT ''修改时间'', + `status` int DEFAULT NULL COMMENT ''业务状态'', + `is_deleted` int DEFAULT 0 COMMENT ''是否已删除'', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_biz_attachment` (`biz_type`,`biz_id`,`attachment_key`(256)), + KEY `idx_biz_type_biz_id` (`biz_type`,`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT=''HCS附件转传映射表(C103-2)''', + 'SELECT 1') + FROM information_schema.TABLES + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'blade_hcs_attachment_sync' +); +PREPARE ddl_stmt FROM @ddl_sql; +EXECUTE ddl_stmt; +DEALLOCATE PREPARE ddl_stmt; 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 053/124] =?UTF-8?q?:feat:=20=E5=90=88=E5=90=8C=E9=99=84?= =?UTF-8?q?=E4=BB=B6=E6=8C=82=E8=BD=BD=E6=8C=89=20eopCdraft=20=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=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> attachments = parseJsonArray(attachmentsJson); - List attachmentFdIds = new ArrayList<>(); + List attachmentRefs = new ArrayList<>(); for (Map attachment : attachments) { - attachmentFdIds.add(transferOne(attachment, operatorLoginName)); + attachmentRefs.add(this.transferOne(bizType, bizId, attachment, operatorLoginName)); } - return attachmentFdIds; + return attachmentRefs; } /** - * 解析合同主文件 JSON(仅 approved=true 的文件)与其它附件 JSON 并转传 + * 解析合同主文件 JSON(仅 approved=true 的文件,挂用印字段)与其它附件 JSON(挂其他附件字段)并转传 * + * @param bizType 业务单据类型(HcsSyncConstant.BIZ_TYPE_*) + * @param bizId 业务单据id * @param contractFileJson 合同主文件 JSON * @param attachmentsJson 其它附件 JSON * @param operatorLoginName 操作人登录名 - * @return 合规附件ID 列表 + * @return 合规附件引用列表(fdId + fdEntityKey) */ - public List transferContractAttachments(String contractFileJson, String attachmentsJson, String operatorLoginName) { - List> attachments = new ArrayList<>(); + public List transferContractAttachments(String bizType, Long bizId, String contractFileJson, String attachmentsJson, String operatorLoginName) { + List attachmentRefs = new ArrayList<>(); for (Map file : parseJsonArray(contractFileJson)) { if (isApproved(file)) { - attachments.add(file); + attachmentRefs.add(this.transferOne(bizType, bizId, file, operatorLoginName, + HcsSyncConstant.CONTRACT_ATTACH_KEY_SEAL)); } } - attachments.addAll(parseJsonArray(attachmentsJson)); - List attachmentFdIds = new ArrayList<>(); - for (Map attachment : attachments) { - attachmentFdIds.add(transferOne(attachment, operatorLoginName)); + for (Map attachment : parseJsonArray(attachmentsJson)) { + attachmentRefs.add(this.transferOne(bizType, bizId, attachment, operatorLoginName, + HcsSyncConstant.CONTRACT_ATTACH_KEY_OTHER)); } - return attachmentFdIds; + return attachmentRefs; } /** @@ -163,14 +169,26 @@ public class HcsAttachmentSupport { } /** - * 转传单个附件:映射缓存命中直接返回,未命中下载上传后写缓存 + * 转传单个附件:映射同步表命中直接复用合规附件ID,未命中下载上传后落成功记录; + * 返回引用默认不带 fdEntityKey,由调用方(或合同主文件/其他附件重载)指定挂载字段 */ - private String transferOne(Map attachment, String operatorLoginName) { + private HcsAttachmentRefDTO transferOne(String bizType, Long bizId, Map attachment, String operatorLoginName) { + return this.transferOne(bizType, bizId, attachment, operatorLoginName, null); + } + + /** + * 转传单个附件并指定挂载字段 key(fdEntityKey,如合同 eopCdraftSpecial/eopCdraftSign/eopCdraftOther) + */ + private HcsAttachmentRefDTO transferOne(String bizType, Long bizId, Map attachment, String operatorLoginName, String fdEntityKey) { String attachmentKey = attachmentKey(attachment); - String cacheKey = HcsSyncConstant.ATTACHMENT_CACHE_KEY_PREFIX + attachmentKey; - String cachedFdId = bladeRedis.get(cacheKey); - if (StringUtil.isNotBlank(cachedFdId)) { - return cachedFdId; + HcsAttachmentSync existing = hcsAttachmentSyncMapper.selectOne(Wrappers.lambdaQuery() + .eq(HcsAttachmentSync::getBizType, bizType) + .eq(HcsAttachmentSync::getBizId, bizId) + .eq(HcsAttachmentSync::getAttachmentKey, attachmentKey) + .last("limit 1")); + if (existing != null && StringUtil.isNotBlank(existing.getFdId())) { + String url = resolveUrl(attachment); + return buildRef(existing.getFdId(), resolveFileName(attachment, url == null ? "" : url), fdEntityKey); } String url = resolveUrl(attachment); if (StringUtil.isBlank(url)) { @@ -184,12 +202,30 @@ public class HcsAttachmentSupport { if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdId())) { log.error("HCS附件转传失败响应:{}", result == null ? "无响应" : String.format("code=%s, msg=%s, traceId=%s", result.getCode(), result.getMsg(), result.getTraceId())); - throw new HcsException("HCS附件转传失败:" + (result == null ? "响应为空" : result.getMsg())); + throw new HcsException("HCS附件转传失败[" + fileName + "]:" + (result == null ? "响应为空" : result.getMsg())); } String attachmentFdId = result.getData().getFdId(); - bladeRedis.getValueOps().setIfAbsent(cacheKey, attachmentFdId, Duration.ofDays(HcsSyncConstant.ATTACHMENT_CACHE_TTL_DAYS)); - log.info("HCS附件转传完成:{} → 合规附件ID {}", fileName, attachmentFdId); - return attachmentFdId; + HcsAttachmentSync record = new HcsAttachmentSync(); + record.setBizType(bizType); + record.setBizId(bizId); + record.setAttachmentKey(attachmentKey); + record.setAttachmentName(fileName); + record.setFdId(attachmentFdId); + record.setSyncTime(LocalDateTime.now()); + hcsAttachmentSyncMapper.insert(record); + log.info("HCS附件转传完成:{} → 合规附件ID {}(业务单据[{}:{}],fdEntityKey={})", fileName, attachmentFdId, bizType, bizId, fdEntityKey); + return buildRef(attachmentFdId, fileName, fdEntityKey); + } + + /** + * 合规附件引用(fdId + 挂载字段 key) + */ + private HcsAttachmentRefDTO buildRef(String fdId, String fileName, String fdEntityKey) { + HcsAttachmentRefDTO ref = new HcsAttachmentRefDTO(); + ref.setFdId(fdId); + ref.setFdFileName(fileName); + ref.setFdEntityKey(fdEntityKey); + return ref; } /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 375ecb7b..876b6f6a 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -43,12 +43,9 @@ import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.dto.HcsRiskQueryDTO; import org.springblade.hcs.dto.HcsRiskVO; import org.springblade.hcs.dto.HcsSignerDTO; -import org.springblade.hcs.dto.HcsUserRefVO; import org.springblade.hcs.dto.HcsXformFieldDTO; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; -import org.springblade.system.cache.UserCache; -import org.springblade.system.pojo.entity.User; import org.springblade.transport.constant.HcsContractFieldConstant; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; @@ -124,8 +121,8 @@ public class HcsContractSyncSupport { if (hcsProperties.getContract().isRequireRiskCheck()) { risky = checkRelativeRisk(contractManage); } - // ② 附件转传(v4 已明确挂载点:C103-1 fdFieldJson.attachment,转传取得合规附件ID 后随发起报文挂载) - List attachmentFdIds = transferAttachmentsIfEnabled(contractManage); + // ② 附件转传(v4 已明确挂载点:C103-1 fdFieldJson.attachment,转传取得合规附件引用后随发起报文挂载) + List attachmentRefs = transferAttachmentsIfEnabled(contractManage); // ③④ 首推判重后起草(C103-1);已有合规ID(变更单)走更新(C103-11) String resultMessage; if (StringUtil.isBlank(contractManage.getHcsFdId())) { @@ -134,7 +131,7 @@ public class HcsContractSyncSupport { markSynced(contractManage, existFdId, "判重命中,回填已有合规合同ID"); resultMessage = "判重命中,回填已有合规合同ID"; } else { - String fdContractId = draftContract(contractManage, attachmentFdIds); + String fdContractId = draftContract(contractManage, attachmentRefs); // 先持久化合规合同ID(调用方必须保存),履约规则同步失败时下轮凭其走更新补偿 markSynced(contractManage, fdContractId, "C103-1 合同发起成功"); resultMessage = "C103-1 合同发起成功"; @@ -204,7 +201,7 @@ public class HcsContractSyncSupport { contractManage.getCurrentNode()); try { List attachments = transferSpecExplanationAttachments(contractManage); - hcsContractSpecSyncSupport.applySpec(contractManage.getId(), attachments, requireLoginName(contractManage)); + hcsContractSpecSyncSupport.applySpec(contractManage.getId(), attachments); } catch (Exception exception) { log.warn("HCS合同自动特批发起失败(保持待特批,可人工重发):contractNo={},{}", contractManage.getContractNo(), exception.getMessage(), exception); @@ -213,7 +210,7 @@ public class HcsContractSyncSupport { /** * 筛选合同「特批说明」类型附件(fileType=特批说明,业务字典 contract_attachment_type)并转传合规(C103-2), - * 返回特批附件引用;无特批说明附件返回空列表(提交时已强制校验,此处由 C103-8 防御性拦截) + * 返回特批附件引用(fdEntityKey=eopCdraftSpecial);无特批说明附件返回空列表(提交时已强制校验,此处由 C103-8 防御性拦截) */ private List transferSpecExplanationAttachments(ContractManage contractManage) { List> specAttachments = new ArrayList<>(); @@ -227,17 +224,15 @@ public class HcsContractSyncSupport { return List.of(); } String specJson = JsonUtil.toJson(specAttachments); - String loginName = requireLoginName(contractManage); - List attachmentFdIds = hcsAttachmentSupport.transferAttachments(specJson, loginName); - List attachments = new ArrayList<>(); - for (int index = 0; index < specAttachments.size(); index++) { - HcsAttachmentRefDTO ref = new HcsAttachmentRefDTO(); - // 附件ID:C103-2 转传返回的合规附件ID(与元数据行序一致) - ref.setFdId(attachmentFdIds.get(index)); - ref.setFdFileName(resolveAttachmentName(specAttachments.get(index))); - attachments.add(ref); + String loginName = hcsProperties.getOperatorLoginName(); + List attachmentRefs = hcsAttachmentSupport.transferAttachments( + HcsSyncConstant.BIZ_TYPE_CONTRACT, contractManage.getId(), specJson, loginName); + for (int index = 0; index < attachmentRefs.size(); index++) { + // 特批附件字段 key:与元数据行序一致 + attachmentRefs.get(index).setFdEntityKey(HcsSyncConstant.CONTRACT_ATTACH_KEY_SPECIAL); + attachmentRefs.get(index).setFdFileName(resolveAttachmentName(specAttachments.get(index))); } - return attachments; + return attachmentRefs; } /** @@ -327,9 +322,9 @@ public class HcsContractSyncSupport { /** * C103-1 合同发起,返回合规合同 fdContractId */ - private String draftContract(ContractManage contractManage, List attachmentFdIds) { - HcsContractDraftDTO param = buildDraftParam(contractManage, attachmentFdIds); - log.info("HCS合同推送开始:{}(C103-1 发起,挂载附件 {} 个)", contractManage.getContractNo(), attachmentFdIds.size()); + private String draftContract(ContractManage contractManage, List attachmentRefs) { + HcsContractDraftDTO param = buildDraftParam(contractManage, attachmentRefs); + log.info("HCS合同推送开始:{}(C103-1 发起,挂载附件 {} 个)", contractManage.getContractNo(), attachmentRefs.size()); HcsResult result = hcsClient.contractDraft(param); return validateDraftResult(contractManage, result); } @@ -349,9 +344,9 @@ public class HcsContractSyncSupport { /** * 组装 C103-1/C103-11 入参(字段标注照 §3.4 规范,映射表见设计文档 §5.2); - * attachmentFdIds 新建传合规附件ID 列表(必填,无附件传空列表),更新传 null 不挂载 + * attachmentRefs 新建传合规附件引用列表(fdId+fdEntityKey,必填,无附件传空列表),更新传 null 不挂载 */ - private HcsContractDraftDTO buildDraftParam(ContractManage contractManage, List attachmentFdIds) { + private HcsContractDraftDTO buildDraftParam(ContractManage contractManage, List attachmentRefs) { HcsContractDraftDTO param = new HcsContractDraftDTO(); // 【必填】合同ID:C103-11 更新顶层必填(传 C103-1 返回的 fdContractId),C103-1 新建不传(v4 新增) param.setFdId(contractManage.getHcsFdId()); @@ -359,24 +354,22 @@ public class HcsContractSyncSupport { param.setFdTemplateId(requireTemplateId(contractManage)); // 【必填】外部系统标识:fd_sources,配置 thirdParty.hcs.src-system(D14) param.setFdOuterSystem(hcsProperties.getSrcSystem()); - // 【必填】操作人登录名:合同承办人登录名(§9-U2) - param.setFdLoginName(requireLoginName(contractManage)); + // 【必填】操作人登录名:配置 thirdParty.hcs.operator-login-name(默认 srvadmin,§9-U2) + param.setFdLoginName(hcsProperties.getOperatorLoginName()); // 【必填】保存类型:submit(提交) param.setSaveType("submit"); HcsContractFieldJsonDTO fieldJson = new HcsContractFieldJsonDTO(); fieldJson.setXformFields(buildXformFields(contractManage)); // 相对方(签署方):甲方/乙方,编号按名称反查 CustomerArchive(§9-U6) fieldJson.setSigner(buildSigners(contractManage)); - // 【必填】附件数据:C103-1 必填(无附件传空列表),fdBindType=ADD;更新不挂载(传 null) - if (attachmentFdIds != null) { - fieldJson.setAttachment(attachmentFdIds.stream().map(fdId -> { - HcsAttachmentRefDTO attachment = new HcsAttachmentRefDTO(); - // 【必填】附件ID(C103-2 转传返回) - attachment.setFdId(fdId); + // 【必填】附件数据:C103-1 必填(无附件传空列表),fdEntityKey=特批 eopCdraftSpecial/用印 eopCdraftSign/其他 eopCdraftOther, + // fdBindType=ADD;更新不挂载(传 null) + if (attachmentRefs != null) { + fieldJson.setAttachment(new ArrayList<>(attachmentRefs)); + for (HcsAttachmentRefDTO attachment : fieldJson.getAttachment()) { // 【必填】操作类型:ADD 新增 attachment.setFdBindType("ADD"); - return attachment; - }).toList()); + } } param.setFdFieldJson(fieldJson); return param; @@ -401,12 +394,17 @@ public class HcsContractSyncSupport { // 币种:TMS 结算币种经 currency-name-mapping 映射(默认 RMB→人民币,照金蝶惯例) fields.add(field(HcsContractFieldConstant.FIELD_FD_CURRENCY_ID, "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); fields.add(field(HcsContractFieldConstant.FIELD_CURRENCY, "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); - // 合同结算类型:settlement-type-mapping[settlementMode](必填:payment/payment_collection/collection/none,映射到"付款/收款"待联调,§9-U3,未配置不传) - String settlementType = hcsProperties.getContract().getSettlementTypeMapping().get(contractManage.getSettlementMode()); + // 合同结算类型:按合同类别固定规则——承运商合同=付款,客户合同=收款(2026-10-12 确认) + String settlementType = null; + if ("承运商合同".equals(contractManage.getContractCategory())) { + settlementType = HcsContractFieldConstant.SETTLEMENT_TYPE_PAYMENT; + } else if ("客户合同".equals(contractManage.getContractCategory())) { + settlementType = HcsContractFieldConstant.SETTLEMENT_TYPE_COLLECTION; + } if (StringUtil.isNotBlank(settlementType)) { fields.add(field(HcsContractFieldConstant.FIELD_FD_SETTLEMENT_TYPE, "合同结算类型", settlementType)); } else { - log.warn("HCS合同结算类型映射缺失:settlementMode=[{}] 不在 contract.settlement-type-mapping,fdSettlementType 不传(§9-U3)", contractManage.getSettlementMode()); + log.warn("HCS合同结算类型无法确定:contractCategory=[{}] 非承运商合同/客户合同,fdSettlementType 不传", contractManage.getContractCategory()); } // 特批流程:fdSepcailContract 固定 false(原文拼写笔误必须沿用,D15,配置项预留) fields.add(field(HcsContractFieldConstant.FIELD_FD_SEPCAIL_CONTRACT, "特批流程", hcsProperties.getContract().isSpecialContractEnabled() ? "true" : "false")); @@ -475,16 +473,18 @@ public class HcsContractSyncSupport { } /** - * 附件转传(可配开关):合同主文件 approved=true + 其它附件,返回合规附件ID 列表(挂载 C103-1 fdFieldJson.attachment) + * 附件转传(可配开关):合同主文件 approved=true(挂 eopCdraftSign)+ 其它附件(挂 eopCdraftOther), + * 返回合规附件引用列表(挂载 C103-1 fdFieldJson.attachment) */ - private List transferAttachmentsIfEnabled(ContractManage contractManage) { + private List transferAttachmentsIfEnabled(ContractManage contractManage) { if (!hcsProperties.getAttachment().isTransferEnabled()) { return List.of(); } - List attachmentFdIds = hcsAttachmentSupport.transferContractAttachments( - contractManage.getContractFileJson(), contractManage.getAttachmentsJson(), requireLoginName(contractManage)); - log.info("HCS合同附件转传完成:contractNo={},共 {} 个附件(随 C103-1 挂载)", contractManage.getContractNo(), attachmentFdIds.size()); - return attachmentFdIds; + List attachmentRefs = hcsAttachmentSupport.transferContractAttachments( + HcsSyncConstant.BIZ_TYPE_CONTRACT, contractManage.getId(), + contractManage.getContractFileJson(), contractManage.getAttachmentsJson(), hcsProperties.getOperatorLoginName()); + log.info("HCS合同附件转传完成:contractNo={},共 {} 个附件(随 C103-1 挂载)", contractManage.getContractNo(), attachmentRefs.size()); + return attachmentRefs; } /** @@ -523,6 +523,7 @@ public class HcsContractSyncSupport { } catch (Exception exception) { String message = StringUtil.isBlank(exception.getMessage()) ? "推送异常" : exception.getMessage(); markFailed(contractManage, message); + log.error("HCS合同推送失败:{}", message, exception); throw new ServiceException("HCS合同推送失败:" + message); } } @@ -535,7 +536,7 @@ public class HcsContractSyncSupport { contractManage.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); contractManage.setHcsRetryCount(0); contractManage.setHcsSyncTime(LocalDateTime.now()); - contractManage.setHcsSyncMsg(message); + contractManage.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); contractManageMapper.updateById(contractManage); log.info("HCS合同推送成功:contractNo={},fdContractId={},{}", contractManage.getContractNo(), fdId, message); } @@ -547,7 +548,7 @@ public class HcsContractSyncSupport { contractManage.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); contractManage.setHcsRetryCount(contractManage.getHcsRetryCount() == null ? 1 : contractManage.getHcsRetryCount() + 1); contractManage.setHcsSyncTime(LocalDateTime.now()); - contractManage.setHcsSyncMsg(message); + contractManage.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); contractManageMapper.updateById(contractManage); log.error("HCS合同推送失败:contractNo={},retryCount={},{}", contractManage.getContractNo(), contractManage.getHcsRetryCount(), message); } @@ -565,20 +566,6 @@ public class HcsContractSyncSupport { return templateId; } - /** - * 合同承办人登录名(fdLoginName 必填) - */ - private String requireLoginName(ContractManage contractManage) { - if (contractManage.getHandlerUserId() == null) { - throw new HcsException("HCS合同推送失败,合同承办人未维护(contractNo=" + contractManage.getContractNo() + ")"); - } - User user = UserCache.getUser(contractManage.getHandlerUserId()); - if (user == null || StringUtil.isBlank(user.getAccount())) { - throw new HcsException("HCS合同推送失败,承办人登录名解析不到(handlerUserId=" + contractManage.getHandlerUserId() + ",§9-U2)"); - } - return user.getAccount(); - } - /** * 按名称反查客商编码(照 KingdeeApBillSyncSupport#queryCustomerCode 惯例,查不到返回 null) */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java index 59466cf8..9a7fef20 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java @@ -32,6 +32,7 @@ import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsAttachmentRefDTO; import org.springblade.hcs.dto.HcsIdVO; import org.springblade.hcs.dto.HcsInvoiceRegAddDTO; import org.springblade.hcs.dto.HcsInvoiceRegUpdateDTO; @@ -181,7 +182,10 @@ public class HcsInvoiceRegSyncSupport { param.setFdThirdCreatorDeptCode(resolveDeptCode(application)); // 附件ID列表:attachmentsJson 经 C103-2 转传 if (hcsProperties.getAttachment().isTransferEnabled() && StringUtil.isNotBlank(application.getAttachmentsJson())) { - param.setFdAttIds(hcsAttachmentSupport.transferAttachments(application.getAttachmentsJson(), resolveCreatorCode(application))); + List attachmentRefs = hcsAttachmentSupport.transferAttachments( + HcsSyncConstant.BIZ_TYPE_INVOICE_APPLICATION, application.getId(), + application.getAttachmentsJson(), resolveCreatorCode(application)); + param.setFdAttIds(attachmentRefs.stream().map(HcsAttachmentRefDTO::getFdId).toList()); } log.info("HCS开票登记新增开始:applicationNo={}", application.getApplicationNo()); HcsResult result = hcsClient.invoiceRegistrationAdd(param); @@ -298,7 +302,7 @@ public class HcsInvoiceRegSyncSupport { application.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); application.setHcsRetryCount(0); application.setHcsSyncTime(LocalDateTime.now()); - application.setHcsSyncMsg(message); + application.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); invoiceApplicationMapper.updateById(application); log.info("HCS开票登记推送成功:applicationNo={},fdId={},{}", application.getApplicationNo(), fdId, message); } @@ -310,7 +314,7 @@ public class HcsInvoiceRegSyncSupport { application.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); application.setHcsRetryCount(application.getHcsRetryCount() == null ? 1 : application.getHcsRetryCount() + 1); application.setHcsSyncTime(LocalDateTime.now()); - application.setHcsSyncMsg(message); + application.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); invoiceApplicationMapper.updateById(application); log.error("HCS开票登记推送失败:applicationNo={},retryCount={},{}", application.getApplicationNo(), application.getHcsRetryCount(), message); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java index 740cfbc7..149c8b0f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java @@ -40,8 +40,7 @@ import org.springblade.hcs.dto.HcsFormSaveVO; import org.springblade.hcs.dto.HcsUserRefVO; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; -import org.springblade.system.cache.UserCache; -import org.springblade.system.pojo.entity.User; +import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.HcsContractExeStageMapper; import org.springblade.transport.mapper.PaymentApplicationMapper; @@ -189,18 +188,16 @@ public class HcsPerfRecordSyncSupport { if (!hcsProperties.getAttachment().isTransferEnabled() || StringUtil.isBlank(payment.getAttachmentsJson())) { return null; } - List attachmentFdIds = hcsAttachmentSupport.transferAttachments(payment.getAttachmentsJson(), operatorLoginName); - if (attachmentFdIds.isEmpty()) { + List attachmentRefs = hcsAttachmentSupport.transferAttachments( + HcsSyncConstant.BIZ_TYPE_PAYMENT, payment.getId(), payment.getAttachmentsJson(), operatorLoginName); + if (attachmentRefs.isEmpty()) { return null; } HcsMechanismsDTO mechanisms = new HcsMechanismsDTO(); - mechanisms.setAttachment(attachmentFdIds.stream().map(fdId -> { - HcsAttachmentRefDTO attachment = new HcsAttachmentRefDTO(); + mechanisms.setAttachment(attachmentRefs.stream().map(ref -> { // 附件ID(C103-2 转传返回) - attachment.setFdId(fdId); - // 履约记录附件字段标识 - attachment.setFdEntityKey(PERF_ATTACH_ENTITY_KEY); - return attachment; + ref.setFdEntityKey(PERF_ATTACH_ENTITY_KEY); + return ref; }).toList()); return mechanisms; } @@ -220,17 +217,10 @@ public class HcsPerfRecordSyncSupport { } /** - * 操作人登录名(付款申请创建人,§9-U2) + * 操作人登录名(thirdParty.hcs.operator-login-name,默认 srvadmin,§9-U2) */ private String resolveLoginName(PaymentApplication payment) { - if (payment.getCreateUser() == null) { - throw new HcsException("C108 履约记录推送失败,付款申请创建人未维护(paymentNo=" + payment.getPaymentNo() + ")"); - } - User user = UserCache.getUser(payment.getCreateUser()); - if (user == null || StringUtil.isBlank(user.getAccount())) { - throw new HcsException("C108 履约记录推送失败,创建人登录名解析不到(createUser=" + payment.getCreateUser() + ")"); - } - return user.getAccount(); + return hcsProperties.getOperatorLoginName(); } /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java index af7cdf54..525cc3cd 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsReceiptBillSyncSupport.java @@ -40,8 +40,6 @@ import org.springblade.hcs.dto.HcsReceiptBillSaveDTO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; -import org.springblade.system.cache.UserCache; -import org.springblade.system.pojo.entity.User; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.FormalSettlementMapper; @@ -186,18 +184,17 @@ public class HcsReceiptBillSyncSupport { param.setFormData(formData); // 附件挂载(发票扫描件):fdEntityKey=fd_attach,发起带 fdBindType=ADD,更新不带 if (hcsProperties.getAttachment().isTransferEnabled() && StringUtil.isNotBlank(invoiceReceipt.getAttachmentsJson())) { - List attachmentFdIds = hcsAttachmentSupport.transferAttachments(invoiceReceipt.getAttachmentsJson(), operatorLoginName); - if (!attachmentFdIds.isEmpty()) { + List attachmentRefs = hcsAttachmentSupport.transferAttachments( + HcsSyncConstant.BIZ_TYPE_INVOICE_RECEIPT, invoiceReceipt.getId(), + invoiceReceipt.getAttachmentsJson(), operatorLoginName); + if (!attachmentRefs.isEmpty()) { HcsMechanismsDTO mechanisms = new HcsMechanismsDTO(); - mechanisms.setAttachment(attachmentFdIds.stream().map(fdId -> { - HcsAttachmentRefDTO attachment = new HcsAttachmentRefDTO(); + mechanisms.setAttachment(attachmentRefs.stream().map(ref -> { // 附件ID(C103-2 转传返回) - attachment.setFdId(fdId); - // 收票单附件字段标识 - attachment.setFdEntityKey(RECEIPT_ATTACH_ENTITY_KEY); + ref.setFdEntityKey(RECEIPT_ATTACH_ENTITY_KEY); // 绑定类型:仅发起传 ADD - attachment.setFdBindType(add ? "ADD" : null); - return attachment; + ref.setFdBindType(add ? "ADD" : null); + return ref; }).toList()); param.setMechanisms(mechanisms); } @@ -258,7 +255,7 @@ public class HcsReceiptBillSyncSupport { invoiceReceipt.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); invoiceReceipt.setHcsRetryCount(0); invoiceReceipt.setHcsSyncTime(LocalDateTime.now()); - invoiceReceipt.setHcsSyncMsg(message); + invoiceReceipt.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); invoiceReceiptMapper.updateById(invoiceReceipt); log.info("HCS收票单推送成功:invoiceNo={},{}", invoiceReceipt.getInvoiceNo(), message); } @@ -270,23 +267,16 @@ public class HcsReceiptBillSyncSupport { invoiceReceipt.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); invoiceReceipt.setHcsRetryCount(invoiceReceipt.getHcsRetryCount() == null ? 1 : invoiceReceipt.getHcsRetryCount() + 1); invoiceReceipt.setHcsSyncTime(LocalDateTime.now()); - invoiceReceipt.setHcsSyncMsg(message); + invoiceReceipt.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); invoiceReceiptMapper.updateById(invoiceReceipt); log.error("HCS收票单推送失败:invoiceNo={},retryCount={},{}", invoiceReceipt.getInvoiceNo(), invoiceReceipt.getHcsRetryCount(), message); } /** - * 操作人登录名(收票单创建人,§9-U2) + * 操作人登录名(thirdParty.hcs.operator-login-name,默认 srvadmin,§9-U2) */ private String resolveLoginName(InvoiceReceipt invoiceReceipt) { - if (invoiceReceipt.getCreateUser() == null) { - throw new HcsException("C109 收票单推送失败,收票单创建人未维护(invoiceNo=" + invoiceReceipt.getInvoiceNo() + ")"); - } - User user = UserCache.getUser(invoiceReceipt.getCreateUser()); - if (user == null || StringUtil.isBlank(user.getAccount())) { - throw new HcsException("C109 收票单推送失败,创建人登录名解析不到(createUser=" + invoiceReceipt.getCreateUser() + ")"); - } - return user.getAccount(); + return hcsProperties.getOperatorLoginName(); } /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java index 40ea1383..09e8d863 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java @@ -38,9 +38,7 @@ import org.springblade.hcs.dto.HcsSpecPayPropsDTO; import org.springblade.hcs.dto.HcsSpecPaySaveDTO; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; -import org.springblade.system.cache.UserCache; import org.springblade.transport.constant.HcsSyncConstant; -import org.springblade.system.pojo.entity.User; import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.PaymentApplication; @@ -172,21 +170,19 @@ public class HcsSpecPaySyncSupport { if (!hcsProperties.getAttachment().isTransferEnabled() || StringUtil.isBlank(payment.getAttachmentsJson())) { return null; } - List attachmentFdIds = hcsAttachmentSupport.transferAttachments(payment.getAttachmentsJson(), operatorLoginName); - if (attachmentFdIds.isEmpty()) { + List attachmentRefs = hcsAttachmentSupport.transferAttachments( + HcsSyncConstant.BIZ_TYPE_PAYMENT, payment.getId(), payment.getAttachmentsJson(), operatorLoginName); + if (attachmentRefs.isEmpty()) { return null; } HcsMechanismsDTO mechanisms = new HcsMechanismsDTO(); boolean add = StringUtil.isBlank(payment.getHcsSpecFdId()); - mechanisms.setAttachment(attachmentFdIds.stream().map(fdId -> { - HcsAttachmentRefDTO attachment = new HcsAttachmentRefDTO(); + mechanisms.setAttachment(attachmentRefs.stream().map(ref -> { // 附件ID(C103-2 转传返回) - attachment.setFdId(fdId); - // 特批附件字段标识 - attachment.setFdEntityKey(SPEC_ATTACH_ENTITY_KEY); + ref.setFdEntityKey(SPEC_ATTACH_ENTITY_KEY); // 绑定类型:仅发起传 ADD - attachment.setFdBindType(add ? "ADD" : null); - return attachment; + ref.setFdBindType(add ? "ADD" : null); + return ref; }).toList()); return mechanisms; } @@ -214,16 +210,9 @@ public class HcsSpecPaySyncSupport { } /** - * 操作人登录名(付款申请创建人,§9-U2) + * 操作人登录名(thirdParty.hcs.operator-login-name,默认 srvadmin,§9-U2) */ private String resolveLoginName(PaymentApplication payment) { - if (payment.getCreateUser() == null) { - throw new HcsException("C106 特批推送失败,付款申请创建人未维护(paymentNo=" + payment.getPaymentNo() + ")"); - } - User user = UserCache.getUser(payment.getCreateUser()); - if (user == null || StringUtil.isBlank(user.getAccount())) { - throw new HcsException("C106 特批推送失败,创建人登录名解析不到(createUser=" + payment.getCreateUser() + ")"); - } - return user.getAccount(); + return hcsProperties.getOperatorLoginName(); } } diff --git a/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md index a37ddc36..60225e94 100644 --- a/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md +++ b/doc/docs/hcs合同/2026-09-27-桂物合同合规系统HCS接入技术设计.md @@ -82,7 +82,7 @@ org.springblade.transport │ ├── HcsSpecPaySyncSupport.java # 特批 C106-3/4 │ ├── HcsInvoiceRegSyncSupport.java # 开票登记 C111 │ ├── HcsReceiptBillSyncSupport.java # 收票单 C109 -│ └── HcsAttachmentSupport.java # 附件转传 + TMS→HCS 附件ID映射缓存 +│ └── HcsAttachmentSupport.java # 附件转传 + TMS→HCS 附件ID映射同步表(blade_hcs_attachment_sync) ├── task/HcsPushTask.java # @Scheduled 扫描首推/补偿(照 PaymentKingdeeResultTask 模式) ├── controller/HcsSyncController.java # 手动推送/重推、校验重放、对账查询端点 └── entity/HcsContractExeStage.java # 履约规则实体(blade-transport-api) @@ -338,7 +338,7 @@ flowchart LR 1. 输入:单据 `attachmentsJson`/`contractFileJson`(JSON 元素含 url/fileType/approved 等,去重键照 `attachmentKey` 惯例 url|link|fileUrl|downloadUrl|uid|originalName)。 2. 下载:按元数据 URL 从文件服务拉取流(文件服务基址可配 `attachment.file-download-base`)。 3. 上传:C103-2 multipart(fdFile、fdAnonymous=false、fdLoginName=操作人)→ 附件 `fdId`。 -4. 映射缓存:Redis `hcs:att:{attachmentKey}` → 合规 fdId(TTL 7d),未命中重传(重复上传仅浪费存储,无业务风险,故不做持久化映射表)。 +4. 映射同步表:`blade_hcs_attachment_sync`(biz_type+biz_id+attachment_key 唯一,照金蝶附件同步表设计)落业务单据 → 合规 fdId 映射,转传前查命中即复用;仅落成功记录(失败整单重试,原因落单据 hcs_sync_msg)。 5. 任一附件转传失败 → 整单推送失败进补偿重试。 --- From dc6d7bbc3f9eceaf4b2273e288c5c4cb102dc9c0 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 17:36:57 +0800 Subject: [PATCH 054/124] =?UTF-8?q?:feat:=20=E6=96=B0=E5=A2=9EHCS=E5=90=88?= =?UTF-8?q?=E5=90=8C=E7=BB=93=E7=AE=97=E7=B1=BB=E5=9E=8B=E6=9E=9A=E4=B8=BE?= =?UTF-8?q?=E5=B8=B8=E9=87=8F=EF=BC=8C=E6=89=BF=E8=BF=90=E5=95=86=E5=90=88?= =?UTF-8?q?=E5=90=8C=E4=BB=98=E6=AC=BE=E3=80=81=E5=AE=A2=E6=88=B7=E5=90=88?= =?UTF-8?q?=E5=90=8C=E6=94=B6=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/HcsContractFieldConstant.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java index b937c7b7..5dcd6fcd 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java @@ -167,6 +167,28 @@ public final class HcsContractFieldConstant { */ public static final String FIELD_FD_DESC = "fdDesc"; + // ==================== 结算类型枚举值 ==================== + + /** + * 合同结算类型取值:付款(fdSettlementType,承运商合同固定取此值) + */ + public static final String SETTLEMENT_TYPE_PAYMENT = "payment"; + + /** + * 合同结算类型取值:收支双向(fdSettlementType) + */ + public static final String SETTLEMENT_TYPE_PAYMENT_COLLECTION = "payment_collection"; + + /** + * 合同结算类型取值:收款(fdSettlementType,客户合同固定取此值) + */ + public static final String SETTLEMENT_TYPE_COLLECTION = "collection"; + + /** + * 合同结算类型取值:不结算(fdSettlementType) + */ + public static final String SETTLEMENT_TYPE_NONE = "none"; + // ==================== 期限枚举值 ==================== /** From b7293c0ddb693bd1d702f4ebfd25020e7235b08f 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 17:36:57 +0800 Subject: [PATCH 055/124] =?UTF-8?q?:feat:=20HCS=E6=93=8D=E4=BD=9C=E4=BA=BA?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=90=8D=E9=85=8D=E7=BD=AE=E5=8C=96=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E5=8F=96=E5=80=BC=EF=BC=8C=E6=A8=A1=E6=9D=BF=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E6=94=B9=E6=8B=AC=E5=8F=B7=E8=AE=B0=E6=B3=95=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=B8=AD=E6=96=87=E9=94=AE=E7=BB=91=E5=AE=9A=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HcsSyncController.java | 2 +- .../hcs/HcsContractSpecSyncSupport.java | 7 +++---- .../support/hcs/HcsExeStageSyncSupport.java | 20 ++----------------- .../support/hcs/HcsPaymentSyncSupport.java | 4 ++-- .../support/hcs/HcsProjectSyncSupport.java | 17 +++++----------- .../springblade/hcs/config/HcsProperties.java | 19 ++++++++++++++---- .../hcs/dto/HcsContractDetailVO.java | 2 +- doc/nacos/third-party-api.yaml | 11 +++++----- 8 files changed, 35 insertions(+), 47 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index ef580dba..ec573299 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -242,7 +242,7 @@ public class HcsSyncController { return ref; }) .toList(); - return R.data(hcsContractSpecSyncSupport.applySpec(contractId, attachments, AuthUtil.getUserAccount())); + return R.data(hcsContractSpecSyncSupport.applySpec(contractId, attachments)); } /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index 63933d32..820df7fb 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -88,17 +88,16 @@ public class HcsContractSpecSyncSupport { * * @param contractId 合同ID * @param attachments 特批附件引用(fdId=C103-2 合规附件ID,fdFileName=文件名) - * @param loginName 当前操作人登录名 * @return 结果描述 */ - public String applySpec(Long contractId, List attachments, String loginName) { + public String applySpec(Long contractId, List attachments) { ContractManage contractManage = requireAppliableContract(contractId); if (attachments == null || attachments.isEmpty()) { throw new ServiceException("请先上传特批申请材料(含内部审批流程附件)"); } HcsSpecContractSaveDTO param = new HcsSpecContractSaveDTO(); - // 【必填】操作人登录名:当前登录人(§9-U2) - param.setFdLoginName(loginName); + // 【必填】操作人登录名:配置 thirdParty.hcs.operator-login-name(默认 srvadmin,§9-U2) + param.setFdLoginName(hcsProperties.getOperatorLoginName()); // 【必填】合规合同ID:blade_contract_manage.hcs_fd_id(非名称,照 C106-3 fd_contract_name 惯例) param.setFdContractId(requireContractFdId(contractManage)); // 【必填】合同编号 diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java index 089bd915..262e547e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java @@ -36,8 +36,6 @@ import org.springblade.hcs.dto.HcsExeplanVO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; -import org.springblade.system.cache.UserCache; -import org.springblade.system.pojo.entity.User; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.HcsContractExeStageMapper; @@ -116,8 +114,8 @@ public class HcsExeStageSyncSupport { param.setFdContractId(contractManage.getHcsFdId()); // 【必填】外部系统标识:fd_sources,配置 thirdParty.hcs.src-system(D14) param.setFdOuterSystem(hcsProperties.getSrcSystem()); - // 【必填】操作人登录名:合同承办人登录名(§9-U2) - param.setFdLoginName(requireLoginName(contractManage)); + // 【必填】操作人登录名:配置 thirdParty.hcs.operator-login-name(默认 srvadmin,§9-U2) + param.setFdLoginName(hcsProperties.getOperatorLoginName()); // 【必填】计划整体操作类型:首次同步 add,已同步过(有履约计划ID)update param.setFdEopExeplanOperateType(StringUtil.isBlank(contractManage.getHcsExeplanId()) ? "add" : "update"); // 履约计划ID:已同步过则传(回填自首次同步返回) @@ -248,20 +246,6 @@ public class HcsExeStageSyncSupport { } } - /** - * 合同承办人登录名(fdLoginName 必填) - */ - private String requireLoginName(ContractManage contractManage) { - if (contractManage.getHandlerUserId() == null) { - throw new HcsException("C103-9 履约规则同步失败,合同承办人未维护(contractNo=" + contractManage.getContractNo() + ")"); - } - User user = UserCache.getUser(contractManage.getHandlerUserId()); - if (user == null || StringUtil.isBlank(user.getAccount())) { - throw new HcsException("C103-9 履约规则同步失败,承办人登录名解析不到(§9-U2)"); - } - return user.getAccount(); - } - /** * LocalDateTime → 毫秒时间戳 */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java index 1b5aeaf6..516e90cc 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java @@ -196,7 +196,7 @@ public class HcsPaymentSyncSupport { payment.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); payment.setHcsRetryCount(0); payment.setHcsSyncTime(LocalDateTime.now()); - payment.setHcsSyncMsg(message); + payment.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); paymentApplicationMapper.updateById(payment); log.info("HCS付款申请推送成功:paymentNo={},{}", payment.getPaymentNo(), message); } @@ -208,7 +208,7 @@ public class HcsPaymentSyncSupport { payment.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); payment.setHcsRetryCount(payment.getHcsRetryCount() == null ? 1 : payment.getHcsRetryCount() + 1); payment.setHcsSyncTime(LocalDateTime.now()); - payment.setHcsSyncMsg(message); + payment.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); paymentApplicationMapper.updateById(payment); log.error("HCS付款申请推送失败:paymentNo={},retryCount={},{}", payment.getPaymentNo(), payment.getHcsRetryCount(), message); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index 103d138b..6a645871 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -271,7 +271,7 @@ public class HcsProjectSyncSupport { projectApply.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); projectApply.setHcsRetryCount(0); projectApply.setHcsSyncTime(LocalDateTime.now()); - projectApply.setHcsSyncMsg(message); + projectApply.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); projectApplyMapper.updateById(projectApply); log.info("HCS项目立项推送成功:projectCode={},fdId={},{}", projectApply.getProjectCode(), fdId, message); } @@ -283,7 +283,7 @@ public class HcsProjectSyncSupport { projectApply.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); projectApply.setHcsRetryCount(projectApply.getHcsRetryCount() == null ? 1 : projectApply.getHcsRetryCount() + 1); projectApply.setHcsSyncTime(LocalDateTime.now()); - projectApply.setHcsSyncMsg(message); + projectApply.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); projectApplyMapper.updateById(projectApply); log.error("HCS项目立项推送失败:projectCode={},retryCount={},{}", projectApply.getProjectCode(), projectApply.getHcsRetryCount(), message); } @@ -300,10 +300,9 @@ public class HcsProjectSyncSupport { } /** - * 项目经办人登录名(curUser 必填) + * 操作人登录名(curUser/fd_head/fd_taker/fd_creator 统一取配置,§9-U2) */ private String requireLoginName(ProjectApply projectApply, String scene) { - // TODO 测试线联调:登录名固定取 srvadmin,联调通过后恢复经办人解析与校验 return resolveLoginName(projectApply.getHandlerUserId()); } @@ -316,16 +315,10 @@ public class HcsProjectSyncSupport { } /** - * 按用户ID 解析登录名(UserCache 惯例) + * 操作人登录名(thirdParty.hcs.operator-login-name,默认 srvadmin) */ private String resolveLoginName(Long userId) { - // TODO 测试线联调:登录名固定取 srvadmin(curUser/fd_head/fd_taker/fd_creator 统一生效),联调通过后恢复按 UserCache 解析 - return "srvadmin"; - /*if (userId == null) { - return null; - } - User user = UserCache.getUser(userId); - return user == null ? null : user.getAccount();*/ + return hcsProperties.getOperatorLoginName(); } /** diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 72a3876b..8230051c 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -61,6 +61,21 @@ public class HcsProperties { * 来源系统标识(fd_sources,D14 约定值 TMS) */ private String srcSystem = "WLTMS"; + /** + * 操作人登录名(fdLoginName / curUser.fdLoginName,全部合同接口共用,§9-U2) + */ + private String operatorLoginName = "srvadmin"; + /** + * Mock 开关(thirdParty.hcs.mockEnabled):true 时 IHcsClient 切换为本地 JSON 桩 + * ({mockDir}/{方法名}.json,见 {@link org.springblade.hcs.mock.HcsClientMock}), + * 供联调前本地自测;生产环境必须为 false + */ + private boolean mockEnabled = false; + /** + * Mock 桩文件目录(与 mockEnabled 配套):存放各接口出参桩 {方法名}.json(源自 HCS 接口文档出参示例), + * 每次调用现读,改文件即生效;默认本机开发目录,其他环境经 Nacos 按需覆盖 + */ + private String mockDir = "F:/home/tms/mock/hcs"; /** * 创建单位 fdId(HCS 组织主数据固定值,fd_creator_unit 等组织引用,各合同接口共用) */ @@ -161,10 +176,6 @@ public class HcsProperties { * TMS 合同类别 -> HCS 模板ID(fdTemplateId,§9-U7 待合规方提供模板清单) */ private Map templateMapping = new HashMap<>(); - /** - * TMS 结算方式 -> 付款|收款(fdSettlementType,§9-U3 字典映射待联调) - */ - private Map settlementTypeMapping = new HashMap<>(); /** * TMS 审核状态 -> HCS 合同状态(xformFields CONTRACT_STATUS 必填,draft/approving/approved 等,§9-U3 待联调后配置) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java index 6b841977..93c87dff 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java @@ -301,7 +301,7 @@ public class HcsContractDetailVO implements Serializable { */ private Boolean fdSepcailContract; /** - * 合同结算模式:open=开口合同; close=闭口合同 + * 合同结算模式:open=开口合同; close=闭口合同。开口合同指合同签订时不明确约定总金额、总数量、具体收付款日期,按实际发生的供货量、业务量结算的合同 */ private String fdContractGwNature; /** diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 0644883f..a33c6293 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -74,6 +74,8 @@ thirdParty: key-auth: ${HCS_KEY_AUTH:3F7e8yI6RV8S53mJ9tYa0672r3W4n279} # 来源系统标识(fd_sources,约定值 WLTMS) src-system: ${HCS_SRC_SYSTEM:WLTMS} + # 操作人登录名(fdLoginName / curUser.fdLoginName,全部合同接口共用,默认 srvadmin) + operator-login-name: ${HCS_OPERATOR_LOGIN_NAME:srvadmin} # 创建单位 fdId(fd_creator_unit 等组织引用,HCS 组织主数据固定值,项目立项、合同等接口共用;与 name 任一为空回退单据开题部门名称仅传名称) creator-unit-id: ${HCS_CREATOR_UNIT_ID:1j56etj23w358wne0ow2k5214nk4f24213w0} # 创建单位名称(与 creator-unit-id 配套) @@ -94,11 +96,10 @@ thirdParty: template-code: ${HCS_PROJECT_TEMPLATE_CODE:template_15x0og} # 合同(C103-1/11) contract: - # TMS 合同类别 -> HCS 模板ID(§9-U7 待合规方提供模板清单) - template-mapping: {} - # TMS 结算方式 -> 付款|收款(§9-U3 字典映射待联调) - settlement-type-mapping: {} - # TMS 币种码 -> HCS 币种名称(照金蝶 RMB->CNY 映射惯例) + # TMS 合同类别 -> HCS 模板ID(§9-U7 合规方提供模板清单;中文键必须用 "[...]" 括号记法,否则绑定失败) + template-mapping: + "[承运商合同]": "1jvnp5s7mw13gw5q4w4g9qin1n1a2rn14gw0" + # 币种:TMS 币种码 -> HCS 币种名称(照金蝶 RMB->CNY 映射惯例) currency-name-mapping: {"RMB": "人民币"} # 合同 fdSepcailContract 固定 false(D15,配置项预留) special-contract-enabled: ${HCS_CONTRACT_SPECIAL_ENABLED:false} From b7005ea5477bd4b7e20992156aa38ce7c9f54461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 13 Oct 2026 11:38:31 +0800 Subject: [PATCH 056/124] =?UTF-8?q?:refactor:=20HCS=E5=90=88=E5=90=8C/?= =?UTF-8?q?=E5=BC=80=E7=A5=A8=E5=88=A4=E9=87=8D=E6=9F=A5=E8=AF=A2=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=90=8D=E6=8F=90=E5=8F=96=E8=87=B3HcsFieldConstant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/support/hcs/HcsContractSyncSupport.java | 5 +++-- .../transport/support/hcs/HcsInvoiceRegSyncSupport.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 876b6f6a..0a033b98 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -47,6 +47,7 @@ import org.springblade.hcs.dto.HcsXformFieldDTO; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; import org.springblade.transport.constant.HcsContractFieldConstant; +import org.springblade.transport.constant.HcsFieldConstant; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.CustomerArchiveMapper; @@ -302,9 +303,9 @@ public class HcsContractSyncSupport { */ private String findExistFdId(ContractManage contractManage) { HcsPageQueryDTO query = new HcsPageQueryDTO(); - query.setColumns(List.of("fdId", "fdNumber")); + query.setColumns(List.of(HcsFieldConstant.CONTRACT_FD_ID, HcsFieldConstant.CONTRACT_FD_NUMBER)); // 判重条件:合同编号精确匹配 - query.setConditions(Map.of("fdNumber", Objects.toString(contractManage.getContractNo(), ""))); + query.setConditions(Map.of(HcsFieldConstant.CONTRACT_FD_NUMBER, Objects.toString(contractManage.getContractNo(), ""))); query.setOffset(0); query.setPageSize(10); HcsResult> result = hcsClient.contractList(query); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java index 9a7fef20..067ab47b 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsInvoiceRegSyncSupport.java @@ -48,6 +48,7 @@ import org.springblade.system.cache.SysCache; import org.springblade.system.cache.UserCache; import org.springblade.system.pojo.entity.Dept; import org.springblade.system.pojo.entity.User; +import org.springblade.transport.constant.HcsFieldConstant; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.InvoiceApplicationInvoiceMapper; @@ -221,9 +222,9 @@ public class HcsInvoiceRegSyncSupport { */ private String findExistFdId(InvoiceApplication application) { HcsPageQueryDTO query = new HcsPageQueryDTO(); - query.setColumns(List.of("fdId", "fdNumber")); + query.setColumns(List.of(HcsFieldConstant.INVOICE_FD_ID, HcsFieldConstant.INVOICE_FD_NUMBER)); // 判重条件:单据编号精确匹配 - query.setConditions(Map.of("fdNumber", Objects.toString(application.getApplicationNo(), ""))); + query.setConditions(Map.of(HcsFieldConstant.INVOICE_FD_NUMBER, Objects.toString(application.getApplicationNo(), ""))); query.setOffset(0); query.setPageSize(10); HcsResult> result = hcsClient.invoiceRegistrationList(query); From 17cc04b7efd0a19d84012bc01a616636e7b75e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 13 Oct 2026 15:19:29 +0800 Subject: [PATCH 057/124] =?UTF-8?q?fix:=20=E9=A1=B9=E7=9B=AE=E7=AB=8B?= =?UTF-8?q?=E9=A1=B9HCS=E6=8E=A8=E9=80=81=E7=BB=93=E7=AE=97=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=94=B1=E5=AD=97=E5=85=B8=E6=96=87=E6=9C=AC=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E4=B8=BAHCS=E7=BC=96=E7=A0=81(1/2/3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsProjectSyncSupport.java | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index 6a645871..45f8b7de 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -190,10 +190,10 @@ public class HcsProjectSyncSupport { // 可用单位列表:与创建单位一致(同走 creator-unit 配置)(废弃) // props.setFdAvailUnits(List.of(creatorUnit)); - // 结算类型:TMS settlementMode 原值(字典映射待联调,§9-U3) - props.setFdSettlementType(projectApply.getSettlementMode()); - // 计划保证金:TMS fundDemand(万元)× 10000 转 HCS 元(变更映射曾名"履约保证金",语义联调确认) - props.setFdProPlanDeposit(toYuan(projectApply.getFundDemand())); + // 结算类型:TMS settle_method 字典文本映射 HCS 编码(1=先款后票,2=先票后款,3=先款后票+先票后款(同时存在)) + props.setFdSettlementType(mapSettlementType(projectApply.getSettlementMode())); + // 计划保证金:TMS fundDemand 与 HCS fd_pro_plan_deposit 单位同为万元,直传不换算(接口说明 §5.1) + props.setFdProPlanDeposit(projectApply.getFundDemand()); // 是否自营项目:一期固定 "2"。是|1, 否|2 props.setFdIsSelfPro("2"); // TODO 待确认:项目收入目标 fd_pro_income_goal,TMS 无直接对应字段,一期不传(§5.1) @@ -211,6 +211,26 @@ public class HcsProjectSyncSupport { return formData; } + /** + * 结算方式字典文本映射 HCS 编码:先款后票=1、先票后款=2、先款后票+先票后款(同时存在)=3;未匹配时原值直传并告警 + */ + private String mapSettlementType(String settlementMode) { + if (StringUtil.isBlank(settlementMode)) { + return null; + } + String code = switch (settlementMode.trim()) { + case "先款后票" -> "1"; + case "先票后款" -> "2"; + case "先款后票+先票后款(同时存在)" -> "3"; + default -> null; + }; + if (code == null) { + log.warn("HCS项目立项结算类型未匹配编码,原值直传:settlementMode=[{}]", settlementMode); + return settlementMode; + } + return code; + } + /** * C102-3 项目立项查询判重(conditions={"fd_num": projectCode},§9-U4 查询能力联调确认) */ From 7def08ab2f82747a9e2cd53787a55f55048ee4a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 13 Oct 2026 15:20:40 +0800 Subject: [PATCH 058/124] =?UTF-8?q?:chore:=20=E5=AF=B9=E9=BD=90third-party?= =?UTF-8?q?-api.yaml=E7=9A=84HCS=E6=8E=A8=E9=80=81=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=EF=BC=88=E5=8D=B3=E6=97=B6=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E6=80=BB=E5=BC=80=E5=85=B3+=E4=BA=94=E7=B1=BB=E6=89=AB?= =?UTF-8?q?=E6=8F=8F=E7=8B=AC=E7=AB=8B=E5=BC=80=E5=85=B3=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3baseUrl=E7=BD=91=E5=85=B3=E5=89=8D=E7=BC=80=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/nacos/third-party-api.yaml | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index a33c6293..1c3b959e 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -67,7 +67,7 @@ thirdParty: # 合同合规系统 hcs: # 合同合规系统(HCS)开放接口地址(v4 接口说明:带网关前缀,直连可配,代码不感知) - baseUrl: ${HCS_BASE_URL:http://172.16.203.134:8000/gwzh/BFI} + baseUrl: ${HCS_BASE_URL:http://172.16.203.134:8000/gwzh/HTHG} # Authorization 请求头整值(含 Basic 前缀,敏感值通过环境变量注入) authorization: ${HCS_AUTHORIZATION:Basic d2NjazprJDdQcVIyIXNCdjkmbkc0} # Key-Auth 请求头值(v4 接口说明:所有接口固定携带 Authorization + Key-Auth 两个头) @@ -80,16 +80,25 @@ thirdParty: creator-unit-id: ${HCS_CREATOR_UNIT_ID:1j56etj23w358wne0ow2k5214nk4f24213w0} # 创建单位名称(与 creator-unit-id 配套) creator-unit-name: ${HCS_CREATOR_UNIT_NAME:广西物产城矿发展有限公司} - # 推送任务(扫描首推/补偿,P1 接线) + # 推送任务(审批通过即时推送 + 定时扫描兜底,HcsPushTask 五类任务独立开关) push: - # 总开关(默认关,灰度打开) - sync-enabled: ${HCS_PUSH_SYNC_ENABLED:false} - # 扫描调度 cron,默认每5分钟 - cron: ${HCS_PUSH_CRON:0 */5 * * * ?} + # 审批通过即时推送总开关(事务提交后异步推送,关闭时仅走扫描兜底) + immediate-enabled: ${HCS_PUSH_IMMEDIATE_ENABLED:false} # 每类单据单轮扫描批量 batch-size: ${HCS_PUSH_BATCH_SIZE:50} # 推送失败自动重试上限,超限仅人工重推 max-retry: ${HCS_PUSH_MAX_RETRY:5} + # 五类扫描任务独立开关(cron 有代码默认值错峰每5分钟,无需配置) + project: + sync-enabled: ${HCS_PUSH_PROJECT_ENABLED:false} + contract: + sync-enabled: ${HCS_PUSH_CONTRACT_ENABLED:false} + payment: + sync-enabled: ${HCS_PUSH_PAYMENT_ENABLED:false} + invoice-application: + sync-enabled: ${HCS_PUSH_INVOICE_APP_ENABLED:false} + invoice-receipt: + sync-enabled: ${HCS_PUSH_INVOICE_RCV_ENABLED:false} # 项目立项(C102) project: # 立项 bpmOperation.templateCode(环境相关值,§9-U9 待合规方提供) @@ -99,6 +108,10 @@ thirdParty: # TMS 合同类别 -> HCS 模板ID(§9-U7 合规方提供模板清单;中文键必须用 "[...]" 括号记法,否则绑定失败) template-mapping: "[承运商合同]": "1jvnp5s7mw13gw5q4w4g9qin1n1a2rn14gw0" + # TMS 审核状态 -> HCS 合同状态(CONTRACT_STATUS 必填,§9-U3 待联调确认字典值后启用) + #status-mapping: + # approved: approved + # change_approved: approved # 币种:TMS 币种码 -> HCS 币种名称(照金蝶 RMB->CNY 映射惯例) currency-name-mapping: {"RMB": "人民币"} # 合同 fdSepcailContract 固定 false(D15,配置项预留) @@ -153,7 +166,7 @@ thirdParty: attachment: # 附件转传总开关 transfer-enabled: ${HCS_ATTACHMENT_TRANSFER_ENABLED:true} - # TMS 文件服务下载基址(拉取附件流用) + # TMS 文件服务下载基址(拉取附件流用,必填否则附件转传失败) file-download-base: ${HCS_ATTACHMENT_FILE_DOWNLOAD_BASE:} # 主数据缓存(C103-6/7/12,启动/首次使用时拉取并缓存) master-data: From 25fbb89210c176a5773e6886a1f00ab67d121527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 13 Oct 2026 15:24:24 +0800 Subject: [PATCH 059/124] =?UTF-8?q?fix:=20TMS=20=E5=B8=81=E7=A7=8D?= =?UTF-8?q?=E7=A0=81=20->=20HCS=20=E5=B8=81=E7=A7=8D=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/nacos/third-party-api.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 1c3b959e..f907c119 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -113,7 +113,7 @@ thirdParty: # approved: approved # change_approved: approved # 币种:TMS 币种码 -> HCS 币种名称(照金蝶 RMB->CNY 映射惯例) - currency-name-mapping: {"RMB": "人民币"} + currency-name-mapping: {"RMB": "CNY"} # 合同 fdSepcailContract 固定 false(D15,配置项预留) special-contract-enabled: ${HCS_CONTRACT_SPECIAL_ENABLED:false} # 合同推送前是否强制客商风险校验 From 0054cbec92449408afb1a4e1c64d97e1c344d603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 13 Oct 2026 16:45:06 +0800 Subject: [PATCH 060/124] =?UTF-8?q?fix:=20TMS=20=E5=B8=81=E7=A7=8D?= =?UTF-8?q?=E7=A0=81=20->=20HCS=20=E5=B8=81=E7=A7=8D=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/support/hcs/HcsContractSyncSupport.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 0a033b98..f20107b9 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -393,7 +393,7 @@ public class HcsContractSyncSupport { fields.add(field(HcsContractFieldConstant.FIELD_FD_AMOUNT, "合同金额", toPlainString(contractManage.getContractAmount()))); fields.add(field(HcsContractFieldConstant.FIELD_AMOUNT, "合同金额", toPlainString(contractManage.getContractAmount()))); // 币种:TMS 结算币种经 currency-name-mapping 映射(默认 RMB→人民币,照金蝶惯例) - fields.add(field(HcsContractFieldConstant.FIELD_FD_CURRENCY_ID, "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); + // fields.add(field(HcsContractFieldConstant.FIELD_FD_CURRENCY_ID, "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); fields.add(field(HcsContractFieldConstant.FIELD_CURRENCY, "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); // 合同结算类型:按合同类别固定规则——承运商合同=付款,客户合同=收款(2026-10-12 确认) String settlementType = null; From f13ee1f11b624b7b5ecdc7c5bf51e8bd2fc1787a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 13 Oct 2026 17:47:32 +0800 Subject: [PATCH 061/124] =?UTF-8?q?:feat:=20HCS=E5=90=88=E5=90=8C=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E6=96=B0=E5=A2=9E=E7=BB=93=E7=AE=97=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?fdContractGwNature=E5=9B=BA=E5=AE=9A=E4=BC=A0=E5=BC=80=E5=8F=A3?= =?UTF-8?q?=E5=90=88=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/HcsContractFieldConstant.java | 17 +++++++++++++++++ .../support/hcs/HcsContractSyncSupport.java | 6 ++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java index 5dcd6fcd..5de8fa5a 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java @@ -167,6 +167,11 @@ public final class HcsContractFieldConstant { */ public static final String FIELD_FD_DESC = "fdDesc"; + /** + * 合同结算模式:open=开口合同,close=闭口合同 + */ + public static final String FIELD_FD_CONTRACT_GW_NATURE = "fdContractGwNature"; + // ==================== 结算类型枚举值 ==================== /** @@ -189,6 +194,18 @@ public final class HcsContractFieldConstant { */ public static final String SETTLEMENT_TYPE_NONE = "none"; + // ==================== 结算模式枚举值 ==================== + + /** + * 合同结算模式取值:开口合同(fdContractGwNature,TMS 固定取此值) + */ + public static final String CONTRACT_GW_NATURE_OPEN = "open"; + + /** + * 合同结算模式取值:闭口合同(fdContractGwNature) + */ + public static final String CONTRACT_GW_NATURE_CLOSE = "close"; + // ==================== 期限枚举值 ==================== /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index f20107b9..81090586 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -210,7 +210,7 @@ public class HcsContractSyncSupport { } /** - * 筛选合同「特批说明」类型附件(fileType=特批说明,业务字典 contract_attachment_type)并转传合规(C103-2), + * 筛选合同「特批附件」类型附件(fileType=特批附件,业务字典 contract_attachment_type)并转传合规(C103-2), * 返回特批附件引用(fdEntityKey=eopCdraftSpecial);无特批说明附件返回空列表(提交时已强制校验,此处由 C103-8 防御性拦截) */ private List transferSpecExplanationAttachments(ContractManage contractManage) { @@ -407,6 +407,8 @@ public class HcsContractSyncSupport { } else { log.warn("HCS合同结算类型无法确定:contractCategory=[{}] 非承运商合同/客户合同,fdSettlementType 不传", contractManage.getContractCategory()); } + // 结算模式:TMS 合同固定开口合同(open,v4 字段说明) + fields.add(field(HcsContractFieldConstant.FIELD_FD_CONTRACT_GW_NATURE, "结算模式", HcsContractFieldConstant.CONTRACT_GW_NATURE_OPEN)); // 特批流程:fdSepcailContract 固定 false(原文拼写笔误必须沿用,D15,配置项预留) fields.add(field(HcsContractFieldConstant.FIELD_FD_SEPCAIL_CONTRACT, "特批流程", hcsProperties.getContract().isSpecialContractEnabled() ? "true" : "false")); // 合同类型:ContractManage.contractCategory @@ -443,7 +445,7 @@ public class HcsContractSyncSupport { fields.add(field(HcsContractFieldConstant.FIELD_FD_DESC, "合同说明", contractManage.getRemark())); // TODO 待联调(v4 选填字段,暂不传):fdCoTakers 协办人(TMS 无对应)、fdUnderTaker/fdUnderTakerDept 承办人及部门(组织架构对象传值方式待确认)、 // fdRelations 关联合同(数组)、fdProject 关联项目 {"fdId": 合规项目ID}(对象传值方式待确认,TMS projectId 可经立项 hcs_fd_id 关联)、 - // fdContractGwNature 结算模式 open/close、fdContractAttribute 合同属性(枚举值文档未给出,TMS 无对应)、fdUrgencyLevel 紧急程度(TMS 无对应) + // fdContractAttribute 合同属性(枚举值文档未给出,TMS 无对应)、fdUrgencyLevel 紧急程度(TMS 无对应) return fields; } From ef09bfa9cd5102ff7dcaa39a8b509b189cab8450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 13 Oct 2026 18:36:07 +0800 Subject: [PATCH 062/124] =?UTF-8?q?:fix:=20=E7=89=B9=E6=89=B9=E9=99=84?= =?UTF-8?q?=E4=BB=B6=E6=A0=A1=E9=AA=8C=E5=80=BC=E4=B8=8E=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E5=AD=97=E5=85=B8=E5=AF=B9=E9=BD=90=EF=BC=8C=E5=8F=98=E6=9B=B4?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E8=A1=A5=E5=85=85=E5=BC=BA=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 提交校验判定值由「特批说明」改为「特批附件」,与业务字典 contract_attachment_type 实际选项一致,修复高风险/黑名单客商已上传特批附件仍报错的问题 - 报错文案同步与前端下拉框一致 - submitChange(变更提交/变更驳回重提交)补充同一校验,堵住变更绕过附件强校验的缺口 - 补充字典幂等脚本 blade_contract_attachment_type_dict_20261013.sql(本地为界面新增未沉淀脚本) --- .../impl/ContractManageServiceImpl.java | 2 + ...contract_attachment_type_dict_20261013.sql | 39 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 doc/sql/transport/blade_contract_attachment_type_dict_20261013.sql diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java index ec25728e..4a01aa0c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java @@ -332,6 +332,8 @@ public class ContractManageServiceImpl extends BaseServiceImpl afterData = buildContractChangeSnapshot(source); retainChangedSnapshotFields(beforeData, afterData); source.setApprovalStatus(STATUS_CHANGE_REVIEWING); diff --git a/doc/sql/transport/blade_contract_attachment_type_dict_20261013.sql b/doc/sql/transport/blade_contract_attachment_type_dict_20261013.sql new file mode 100644 index 00000000..b3d8e9ba --- /dev/null +++ b/doc/sql/transport/blade_contract_attachment_type_dict_20261013.sql @@ -0,0 +1,39 @@ +-- 合同附件类型业务字典(contract_attachment_type):合同文件/双章归档文件/特批附件。 +-- 后端高风险/黑名单客商提交校验按 fileType=特批附件 精确匹配(HcsSyncConstant#ATTACHMENT_TYPE_SPEC_EXPLANATION),缺字典会导致无法上传特批附件。 +-- 本地环境曾走界面新增,未沉淀脚本;本脚本幂等可重复执行,已存在的项跳过。 + +-- ① 字典父项:合同附件类型 +INSERT INTO blade_dict_biz (id, tenant_id, parent_id, code, dict_key, dict_value, sort, remark, is_sealed, status, is_deleted) +SELECT 2099691747182096386, '000000', 0, 'contract_attachment_type', '-1', '合同附件类型', 1, NULL, 0, 1, 0 +WHERE NOT EXISTS ( + SELECT 1 FROM blade_dict_biz + WHERE code = 'contract_attachment_type' AND dict_key = '-1' AND tenant_id = '000000' AND is_deleted = 0 +); + +-- ② 子项:parent_id 动态取父项ID,兼容各环境父项已单独创建的情况 +INSERT INTO blade_dict_biz (id, tenant_id, parent_id, code, dict_key, dict_value, sort, remark, is_sealed, status, is_deleted) +SELECT 2099691808217608194, '000000', + (SELECT id FROM blade_dict_biz WHERE code = 'contract_attachment_type' AND dict_key = '-1' AND tenant_id = '000000' AND is_deleted = 0 LIMIT 1), + 'contract_attachment_type', '合同文件', '合同文件', 1, NULL, 0, 1, 0 +WHERE NOT EXISTS ( + SELECT 1 FROM blade_dict_biz + WHERE code = 'contract_attachment_type' AND dict_key = '合同文件' AND tenant_id = '000000' AND is_deleted = 0 +); + +INSERT INTO blade_dict_biz (id, tenant_id, parent_id, code, dict_key, dict_value, sort, remark, is_sealed, status, is_deleted) +SELECT 2099691889775849473, '000000', + (SELECT id FROM blade_dict_biz WHERE code = 'contract_attachment_type' AND dict_key = '-1' AND tenant_id = '000000' AND is_deleted = 0 LIMIT 1), + 'contract_attachment_type', '双章归档文件', '双章归档文件', 1, NULL, 0, 1, 0 +WHERE NOT EXISTS ( + SELECT 1 FROM blade_dict_biz + WHERE code = 'contract_attachment_type' AND dict_key = '双章归档文件' AND tenant_id = '000000' AND is_deleted = 0 +); + +INSERT INTO blade_dict_biz (id, tenant_id, parent_id, code, dict_key, dict_value, sort, remark, is_sealed, status, is_deleted) +SELECT 2099691980955824130, '000000', + (SELECT id FROM blade_dict_biz WHERE code = 'contract_attachment_type' AND dict_key = '-1' AND tenant_id = '000000' AND is_deleted = 0 LIMIT 1), + 'contract_attachment_type', '特批附件', '特批附件', 1, NULL, 0, 1, 0 +WHERE NOT EXISTS ( + SELECT 1 FROM blade_dict_biz + WHERE code = 'contract_attachment_type' AND dict_key = '特批附件' AND tenant_id = '000000' AND is_deleted = 0 +); From 68885ab31e587532f5cd51f95fc754bd72123ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 13 Oct 2026 18:36:24 +0800 Subject: [PATCH 063/124] =?UTF-8?q?:refactor:=20=E5=90=88=E5=90=8C?= =?UTF-8?q?=E7=89=B9=E6=89=B9=E6=94=B9=E4=B8=BA=E9=9A=8F=E8=B5=B7=E8=8D=89?= =?UTF-8?q?=E6=8A=A5=E6=96=87=20fdSepcailContract=20=E5=8F=91=E8=B5=B7?= =?UTF-8?q?=EF=BC=8C=E5=88=A0=E9=99=A4=20C103-8=20=E9=93=BE=E8=B7=AF?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E6=AD=A3=E7=BB=93=E6=9E=9C=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E6=8A=A5=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - C103-8 独立特批发起接口合规未提供(联调 404):删除 IHcsClient#addSpecContract、SPEC_CONTRACT_ADD_URL、HcsSpecContractSaveDTO、applySpec 及辅助方法、人工端点 POST /hcs/contract/spec-apply - 高风险/黑名单客商合同推送时 C103-1/C103-11 报文携带 fdSepcailContract=true,合规侧随起草自动走特批流程;推送门禁与手动重推仅拦截 processing,need 存量卡单重推自愈 - 推送成功后 hangSpecReview 挂起"特批审核"(processing),含 approved/rejected 终态守卫防合规秒批回调竞态覆盖 - 特批附件随 C103-1 附件面板 eopCdraftSpecial 挂载(原全部走 eopCdraftOther) - contractLegal/result 回调报文按合规方最新字段表修正(HcsContractLegalResultDTO:contractCode/success/kingdeeId/sourceSystem=WCCK),按合同编号定位合同,success=true 联动放行、false 联动审批驳回 --- .../transport/constant/HcsSyncConstant.java | 6 +- .../controller/HcsSyncController.java | 34 +-- .../support/hcs/HcsAttachmentSupport.java | 8 +- .../hcs/HcsContractSpecSyncSupport.java | 255 +++++++----------- .../support/hcs/HcsContractSyncSupport.java | 123 +++------ ...TO.java => HcsContractLegalResultDTO.java} | 36 +-- .../org/springblade/hcs/feign/IHcsClient.java | 17 +- 7 files changed, 171 insertions(+), 308 deletions(-) rename blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/{HcsSpecContractSaveDTO.java => HcsContractLegalResultDTO.java} (55%) 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 6e4da84b..a99ec2cd 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 @@ -85,7 +85,7 @@ public final class HcsSyncConstant { public static final String CHECK_TYPE_CREDIT = "credit"; /** - * 校验类型:合同特批(C103-8 发起 / 合规特批结果推送留痕) + * 校验类型:合同特批(合规特批结果推送/查询联动留痕;原 C103-8 发起留痕随接口删除) */ public static final String CHECK_TYPE_SPEC = "spec"; @@ -176,9 +176,9 @@ public final class HcsSyncConstant { public static final String ATTACHMENT_TYPE_FIELD = "fileType"; /** - * 附件类型:特批说明(高风险/黑名单客商合同必须上传;中文匹配沿用 FILE_TYPE_SEAL_ARCHIVE="双章归档文件" 惯例) + * 附件类型:特批附件(高风险/黑名单客商合同必须上传;值取业务字典 contract_attachment_type,中文匹配沿用 FILE_TYPE_SEAL_ARCHIVE="双章归档文件" 惯例) */ - public static final String ATTACHMENT_TYPE_SPEC_EXPLANATION = "特批说明"; + public static final String ATTACHMENT_TYPE_SPEC_EXPLANATION = "特批附件"; /** * 附件类型:用印附件(双章归档文件,取值沿用 ContractManageServiceImpl#FILE_TYPE_SEAL_ARCHIVE) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index ec573299..32acee07 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -38,6 +38,7 @@ import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.dto.HcsAttachmentRefDTO; +import org.springblade.hcs.dto.HcsContractLegalResultDTO; import org.springblade.hcs.dto.HcsCurrencyVO; import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.hcs.dto.HcsTemplateVO; @@ -216,35 +217,6 @@ public class HcsSyncController { } } - /** - * 合同发起特批(C103-8,前端接入设计 §3.4):body = { contractId, attachments: [{fdId, name}] } - */ - @PostMapping("/contract/spec-apply") - @ApiOperationSupport(order = 13) - @Operation(summary = "合同发起特批", description = "C103-8:高风险客商合同特批发起,attachments 为经 /hcs/attachment/upload 上传的合规附件引用") - @SuppressWarnings("unchecked") - public R applyContractSpec(@RequestBody Map body) { - Object contractIdValue = body == null ? null : body.get("contractId"); - if (contractIdValue == null || StringUtil.isBlank(String.valueOf(contractIdValue))) { - return R.fail("contractId 不能为空"); - } - Long contractId = Long.valueOf(String.valueOf(contractIdValue)); - Object attachmentsValue = body == null ? null : body.get("attachments"); - List attachments = (attachmentsValue instanceof List list ? list : List.of()).stream() - .filter(Map.class::isInstance) - .map(item -> { - Map attachment = (Map) item; - HcsAttachmentRefDTO ref = new HcsAttachmentRefDTO(); - // 附件ID:C103-2 上传返回的合规附件ID - ref.setFdId(String.valueOf(attachment.get("fdId"))); - // 附件名 - ref.setFdFileName(attachment.get("name") == null ? null : String.valueOf(attachment.get("name"))); - return ref; - }) - .toList(); - return R.data(hcsContractSpecSyncSupport.applySpec(contractId, attachments)); - } - /** * 合同特批结果人工确认(§6-U1 过渡方案:与合规推送等效) */ @@ -266,8 +238,8 @@ public class HcsSyncController { */ @PostMapping("/contractLegal/result") @ApiOperationSupport(order = 15) - @Operation(summary = "合同特批结果回传接收", description = "合规系统推送合同特批结果,按合同ID定位并联动特批状态,原文留痕") - public R contractLegalResult(@RequestBody(required = false) HcsLegalResultDTO param) { + @Operation(summary = "合同特批结果回传接收", description = "合规系统推送合同特批(金蝶同步)结果,按合同编号定位并联动特批状态,原文留痕") + public R contractLegalResult(@RequestBody(required = false) HcsContractLegalResultDTO param) { return R.data(hcsContractSpecSyncSupport.handleLegalResult(param)); } 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 8e63c988..07bcfeb0 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 @@ -66,7 +66,7 @@ import java.util.Objects; * 任一附件转传失败 → 抛出异常由整单推送失败进补偿重试(失败原因落单据 hcs_sync_msg)。 *

    * 合同链路挂载字段 fdEntityKey(v4 枚举):主文件 approved=true → eopCdraftSign(用印)、 - * 其它附件 → eopCdraftOther、特批说明 → eopCdraftSpecial(C103-8 特批链路)。 + * 特批附件(fileType=特批附件)→ eopCdraftSpecial(随 C103-1 fdSepcailContract=true 特批流程)、其它附件 → eopCdraftOther。 * * @author Chill */ @@ -124,8 +124,10 @@ public class HcsAttachmentSupport { } } for (Map attachment : parseJsonArray(attachmentsJson)) { - attachmentRefs.add(this.transferOne(bizType, bizId, attachment, operatorLoginName, - HcsSyncConstant.CONTRACT_ATTACH_KEY_OTHER)); + // 特批附件(fileType=特批附件)挂特批面板字段,其余挂其他附件字段(2026-10-13:特批改随 C103-1 fdSepcailContract 发起) + String entityKey = HcsSyncConstant.ATTACHMENT_TYPE_SPEC_EXPLANATION.equals(attachment.get(HcsSyncConstant.ATTACHMENT_TYPE_FIELD)) + ? HcsSyncConstant.CONTRACT_ATTACH_KEY_SPECIAL : HcsSyncConstant.CONTRACT_ATTACH_KEY_OTHER; + attachmentRefs.add(this.transferOne(bizType, bizId, attachment, operatorLoginName, entityKey)); } return attachmentRefs; } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index 820df7fb..27eaaad4 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -25,20 +25,17 @@ */ package org.springblade.transport.support.hcs; -import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.StringUtil; -import org.springblade.hcs.config.HcsProperties; -import org.springblade.hcs.dto.HcsAttachmentRefDTO; +import org.springblade.hcs.dto.HcsContractDetailQueryDTO; +import org.springblade.hcs.dto.HcsContractDetailVO; +import org.springblade.hcs.dto.HcsContractLegalResultDTO; import org.springblade.hcs.dto.HcsLegalResultDTO; -import org.springblade.hcs.dto.HcsMechanismsDTO; import org.springblade.hcs.dto.HcsResult; -import org.springblade.hcs.dto.HcsSpecContractSaveDTO; -import org.springblade.hcs.dto.HcsFormSaveVO; -import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; @@ -51,15 +48,14 @@ import java.time.LocalDateTime; import java.util.List; /** - * HCS 合同特批同步支撑组件(C103-8 发起特批 / 合规特批结果推送接收,前端接入设计 §3.4) + * HCS 合同特批同步支撑组件(合规特批结果接收:contractLegal/result 推送 + C103-4 定时查询兜底 + 人工确认)。 *

    - * 业务闭环:合同推送时 C101-1 风险校验发现黑名单 → 置 hcs_spec_status=need 挂起(推送链路门禁跳过)→ - * 内部特批审批通过后,前端上传特批材料(C103-2 取合规附件ID)并发起 C103-8 → 状态 processing(流程挂起)→ - * 集团审批结果经合规 contractLegal/result 接口推送 TMS(替代未建设的 B103)→ - * approved 恢复流程,rejected 可重新发起。 + * 业务闭环(2026-10-13 起):高风险/黑名单客商合同随 C103-1/C103-11 报文 fdSepcailContract=true 在合规侧走特批流程 + * (C103-8 独立发起接口合规未提供,已删除),TMS 挂起"特批审核"(processing)→ + * 集团审批结果经合规 contractLegal/result 接口推送 TMS(替代未建设的 B103),或定时 C103-4 查询兜底联动 → + * approved 恢复流程,rejected 联动合同审批驳回。 *

    - * TODO 待联调确认(前端接入设计 §6-U1):C103-8 报文 v4 未提供,按 C106-3 模式预估(双层嵌套返回); - * 结果推送报文 {sourceSystem, requestId=合同ID, status=APPROVED/REJECTED, reason},原文留痕 blade_hcs_check_log。 + * 结果推送报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=WCCK},原文留痕 blade_hcs_check_log。 * * @author Chill */ @@ -69,9 +65,19 @@ import java.util.List; public class HcsContractSpecSyncSupport { /** - * 特批附件字段标识(照 C106-3 fd_spc_approval_attach 惯例预估,§6-U1 以合规方报文为准) + * C103-4 合同审批状态:已审批(fdApprovalStatus,小写枚举) */ - private static final String SPEC_ATTACH_ENTITY_KEY = "fd_spc_approval_attach"; + private static final String LEGAL_STATUS_APPROVED = "approved"; + + /** + * C103-4 合同审批状态:审批作废(特批驳回映射待联调确认,暂按作废联动驳回) + */ + private static final String LEGAL_STATUS_INVALID = "approvalinvalid"; + + /** + * 合同特批结果回传来源系统标识(合规方接口文档约定固定传 WCCK) + */ + private static final String LEGAL_CALLBACK_SRC_SYSTEM = "WCCK"; /** * 结果推送原文留痕最大长度(blade_hcs_check_log.msg 为 varchar(512)) @@ -79,55 +85,56 @@ public class HcsContractSpecSyncSupport { private static final int CALLBACK_MSG_MAX_LENGTH = 500; private final IHcsClient hcsClient; - private final HcsProperties hcsProperties; private final ContractManageMapper contractManageMapper; private final HcsContractCheckLogMapper hcsContractCheckLogMapper; /** - * 发起合同特批(C103-8):校验合同与特批状态 → 组装预估报文 → 回填特批流程ID,状态置 processing + * 特批结果定时查询兜底(合规推送 contractLegal/result 未达/未配置时的补偿,2026-10-13): + * 扫描特批中(processing)的合同,按 C103-4 合同详情 fdApprovalStatus 联动—— + * approved 恢复"审批通过"、approvalinvalid 联动审批驳回(特批驳回的合规侧状态待联调确认,暂按作废映射)、其余等待中跳过; + * 与结果推送互不冲突(推送先到则状态已非 processing,查询自然跳过) * - * @param contractId 合同ID - * @param attachments 特批附件引用(fdId=C103-2 合规附件ID,fdFileName=文件名) - * @return 结果描述 + * @return 结果汇总(供任务日志) */ - public String applySpec(Long contractId, List attachments) { - ContractManage contractManage = requireAppliableContract(contractId); - if (attachments == null || attachments.isEmpty()) { - throw new ServiceException("请先上传特批申请材料(含内部审批流程附件)"); + public String syncProcessingSpecResults() { + List contracts = contractManageMapper.selectList(Wrappers.lambdaQuery() + .eq(ContractManage::getHcsSpecStatus, HcsSyncConstant.SPEC_STATUS_PROCESSING) + .isNotNull(ContractManage::getHcsFdId) + .last("limit 50")); + if (contracts.isEmpty()) { + return "特批结果查询:无特批中合同"; } - HcsSpecContractSaveDTO param = new HcsSpecContractSaveDTO(); - // 【必填】操作人登录名:配置 thirdParty.hcs.operator-login-name(默认 srvadmin,§9-U2) - param.setFdLoginName(hcsProperties.getOperatorLoginName()); - // 【必填】合规合同ID:blade_contract_manage.hcs_fd_id(非名称,照 C106-3 fd_contract_name 惯例) - param.setFdContractId(requireContractFdId(contractManage)); - // 【必填】合同编号 - param.setFdContractNo(contractManage.getContractNo()); - // 【必填】单据主题:"合同特批-" + 合同编号 - param.setFdDocSubject("合同特批-" + contractManage.getContractNo()); - // 特批事由:合同名称(非必传) - param.setFdReason(contractManage.getContractName()); - // 特批附件:发起带 fdBindType=ADD(entityKey 预估照 C106-3,§6-U1) - param.setMechanisms(buildMechanisms(attachments)); - // 特批材料留痕(含合规附件ID,供重新发起与排查) - contractManage.setHcsSpecFilesJson(JSONUtil.toJsonStr(attachments)); - try { - log.info("HCS合同特批发起开始:contractNo={},附件 {} 个", contractManage.getContractNo(), attachments.size()); - // TODO 待联调(§6-U1):报文按 C106-3 模式预估,双层嵌套 data.data.fdId - HcsResult> result = hcsClient.addSpecContract(param); - String specFdId = extractNestedFdId(contractManage, result); - contractManage.setHcsSpecFdId(specFdId); - markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_PROCESSING, "C103-8 合同特批发起成功"); - writeCheckLog(contractManage, HcsSyncConstant.CHECK_RESULT_PASS, "C103-8 特批发起成功,特批流程ID=" + specFdId, result.getTraceId()); - log.info("HCS合同特批发起成功:contractNo={},specFdId={}", contractManage.getContractNo(), specFdId); - return "特批发起成功,等待集团审批"; - } catch (Exception exception) { - String message = StringUtil.isBlank(exception.getMessage()) ? "特批发起异常" : exception.getMessage(); - // 失败保持待特批(need),允许重试发起 - markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_NEED, "C103-8 特批发起失败:" + message); - writeCheckLog(contractManage, HcsSyncConstant.CHECK_RESULT_FAIL, "C103-8 特批发起失败:" + message, null); - throw exception instanceof ServiceException serviceException ? serviceException - : new ServiceException("合同特批发起失败:" + message); + int approvedCount = 0; + int rejectedCount = 0; + for (ContractManage contractManage : contracts) { + try { + HcsContractDetailQueryDTO query = new HcsContractDetailQueryDTO(); + // 【定位】合规合同ID:C103-4 fdId 与 fdNumber 二选一 + query.setFdId(contractManage.getHcsFdId()); + HcsResult result = hcsClient.contractDetail(query); + if (result == null || !result.isSuccess() || result.getData() == null) { + log.warn("HCS特批结果查询失败响应:contractNo={},{}", contractManage.getContractNo(), + result == null ? "无响应" : result.getMsg()); + continue; + } + String approvalStatus = result.getData().getFdApprovalStatus(); + if (LEGAL_STATUS_APPROVED.equalsIgnoreCase(approvalStatus)) { + syncContractOnSpecResult(contractManage, true); + markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_APPROVED, "特批结果查询联动:fdApprovalStatus=approved"); + writeCheckLog(contractManage, HcsSyncConstant.CHECK_RESULT_PASS, "特批结果查询联动:fdApprovalStatus=approved", null); + approvedCount++; + } else if (LEGAL_STATUS_INVALID.equalsIgnoreCase(approvalStatus)) { + syncContractOnSpecResult(contractManage, false); + markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_REJECTED, "特批结果查询联动:fdApprovalStatus=approvalinvalid"); + writeCheckLog(contractManage, HcsSyncConstant.CHECK_RESULT_FAIL, "特批结果查询联动:fdApprovalStatus=approvalinvalid", null); + rejectedCount++; + } + } catch (Exception exception) { + // 单条失败不影响其余,下轮扫描自动重试 + log.warn("HCS特批结果查询单条失败(下轮重试):contractNo={},{}", contractManage.getContractNo(), exception.getMessage()); + } } + return "特批结果查询:扫描 " + contracts.size() + " 单,联动通过 " + approvedCount + ",联动驳回 " + rejectedCount; } /** @@ -158,120 +165,60 @@ public class HcsContractSpecSyncSupport { } /** - * 合同特批结果接收处理(合规 contractLegal/result 推送,替代未建设的 B103,D15 回传机制): - * sourceSystem 须与 third-party.hcs.src-system 配置一致(不符抛出"来源系统标识错误"异常), - * requestId=TMS 合同ID、status=APPROVED/REJECTED, - * approved 恢复合同"审批通过"展示;rejected 联动合同审批驳回;原文全量留痕 + * 合同特批结果接收处理(合规 contractLegal/result 推送,2026-10-13 按合规方最新字段表修正报文结构): + * 特批完成后合规侧同步金蝶并回调,报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=WCCK}; + * sourceSystem 须为 WCCK(不符抛"来源系统标识错误"异常);contractCode=TMS 合同编号定位(requestId 仅请求头回显不可定位); + * success=true 联动恢复"审批通过"(kingdeeId 随留痕保存);success=false 联动合同审批驳回走重新提交闭环(reason 随原文留痕) * * @param param 合规推送报文 * @return 处理结果描述 */ - public String handleLegalResult(HcsLegalResultDTO param) { - // 来源系统校验:仅接受 third-party.hcs.src-system 配置的来源,防伪造回传 - if (!StrUtil.equalsIgnoreCase(param == null ? null : param.getSourceSystem(), hcsProperties.getSrcSystem())) { + public String handleLegalResult(HcsContractLegalResultDTO param) { + // 来源系统校验:仅接受合规方约定的 WCCK,防伪造回传 + if (!LEGAL_CALLBACK_SRC_SYSTEM.equalsIgnoreCase(param == null ? null : param.getSourceSystem())) { log.warn("合同特批结果推送来源系统标识错误:sourceSystem={}", param == null ? null : param.getSourceSystem()); throw new ServiceException("来源系统标识错误"); } - String raw = param == null ? "" : JSONUtil.toJsonStr(param); - String requestId = param == null ? null : param.getRequestId(); - ContractManage contractManage = locateContract(requestId); + String raw = JSONUtil.toJsonStr(param); + ContractManage contractManage = locateContractByNo(param.getContractCode()); if (contractManage == null) { - log.warn("合同特批结果推送未定位到合同:requestId={},报文已留痕", requestId); + log.warn("合同特批结果推送未定位到合同:contractCode={},报文已留痕", param.getContractCode()); writeCallbackLog(null, HcsSyncConstant.CHECK_RESULT_SKIP, "合同特批结果推送未定位到合同:" + raw); - return "已留痕:未定位到合同(requestId=" + requestId + ")"; + return "已留痕:未定位到合同(contractCode=" + param.getContractCode() + ")"; } - String normalizedStatus = param.getStatus() == null ? "" : param.getStatus().trim(); - boolean approved; - if (HcsSyncConstant.LEGAL_RESULT_APPROVED.equalsIgnoreCase(normalizedStatus)) { - approved = true; - } else if (HcsSyncConstant.LEGAL_RESULT_REJECTED.equalsIgnoreCase(normalizedStatus)) { - approved = false; - } else { - log.warn("合同特批结果状态未识别:contractNo={},status={},报文已留痕", contractManage.getContractNo(), param.getStatus()); - writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, "合同特批结果推送状态未识别:" + raw); - return "已留痕:状态字段未识别(contractNo=" + contractManage.getContractNo() + ")"; + if (param.getSuccess() == null) { + log.warn("合同特批结果推送 success 字段缺失:contractNo={},报文已留痕", contractManage.getContractNo()); + writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, "合同特批结果推送 success 字段缺失:" + raw); + return "已留痕:success 字段缺失(contractNo=" + contractManage.getContractNo() + ")"; } - String status = approved ? HcsSyncConstant.SPEC_STATUS_APPROVED : HcsSyncConstant.SPEC_STATUS_REJECTED; - // 特批结果联动合同审批状态(通过恢复展示,驳回联动审批驳回),随 markSpec 一并落库(reason 随原文留痕) - syncContractOnSpecResult(contractManage, approved); - markSpec(contractManage, status, "合同特批结果推送:" + raw); - writeCallbackLog(contractManage, approved ? HcsSyncConstant.CHECK_RESULT_PASS : HcsSyncConstant.CHECK_RESULT_FAIL, - "合同特批结果推送:" + raw); - log.info("合同特批结果推送处理完成:contractNo={},结果={},reason={}", contractManage.getContractNo(), status, param.getReason()); - return "特批结果已处理:" + status; + boolean success = param.getSuccess(); + // 成功:特批完成且金蝶同步成功,恢复"审批通过";kingdeeId 随 hcs_spec_msg/留痕保存 + if (success) { + syncContractOnSpecResult(contractManage, true); + markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_APPROVED, + "合同特批结果推送:金蝶同步成功,kingdeeId=" + param.getKingdeeId()); + writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_PASS, "合同特批结果推送:" + raw); + log.info("合同特批结果推送处理完成:contractNo={},结果=approved,kingdeeId={}", contractManage.getContractNo(), param.getKingdeeId()); + return "特批结果已处理:approved"; + } + // 失败:特批流程已完成但金蝶同步失败,联动合同审批驳回,走重新编辑→提交→审批→重新特批闭环(失败单独重试机制待联调确认) + syncContractOnSpecResult(contractManage, false); + markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_REJECTED, "合同特批结果推送:金蝶同步失败:" + param.getReason()); + writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_FAIL, "合同特批结果推送:" + raw); + log.info("合同特批结果推送处理完成:contractNo={},结果=rejected,reason={}", contractManage.getContractNo(), param.getReason()); + return "特批结果已处理:rejected"; } /** - * 校验可发起特批的合同:存在、审批通过、特批状态为待特批/已驳回 + * 按 ERP 合同编号定位合同(合规推送 contractCode,合同编号唯一) */ - private ContractManage requireAppliableContract(Long contractId) { - ContractManage contractManage = contractManageMapper.selectById(contractId); - if (contractManage == null) { - throw new ServiceException("合同单不存在:" + contractId); - } - if (!List.of("approved", "change_approved").contains(contractManage.getApprovalStatus())) { - throw new ServiceException("仅审批通过的合同可发起特批(当前状态:" + contractManage.getApprovalStatus() + ")"); - } - if (!List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_REJECTED).contains(contractManage.getHcsSpecStatus())) { - throw new ServiceException("仅待特批/已驳回的合同可发起特批(当前状态:" + contractManage.getHcsSpecStatus() + ")"); - } - return contractManage; - } - - /** - * 合规合同ID(合同须已推送合规回填 hcs_fd_id) - */ - private String requireContractFdId(ContractManage contractManage) { - if (StringUtil.isBlank(contractManage.getHcsFdId())) { - throw new ServiceException("合同尚未推送合规,无法发起特批(contractNo=" + contractManage.getContractNo() + ")"); - } - return contractManage.getHcsFdId(); - } - - /** - * 特批附件挂载(发起带 fdBindType=ADD) - */ - private HcsMechanismsDTO buildMechanisms(List attachments) { - HcsMechanismsDTO mechanisms = new HcsMechanismsDTO(); - mechanisms.setAttachment(attachments.stream().map(ref -> { - HcsAttachmentRefDTO attachment = new HcsAttachmentRefDTO(); - // 附件ID:C103-2 转传返回的合规附件ID - attachment.setFdId(ref.getFdId()); - // 附件名(预估字段,§6-U1) - attachment.setFdFileName(ref.getFdFileName()); - // 特批附件字段标识 - attachment.setFdEntityKey(SPEC_ATTACH_ENTITY_KEY); - // 绑定类型:发起传 ADD - attachment.setFdBindType("ADD"); - return attachment; - }).toList()); - return mechanisms; - } - - /** - * 解析 C103-8 双层嵌套返回 data.data.fdId(照 C106-3 模式预估) - */ - private String extractNestedFdId(ContractManage contractManage, HcsResult> result) { - if (result == null || !result.isSuccess() || result.getData() == null || !result.getData().isSuccess() - || result.getData().getData() == null || StringUtil.isBlank(result.getData().getData().getFdId())) { - log.error("HCS合同特批发起失败响应:{},contractNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo()); - throw new HcsException("C103-8 合同特批发起失败:" + (result == null ? "响应为空" : result.getMsg())); - } - return result.getData().getData().getFdId(); - } - - /** - * 按 TMS 合同ID 定位合同(合规推送 requestId) - */ - private ContractManage locateContract(String requestId) { - if (StringUtil.isBlank(requestId)) { - return null; - } - try { - return contractManageMapper.selectById(Long.valueOf(requestId.trim())); - } catch (NumberFormatException exception) { + private ContractManage locateContractByNo(String contractCode) { + if (StringUtil.isBlank(contractCode)) { return null; } + return contractManageMapper.selectOne(Wrappers.lambdaQuery() + .eq(ContractManage::getContractNo, contractCode.trim()) + .last("limit 1")); } /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 81090586..64ed055c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -71,8 +71,9 @@ import java.util.Objects; *

    * 扫描任务按序执行:⓪ 特批挂起门禁 → ① 客商风险校验(可配开关,仅留痕,高风险不再阻断)→ * ② 附件转传(v4 挂载点 fdFieldJson.attachment,随 C103-1 挂载)→ ③ C103-3 判重(§9-U4 查询能力联调确认)→ - * ④ C103-1 起草 / 变更单 C103-11 更新(§9-U5 定位方式待联调)→ ⑤ 高风险/黑名单自动特批 C103-8(外部客商管控, - * {@link HcsContractSpecSyncSupport},挂起"特批审核"待合规推送结果)→ ⑥ 履约规则 C103-9 行级同步({@link HcsExeStageSyncSupport})。 + * ④ C103-1 起草 / 变更单 C103-11 更新(§9-U5 定位方式待联调)→ ⑤ 高风险/黑名单挂起"特批审核" + * (外部客商管控:报文随 fdSepcailContract=true 在合规侧走特批,{@link HcsContractSpecSyncSupport} 接收结果)→ + * ⑥ 履约规则 C103-9 行级同步({@link HcsExeStageSyncSupport})。 * 结果留痕:风险校验写 blade_hcs_check_log 与合同 hcs_risk_* 字段;推送结果回填 hcs_fd_id/hcs_sync_status。 * * @author Chill @@ -103,7 +104,7 @@ public class HcsContractSyncSupport { /** * 推送合同到 HCS:特批挂起门禁 → 风险校验(仅留痕,高风险不再阻断)→ 附件转传 → 判重 → 起草/更新 → 回填合规 fdId 置 synced - * → 高风险/黑名单客商合同挂起"特批审核"并自动发起 C103-8 特批(外部客商管控) + * → 高风险/黑名单客商合同挂起"特批审核"等待合规特批结果(报文随 fdSepcailContract=true,外部客商管控) * * @param contractManage 合同单(approvalStatus 须为 approved/change_approved) * @return 推送结果描述(供任务汇总与 hcs_sync_msg 落库) @@ -112,10 +113,11 @@ public class HcsContractSyncSupport { log.info("HCS合同推送开始:contractNo={},approvalStatus={},首推={},hcsSpecStatus={}", contractManage.getContractNo(), contractManage.getApprovalStatus(), StringUtil.isBlank(contractManage.getHcsFdId()), contractManage.getHcsSpecStatus()); - // ⓪ 特批挂起门禁:待特批/特批中的合同跳过推送,等待合规推送特批结果后恢复(C103-8,前端接入设计 §3.4) - if (List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(contractManage.getHcsSpecStatus())) { + // ⓪ 特批挂起门禁:特批中(processing)的合同跳过推送,等待合规推送/定时查询特批结果后恢复; + // need(存量待特批/历史卡单)不拦截——重推时随起草报文带 fdSepcailContract=true 自愈转特批 + if (HcsSyncConstant.SPEC_STATUS_PROCESSING.equals(contractManage.getHcsSpecStatus())) { log.info("HCS合同推送跳过(特批挂起中):contractNo={},hcsSpecStatus={}", contractManage.getContractNo(), contractManage.getHcsSpecStatus()); - return "合同特批挂起中(" + contractManage.getHcsSpecStatus() + "),跳过推送"; + return "合同特批挂起中(processing),跳过推送"; } // ① 客商风险校验(可配开关):留痕 hcs_risk_* 字段并返回高风险/黑名单标志,不再阻断推送(高风险合同起草后自动转特批) boolean risky = false; @@ -132,20 +134,20 @@ public class HcsContractSyncSupport { markSynced(contractManage, existFdId, "判重命中,回填已有合规合同ID"); resultMessage = "判重命中,回填已有合规合同ID"; } else { - String fdContractId = draftContract(contractManage, attachmentRefs); + String fdContractId = draftContract(contractManage, attachmentRefs, risky); // 先持久化合规合同ID(调用方必须保存),履约规则同步失败时下轮凭其走更新补偿 markSynced(contractManage, fdContractId, "C103-1 合同发起成功"); resultMessage = "C103-1 合同发起成功"; } } else { - updateContract(contractManage); + updateContract(contractManage, risky); markSynced(contractManage, contractManage.getHcsFdId(), "C103-11 合同更新成功"); resultMessage = "C103-11 合同更新成功"; } - // ⑤ 高风险/黑名单客商(外部客商管控):C103-1 起草成功后挂起"特批审核"并自动发起 C103-8; - // 特批已通过的合同不重复发起(单次有效),发起失败保持待特批可人工重发 + // ⑤ 高风险/黑名单客商(外部客商管控):起草/更新报文已随 fdSepcailContract=true 在合规侧发起特批流程, + // 此处挂起"特批审核"等待结果(合规推送 contractLegal/result 或定时 C103-4 查询联动恢复/驳回) if (risky) { - autoApplySpecIfNeeded(contractManage); + hangSpecReview(contractManage); } // ⑥ 履约规则 C103-9 行级同步(随合同链路,§5.3;一期暂不对接默认关,打开后失败抛出由任务落 failed,下轮凭 hcs_fd_id 走更新补偿) if (!hcsProperties.getExeStage().isSyncEnabled()) { @@ -158,7 +160,7 @@ public class HcsContractSyncSupport { /** * C101-1 客商风险校验:甲乙双方各查一次,留痕 check_log 与合同 hcs_risk_* 字段; * 返回是否高风险/黑名单(风险等级=2 或任一方黑名单),不再阻断推送—— - * 推送成功后由自动特批链路挂起处理(外部客商管控,见 {@link #autoApplySpecIfNeeded}) + * 推送成功后由自动特批链路挂起处理(外部客商管控,见 {@link #}) * * @return true=高风险或黑名单客商(触发自动特批) */ @@ -181,72 +183,26 @@ public class HcsContractSyncSupport { } /** - * 高风险/黑名单客商合同自动特批(C103-8,外部客商管控):C103-1 起草成功后置待特批并自动发起, - * TMS 流程挂起展示"特批审核"(currentNode),合规推送特批结果(contractLegal/result)后恢复或驳回; - * 特批已通过(单次有效)的合同不重复发起;发起失败保持待特批仅留痕,可人工重发或重新推送兜底 + * 高风险/黑名单客商合同挂起"特批审核":合规侧特批流程已随 C103-1/C103-11 报文 fdSepcailContract=true 发起 + * (C103-8 独立发起接口合规未提供,2026-10-13 联调确认),TMS 挂起展示"特批审核"(currentNode), + * 结果经合规推送(contractLegal/result)或定时 C103-4 查询联动后恢复或驳回;特批已通过(单次有效)不再重复挂起 */ - private void autoApplySpecIfNeeded(ContractManage contractManage) { - if (HcsSyncConstant.SPEC_STATUS_APPROVED.equals(contractManage.getHcsSpecStatus())) { - log.info("HCS合同高风险/黑名单但特批已通过(单次有效),跳过自动特批:contractNo={},hcsSpecStatus={}", + private void hangSpecReview(ContractManage contractManage) { + // 终态守卫:合规回调(秒批/秒驳)先于挂起执行时,不得覆盖已落地的结果 + if (List.of(HcsSyncConstant.SPEC_STATUS_APPROVED, HcsSyncConstant.SPEC_STATUS_REJECTED).contains(contractManage.getHcsSpecStatus())) { + log.info("HCS合同高风险/黑名单但特批已有终态(单次有效),跳过挂起:contractNo={},hcsSpecStatus={}", contractManage.getContractNo(), contractManage.getHcsSpecStatus()); return; } - contractManage.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_NEED); + contractManage.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_PROCESSING); contractManage.setHcsSpecTime(LocalDateTime.now()); - contractManage.setHcsSpecMsg("高风险/黑名单客商,合同推送合规成功后自动发起特批(C103-8)"); + contractManage.setHcsSpecMsg("高风险/黑名单客商,合同报文随 fdSepcailContract=true 走合规特批流程"); // TMS 流程挂起为"特批审核",特批通过恢复展示、驳回联动合同审批驳回 contractManage.setCurrentNode(HcsSyncConstant.SPEC_REVIEW_NODE); contractManageMapper.updateById(contractManage); - log.info("HCS合同高风险/黑名单触发自动特批(C103-8):contractNo={},riskLevel={},blackStatus={},挂起节点={}", + log.info("HCS合同高风险/黑名单挂起特批审核:contractNo={},riskLevel={},blackStatus={},挂起节点={}", contractManage.getContractNo(), contractManage.getHcsRiskLevel(), contractManage.getHcsBlackStatus(), contractManage.getCurrentNode()); - try { - List attachments = transferSpecExplanationAttachments(contractManage); - hcsContractSpecSyncSupport.applySpec(contractManage.getId(), attachments); - } catch (Exception exception) { - log.warn("HCS合同自动特批发起失败(保持待特批,可人工重发):contractNo={},{}", - contractManage.getContractNo(), exception.getMessage(), exception); - } - } - - /** - * 筛选合同「特批附件」类型附件(fileType=特批附件,业务字典 contract_attachment_type)并转传合规(C103-2), - * 返回特批附件引用(fdEntityKey=eopCdraftSpecial);无特批说明附件返回空列表(提交时已强制校验,此处由 C103-8 防御性拦截) - */ - private List transferSpecExplanationAttachments(ContractManage contractManage) { - List> specAttachments = new ArrayList<>(); - for (Object item : parseJsonArray(contractManage.getAttachmentsJson())) { - if (item instanceof Map attachment - && HcsSyncConstant.ATTACHMENT_TYPE_SPEC_EXPLANATION.equals(attachment.get(HcsSyncConstant.ATTACHMENT_TYPE_FIELD))) { - specAttachments.add(attachment); - } - } - if (specAttachments.isEmpty()) { - return List.of(); - } - String specJson = JsonUtil.toJson(specAttachments); - String loginName = hcsProperties.getOperatorLoginName(); - List attachmentRefs = hcsAttachmentSupport.transferAttachments( - HcsSyncConstant.BIZ_TYPE_CONTRACT, contractManage.getId(), specJson, loginName); - for (int index = 0; index < attachmentRefs.size(); index++) { - // 特批附件字段 key:与元数据行序一致 - attachmentRefs.get(index).setFdEntityKey(HcsSyncConstant.CONTRACT_ATTACH_KEY_SPECIAL); - attachmentRefs.get(index).setFdFileName(resolveAttachmentName(specAttachments.get(index))); - } - return attachmentRefs; - } - - /** - * 附件元数据文件名(name/originalName/fileName 依次取首个非空,照 HcsAttachmentSupport 惯例) - */ - private String resolveAttachmentName(Map attachment) { - for (String field : List.of("name", "originalName", "fileName")) { - Object value = attachment.get(field); - if (value != null && !String.valueOf(value).isBlank()) { - return String.valueOf(value); - } - } - return null; } /** @@ -321,21 +277,21 @@ public class HcsContractSyncSupport { } /** - * C103-1 合同发起,返回合规合同 fdContractId + * C103-1 合同发起,返回合规合同 fdContractId;risky=true 时报文带 fdSepcailContract=true 走合规特批流程 */ - private String draftContract(ContractManage contractManage, List attachmentRefs) { - HcsContractDraftDTO param = buildDraftParam(contractManage, attachmentRefs); - log.info("HCS合同推送开始:{}(C103-1 发起,挂载附件 {} 个)", contractManage.getContractNo(), attachmentRefs.size()); + private String draftContract(ContractManage contractManage, List attachmentRefs, boolean risky) { + HcsContractDraftDTO param = buildDraftParam(contractManage, attachmentRefs, risky); + log.info("HCS合同推送开始:{}(C103-1 发起,挂载附件 {} 个,特批流程={})", contractManage.getContractNo(), attachmentRefs.size(), risky); HcsResult result = hcsClient.contractDraft(param); return validateDraftResult(contractManage, result); } /** - * C103-11 合同更新(入参同发起,v4 新增顶层 fdId 定位已有合同) + * C103-11 合同更新(入参同发起,v4 新增顶层 fdId 定位已有合同);risky=true 时报文带 fdSepcailContract=true */ - private void updateContract(ContractManage contractManage) { - HcsContractDraftDTO param = buildDraftParam(contractManage, null); - log.info("HCS合同推送开始:{}(C103-11 更新,附件不重复挂载待联调确认)", contractManage.getContractNo()); + private void updateContract(ContractManage contractManage, boolean risky) { + HcsContractDraftDTO param = buildDraftParam(contractManage, null, risky); + log.info("HCS合同推送开始:{}(C103-11 更新,附件不重复挂载待联调确认,特批流程={})", contractManage.getContractNo(), risky); HcsResult result = hcsClient.contractUpdate(param); if (result == null || !result.isSuccess()) { log.error("HCS合同更新失败响应:{},contractNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo()); @@ -347,7 +303,7 @@ public class HcsContractSyncSupport { * 组装 C103-1/C103-11 入参(字段标注照 §3.4 规范,映射表见设计文档 §5.2); * attachmentRefs 新建传合规附件引用列表(fdId+fdEntityKey,必填,无附件传空列表),更新传 null 不挂载 */ - private HcsContractDraftDTO buildDraftParam(ContractManage contractManage, List attachmentRefs) { + private HcsContractDraftDTO buildDraftParam(ContractManage contractManage, List attachmentRefs, boolean risky) { HcsContractDraftDTO param = new HcsContractDraftDTO(); // 【必填】合同ID:C103-11 更新顶层必填(传 C103-1 返回的 fdContractId),C103-1 新建不传(v4 新增) param.setFdId(contractManage.getHcsFdId()); @@ -360,7 +316,7 @@ public class HcsContractSyncSupport { // 【必填】保存类型:submit(提交) param.setSaveType("submit"); HcsContractFieldJsonDTO fieldJson = new HcsContractFieldJsonDTO(); - fieldJson.setXformFields(buildXformFields(contractManage)); + fieldJson.setXformFields(buildXformFields(contractManage, risky)); // 相对方(签署方):甲方/乙方,编号按名称反查 CustomerArchive(§9-U6) fieldJson.setSigner(buildSigners(contractManage)); // 【必填】附件数据:C103-1 必填(无附件传空列表),fdEntityKey=特批 eopCdraftSpecial/用印 eopCdraftSign/其他 eopCdraftOther, @@ -379,7 +335,7 @@ public class HcsContractSyncSupport { /** * xformFields 模板字段(字段名取 {@link HcsContractFieldConstant},中文名取自《桂物合同集成接口逻辑梳理》§5.1 合同字段说明) */ - private List buildXformFields(ContractManage contractManage) { + private List buildXformFields(ContractManage contractManage, boolean risky) { List fields = new ArrayList<>(); // 【必填】合同ID:更新时传合同发起返回的 fdContractId 的值(v4 合同字段说明) fields.add(field(HcsContractFieldConstant.FIELD_FD_ID, "合同ID", contractManage.getHcsFdId())); @@ -409,8 +365,9 @@ public class HcsContractSyncSupport { } // 结算模式:TMS 合同固定开口合同(open,v4 字段说明) fields.add(field(HcsContractFieldConstant.FIELD_FD_CONTRACT_GW_NATURE, "结算模式", HcsContractFieldConstant.CONTRACT_GW_NATURE_OPEN)); - // 特批流程:fdSepcailContract 固定 false(原文拼写笔误必须沿用,D15,配置项预留) - fields.add(field(HcsContractFieldConstant.FIELD_FD_SEPCAIL_CONTRACT, "特批流程", hcsProperties.getContract().isSpecialContractEnabled() ? "true" : "false")); + // 特批流程:高风险/黑名单客商报文带 true(合规侧随起草自动走特批流程,C103-8 独立接口未提供); + // 配置项 contract.special-contract-enabled 可强制全量走特批(原文拼写笔误必须沿用,D15) + fields.add(field(HcsContractFieldConstant.FIELD_FD_SEPCAIL_CONTRACT, "特批流程", risky || hcsProperties.getContract().isSpecialContractEnabled() ? "true" : "false")); // 合同类型:ContractManage.contractCategory fields.add(field(HcsContractFieldConstant.FIELD_CONTRACT_TYPE, "合同类型", contractManage.getContractCategory())); // 甲方名称/乙方名称:TMS 存名称字符串 @@ -515,8 +472,8 @@ public class HcsContractSyncSupport { if (!List.of("approved", "change_approved").contains(contractManage.getApprovalStatus())) { throw new ServiceException("仅审批通过的合同可推送合规(当前状态:" + contractManage.getApprovalStatus() + ")"); } - if (List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(contractManage.getHcsSpecStatus())) { - throw new ServiceException("高风险客商合同需先完成特批(C103-8,当前特批状态:" + contractManage.getHcsSpecStatus() + ")"); + if (HcsSyncConstant.SPEC_STATUS_PROCESSING.equals(contractManage.getHcsSpecStatus())) { + throw new ServiceException("合同特批审核中,禁止重推(等待合规特批结果后恢复)"); } contractManage.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); contractManage.setHcsRetryCount(0); diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecContractSaveDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractLegalResultDTO.java similarity index 55% rename from blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecContractSaveDTO.java rename to blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractLegalResultDTO.java index 24b275ba..bfb4d3ea 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecContractSaveDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractLegalResultDTO.java @@ -33,45 +33,45 @@ import java.io.Serial; import java.io.Serializable; /** - * 合同合规系统(HCS)C103-8 合同发起特批流程入参 + * 合同特批完成后合规系统回传 TMS 的结果报文(POST /hcs/contractLegal/result,iPaaS 网关 /gwzh/HTHG/contractLegal/result) *

    - * TODO 待联调确认(前端接入设计 §6-U1):C103-8 报文 v4 未提供,本 DTO 按 C106-3 结算付款特批的 - * formData/mechanisms 模式预估,字段名以合规方最新接口说明为准。 + * 报文为"合同同步结果"结构:合规特批完成后同步金蝶,回调携带金蝶同步结果; + * 定位合同用 contractCode(ERP 合同编号),requestId 仅是 X-ERP-Request-Id 请求头原样回传、不能用于定位。 * * @author Chill */ @Data @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) -public class HcsSpecContractSaveDTO implements Serializable { +public class HcsContractLegalResultDTO implements Serializable { @Serial private static final long serialVersionUID = 1L; /** - * 特批流程ID(更新必填,发起不传) + * 合同类型:deliverer=投送人;gc=钢厂;sett_center=结算中心 */ - private String fdId; + private String contractType; /** - * 【必填】操作人登录名(§9-U2) + * ERP 本次同步使用的合同编号(TMS blade_contract_manage.contract_no,定位合同用) */ - private String fdLoginName; + private String contractCode; /** - * 【必填】合规合同ID(blade_contract_manage.hcs_fd_id,非名称) + * 本次合同同步请求头 X-ERP-Request-Id,原样回传(不用于定位) */ - private String fdContractId; + private String requestId; /** - * 【必填】合同编号 + * 金蝶同步成功传 true,失败传 false */ - private String fdContractNo; + private Boolean success; /** - * 【必填】单据主题:"合同特批-" + 合同编号 + * 金蝶同步失败原因;失败时建议填写 */ - private String fdDocSubject; + private String reason; /** - * 特批事由(合同名称/特批原因,非必传) + * 金蝶实际返回的合同 ID;成功时用于保存留痕 */ - private String fdReason; + private String kingdeeId; /** - * 特批附件(C103-2 转传返回的合规附件ID 引用) + * 来源系统标识,约定传 WCCK(最长 64 字符) */ - private HcsMechanismsDTO mechanisms; + private String sourceSystem; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java index f3bee019..d34a7a89 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java @@ -55,7 +55,6 @@ import org.springblade.hcs.dto.HcsReceiptBillSaveDTO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.dto.HcsRiskQueryDTO; import org.springblade.hcs.dto.HcsRiskVO; -import org.springblade.hcs.dto.HcsSpecContractSaveDTO; import org.springblade.hcs.dto.HcsSpecPaySaveDTO; import org.springblade.hcs.dto.HcsTemplateVO; import org.springframework.cloud.openfeign.FeignClient; @@ -79,7 +78,7 @@ import org.springframework.web.multipart.MultipartFile; * * @author Chill */ -@FeignClient(name = "HCS", url = "${thirdParty.hcs.baseUrl}", configuration = HcsFeignClientConfig.class, fallbackFactory = HcsClientFallbackFactory.class) +@FeignClient(name = "HCS", url = "${thirdParty.hcs.baseUrl}", configuration = HcsFeignClientConfig.class, fallbackFactory = HcsClientFallbackFactory.class, primary = false) public interface IHcsClient { String PROJECT_ADD_URL = "${thirdParty.hcs.projectAddUrl:/openapi/sys-modeling/apis/data/km-project1/V1/projectApproval/add}"; @@ -99,7 +98,6 @@ public interface IHcsClient { String CREDIT_CHECK_URL = "${thirdParty.hcs.creditCheckUrl:/openapi/eop-cdraft/lcode/ext-cdraft/extEopCdraftMainOpen/contractCreditCheck}"; String SPEC_PAY_ADD_URL = "${thirdParty.hcs.specPayAddUrl:/openapi/sys-modeling/lcode/ext-pay-receive/extPayReceiveOpenService/addSpecApplyPay}"; String SPEC_PAY_UPDATE_URL = "${thirdParty.hcs.specPayUpdateUrl:/openapi/sys-modeling/lcode/ext-pay-receive/extPayReceiveOpenService/updateSpecApplyPay}"; - String SPEC_CONTRACT_ADD_URL = "${thirdParty.hcs.specContractAddUrl:/openapi/sys-modeling/lcode/ext-cdraft/extEopCdraftMainOpen/addSpecApplyContract}"; String PERF_RECORD_ADD_URL = "${thirdParty.hcs.perfRecordAddUrl:/openapi/sys-modeling/apis/data/km-pay-receive/V1/dataSync/add}"; String PERF_RECORD_UPDATE_URL = "${thirdParty.hcs.perfRecordUpdateUrl:/openapi/sys-modeling/apis/data/km-pay-receive/V1/dataSync/update}"; String RECEIPT_BILL_ADD_URL = "${thirdParty.hcs.receiptBillAddUrl:/openapi/sys-modeling/lcode/ext-invoice-receive/extInvoiceReceiveOpenService/addReceiveBill}"; @@ -267,19 +265,6 @@ public interface IHcsClient { @PostMapping(SPEC_PAY_UPDATE_URL) HcsResult> updateSpecApplyPay(@RequestBody HcsSpecPaySaveDTO param); - /** - * C103-8 合同发起特批流程(高风险客商签约特批) - *

    - * TODO 待联调确认(前端接入设计 §6-U1):C103-8 报文与路径均未在 v4 接口说明中定义, - * 本端点按 C106-3 结算付款特批的报文结构预估(双层嵌套 data.data 承接返回), - * 路径可经 thirdParty.hcs.specContractAddUrl 覆盖,字段以合规方最新接口说明为准。 - * - * @param param 请求参数 - * @return data.data.{fdId, fdXFormId, docViewUrl}(fdId 为特批流程ID) - */ - @PostMapping(SPEC_CONTRACT_ADD_URL) - HcsResult> addSpecContract(@RequestBody HcsSpecContractSaveDTO param); - /** * C108-1 履约记录新建 * From 08e07841b524987e82bd6fc1ca76fa816cb0a749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 13 Oct 2026 18:36:38 +0800 Subject: [PATCH 064/124] =?UTF-8?q?:feat:=20=E5=90=88=E5=90=8C=E7=89=B9?= =?UTF-8?q?=E6=89=B9=E7=BB=93=E6=9E=9C=E5=AE=9A=E6=97=B6=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=85=9C=E5=BA=95=E5=B9=B6=E5=90=8C=E6=AD=A5=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - HcsPushTask 合同任务每轮附带 syncProcessingSpecResults:扫描特批中(processing)合同调 C103-4 详情,fdApprovalStatus=approved/approvalinvalid 联动恢复/驳回,作为合规回调未达时的补偿 - 更新 2026-10-12 特批流程梳理文档:状态机、阶段 B/C/D、§五机制汇总、§六配置、§七常量对齐当前实现 - 2026-10-09 前端接入设计文档标注 spec-apply 失效说明 --- .../transport/task/HcsPushTask.java | 14 ++- .../2026-10-09-项目立项与合同HCS前端接入设计.md | 2 + ...2026-10-12-合同特批与结算付款特批流程梳理.md | 112 +++++++++--------- 3 files changed, 69 insertions(+), 59 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java index e426d80f..8f239069 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java @@ -42,6 +42,7 @@ import org.springblade.transport.pojo.entity.InvoiceApplication; import org.springblade.transport.pojo.entity.InvoiceReceipt; import org.springblade.transport.pojo.entity.PaymentApplication; import org.springblade.transport.pojo.entity.ProjectApply; +import org.springblade.transport.support.hcs.HcsContractSpecSyncSupport; import org.springblade.transport.support.hcs.HcsContractSyncSupport; import org.springblade.transport.support.hcs.HcsInvoiceRegSyncSupport; import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; @@ -104,6 +105,7 @@ public class HcsPushTask { private final InvoiceReceiptMapper invoiceReceiptMapper; private final HcsProjectSyncSupport hcsProjectSyncSupport; private final HcsContractSyncSupport hcsContractSyncSupport; + private final HcsContractSpecSyncSupport hcsContractSpecSyncSupport; private final HcsPaymentSyncSupport hcsPaymentSyncSupport; private final HcsInvoiceRegSyncSupport hcsInvoiceRegSyncSupport; private final HcsReceiptBillSyncSupport hcsReceiptBillSyncSupport; @@ -149,11 +151,19 @@ public class HcsPushTask { /** * 合同(C103)定时推送:扫描审批通过且待同步/待补偿的合同(含风险校验→附件转传→C103-1→履约规则 C103-9 行级同步), - * 独立开关与 cron 调度 + * 并对特批中(processing)的合同做 C103-4 结果查询兜底,独立开关与 cron 调度 */ @Scheduled(cron = "${thirdParty.hcs.push.contract.cron:0 1/5 * * * ?}") public void pushHcsContract() { - this.runOnce("合同", HcsSyncConstant.BIZ_TYPE_CONTRACT, contractSyncEnabled, this::pushUnsyncedContracts); + this.runOnce("合同", HcsSyncConstant.BIZ_TYPE_CONTRACT, contractSyncEnabled, this::syncHcsContracts); + } + + /** + * 合同链路组合动作:待同步合同推送 + 特批结果查询兜底(合规推送 contractLegal/result 未达时 C103-4 轮询联动) + */ + private String syncHcsContracts() { + String pushSummary = this.pushUnsyncedContracts(); + return pushSummary + ";" + hcsContractSpecSyncSupport.syncProcessingSpecResults(); } /** diff --git a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md index 22796a11..3747ff96 100644 --- a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md +++ b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md @@ -1,5 +1,7 @@ # 项目立项与合同 HCS 前端接入设计(tms-erp-web) +> **⚠️ 2026-10-13 失效说明**:C103-8 独立特批发起接口合规未提供,本文涉及的 `POST /hcs/contract/spec-apply`(发起特批)后端端点已删除;特批改随合同推送报文 `fdSepcailContract=true` 自动发起,前端只需展示特批状态(`hcs_spec_status`/`currentNode=特批审核`)与接收结果联动,无需"发起特批"按钮/弹窗。结果推送 `/hcs/contractLegal/result` 不受影响。 + > **日期**:2026-10-09 > **依据**:《桂物合同集成相关接口说明-v4.docx》、[TMS业财融合方案.docx](../TMS业财融合方案.docx)、[2026-09-27-桂物合同合规系统HCS接入技术设计.md](./2026-09-27-桂物合同合规系统HCS接入技术设计.md)、[2026-09-28-HCS接入实施状态与确认清单.md](./2026-09-28-HCS接入实施状态与确认清单.md) > **涉及工程**:`tms-api`(后端补前端代理端点)、`tms-erp-web`(前端页面与 API 模块) diff --git a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md index 236e18f2..28c40d81 100644 --- a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md +++ b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md @@ -6,6 +6,7 @@ > 关联提交:`8e6e263`(外部客商高风险黑名单管控与合同自动特批) > > **2026-10-12 变更**:原计划的 B103 推送合规方未建设,特批结果改为合规审批完成后经 iPaaS 主动推送 TMS:合同 `POST /hcs/contractLegal/result`、付款 `POST /hcs/paymentLegal/result`(报文 `{sourceSystem, requestId, status=APPROVED/REJECTED, reason}`);原推测性回调端点 `/hcs/callback/spec-result` 及 `HcsFieldConstant.SPEC_CB_*` 候选键解析已删除。见 §2.5/§4.4/§五。 +> **2026-10-13 变更**:C103-8 独立特批发起接口合规未提供(联调 404),合同特批改为随 C103-1/C103-11 报文携带 `fdSepcailContract=true` 发起(高风险/黑名单判定后置入报文);TMS 挂起"特批审核"(processing)后新增**定时 C103-4 结果查询兜底**(随合同推送任务执行,`fdApprovalStatus=approved/approvalinvalid` 联动恢复/驳回);特批附件改随 C103-1 附件面板 `eopCdraftSpecial` 挂载;附件类型判定值与业务字典对齐为「特批附件」。**C103-8 全链路代码已删除**(`IHcsClient#addSpecContract`/`HcsSpecContractSaveDTO`/`applySpec`/`POST /hcs/contract/spec-apply`)。**contractLegal/result 报文已按合规方最新字段表修正**:`{contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=WCCK}`(金蝶同步结果结构,非原假设的 status=APPROVED/REJECTED),按 `contractCode`=合同编号定位,`success=true` 联动放行(kingdeeId 留痕)/`false` 联动驳回走重新提交闭环;付款 `paymentLegal/result` 仍为旧结构,待合规方字段表后同步修正。 --- @@ -17,7 +18,7 @@ | 触发线 | HCS 接口 | 判定条件 | 触发的特批 | 作用对象 | | --- | --- | --- | --- | --- | -| 外部客商高风险/黑名单 | C101-1 风险查询 | `fdRiskLevel=2`(高风险)或 `fdBlackStatus=yes`(黑名单) | 合同特批(C103-8 发起 / contractLegal/result 结果推送) | `ContractManage`(合同) | +| 外部客商高风险/黑名单 | C101-1 风险查询 | `fdRiskLevel=2`(高风险)或 `fdBlackStatus=yes`(黑名单) | 合同特批(C103-1/C103-11 报文 `fdSepcailContract=true` 发起 / contractLegal/result 结果回调 + C103-4 定时查询兜底) | `ContractManage`(合同) | | 合同额度超额 | C106-1 额度校验 | `fdIsCredit=false`(超额) | 结算付款特批(C106-3 发起 / C106-4 更新) | `PaymentApplication`(付款申请) | 补充规则: @@ -28,13 +29,13 @@ ### 1.2 与普通审批的关系 -特批挂在 TMS 审批**之后**(合同须先审批通过并成功推送 HCS 起草,拿到 `hcs_fd_id` 后才能发起特批)。特批期间 TMS 用 `hcs_spec_status ∈ {need, processing}` + `currentNode="特批审核"` 挂起展示,推送门禁跳过;特批通过即放行,驳回则联动本地审批驳回(仅合同链路)。 +特批与合同起草**同报文发起**(高风险/黑名单客商推送时 C103-1/C103-11 报文带 `fdSepcailContract=true`,合规侧随起草自动走特批流程;C103-8 独立发起接口合规未提供,相关代码已删除)。特批期间 TMS 用 `hcs_spec_status=processing` + `currentNode="特批审核"` 挂起展示,推送门禁与手动重推均拦截;特批通过即放行,驳回则联动本地审批驳回(仅合同链路)。 ### 1.3 特批状态机(两条链路共用 `HcsSyncConstant.SPEC_STATUS_*`) ``` -none(默认) ──触发──▶ need(挂起"特批审核")──发起成功──▶ processing(HCS 流程进行中)──结果──▶ approved / rejected - └─发起失败──▶ 回落 need(仅留痕,可人工重发) +none(默认) ──高风险/黑名单随 C103-1/C103-11 带 fdSepcailContract=true──▶ processing(挂起"特批审核")──结果回调/查询──▶ approved / rejected +need(存量遗留,2026-10-13 起不再产生;重推时自愈:报文带特批标记 → 挂起转 processing) ``` - 合同特批 `approved` **单次有效**:再次推送时若已 approved 不重复发起。 @@ -42,81 +43,78 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 --- -## 二、合同特批(C103-8 发起 / contractLegal/result 结果推送) +## 二、合同特批(fdSepcailContract 随起草发起 / contractLegal/result 结果回调 + C103-4 查询兜底) ### 2.1 触发条件 外部客商高风险(风险等级=2)或黑名单,甲方或乙方任一方命中。风险判定:`HcsContractSyncSupport#checkRelativeRisk`(`HcsContractSyncSupport.java:167-183`,`risky` 判定在 :178)。 -### 2.2 阶段 A:提交校验(特批说明附件必传) +### 2.2 阶段 A:提交校验(特批附件必传) 入口 `ContractManageController`(`@RequestMapping("/contract-manage")`): -| 接口 | Service 方法 | 校验调用 | -| --- | --- | --- | -| `POST /contract-manage/submit` | `ContractManageServiceImpl#submit`(:146) | :161 | -| `POST /contract-manage/to-temporary` | `#toTemporary`(:178) | :185 | -| `POST /contract-manage/submit-formal` | `#submitFormal`(:198) | :205 | +| 接口 | Service 方法 | +| --- | --- | +| `POST /contract-manage/submit` | `ContractManageServiceImpl#submit` | +| `POST /contract-manage/to-temporary` | `#toTemporary` | +| `POST /contract-manage/submit-formal` | `#submitFormal` | +| `POST /contract-manage/submit-change`(变更提交/变更驳回重提交) | `#submitChange` | -三处均调用 `validateSpecExplanationOnSubmit`(:1048-1061): +四处均调用 `validateSpecExplanationOnSubmit`: -1. `isRiskyCustomer`(:1066-1071)→ `HcsCreditCheckSupport#queryCustomerRiskByName`(:240)→ `queryCustomerRisk`(:182-231)**实时调 C101-1**(`hcsClient.getRelativeRisk`);内部组织客商直接返回不命中;名称反查不到客商编号不阻断(:242-248)。 -2. 命中且 `attachmentsJson` 中无 `fileType=特批说明`(`attachmentType=spec_explanation`)附件 → 抛出:"合同相对方存在高风险/黑名单客商,必须上传「特批说明」类型附件后再提交审批"。 +1. `isRiskyCustomer` → `HcsCreditCheckSupport#queryCustomerRiskByName` → `queryCustomerRisk` **实时调 C101-1**(`hcsClient.getRelativeRisk`);内部组织客商直接返回不命中;名称反查不到客商编号不阻断。 +2. 命中且 `attachmentsJson` 中无 `fileType=特批附件`(业务字典 `contract_attachment_type`,2026-10-13 与字典对齐,原设计值「特批说明」字典中不存在)附件 → 抛出:"合同相对方存在高风险/黑名单客商,必须上传「特批附件」类型附件后再提交审批"。 -> 已知缺口:`submitChange`(:303)未调用该校验;`submit()` 中"变更驳回重提交"分支(:150-155)转入 `submitChange`,会绕过附件强校验——推送后自动特批链路仍会兜底挂起,但附件缺失会导致特批发起失败。 +### 2.3 阶段 B:审批通过 → 推送(报文带特批标记)→ 挂起 -### 2.3 阶段 B:审批通过 → 推送 → 自动特批 +审批通过:`POST /contract-manage/approve` → `ContractManageServiceImpl#approve`:置 `hcsSyncStatus=unsynced`(推送零埋点 ADR-0001)→ `hcsImmediatePushSupport.pushContractAfterCommit(id)`。 -审批通过:`POST /contract-manage/approve` → `ContractManageServiceImpl#approve`(:217-245):置 `hcsSyncStatus=unsynced`(:237,推送零埋点 ADR-0001)→ `hcsImmediatePushSupport.pushContractAfterCommit(id)`(:243)。 - -合同推送共 3 个入口,收敛到 `HcsContractSyncSupport#pushContract`(:113-158): +合同推送共 3 个入口,收敛到 `HcsContractSyncSupport#pushContract`: | 入口 | 位置 | 说明 | | --- | --- | --- | -| 即时推送 | `HcsImmediatePushSupport#pushContractAfterCommit`(:114) | afterCommit 异步(2 线程 daemon 池),开关 `push.immediate-enabled` 默认 false;`pushContractNow`(:178)对特批挂起中(need/processing)短路跳过(:185-188) | -| 定时扫描 | `HcsPushTask#pushHcsContract`(:155,cron 默认 `0 1/5 * * * ?`) | `pushUnsyncedContracts`(:254-278):`approvalStatus ∈ {approved, change_approved}` 且 `hcs_sync_status ∈ {unsynced, failed}` 且重试未超限 | -| 手动重推 | `HcsSyncController POST /hcs/sync/contract/{id}`(:110)→ `repushContract`(:509-530) | 特批挂起中不可推(:517-519) | +| 即时推送 | `HcsImmediatePushSupport#pushContractAfterCommit` | afterCommit 异步(2 线程 daemon 池),开关 `push.immediate-enabled` 默认 false;`pushContractNow` 对特批挂起中(processing)短路跳过 | +| 定时扫描 | `HcsPushTask#pushHcsContract`(cron 默认 `0 1/5 * * * ?`) | `pushUnsyncedContracts`:`approvalStatus ∈ {approved, change_approved}` 且 `hcs_sync_status ∈ {unsynced, failed}` 且重试未超限;同轮附带特批结果查询兜底(见 §2.5) | +| 手动重推 | `HcsSyncController POST /hcs/sync/contract/{id}` → `repushContract` | 特批审核中(processing)不可推 | -`pushContract` 内部步骤(与本文相关的 ⑤): +`pushContract` 内部步骤: ``` -⓪ 特批挂起门禁(need/processing 直接返回,:118-121) -① 风险校验仅留痕(:124-126,回写 hcs_risk_level / hcs_black_status / hcs_risk_time) -②③④ 附件转传 C103-2 / 判重 / C103-1 起草或 C103-11 更新,markSynced 回填 hcs_fd_id(:535) -⑤ risky 时 autoApplySpecIfNeeded(:190-212)——自动特批链路 +⓪ 特批挂起门禁(仅 processing 拦截;need 存量单放行自愈) +① 风险校验仅留痕(回写 hcs_risk_level / hcs_black_status / hcs_risk_time,返回 risky 标志) +②③④ 附件转传 C103-2 / 判重 / C103-1 起草或 C103-11 更新——risky=true 时报文带 fdSepcailContract=true, + 合规侧随起草/更新自动走特批流程;markSynced 回填 hcs_fd_id +⑤ risky 时 hangSpecReview:置 hcs_spec_status=processing + currentNode="特批审核"(先起草后挂起,同推送事务内完成) +⑥ 履约规则 C103-9 行级同步(一期默认关) ``` -`autoApplySpecIfNeeded`(:190-212): +`hangSpecReview` 要点: -1. 特批已通过(`hcs_spec_status=approved`,单次有效)→ 跳过(:191-195); -2. 置 `hcsSpecStatus=need` + `currentNode="特批审核"`(`SPEC_REVIEW_NODE`,:196-201)——**先挂起后特批**; -3. `transferSpecExplanationAttachments`(:218-242)筛选「特批说明」附件转传 C103-2(合规附件 ID 存入 `hcs_spec_files_json`); -4. 调 `hcsContractSpecSyncSupport.applySpec(...)`(:207)发起 C103-8;失败保持 `need` 仅留痕(:208-211),可人工经 `POST /hcs/contract/spec-apply` 重发。 +1. 终态守卫:`hcs_spec_status` 已是 approved/rejected(合规秒批/秒驳回调先于挂起执行)不再覆盖; +2. 置 `processing` + `currentNode="特批审核"` + `hcs_spec_msg` 说明,等待结果联动(§2.5)。 -> 设计要点(`HcsContractSyncSupport.java:56-58` 注释):C103-8 必须携带已起草合同的 `hcs_fd_id`,因此顺序是 **先 C103-1 起草、后 C103-8 特批**(8e6e263 调整)。 +> 设计要点:C103-8 独立发起接口合规未提供(联调 404),特批**随 C103-1/C103-11 报文** `fdSepcailContract=true` 发起(字段名原文如此,Special 拼写笔误必须沿用);原 `autoApplySpecIfNeeded`/`applySpec` 及人工端点 `POST /hcs/contract/spec-apply` 已随 C103-8 删除。 -### 2.4 阶段 C:发起特批 C103-8 +### 2.4 特批附件挂载(随 C103-1 附件面板) -`HcsContractSpecSyncSupport#applySpec`(`HcsContractSpecSyncSupport.java:92-130`): +`HcsAttachmentSupport#transferContractAttachments`:主文件(approved=true)→ `eopCdraftSign`(用印)、 +**`fileType=特批附件` → `eopCdraftSpecial`(特批面板,2026-10-13 起)**、其它附件 → `eopCdraftOther`。 +特批附件随起草报文一并挂载,合规特批流程直接引用,无独立转传步骤。 -- 前置:`requireAppliableContract`(:196-208,须审批通过 + 特批状态 need/rejected)、附件非空(:94-96)、`requireContractFdId`(:213-218,须已有 `hcs_fd_id`); -- 组装 `HcsSpecContractSaveDTO`:`fdDocSubject="合同特批-{合同编号}"`、`fdReason=合同名称`、附件 `fdEntityKey=fd_spc_approval_attach`(:97-111); -- `hcsClient.addSpecContract`(`IHcsClient.java:281`,`SPEC_CONTRACT_ADD_URL`)响应双层嵌套 `data.data.fdId` → 回填 `hcs_spec_fd_id`(:117),`markSpec` 置 `processing`(:118); -- 留痕 `blade_hcs_check_log`(biz_type=`contract`,check_type=`spec`,:335-350);失败回 `need`(:125)。 +### 2.5 阶段 D:结果联动(两条等效路径 + 定时查询兜底) -### 2.5 阶段 D:结果联动(两条等效路径) - -| 路径 | 接口 | 实现 | +| 路径 | 接口/机制 | 实现 | | --- | --- | --- | -| 合规推送 | `POST /hcs/contractLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/contractLegal/result`) | `handleLegalResult`:先校验 `sourceSystem`(不符抛"来源系统标识错误"异常)→ `requestId`=合同ID(selectById)定位 → `status=APPROVED/REJECTED` 大小写不敏感识别(其他值仅留痕)→ 原文(含 reason)留痕,报文模型 `HcsLegalResultDTO` | -| 人工确认 | `POST /hcs/contract/spec/confirm`(:251-257) | `confirmSpecResult`(:139-157,仅 processing 可确认) | +| 合规回调(主) | `POST /hcs/contractLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/contractLegal/result`) | `handleLegalResult(HcsContractLegalResultDTO)`:`sourceSystem` 须为 **WCCK**(不符抛"来源系统标识错误")→ `contractCode`=TMS 合同编号定位(`requestId` 仅 X-ERP-Request-Id 回显,不可定位)→ `success=true` 联动恢复"审批通过"(kingdeeId 随留痕保存)/ `success=false` 联动审批驳回走重新提交闭环 → 原文留痕 | +| 定时查询兜底 | `HcsPushTask#pushHcsContract` 每轮附带 → `HcsContractSpecSyncSupport#syncProcessingSpecResults` | 扫描 `hcs_spec_status=processing` 的合同,C103-4 合同详情 `fdApprovalStatus`:`approved` 联动恢复 / `approvalinvalid` 联动驳回(特批驳回的合规侧取值待联调确认);回调先到则状态已非 processing,天然跳过 | +| 人工确认 | `POST /hcs/contract/spec/confirm` | `confirmSpecResult`(仅 processing 可确认) | -联动 `syncContractOnSpecResult`(:312-320): +联动 `syncContractOnSpecResult`: -- `approved` → `currentNode="审批通过"`(C103-1 已起草,无需再推送,流程放行); -- `rejected` → `approvalStatus=rejected` + `currentNode="已驳回"`,走"重新编辑 → 提交 → 审批 → 重新特批"闭环。 +- 通过(回调 success=true / 查询 approved)→ `currentNode="审批通过"`(C103-1 已起草,无需再推送,流程放行); +- 驳回(回调 success=false / 查询 approvalinvalid)→ `approvalStatus=rejected` + `currentNode="已驳回"`,走"重新编辑 → 提交 → 审批 → 重新特批"闭环。 -`markSpec`(:325-330)回写 `hcs_spec_status`/`hcs_spec_time`/`hcs_spec_msg`,回调原文留痕。 +`markSpec` 回写 `hcs_spec_status`/`hcs_spec_time`/`hcs_spec_msg`,回调原文留痕。 ### 2.6 TMS 侧留痕字段(`blade_contract_manage`,`ContractManage.java:45`) @@ -124,7 +122,7 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 | --- | --- | --- | | `hcs_fd_id` | :213 | HCS 合同 ID(C103-1 起草回填) | | `hcs_risk_level` / `hcs_black_status` / `hcs_risk_time` | :233/:236/:239 | C101-1 风险留痕 | -| `hcs_spec_fd_id` | :242 | HCS 特批流程 ID(C103-8 回填) | +| `hcs_spec_fd_id` | :242 | HCS 特批流程 ID(原 C103-8 回填;接口删除后新流程不再产生,仅存量数据可能有值) | | `hcs_spec_status` | :246 | `none/need/processing/approved/rejected` | | `hcs_spec_time` / `hcs_spec_msg` | :249/:253 | 特批时间/信息 | | `hcs_spec_files_json` | :256 | 特批材料(含 C103-2 合规附件 ID) | @@ -237,13 +235,13 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 ## 五、推送时机与结果接收机制汇总 -| 机制 | 合同特批(C103-8/contractLegal/result) | 付款/结算付款特批(C106-3/4/paymentLegal/result) | +| 机制 | 合同特批(fdSepcailContract/contractLegal/result/C103-4 兜底) | 付款/结算付款特批(C106-3/4/paymentLegal/result) | | --- | --- | --- | -| 定时扫描 | `HcsPushTask#pushHcsContract`(默认 `0 1/5 * * * ?`) | `HcsPushTask#pushHcsPayment`(默认 `0 2/5 * * * ?`);Redis 任务锁 TTL 240s(:92)、分钟位错峰(:75-77) | +| 定时扫描 | `HcsPushTask#pushHcsContract`(默认 `0 1/5 * * * ?`,同轮附带特批结果查询兜底 `syncProcessingSpecResults`) | `HcsPushTask#pushHcsPayment`(默认 `0 2/5 * * * ?`);Redis 任务锁 TTL 240s、分钟位错峰 | | 即时推送 | `HcsImmediatePushSupport#pushContractAfterCommit`(afterCommit 异步,开关默认 false,单条锁 TTL 120s) | 无 | -| 结果推送接收 | `POST /hcs/contractLegal/result`(blade.secure 放行,requestId=合同ID,原文留痕+联动审批状态) | `POST /hcs/paymentLegal/result`(blade.secure 放行,requestId=付款申请ID,回写特批状态) | +| 结果推送接收 | `POST /hcs/contractLegal/result`(blade.secure 放行,sourceSystem=WCCK,contractCode=合同编号定位,success 联动审批状态,原文留痕) | `POST /hcs/paymentLegal/result`(blade.secure 放行,requestId=付款申请ID,回写特批状态;报文仍为旧结构待合规方字段表确认) | | 人工确认 | `POST /hcs/contract/spec/confirm` | `POST /hcs/spec-pay/confirm` | -| 手动发起/重推 | `POST /hcs/contract/spec-apply`(:226)、`POST /hcs/sync/contract/{id}`(:110) | `POST /hcs/sync/payment/{id}`(:111)、`POST /hcs/sync/payment`(:129) | +| 手动发起/重推 | `POST /hcs/sync/contract/{id}`(spec-apply 已随 C103-8 删除,2026-10-13) | `POST /hcs/sync/payment/{id}`、`POST /hcs/sync/payment` | --- @@ -251,12 +249,12 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 | 配置 | 默认 | 说明 | | --- | --- | --- | -| `contract.require-risk-check` | true | 提交时特批说明附件强校验 | +| `contract.require-risk-check` | true | 提交时特批附件强校验 | | `risk.check-on-contract` | — | 合同链路 C101-1 查询开关 | | `risk.check-on-payment` | true | 付款提交 C101-1 校验开关 | | `risk.block-blacklist` | true | 付款链路黑名单阻断(合同链路已不用于阻断) | | `credit.check-enabled` | **false** | C106-1 额度校验,一期未对接(付款特批自动触发源关闭) | -| `contract.special-contract-enabled` | false | C103-1 报文特批流程字段 `fdSepcailContract`(固定 false,D15) | +| `contract.special-contract-enabled` | false | C103-1/C103-11 报文 `fdSepcailContract` 强制 true(默认关;高风险/黑名单判定自动带 true,本开关可强制全量走特批,联调验证用) | | `push.immediate-enabled` | false | 审批通过后即时推送 | | `push.contract.sync-enabled` / `push.contract.cron` | — / `0 1/5 * * * ?` | 合同定时扫描 | | `push.payment.sync-enabled` / `push.payment.cron` | — / `0 2/5 * * * ?` | 付款定时扫描 | @@ -267,6 +265,6 @@ none(默认) ──触发──▶ need(挂起"特批审核")──发 ## 七、留痕与常量速查 - **留痕表**:`blade_hcs_check_log`(`HcsContractCheckLog.java:44`):`biz_type=contract/payment`、`check_type=risk/credit/spec`、`result`、`msg`(≤500)、`trace_id`。 -- **关键常量**(`HcsSyncConstant`):`SPEC_STATUS_NONE/NEED/PROCESSING/APPROVED/REJECTED`(:119-149)、`RISK_LEVEL_HIGH="2"`(:156)、`ATTACHMENT_TYPE_SPEC_EXPLANATION="特批说明"`(:171)、`SPEC_REVIEW_NODE="特批审核"`(:176)。 +- **关键常量**(`HcsSyncConstant`):`SPEC_STATUS_NONE/NEED/PROCESSING/APPROVED/REJECTED`(:119-149)、`RISK_LEVEL_HIGH="2"`(:156)、`ATTACHMENT_TYPE_SPEC_EXPLANATION="特批附件"`(:181,2026-10-13 与业务字典对齐)、`SPEC_REVIEW_NODE="特批审核"`(:208)。 - **合规推送结果状态**(`HcsSyncConstant`):`LEGAL_RESULT_APPROVED="APPROVED"` / `LEGAL_RESULT_REJECTED="REJECTED"`(原 B103 回调候选键常量 `HcsFieldConstant.SPEC_CB_*` 已随旧回调端点删除)。 -- **特批附件挂载键**:`fd_spc_approval_attach`(合同 C103-8 与付款 C106-3/4 共用)。 +- **特批附件挂载键**:合同特批附件随 C103-1 附件面板 `eopCdraftSpecial`(2026-10-13 起);付款 C106-3/4 特批材料仍用 `fd_spc_approval_attach`。 From d99488b999632b3507ea2c4404ae78554669b2ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 13 Oct 2026 20:05:16 +0800 Subject: [PATCH 065/124] =?UTF-8?q?:fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=98?= =?UTF-8?q?=E6=AC=BE=E7=94=B3=E8=AF=B7=E8=8D=89=E7=A8=BF=E9=87=8D=E5=AD=98?= =?UTF-8?q?=E6=97=B6=E7=BB=93=E7=AE=97=E5=85=B3=E8=81=94=E5=94=AF=E4=B8=80?= =?UTF-8?q?=E7=B4=A2=E5=BC=95=E5=86=B2=E7=AA=81=EF=BC=88=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=AE=8B=E7=95=99=E6=97=A7=E8=A1=8C=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E7=89=A9=E7=90=86=E5=88=A0=E9=99=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/PaymentApplicationSettlementMapper.java | 11 +++++++++++ .../service/impl/PaymentApplicationServiceImpl.java | 12 +++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/PaymentApplicationSettlementMapper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/PaymentApplicationSettlementMapper.java index 78e02855..29d34fa0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/PaymentApplicationSettlementMapper.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/PaymentApplicationSettlementMapper.java @@ -1,10 +1,21 @@ package org.springblade.transport.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.springblade.transport.pojo.entity.PaymentApplicationSettlement; /** 付款申请关联正式结算单 Mapper。 */ @Mapper public interface PaymentApplicationSettlementMapper extends BaseMapper { + + /** + * 按付款申请主键物理删除关联记录(表存在不含逻辑删除字段的关系唯一索引,重存前必须物理清理) + * + * @param paymentApplicationId 付款申请主键 + * @return 删除行数 + */ + @Delete("DELETE FROM blade_payment_application_settlement WHERE payment_application_id = #{paymentApplicationId}") + int deleteByPaymentApplicationId(@Param("paymentApplicationId") Long paymentApplicationId); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java index a52fcc28..fffde5e0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java @@ -325,7 +325,7 @@ private final CustomerReceiptAccountMapper receiptAccountMapper; validateProjectAdvanceContract(entity); validateSelectedBill(entity, false); validateQuota(entity); - // HCS 提交同步校验(事务内查询类同步,D15/R2-Q3):C101-1 风险(黑名单阻断)+ C106-1 额度(超额转特批) + // HCS 提交同步校验(事务内查询类同步,D15/R2-Q3):C101-1 风险(收款方外部客商高风险/黑名单须特批附件并标记待特批)+ C106-1 额度(超额转特批) hcsCreditCheckSupport.checkOnSubmit(entity); entity.setApprovalStatus(TransportBusiConstant.REVIEWING); entity.setCurrentNode("财务审核"); @@ -388,6 +388,12 @@ private final CustomerReceiptAccountMapper receiptAccountMapper; public String doSyncKingdee(Long id, KingdeeSyncContext context) { PaymentApplication entity = lockedPayment(id); if (!TransportBusiConstant.APPROVED.equals(entity.getApprovalStatus())) throw new ServiceException("仅审批通过的付款申请允许生成金蝶单据"); + // 高风险/黑名单客商付款特批门禁:待特批/特批审核中(挂起"特批审核")禁止推送金蝶, + // 特批通过(合规 paymentLegal/result 回调恢复"审批通过")后放行 + if (entity.getHcsSpecStatus() != null && List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PUSHING, + HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(entity.getHcsSpecStatus())) { + throw new ServiceException("收款方客商为高风险/黑名单,付款特批审核中(" + entity.getCurrentNode() + "),特批完成后方可推送金蝶"); + } if (KingdeeBfiConstant.KINGDEE_STATUS_SYNCED.equals(entity.getKingdeeStatus()) || KingdeeBfiConstant.KINGDEE_STATUS_PAYING.equals(entity.getKingdeeStatus()) || KingdeeBfiConstant.KINGDEE_STATUS_PAID.equals(entity.getKingdeeStatus()) @@ -1505,8 +1511,8 @@ private final CustomerReceiptAccountMapper receiptAccountMapper; private void saveSettlementRelations(PaymentApplication entity, List settlements) { if (settlements.isEmpty()) return; - settlementRelationMapper.delete(Wrappers.lambdaQuery() - .eq(PaymentApplicationSettlement::getPaymentApplicationId, entity.getId())); + // 关系唯一索引不含 is_deleted,逻辑删除会残留旧行导致重存冲突,此处必须物理删除 + settlementRelationMapper.deleteByPaymentApplicationId(entity.getId()); BigDecimal totalBase = settlements.stream().map(item -> money(item.getSettlementAmount()).subtract( cumulativeFormalSettlementApplied(item.getId(), entity.getId())).max(BigDecimal.ZERO)) .reduce(BigDecimal.ZERO, BigDecimal::add); From 30028b9e275899d2f784b8dc41783c743cd5e5ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Wed, 14 Oct 2026 10:03:10 +0800 Subject: [PATCH 066/124] =?UTF-8?q?:feat:=20=E4=BB=98=E6=AC=BE=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E6=94=B6=E6=AC=BE=E6=96=B9=E9=AB=98=E9=A3=8E=E9=99=A9?= =?UTF-8?q?=E9=BB=91=E5=90=8D=E5=8D=95=E7=BB=9F=E4=B8=80=E8=B5=B0=E7=89=B9?= =?UTF-8?q?=E6=89=B9=EF=BC=88=E7=89=B9=E6=89=B9=E9=99=84=E4=BB=B6=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C/=E7=89=B9=E6=89=B9=E5=AE=A1=E6=A0=B8=E6=8C=82?= =?UTF-8?q?=E8=B5=B7/=E7=BB=93=E6=9E=9C=E8=81=94=E5=8A=A8=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E7=8A=B6=E6=80=81/=E9=87=91=E8=9D=B6=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E9=97=A8=E7=A6=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/constant/HcsSyncConstant.java | 13 +- .../controller/HcsSyncController.java | 9 +- .../support/hcs/HcsCreditCheckSupport.java | 82 +++++-- .../support/hcs/HcsPaymentSyncSupport.java | 33 ++- .../support/hcs/HcsSpecPaySyncSupport.java | 17 +- .../springblade/hcs/config/HcsProperties.java | 4 - ...2026-10-12-合同特批与结算付款特批流程梳理.md | 71 ++++--- ...¸š务流程(前端提交-客商风险特批-同步金蝶-结果回写).md | 200 ++++++++++++++++++ doc/nacos/third-party-api.yaml | 4 +- 9 files changed, 361 insertions(+), 72 deletions(-) create mode 100644 doc/docs/业务流程/2026-10-13-付款申请全链路业务流程(前端提交-客商风险特批-同步金蝶-结果回写).md 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 a99ec2cd..e056a78a 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 @@ -124,7 +124,7 @@ public final class HcsSyncConstant { public static final String SPEC_STATUS_NONE = "none"; /** - * 特批状态:待特批(额度超额标记,扫描任务据此发起 C106-3) + * 特批状态:待特批(高风险/黑名单或额度超额标记,扫描任务据此发起 C106-3) */ public static final String SPEC_STATUS_NEED = "need"; @@ -134,17 +134,17 @@ public final class HcsSyncConstant { public static final String SPEC_STATUS_PUSHING = "pushing"; /** - * 特批状态:特批中(C106-3 已发起,结果人工确认,§9-U1) + * 特批状态:特批中(C106-3 已发起,TMS 挂起「特批审核」,等待合规 paymentLegal/result 回调) */ public static final String SPEC_STATUS_PROCESSING = "processing"; /** - * 特批状态:特批通过(人工确认) + * 特批状态:特批通过(合规回调/人工确认,联动恢复"审批通过"放行) */ public static final String SPEC_STATUS_APPROVED = "approved"; /** - * 特批状态:特批驳回(人工确认) + * 特批状态:特批驳回(合规回调/人工确认,联动付款审批驳回走重新提交闭环) */ public static final String SPEC_STATUS_REJECTED = "rejected"; @@ -180,6 +180,11 @@ public final class HcsSyncConstant { */ public static final String ATTACHMENT_TYPE_SPEC_EXPLANATION = "特批附件"; + /** + * 付款申请附件类型值:特批附件(前端付款表单附件类型枚举 attachmentType,付款附件结构与合同 fileType 结构不同) + */ + public static final String PAYMENT_ATTACH_TYPE_SPECIAL = "special_approval"; + /** * 附件类型:用印附件(双章归档文件,取值沿用 ContractManageServiceImpl#FILE_TYPE_SEAL_ARCHIVE) */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 32acee07..46956b8f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -136,11 +136,11 @@ public class HcsSyncController { } /** - * 特批结果人工确认(§9-U1 过渡方案:v4 无结果查询/回调接口) + * 特批结果人工确认(§9-U1 过渡兜底:与合规 paymentLegal/result 回调等效,均联动付款审批状态) */ @PostMapping("/spec-pay/confirm") @ApiOperationSupport(order = 3) - @Operation(summary = "特批结果人工确认", description = "传入付款申请ID与结果(approved/rejected),仅特批中(processing)允许确认") + @Operation(summary = "特批结果人工确认", description = "传入付款申请ID与结果(approved/rejected),仅特批中(processing)允许确认;approved 恢复审批通过放行,rejected 联动付款审批驳回") public R confirmSpecResult(@Parameter(description = "付款申请ID", required = true) @RequestParam Long id, @Parameter(description = "确认结果 approved/rejected", required = true) @RequestParam String result) { return R.data(hcsPaymentSyncSupport.confirmSpecResult(id, result)); @@ -248,11 +248,12 @@ public class HcsSyncController { *

    * 免登免授权同合同接口(blade.secure 放行); * iPaaS 网关注册映射:/gwzh/HTHG/paymentLegal/result → /hcs/paymentLegal/result; - * 报文同合同接口(requestId=TMS付款申请ID),付款特批结果不联动付款审批状态(§4.4)。 + * 报文 {sourceSystem, requestId=TMS付款申请ID, status=APPROVED/REJECTED, reason}, + * approved 恢复"审批通过"放行,rejected 联动付款审批驳回走重新提交闭环。 */ @PostMapping("/paymentLegal/result") @ApiOperationSupport(order = 16) - @Operation(summary = "付款特批结果回传接收", description = "合规系统推送付款特批结果,按付款申请ID定位并回写特批状态") + @Operation(summary = "付款特批结果回传接收", description = "合规系统推送付款特批结果,按付款申请ID定位并联动特批状态与付款审批状态,原文留痕") public R paymentLegalResult(@RequestBody(required = false) HcsLegalResultDTO param) { return R.data(hcsPaymentSyncSupport.handleLegalResult(param)); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java index c056cbce..1331708b 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java @@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.tool.jackson.JsonUtil; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsCreditCheckDTO; @@ -51,13 +52,17 @@ import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; import java.util.Objects; /** * HCS 付款提交校验支撑组件(C101-1 客商风险 + C106-1 额度校验,设计文档 §5.4,D15/R2-Q3) *

    * 付款申请提交(submit)事务内同步调用(查询类同步): - * ① C101-1 按收款方客商编号查风险,黑名单且 block-blacklist=true 时阻断提交; + * ① C101-1 收款方为外部客商时查风险,高风险(风险等级=2)/黑名单提示且必须上传「特批附件」, + * 并标记 hcs_spec_status=need 转付款特批链路(审批通过后扫描任务发起 C106-3,合规 paymentLegal/result 回调联动); + * 内部组织客商默认无风险不查询; * ② C106-1 校验申请金额是否超出合同额度,超额不拦截提交,置 hcs_credit_status=over 并标记 * hcs_spec_status=need 转特批链路(D15/R2-Q2)。 * 校验依赖合同已推送(hcs_fd_id 存在),未推送时按 credit.require-contract-synced 配置阻断或跳过。 @@ -87,7 +92,7 @@ public class HcsCreditCheckSupport { * @param payment 付款申请单(须含合同与收款方信息) */ public void checkOnSubmit(PaymentApplication payment) { - // ① 客商风险校验(可配开关),黑名单阻断提交 + // ① 客商风险校验(可配开关):外部客商高风险/黑名单须特批附件并标记待特批 if (hcsProperties.getRisk().isCheckOnPayment()) { checkRelativeRisk(payment); } @@ -99,35 +104,49 @@ public class HcsCreditCheckSupport { } /** - * C101-1 收款方客商风险校验:黑名单且 block-blacklist=true 时阻断提交 + * C101-1 收款方客商风险校验:仅外部客商查询,高风险/黑名单必须上传特批附件, + * 并标记 hcs_spec_status=need 转付款特批链路(不再直接阻断) */ private void checkRelativeRisk(PaymentApplication payment) { - String customerCode = queryCustomerCode(payment.getPayeeName()); - if (StringUtil.isBlank(customerCode)) { + CustomerArchive customerArchive = queryCustomerArchive(payment.getPayeeName()); + if (customerArchive == null) { writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_RISK, HcsSyncConstant.CHECK_RESULT_SKIP, "收款方[" + payment.getPayeeName() + "]反查不到客商编号,跳过风险校验(§9-U6)", null); log.warn("HCS付款提交风险校验跳过:paymentNo={},收款方反查不到客商编号", payment.getPaymentNo()); return; } + // 内部组织类型客商默认无风险,不查 C101-1(与 queryCustomerRisk 展示口径一致) + if (HcsSyncConstant.CUSTOMER_KIND_INTERNAL.equals(customerArchive.getCustomerKind())) { + writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_RISK, HcsSyncConstant.CHECK_RESULT_SKIP, + "收款方[" + payment.getPayeeName() + "]为内部组织客商,默认无风险跳过校验", null); + return; + } HcsRiskQueryDTO param = new HcsRiskQueryDTO(); // 【必填】客商编号:按收款方名称反查 CustomerArchive 客商编码(用哪个编码待联调,§9-U6) - param.setFdNumber(customerCode); + param.setFdNumber(customerArchive.getCustomerCode()); HcsResult result = hcsClient.getRelativeRisk(param); if (result == null || !result.isSuccess()) { log.error("HCS客商风险查询失败响应:{},paymentNo={},fdNumber={}", - result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), payment.getPaymentNo(), customerCode); + result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), payment.getPaymentNo(), customerArchive.getCustomerCode()); throw new HcsException("C101-1 客商风险查询失败:" + (result == null ? "响应为空" : result.getMsg())); } HcsRiskVO risk = result.getData(); String blackStatus = risk == null ? null : risk.getFdBlackStatus(); - boolean blacklist = BLACK_STATUS_YES.equalsIgnoreCase(blackStatus); - writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_RISK, blacklist ? HcsSyncConstant.CHECK_RESULT_FAIL : HcsSyncConstant.CHECK_RESULT_PASS, - "收款方[" + payment.getPayeeName() + "]黑名单=" + blackStatus + ",风险等级=" + (risk == null ? null : risk.getFdRiskLevel()), + String riskLevel = risk == null ? null : risk.getFdRiskLevel(); + boolean risky = HcsSyncConstant.RISK_LEVEL_HIGH.equals(riskLevel) || BLACK_STATUS_YES.equalsIgnoreCase(blackStatus); + writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_RISK, risky ? HcsSyncConstant.CHECK_RESULT_FAIL : HcsSyncConstant.CHECK_RESULT_PASS, + "收款方[" + payment.getPayeeName() + "]黑名单=" + blackStatus + ",风险等级=" + riskLevel + ",高风险/黑名单=" + risky, result.getTraceId()); - if (blacklist && hcsProperties.getRisk().isBlockBlacklist()) { - log.error("HCS付款提交被风险校验阻断:paymentNo={},收款方[{}]黑名单", payment.getPaymentNo(), payment.getPayeeName()); - throw new ServiceException("收款方客商黑名单,禁止提交付款申请"); + if (!risky) { + return; } + // 高风险/黑名单:必须上传「特批附件」类型附件(提示阻断),并标记待特批(审批通过后推送 C106-3); + // 清空旧特批流程ID:特批单次有效,重新提交须重新发起 C106-3(否则会 C106-4 更新旧驳回单) + if (!hasSpecAttachment(payment.getAttachmentsJson())) { + throw new ServiceException("收款方[" + payment.getPayeeName() + "]为高风险/黑名单客商,必须上传「特批附件」类型附件后再提交审批"); + } + payment.setHcsSpecFdId(null); + payment.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_NEED); } /** @@ -249,19 +268,50 @@ public class HcsCreditCheckSupport { } /** - * 按名称反查客商编码(照 KingdeeApBillSyncSupport#queryCustomerCode 惯例,查不到返回 null) + * 按名称反查客商档案(内部/外部类型判断与客商编码获取共用;查不到返回 null) */ - private String queryCustomerCode(String customerName) { + private CustomerArchive queryCustomerArchive(String customerName) { if (StringUtil.isBlank(customerName)) { return null; } - CustomerArchive customerArchive = customerArchiveMapper.selectOne(Wrappers.lambdaQuery() + return customerArchiveMapper.selectOne(Wrappers.lambdaQuery() .and(wrapper -> wrapper.eq(CustomerArchive::getFullName, customerName).or().eq(CustomerArchive::getShortName, customerName)) .eq(CustomerArchive::getIsDeleted, 0) .last("limit 1")); + } + + /** + * 按名称反查客商编码(照 KingdeeApBillSyncSupport#queryCustomerCode 惯例,查不到返回 null) + */ + private String queryCustomerCode(String customerName) { + CustomerArchive customerArchive = queryCustomerArchive(customerName); return customerArchive == null ? null : customerArchive.getCustomerCode(); } + /** + * 附件中是否已上传特批附件(付款附件结构 attachmentType=special_approval,即前端付款表单「特批附件」类型; + * 兼容 fileType=特批附件 结构;口径同合同提交校验 validateSpecExplanationOnSubmit) + */ + private boolean hasSpecAttachment(String attachmentsJson) { + if (StringUtil.isBlank(attachmentsJson)) { + return false; + } + try { + Object parsed = JsonUtil.parse(attachmentsJson, List.class); + if (!(parsed instanceof List attachments)) { + return false; + } + return attachments.stream().filter(Map.class::isInstance).map(Map.class::cast) + .anyMatch(attachment -> HcsSyncConstant.PAYMENT_ATTACH_TYPE_SPECIAL + .equals(Objects.toString(attachment.get("attachmentType"), null)) + || HcsSyncConstant.ATTACHMENT_TYPE_SPEC_EXPLANATION + .equals(Objects.toString(attachment.get(HcsSyncConstant.ATTACHMENT_TYPE_FIELD), null))); + } catch (Exception exception) { + log.error("HCS付款提交附件JSON解析失败:按未上传特批附件处理", exception); + return false; + } + } + /** * 校验留痕(blade_hcs_check_log,异常不影响主流程) */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java index 516e90cc..87e33e70 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java @@ -33,6 +33,7 @@ import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.constant.TransportBusiConstant; import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.pojo.entity.PaymentApplication; import org.springframework.stereotype.Component; @@ -43,8 +44,10 @@ import java.util.List; /** * HCS 付款链推送编排支撑组件(结算付款特批 C106-3/4 + 履约记录 C108-1/2 + 特批结果推送接收,设计文档 §5.0/§5.5/§5.6) *

    - * 编排顺序:特批(额度超额标记 need 时发起)→ 履约记录(审批通过新建 / 实际付款推进更新)。 + * 编排顺序:特批(提交时高风险/黑名单须特批附件或额度超额标记 need 时发起)→ 履约记录(审批通过新建 / 实际付款推进更新)。 * 特批流程ID 与履约记录ID 在各自 Support 内即时持久化;整体同步状态(hcs_sync_status)由本组件统一回写。 + * 特批发起后 TMS 挂起 currentNode="特批审核",合规 paymentLegal/result 回调联动付款审批状态 + * (通过恢复"审批通过"放行 / 驳回联动审批驳回走重新提交闭环),人工确认等效兜底。 * * @author Chill */ @@ -71,7 +74,7 @@ public class HcsPaymentSyncSupport { */ public String pushPayment(PaymentApplication payment) { StringBuilder result = new StringBuilder(); - // ① 结算付款特批:提交时额度超额(hcs_spec_status=need)且未发起时发起 C106-3(C106-1 暂不对接后无自动置 need,仅历史数据/人工场景可达) + // ① 结算付款特批:提交时高风险/黑名单(须特批附件)或额度超额(hcs_spec_status=need)且未发起时发起 C106-3 if (HcsSyncConstant.SPEC_STATUS_NEED.equals(payment.getHcsSpecStatus())) { result.append(hcsSpecPaySyncSupport.pushSpecPay(payment)); } @@ -115,7 +118,7 @@ public class HcsPaymentSyncSupport { } /** - * 特批结果人工确认(§9-U1 过渡方案:v4 无结果查询/回调接口) + * 特批结果人工确认(页面确认与合规 paymentLegal/result 回调等效,§9-U1 过渡兜底) * * @param id 付款申请单ID * @param result confirmed approved / rejected @@ -132,6 +135,8 @@ public class HcsPaymentSyncSupport { if (!HcsSyncConstant.SPEC_STATUS_PROCESSING.equals(payment.getHcsSpecStatus())) { throw new ServiceException("仅特批中的付款申请允许确认结果(当前状态:" + payment.getHcsSpecStatus() + ")"); } + // 特批结果联动付款审批状态(通过恢复放行 / 驳回联动审批驳回),随 updateById 一并落库 + syncPaymentOnSpecResult(payment, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(result)); payment.setHcsSpecStatus(result); paymentApplicationMapper.updateById(payment); log.info("HCS特批结果人工确认:paymentNo={},specFdId={},结果={}", payment.getPaymentNo(), payment.getHcsSpecFdId(), result); @@ -139,10 +144,11 @@ public class HcsPaymentSyncSupport { } /** - * 付款特批结果接收处理(合规 paymentLegal/result 推送,替代未建设的 B103,D15 回传机制): + * 付款特批结果接收处理(合规 paymentLegal/result 回调通知特批审批结果): * sourceSystem 须与 third-party.hcs.src-system 配置一致(不符抛出"来源系统标识错误"异常), * requestId=TMS 付款申请ID、status=APPROVED/REJECTED; - * 付款特批结果不联动付款审批状态(§4.4),仅回写 hcs_spec_status + * 特批结果联动付款审批状态:approved 恢复"审批通过"放行(后续金蝶推送放行), + * rejected 联动付款审批驳回(returned),走"重新编辑→提交→审批→重新特批"闭环 * * @param param 合规推送报文 * @return 处理结果描述 @@ -169,12 +175,29 @@ public class HcsPaymentSyncSupport { log.warn("付款特批结果状态未识别:paymentNo={},status={},reason={}", payment.getPaymentNo(), param.getStatus(), param.getReason()); return "状态字段未识别(paymentNo=" + payment.getPaymentNo() + ")"; } + syncPaymentOnSpecResult(payment, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(status)); payment.setHcsSpecStatus(status); paymentApplicationMapper.updateById(payment); log.info("付款特批结果推送处理完成:paymentNo={},结果={},reason={}", payment.getPaymentNo(), status, param.getReason()); return "特批结果已处理:" + status; } + /** + * 特批结果联动付款审批状态(handleLegalResult 与 confirmSpecResult 共用,仅改字段,随 updateById 落库): + * approved 恢复"审批通过"展示并放行(审批状态保持 approved,金蝶推送门禁解除); + * rejected 联动付款审批驳回(returned + "已驳回"),走重新编辑→提交→审批→重新特批闭环 + * (提交时重新校验收款方风险与特批附件) + */ + private void syncPaymentOnSpecResult(PaymentApplication payment, boolean approved) { + if (approved) { + payment.setCurrentNode("审批通过"); + } else { + payment.setApprovalStatus(TransportBusiConstant.RETURNED); + payment.setCurrentNode("已驳回"); + payment.setCurrentProcessor("待处理"); + } + } + /** * 按 TMS 付款申请ID 定位付款申请(合规推送 requestId) */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java index 09e8d863..a9fdcfa9 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java @@ -30,32 +30,33 @@ import lombok.extern.slf4j.Slf4j; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsAttachmentRefDTO; +import org.springblade.hcs.dto.HcsFormSaveVO; import org.springblade.hcs.dto.HcsMechanismsDTO; import org.springblade.hcs.dto.HcsResult; -import org.springblade.hcs.dto.HcsFormSaveVO; import org.springblade.hcs.dto.HcsSpecPayFormDataDTO; import org.springblade.hcs.dto.HcsSpecPayPropsDTO; import org.springblade.hcs.dto.HcsSpecPaySaveDTO; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.PaymentApplication; -import org.springblade.transport.mapper.ContractManageMapper; import org.springframework.stereotype.Component; import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.List; /** * HCS 结算付款特批同步支撑组件(C106-3 发起 / C106-4 更新,设计文档 §5.5) *

    - * 触发:付款申请审批通过且 hcs_spec_status=need(提交时额度超额标记)→ 扫描任务发起 C106-3, - * 返回 data.data.fdId(双层嵌套)→ hcs_spec_fd_id,状态置 processing; + * 触发:付款申请提交时收款方外部客商高风险/黑名单(须特批附件)或额度超额标记 hcs_spec_status=need + * → 审批通过后扫描任务发起 C106-3,返回 data.data.fdId(双层嵌套)→ hcs_spec_fd_id,状态置 processing + * 并挂起 currentNode="特批审核"; * 单据变更且特批流程存在时走 C106-4(顶层 fdId=hcs_spec_fd_id,附件不带 fdBindType)。 - * 特批结果:v4 无结果查询/回调接口,approved/rejected 一期由页面人工确认(§9-U1)。 + * 特批结果:合规 paymentLegal/result 回调联动付款审批状态(通过放行/驳回联动审批驳回), + * 页面人工确认等效兜底(§9-U1)。 * * @author Chill */ @@ -91,8 +92,10 @@ public class HcsSpecPaySyncSupport { String specFdId = extractNestedFdId(payment, result); payment.setHcsSpecFdId(specFdId); payment.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_PROCESSING); + // TMS 流程挂起展示:等待合规 paymentLegal/result 回调联动付款审批状态(与合同链路 hangSpecReview 口径一致) + payment.setCurrentNode(HcsSyncConstant.SPEC_REVIEW_NODE); paymentApplicationMapper.updateById(payment); - log.info("HCS结算付款特批发起成功:paymentNo={},specFdId={}", payment.getPaymentNo(), specFdId); + log.info("HCS结算付款特批发起成功:paymentNo={},specFdId={},挂起「{}」", payment.getPaymentNo(), specFdId, HcsSyncConstant.SPEC_REVIEW_NODE); return "C106-3 特批发起成功"; } // C106-4 更新:顶层 fdId 必填,内层无业务数据,以内层 success 判断 diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 8230051c..301a44a5 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -216,10 +216,6 @@ public class HcsProperties { * 付款提交前风险校验开关 */ private boolean checkOnPayment = true; - /** - * 黑名单是否阻断(合同置 failed / 付款提交拦截) - */ - private boolean blockBlacklist = true; } @Data diff --git a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md index 28c40d81..226669cb 100644 --- a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md +++ b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md @@ -4,9 +4,11 @@ > 涉及模块:`blade-service/blade-transport`(业务编排/状态留痕)、`blade-third-party-api/blade-hcs-api`(Feign 客户端 + DTO + 配置) > 关联设计文档:`doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md`(§九)、`2026-09-27-桂物合同合规系统HCS接入技术设计.md`(§5.4/§5.5) > 关联提交:`8e6e263`(外部客商高风险黑名单管控与合同自动特批) +> 付款申请全链路(前端提交 → 风险/特批 → 同步金蝶 → 结果回写)专项梳理:`doc/docs/业务流程/2026-10-13-付款申请全链路业务流程(前端提交-客商风险特批-同步金蝶-结果回写).md` > > **2026-10-12 变更**:原计划的 B103 推送合规方未建设,特批结果改为合规审批完成后经 iPaaS 主动推送 TMS:合同 `POST /hcs/contractLegal/result`、付款 `POST /hcs/paymentLegal/result`(报文 `{sourceSystem, requestId, status=APPROVED/REJECTED, reason}`);原推测性回调端点 `/hcs/callback/spec-result` 及 `HcsFieldConstant.SPEC_CB_*` 候选键解析已删除。见 §2.5/§4.4/§五。 > **2026-10-13 变更**:C103-8 独立特批发起接口合规未提供(联调 404),合同特批改为随 C103-1/C103-11 报文携带 `fdSepcailContract=true` 发起(高风险/黑名单判定后置入报文);TMS 挂起"特批审核"(processing)后新增**定时 C103-4 结果查询兜底**(随合同推送任务执行,`fdApprovalStatus=approved/approvalinvalid` 联动恢复/驳回);特批附件改随 C103-1 附件面板 `eopCdraftSpecial` 挂载;附件类型判定值与业务字典对齐为「特批附件」。**C103-8 全链路代码已删除**(`IHcsClient#addSpecContract`/`HcsSpecContractSaveDTO`/`applySpec`/`POST /hcs/contract/spec-apply`)。**contractLegal/result 报文已按合规方最新字段表修正**:`{contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=WCCK}`(金蝶同步结果结构,非原假设的 status=APPROVED/REJECTED),按 `contractCode`=合同编号定位,`success=true` 联动放行(kingdeeId 留痕)/`false` 联动驳回走重新提交闭环;付款 `paymentLegal/result` 仍为旧结构,待合规方字段表后同步修正。 +> **2026-10-13 付款链路变更**:按最新需求,付款链路黑名单**不再直接阻断**,与高风险统一走特批:提交时收款方为**外部客商**(`CustomerArchive.customerKind≠internal`)才查 C101-1,高风险(`fdRiskLevel=2`)/黑名单(`fdBlackStatus=yes`)→ 提示且**必须上传「特批附件」**(付款附件结构 `attachmentType=special_approval`,缺失抛异常)+ 标记 `hcs_spec_status=need`(不再依赖 C106-1 额度超额这一唯一触发源);审批通过后扫描任务发起 C106-3,TMS 挂起 `currentNode="特批审核"`;合规审批完成后**回调 `paymentLegal/result`** 通知结果,`APPROVED` 恢复"审批通过"放行、`REJECTED` 联动付款审批驳回(returned)走重新提交闭环,页面人工确认等效兜底;特批审核中(need/pushing/processing)**禁止推送金蝶**(`doSyncKingdee` 门禁);前端付款表单同步增加收款方 C101-1 风险查询提示与特批附件提交校验。`risk.block-blacklist` 配置及 Nacos 项已删除。见 §三/§4.4。 --- @@ -19,27 +21,29 @@ | 触发线 | HCS 接口 | 判定条件 | 触发的特批 | 作用对象 | | --- | --- | --- | --- | --- | | 外部客商高风险/黑名单 | C101-1 风险查询 | `fdRiskLevel=2`(高风险)或 `fdBlackStatus=yes`(黑名单) | 合同特批(C103-1/C103-11 报文 `fdSepcailContract=true` 发起 / contractLegal/result 结果回调 + C103-4 定时查询兜底) | `ContractManage`(合同) | -| 合同额度超额 | C106-1 额度校验 | `fdIsCredit=false`(超额) | 结算付款特批(C106-3 发起 / C106-4 更新) | `PaymentApplication`(付款申请) | +| 收款方外部客商高风险/黑名单 | C101-1 风险查询 | 同上判定(仅收款方,`customerKind=internal` 内部客商不查) | 结算付款特批(提交校验特批附件 + 标记 need → C106-3 发起 / C106-4 更新 / paymentLegal/result 回调联动付款审批状态) | `PaymentApplication`(付款申请) | +| 合同额度超额 | C106-1 额度校验 | `fdIsCredit=false`(超额) | 结算付款特批(同上链路) | `PaymentApplication`(付款申请) | 补充规则: -- **内部组织客商不查**:`CustomerArchive.customerKind=internal` 默认无风险(`HcsSyncConstant.CUSTOMER_KIND_INTERNAL`)。 +- **内部组织客商不查**:`CustomerArchive.customerKind=internal` 默认无风险(`HcsSyncConstant.CUSTOMER_KIND_INTERNAL`),合同链路(甲/乙方)与付款链路(收款方)口径一致。 - **甲/乙任一方命中即整单管控**(`HcsSyncConstant.java:151-176`)。 -- **付款链路中黑名单不是特批而是直接阻断**:`risk.block-blacklist=true`(默认)时提交付款申请直接抛异常,不走特批。 +- **付款链路高风险/黑名单不再阻断**(2026-10-13 起):提示且必须上传「特批附件」,标记 need 走 C106-3 特批;原 `risk.block-blacklist` 阻断配置已删除。 ### 1.2 与普通审批的关系 -特批与合同起草**同报文发起**(高风险/黑名单客商推送时 C103-1/C103-11 报文带 `fdSepcailContract=true`,合规侧随起草自动走特批流程;C103-8 独立发起接口合规未提供,相关代码已删除)。特批期间 TMS 用 `hcs_spec_status=processing` + `currentNode="特批审核"` 挂起展示,推送门禁与手动重推均拦截;特批通过即放行,驳回则联动本地审批驳回(仅合同链路)。 +特批与合同起草**同报文发起**(高风险/黑名单客商推送时 C103-1/C103-11 报文带 `fdSepcailContract=true`,合规侧随起草自动走特批流程;C103-8 独立发起接口合规未提供,相关代码已删除)。特批期间 TMS 用 `hcs_spec_status=processing` + `currentNode="特批审核"` 挂起展示,推送门禁与手动重推均拦截;特批通过即放行,驳回则联动本地审批驳回(合同与付款链路均已联动)。付款链路另在特批审核中(need/pushing/processing)**禁止推送金蝶**,特批通过后放行。 ### 1.3 特批状态机(两条链路共用 `HcsSyncConstant.SPEC_STATUS_*`) ``` none(默认) ──高风险/黑名单随 C103-1/C103-11 带 fdSepcailContract=true──▶ processing(挂起"特批审核")──结果回调/查询──▶ approved / rejected +none(默认) ──付款提交高风险/黑名单须特批附件 / 额度超额──▶ need ──审批通过后扫描 C106-3──▶ processing(挂起"特批审核")──paymentLegal/result 回调──▶ approved / rejected need(存量遗留,2026-10-13 起不再产生;重推时自愈:报文带特批标记 → 挂起转 processing) ``` - 合同特批 `approved` **单次有效**:再次推送时若已 approved 不重复发起。 -- 付款特批 `approved/rejected` **不联动付款审批状态**(无驳回联动),仅人工确认。 +- 付款特批结果**联动付款审批状态**(2026-10-13 起):`approved` 恢复"审批通过"放行(金蝶推送门禁解除);`rejected` 联动付款审批驳回(`approvalStatus=returned` + `currentNode="已驳回"`),走"重新编辑→提交→审批→重新特批"闭环。 --- @@ -132,26 +136,33 @@ need(存量遗留,2026-10-13 起不再产生;重推时自愈:报文带 ## 三、付款特批(付款申请提交触发侧) -### 3.1 入口与触发 +### 3.1 入口与触发(2026-10-13 起两类触发源) -`PaymentApplicationController`(`/payment-application`)`POST /submit` → `PaymentApplicationServiceImpl#submit`(`PaymentApplicationServiceImpl.java:316-335`),事务内 :329 调 `HcsCreditCheckSupport#checkOnSubmit(entity)`(`HcsCreditCheckSupport.java:89-99`),依次执行两项校验: +`PaymentApplicationController`(`/payment-application`)`POST /submit` → `PaymentApplicationServiceImpl#submit`,事务内调 `HcsCreditCheckSupport#checkOnSubmit(entity)`(`HcsCreditCheckSupport.java:94-108`),依次执行两项校验: -**① C101-1 收款方风险校验**(开关 `risk.check-on-payment` 默认 true,:91) +**① C101-1 收款方风险校验**(开关 `risk.check-on-payment` 默认 true,:95-98) -- `checkRelativeRisk`(:104-131):按收款方 `payeeName` 反查 `CustomerArchive` 客商编号 → C101-1 实时查询; -- **黑名单且 `risk.block-blacklist=true`(默认 true)→ 直接阻断**:抛"收款方客商黑名单,禁止提交付款申请"(:127-129)——付款链路黑名单不走特批; -- 反查不到客商编号记 skip 留痕、不阻断(:106-110)。 +- `checkRelativeRisk`(:110-148):按收款方 `payeeName` 反查 `CustomerArchive`: + - 反查不到客商档案 → skip 留痕、不阻断(:111-117); + - **内部组织客商(`customerKind=internal`)默认无风险,不调 C101-1**(:119-124); + - 外部客商按客商编号实时调 C101-1,高风险(`fdRiskLevel=2`)或黑名单(`fdBlackStatus=yes`)判定 risky(:136); +- **risky 时两步管控(不再直接阻断)**: + 1. **特批附件必传**:`attachmentsJson` 中无 `attachmentType=special_approval`(前端付款表单「特批附件」类型,兼容 `fileType=特批附件` 旧结构)附件 → 抛"收款方[xxx]为高风险/黑名单客商,必须上传「特批附件」类型附件后再提交审批"(`hasSpecAttachment`,:295-313); + 2. **标记待特批**:`hcs_spec_status=need` 并清空旧 `hcs_spec_fd_id`(特批单次有效,重新提交须重新发起 C106-3,:149-151)——审批通过后扫描任务发起 C106-3。 -**② C106-1 合同额度校验**(开关 `credit.check-enabled` 默认 false,**一期未对接**,:95-97) +**② C106-1 合同额度校验**(开关 `credit.check-enabled` 默认 false,**一期未对接**,:100-103) -- `checkCredit`(:136-172):要求合同已推送(有 `hcs_fd_id`,:138-145)→ `hcsClient.contractCreditCheck`(:151); -- `fdIsCredit=true`(额度内)→ `hcs_credit_status=pass`(:160); -- **超额不拦截提交** → `hcs_credit_status=over` + `hcs_credit_msg` + **`hcs_spec_status=need`**(:167-169)——这是付款特批的唯一自动触发点。 +- `checkCredit`:要求合同已推送(有 `hcs_fd_id`)→ `hcsClient.contractCreditCheck`; +- `fdIsCredit=true`(额度内)→ `hcs_credit_status=pass`; +- **超额不拦截提交** → `hcs_credit_status=over` + `hcs_credit_msg` + **`hcs_spec_status=need`**。 -### 3.2 后续流转 +### 3.2 后续流转(审批通过 → 推送特批 → 挂起 → 回调联动) -- 审批通过:`#approve`(:353-362)置 `hcs_sync_status=unsynced`(:359,零埋点 ADR-0001); -- **付款链没有即时推送**(`HcsImmediatePushSupport` 仅覆盖 project/contract),完全依赖定时扫描/手动端点(见 §四)。 +- 审批通过:`#approve` 置 `hcs_sync_status=unsynced`(零埋点 ADR-0001); +- **付款链没有即时推送**(`HcsImmediatePushSupport` 仅覆盖 project/contract),完全依赖定时扫描/手动端点(见 §四); +- 扫描任务对 `hcs_spec_status=need` 的已审批单发起 C106-3 → 成功后 `processing` + **挂起 `currentNode="特批审核"`**(`HcsSpecPaySyncSupport#pushSpecPay`); +- **特批审核中(need/pushing/processing)禁止推送金蝶**:`PaymentApplicationServiceImpl#doSyncKingdee` 门禁抛"收款方客商为高风险/黑名单,付款特批审核中…特批完成后方可推送金蝶"; +- 合规审批完成后**回调 `paymentLegal/result`**(见 §4.4):`APPROVED` → 恢复"审批通过"放行(金蝶门禁解除);`REJECTED` → 联动付款审批驳回(`approvalStatus=returned` + `currentNode="已驳回"`),走"重新编辑→提交→审批→重新特批"闭环(提交时重新校验风险与特批附件)。 ### 3.3 TMS 侧留痕字段(`blade_payment_application`,`PaymentApplication.java:41`) @@ -161,6 +172,7 @@ need(存量遗留,2026-10-13 起不再产生;重推时自愈:报文带 | `hcs_credit_status` | :135 | `pass`(额度内)/ `over`(超额) | | `hcs_credit_msg` / `hcs_credit_time` | :137/:139 | 额度校验信息 | | `hcs_spec_fd_id` / `hcs_spec_status` | :141/:142 | 特批流程 ID / `none/need/pushing/processing/approved/rejected` | +| `current_node` | :111 | 特批挂起展示:`特批审核`(C106-3 发起后)/ `审批通过`(特批通过恢复)/ `已驳回`(特批驳回联动) | | `hcs_perf_fd_id` | :145 | 履约记录(C108,默认关,不在本文范围) | ### 3.4 与合同特批的关联 @@ -188,13 +200,13 @@ need(存量遗留,2026-10-13 起不再产生;重推时自愈:报文带 | 定时扫描 | `HcsPushTask#pushHcsPayment`(:163,cron 默认 `0 2/5 * * * ?`,开关 `push.payment.sync-enabled` 默认 false) | `pushUnsyncedPayments`(:285-309):`approvalStatus=approved` 且 `hcs_sync_status ∈ {unsynced, failed}` 且重试未超限 → `HcsPaymentSyncSupport#pushPayment` | | 手动重推 | `POST /hcs/sync/payment/{id}`(`HcsSyncController.java:111`)→ `repushPayment`(:95-113);批量 `POST /hcs/sync/payment`(:129) | — | -`HcsPaymentSyncSupport#pushPayment`(`HcsPaymentSyncSupport.java:70-87`): +`HcsPaymentSyncSupport#pushPayment`(`HcsPaymentSyncSupport.java:75-91`): -1. **① 结算付款特批**:`hcs_spec_status=need` 且未发起时(:72-74)调 `HcsSpecPaySyncSupport#pushSpecPay`; +1. **① 结算付款特批**:`hcs_spec_status=need` 且未发起时(:77-80)调 `HcsSpecPaySyncSupport#pushSpecPay`(C106-3 成功后 `processing` + 挂起 `currentNode="特批审核"`); 2. ② 履约记录 C108(默认关); -3. 最后统一 `markSynced`(:142)/ `markFailed`(:154)回写整体同步状态。 +3. 最后统一 `markSynced` / `markFailed` 回写整体同步状态。 -> 当前 `credit.check-enabled=false`(C106-1 未对接),`need` 无自动触发源,"仅历史数据/人工场景可达"(`HcsPaymentSyncSupport.java:72` 注释)。 +> `need` 触发源(2026-10-13 起):提交时收款方外部客商高风险/黑名单(须特批附件)或 C106-1 额度超额(`credit.check-enabled=false` 未对接时仅前者可达)。 ### 4.3 C106-3/4 实现(`HcsSpecPaySyncSupport`) @@ -225,11 +237,11 @@ need(存量遗留,2026-10-13 起不再产生;重推时自愈:报文带 ### 4.4 结果确认 -特批结果由合规系统审批完成后主动推送(2026-10-12 起,替代原计划的 B103,§9-U1 已闭环): +特批结果由合规系统审批完成后**回调 `paymentLegal/result` 通知 TMS**,并联动付款审批状态(2026-10-13 起): -- `POST /hcs/paymentLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/paymentLegal/result`)→ `HcsPaymentSyncSupport#handleLegalResult`:先校验 `sourceSystem`(不符抛"来源系统标识错误"异常),`requestId`=付款申请ID 定位,`status=APPROVED/REJECTED` 回写 `hcs_spec_status`,不联动付款审批状态; -- 等效兜底:页面人工确认 `POST /hcs/spec-pay/confirm`(仅 `processing` 可确认,置 `approved/rejected`); -- **付款特批结果不联动付款审批状态**(与合同特批的 `syncContractOnSpecResult` 不同,无驳回联动)。 +- `POST /hcs/paymentLegal/result`(`HcsSyncController`,blade.secure 放行,网关注册 `/gwzh/HTHG/paymentLegal/result`)→ `HcsPaymentSyncSupport#handleLegalResult`(:156-189):先校验 `sourceSystem`(不符抛"来源系统标识错误"异常),`requestId`=付款申请ID 定位,`status=APPROVED` → 特批通过 + 恢复 `currentNode="审批通过"` 放行(金蝶推送门禁解除);`status=REJECTED` → 特批驳回 + **联动付款审批驳回**(`approvalStatus=returned` + `currentNode="已驳回"`,`syncPaymentOnSpecResult` :191-202),走"重新编辑→提交→审批→重新特批"闭环; +- 等效兜底:页面人工确认 `POST /hcs/spec-pay/confirm`(仅 `processing` 可确认,与回调同样联动付款审批状态); +- 与合同特批(contractLegal/result + C103-4 定时查询兜底)不同,付款特批**仅回调通知**(合规未提供 C106 结果查询接口),无定时查询兜底,回调未达时靠人工确认。 --- @@ -239,7 +251,7 @@ need(存量遗留,2026-10-13 起不再产生;重推时自愈:报文带 | --- | --- | --- | | 定时扫描 | `HcsPushTask#pushHcsContract`(默认 `0 1/5 * * * ?`,同轮附带特批结果查询兜底 `syncProcessingSpecResults`) | `HcsPushTask#pushHcsPayment`(默认 `0 2/5 * * * ?`);Redis 任务锁 TTL 240s、分钟位错峰 | | 即时推送 | `HcsImmediatePushSupport#pushContractAfterCommit`(afterCommit 异步,开关默认 false,单条锁 TTL 120s) | 无 | -| 结果推送接收 | `POST /hcs/contractLegal/result`(blade.secure 放行,sourceSystem=WCCK,contractCode=合同编号定位,success 联动审批状态,原文留痕) | `POST /hcs/paymentLegal/result`(blade.secure 放行,requestId=付款申请ID,回写特批状态;报文仍为旧结构待合规方字段表确认) | +| 结果推送接收 | `POST /hcs/contractLegal/result`(blade.secure 放行,sourceSystem=WCCK,contractCode=合同编号定位,success 联动审批状态,原文留痕) | `POST /hcs/paymentLegal/result`(blade.secure 放行,requestId=付款申请ID,回写特批状态并**联动付款审批状态**:approved 恢复放行 / rejected 联动审批驳回;报文仍为旧结构待合规方字段表确认) | | 人工确认 | `POST /hcs/contract/spec/confirm` | `POST /hcs/spec-pay/confirm` | | 手动发起/重推 | `POST /hcs/sync/contract/{id}`(spec-apply 已随 C103-8 删除,2026-10-13) | `POST /hcs/sync/payment/{id}`、`POST /hcs/sync/payment` | @@ -251,9 +263,8 @@ need(存量遗留,2026-10-13 起不再产生;重推时自愈:报文带 | --- | --- | --- | | `contract.require-risk-check` | true | 提交时特批附件强校验 | | `risk.check-on-contract` | — | 合同链路 C101-1 查询开关 | -| `risk.check-on-payment` | true | 付款提交 C101-1 校验开关 | -| `risk.block-blacklist` | true | 付款链路黑名单阻断(合同链路已不用于阻断) | -| `credit.check-enabled` | **false** | C106-1 额度校验,一期未对接(付款特批自动触发源关闭) | +| `risk.check-on-payment` | true | 付款提交 C101-1 校验开关(收款方外部客商高风险/黑名单须特批附件并标记待特批) | +| `credit.check-enabled` | **false** | C106-1 额度校验,一期未对接(付款特批第二触发源关闭,高风险/黑名单触发不受影响) | | `contract.special-contract-enabled` | false | C103-1/C103-11 报文 `fdSepcailContract` 强制 true(默认关;高风险/黑名单判定自动带 true,本开关可强制全量走特批,联调验证用) | | `push.immediate-enabled` | false | 审批通过后即时推送 | | `push.contract.sync-enabled` / `push.contract.cron` | — / `0 1/5 * * * ?` | 合同定时扫描 | diff --git a/doc/docs/业务流程/2026-10-13-付款申请全链路业务流程(前端提交-客商风险特批-同步金蝶-结果回写).md b/doc/docs/业务流程/2026-10-13-付款申请全链路业务流程(前端提交-客商风险特批-同步金蝶-结果回写).md new file mode 100644 index 00000000..64022897 --- /dev/null +++ b/doc/docs/业务流程/2026-10-13-付款申请全链路业务流程(前端提交-客商风险特批-同步金蝶-结果回写).md @@ -0,0 +1,200 @@ +# 付款申请全链路业务流程(前端提交 → 客商风险与特批 → 同步金蝶 → 结果回写) + +> 梳理日期:2026-10-13 +> 涉及模块:`tms-erp-web/src/views/payment/payment-application-form.vue`(前端表单)、`blade-service/blade-transport`(业务编排)、`blade-third-party-api/blade-hcs-api`(合规 Feign)、`blade-third-party-api/blade-bfi-api`(金蝶 BFI Feign) +> 关联文档:`doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md`(特批机制专项)、`doc/docs/TMS业财融合-集成流程图文字版与业务流程梳理.md`(图03)、`业务流程/2026-09-16-付款管理正式付款同步金蝶….md` 与 `业务流程/2026-09-17-付款管理金蝶付款结果定时回写….md`(金蝶链路专项) +> 2026-10-13 变更:付款链路黑名单不再直接阻断,与高风险统一走特批(提示 + 特批附件必传 + C106-3 特批 + 回调联动审批状态 + 金蝶推送门禁);前端付款表单新增风险客商提示条与特批附件提交校验。 + +--- + +## 一、全链路总览 + +```mermaid +flowchart TD + subgraph FE["前端 · 付款申请表单"] + f1["新建付款申请
    选付款类型(正式结算付款/预付款/项目预付)"] + f1 --> f2["选合同/结算单 → 联动收款账户
    客商档案反查收款方"] + f2 --> f3{"C101-1 客商风险查询
    (收款方外部客商才查)"} + f3 -->|"高风险/黑名单"| f4["风险客商提示条(常驻)
    要求上传「特批附件」"] + f3 -->|"低风险/中风险/内部客商"| f5["正常填写"] + f4 --> f6 + f5 --> f6["保存草稿 / 提交"] + end + + subgraph TMS["TMS 后端 · 提交与审批"] + f6 --> t1{"提交校验
    (submit 事务内)"} + t1 -->|"特批附件缺失"| t2["拦截:必须上传「特批附件」"] + t1 -->|"通过"| t3["reviewing 财务审核
    (高风险/黑名单置 hcs_spec_status=need)"] + t3 --> t4{"本地审批"} + t4 -->|"驳回"| t5["returned 已驳回 → 重新编辑"] + t4 -->|"通过"| t6["approved 审批通过
    hcs_sync_status=unsynced"] + end + + subgraph HCS["合同合规系统(HCS)"] + t6 -->|"定时扫描发起 C106-3"| h1["结算付款特批单生成"] + h1 --> h2["TMS 挂起 currentNode=特批审核
    (need/pushing/processing 禁止推送金蝶)"] + h2 --> h3{"集团特批审批"} + h3 -->|"paymentLegal/result:APPROVED"| h4["恢复 审批通过 → 放行金蝶推送"] + h3 -->|"paymentLegal/result:REJECTED"| h5["联动付款审批驳回 returned
    重新编辑 → 提交 → 重新特批"] + end + + subgraph JD["金蝶星瀚(经 iPaaS /gwzh/BFI)"] + h4 -->|"手动/批量同步"| j1{"付款类型路由"} + j1 -->|"正式结算付款"| j2["A102-4 预检财务应付单已生成
    → A103-2 幂等预检 → A103-1 应付下推"] + j1 -->|"预付款"| j3["A103-3 预付款申请保存"] + j2 --> j4["kingdeeStatus=synced(锁单)"] + j3 --> j4 + j4 --> j5["财务共享审批 → 付款处理 → 付款完成"] + j5 -->|"A103-2/A103-4 定时回写"| j6["更新付款结果/履约数据"] + end +``` + +三条主线:**合规管控线**(C101-1 风险 → 特批附件 → C106-3 特批 → paymentLegal/result 联动)、**本地审批线**(draft → reviewing → approved/returned)、**金蝶付款线**(A103-1/A103-3 → 锁单 → A103-2/A103-4 回写)。硬约束:**高风险/黑名单收款方特批不通过,付款申请不得推送金蝶**。 + +--- + +## 二、阶段一:前端表单与提交(`payment-application-form.vue`) + +| 步骤 | 动作 | 实现要点 | +|---|---|---| +| 1 | 新建/编辑付款申请 | 付款类型路由引用单据:正式结算付款→正式结算单(可多张)、预付款→预结算单、项目预付→项目+合同 | +| 2 | 选合同联动 | `fillBillTypeFromContract`:带出票据类型/付款方(合同甲方)/收款账户候选(合同乙方客商) | +| 3 | **收款方风险查询** | `loadReceiptAccountOptions`:按合同乙方名称反查客商档案 → `GET /hcs/risk?customerCode=`(C101-1 实时查,后端对内部组织客商默认返回无风险)→ `payeeRisky/payeeRiskLevel/payeeBlackStatus/payeeRiskTip` 留档 | +| 4 | **风险客商提示条** | 高风险/黑名单时基本信息"备注"下方常驻展示(橙黄底红字,同合同新增页):`风险等级:高风险|黑名单:是。【名称】:…风险项…,按集团规定不可直接付款,提交前须上传「特批附件」类型附件,审批通过后将自动发起付款特批`;附件清单同步显示"未上传:特批附件" | +| 5 | 附件材料 | 材料清单:磅单/结算单(必传)、合同签章文件(首次合同付款/项目预付)、**特批附件**(收款方高风险/黑名单或客商等级 D/E/F 时必传,`attachmentType=special_approval`)、其他 | +| 6 | 保存草稿 | `POST /payment-application`(save)→ draft,可反复编辑 | +| 7 | 提交 | `submitForm`:静默保存 → **特批附件缺失校验**(高风险/黑名单阻断,提示与后端同口径)→ `POST /payment-application/submit` → 发起 MK 审批流 | + +> 风险查询失败不阻断前端填写,提交时后端强校验兜底。 + +--- + +## 三、阶段二:后端提交校验(`PaymentApplicationServiceImpl#submit`,事务内) + +``` +前置校验:状态(draft/returned)→ 申请金额>0 → 尾款/项目预付合同/选票/额度校验 + ↓ +HcsCreditCheckSupport#checkOnSubmit(risk.check-on-payment 默认 true) + ↓ +① C101-1 收款方风险校验(checkRelativeRisk): + - 反查不到客商档案 → skip 留痕不阻断 + - 内部组织客商(customerKind=internal)→ 默认无风险,不调 C101-1 + - 外部客商 → C101-1 实时查询,risky = 风险等级2(高风险)或 fdBlackStatus=yes(黑名单) + - risky → 「特批附件必传」校验(attachmentsJson 含 attachmentType=special_approval,缺失抛异常) + → hcs_spec_status=need + 清空旧 hcs_spec_fd_id(特批单次有效,重新提交重新发起) +② C106-1 额度校验(credit.check-enabled 默认 false,一期未对接): + - 合同已推送(有 hcs_fd_id)→ 额度内 pass / 超额不拦截 → hcs_credit_status=over + need + ↓ +全部通过:approvalStatus=reviewing,currentNode="财务审核",留痕 blade_hcs_check_log(biz_type=payment,check_type=risk/credit) +``` + +--- + +## 四、阶段三:本地审批 + +| 动作 | 状态流转 | 附加动作 | +|---|---|---| +| 审批通过 `approve` | reviewing → **approved**,currentNode="审批通过" | `hcs_sync_status=unsynced`(零埋点 ADR-0001,扫描任务据此接管后续推送) | +| 审批驳回 `returnBill` | reviewing → **returned**,currentNode="已驳回" | — | +| 作废 `voidBill` | approved → **voided**,currentNode="已作废" | 票据付款释放票据占用 | + +--- + +## 五、阶段四:HCS 付款特批推送(`HcsPushTask#pushHcsPayment`) + +- **定时扫描**:cron 默认 `0 2/5 * * * ?`,开关 `push.payment.sync-enabled` **默认 false**(灰度开启);条件 `approvalStatus=approved` 且 `hcs_sync_status ∈ {unsynced, failed}` 且重试 < `push.max-retry`(默认 5);Redis 任务锁 TTL 240s 防多实例重扫。 +- **推送编排**(`HcsPaymentSyncSupport#pushPayment`): + 1. **① 结算付款特批**(`hcs_spec_status=need` 时,`HcsSpecPaySyncSupport#pushSpecPay`): + - `hcs_spec_fd_id` 为空 → **C106-3 发起**:报文主题 `结算付款特批-{paymentNo}`,合同传 `blade_contract_manage.hcs_fd_id`,金额/收付款方/账户随单,附件经 C103-2 转传挂 `fd_spc_approval_attach`(发起带 `fdBindType=ADD`)→ 返回双层 `data.data.fdId` 回填 `hcs_spec_fd_id` → 状态 **processing** + **挂起 `currentNode="特批审核"`**; + - 非空 → **C106-4 更新**(单据变更场景,附件不带 fdBindType)。 + 2. ② C108 履约记录(默认关)。 + 3. `markSynced`/`markFailed` 回写整体同步状态。 +- **手动重推**:`POST /hcs/sync/payment/{id}`(重置 unsynced 立即推)、`POST /hcs/sync/payment`(批量扫一轮)。 +- **金蝶推送门禁**(`doSyncKingdee`):`hcs_spec_status ∈ {need, pushing, processing}` 抛"收款方客商为高风险/黑名单,付款特批审核中(特批审核),特批完成后方可推送金蝶"。 + +--- + +## 六、阶段五:特批结果联动(`HcsPaymentSyncSupport`) + +| 路径 | 机制 | 结果联动 | +|---|---|---| +| **合规回调(主)** | 合规审批完成后回调 `POST /hcs/paymentLegal/result`(网关 `/gwzh/HTHG/paymentLegal/result`,blade.secure 放行)→ `handleLegalResult`:`sourceSystem` 须为 `third-party.hcs.src-system`(默认 WLTMS,不符抛"来源系统标识错误"),`requestId`=付款申请ID 定位,`status=APPROVED/REJECTED` | 见下 | +| **人工确认(兜底)** | `POST /hcs/spec-pay/confirm`(仅 processing 可确认,与回调等效) | 见下 | + +| 特批结果 | `hcs_spec_status` | 付款审批联动 | 后续 | +|---|---|---|---| +| APPROVED | approved | currentNode="审批通过"(审批状态保持 approved) | 金蝶推送门禁解除,可同步金蝶 | +| REJECTED | rejected | **approvalStatus=returned + currentNode="已驳回"** | 走"重新编辑 → 提交(重新校验风险与特批附件、重新置 need)→ 审批 → 重新发起 C106-3"闭环 | + +> 付款特批无 C106 结果查询接口,不做定时查询兜底(合同链路才有 C103-4 兜底);回调未达时靠页面人工确认。 + +--- + +## 七、阶段六:同步金蝶(`syncKingdee` → `doSyncKingdee`,单据级事务经自代理) + +**前置**:`approvalStatus=approved` + 特批门禁通过 + `kingdeeStatus` 非终态(synced/paying/paid/closed 直接幂等返回)。 + +| 付款类型 | 链路 | +|---|---| +| **正式结算付款**(settlement_payment,应付类) | ① `requirePayableSettlement` 校验结算类型 → ② 逐张正式结算单 **A102-4** 预检财务应付单已在金蝶生成(缺则拦截"请先在正式付款单页面同步金蝶")→ ③ **A103-2** 幂等预检(上次下推成功但本地回滚的场景直接回填)→ ④ **A103-1 付款申请保存(应付下推)** | +| **预付款 / 项目预付** | 上次失败先 **A103-2** 勾稽恢复 → **A103-3 付款申请保存(预付款)**,不绑应付单 | + +- **成功**:`kingdeeBillId` 回填 + `kingdeeStatus=synced`(业务单据锁定,ERP 不可改);付款申请单编号与付款状态由定时回写任务经 A103-2/A103-4 回填。 +- **失败**:事务回滚后独立事务 `markKingdeeSyncFailed` → `kingdeeStatus=failed`,可重试同步。 +- 批量:`syncKingdeeBatch`(全批共享档案缓存 + A102-4 批量预检,逐单单据级事务)。 + +--- + +## 八、阶段七:付款结果回写与履约联动 + +- **定时回写**(`PaymentKingdeeResultTask`,专项文档见 `业务流程/2026-09-17-….md`):**A103-2** 付款申请单查询 + **A103-4** 付款处理查询 → 回写 `kingdeeBillNo`/付款状态(paying/paid/closed)→ 付款完成联动正式结算付款记录(`blade_formal_settlement_payment`)与履约数据。 +- **HCS 履约/附件**(默认关/独立周期):C108 履约记录推送(`perf-record.sync-enabled`)、C106-2 付款附件每日定时推送——不在本文展开,见特批专项文档 §四。 + +--- + +## 九、状态机速查 + +**付款审批状态 `approvalStatus`**:`draft` →(提交)`reviewing` →(通过)`approved` /(驳回)`returned` /(作废,仅 approved)`voided`;特批驳回联动 `approved → returned`。 + +**HCS 特批状态 `hcs_spec_status`**:`none` →(提交时高风险/黑名单或额度超额)`need` →(C106-3 发起成功)`processing`(挂起"特批审核")→(paymentLegal/result 回调/人工确认)`approved` / `rejected`。 + +**金蝶状态 `kingdeeStatus`**:空 →(同步成功)`synced` →(回写)`paying` → `paid` / `closed`;同步失败 `failed`(可重推)。 + +**当前节点 `currentNode`**:财务审核 → 审批通过 →(特批中)**特批审核** → 审批通过(放行)/ 已驳回(returned 闭环)。 + +--- + +## 十、配置项与接口速查 + +| 配置(`thirdParty.hcs.*`) | 默认 | 说明 | +|---|---|---| +| `risk.check-on-payment` | true | 提交时收款方 C101-1 校验开关 | +| `credit.check-enabled` | false | C106-1 额度校验(一期未对接,超额为特批第二触发源) | +| `push.payment.sync-enabled` / `push.payment.cron` | **false** / `0 2/5 * * * ?` | 付款特批+履约定时扫描(**未开启时高风险单审批通过后停在 need,且金蝶推送被门禁拦截**) | +| `push.max-retry` / `push.batch-size` | 5 / 50 | 重试上限 / 单轮批量 | +| `spec-pay.payment-purpose/nature/type`、`doc-status` | — | C106 报文字典值 | +| `src-system` | WLTMS | paymentLegal/result 回调来源校验值 | + +| 接口 | 提供方 | 用途 | +|---|---|---| +| `GET /hcs/risk` | TMS 代理 C101-1 | 前端收款方风险查询(提示条) | +| C106-3 / C106-4 | 合同合规 | 结算付款特批发起 / 更新 | +| `POST /hcs/paymentLegal/result` | 合同合规 → TMS | 特批结果回调(APPROVED 放行 / REJECTED 联动审批驳回) | +| `POST /hcs/spec-pay/confirm` | TMS | 特批结果人工确认(兜底) | +| A102-4 / A103-2 | 金蝶 | 财务应付单预检 / 付款申请单幂等预检与结果回写 | +| A103-1 / A103-3 | 金蝶 | 应付下推付款申请 / 预付款申请保存 | +| B901 | ERP → 金蝶 | 锁单/解锁(已推金蝶单据 ERP 锁定) | + +--- + +## 十一、异常与逆向 + +| 场景 | 处理 | +|---|---| +| C101-1 查询失败 | 提交抛"C101-1 客商风险查询失败"(不留风险缺口);前端查询失败仅跳过提示 | +| 收款方反查不到客商档案 | skip 留痕不阻断(§9-U6 口径) | +| 特批附件缺失 | 前端提交阻断 + 后端提交抛异常(双重校验) | +| C106-3 发起失败 | `hcs_sync_status=failed` + 重试计数,下轮扫描自动补偿,超限人工重推 | +| 特批驳回 | 付款审批联动驳回(returned),重新编辑提交后重新置 need、清空旧 `hcs_spec_fd_id`,重新发起特批 | +| 金蝶推送失败 | `kingdeeStatus=failed`,A103-2 幂等预检防重复推送;批量同步单条失败不影响整批 | +| 金蝶侧驳回/需修改 | 金蝶反审核+删除 → 解锁 → TMS 重推(已推单据 ERP 不可改,财务共享审批对 TMS 黑盒) | diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index f907c119..fa11f060 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -66,6 +66,8 @@ thirdParty: cron: ${BFI_PAY_RESULT_CRON:0 */10 * * * ?} # 合同合规系统 hcs: + # Mock 开关(true 时 IHcsClient 走本地 JSON 桩 F:/home/tms/mock/hcs/{方法名}.json,联调前自测用,生产必须 false;改配置需重启,改桩文件即时生效) + mock-enabled: ${HCS_MOCK_ENABLED:false} # 合同合规系统(HCS)开放接口地址(v4 接口说明:带网关前缀,直连可配,代码不感知) baseUrl: ${HCS_BASE_URL:http://172.16.203.134:8000/gwzh/HTHG} # Authorization 请求头整值(含 Basic 前缀,敏感值通过环境变量注入) @@ -128,8 +130,6 @@ thirdParty: risk: check-on-contract: ${HCS_RISK_CHECK_ON_CONTRACT:true} check-on-payment: ${HCS_RISK_CHECK_ON_PAYMENT:true} - # 黑名单是否阻断(合同置 failed / 付款提交拦截) - block-blacklist: ${HCS_RISK_BLOCK_BLACKLIST:true} # 额度校验(C106-1,一期暂不对接) credit: # 额度校验开关(默认关,关闭后特批无自动触发,对接后打开) From 433015fde0f090e979a4655cdb7a3aa61fc18d93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Wed, 14 Oct 2026 11:15:56 +0800 Subject: [PATCH 067/124] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DHCS=E7=89=B9?= =?UTF-8?q?=E6=89=B9=E7=8A=B6=E6=80=81=E4=B8=BAnull=E6=97=B6List.of.contai?= =?UTF-8?q?ns=E6=8A=9BNPE=E5=AF=BC=E8=87=B4=E5=90=88=E5=90=8C=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/support/hcs/HcsContractSpecSyncSupport.java | 3 ++- .../transport/support/hcs/HcsContractSyncSupport.java | 4 +++- .../transport/support/hcs/HcsImmediatePushSupport.java | 3 ++- .../transport/support/hcs/HcsPaymentSyncSupport.java | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index 27eaaad4..e5fec114 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -45,6 +45,7 @@ import org.springblade.transport.pojo.entity.HcsContractCheckLog; import org.springframework.stereotype.Component; import java.time.LocalDateTime; +import java.util.Arrays; import java.util.List; /** @@ -149,7 +150,7 @@ public class HcsContractSpecSyncSupport { if (contractManage == null) { throw new ServiceException("合同单不存在:" + id); } - if (!List.of(HcsSyncConstant.SPEC_STATUS_APPROVED, HcsSyncConstant.SPEC_STATUS_REJECTED).contains(result)) { + if (!Arrays.asList(HcsSyncConstant.SPEC_STATUS_APPROVED, HcsSyncConstant.SPEC_STATUS_REJECTED).contains(result)) { throw new ServiceException("特批结果仅支持 approved/rejected"); } if (!HcsSyncConstant.SPEC_STATUS_PROCESSING.equals(contractManage.getHcsSpecStatus())) { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 64ed055c..e0cc305d 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -62,6 +62,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; @@ -189,7 +190,8 @@ public class HcsContractSyncSupport { */ private void hangSpecReview(ContractManage contractManage) { // 终态守卫:合规回调(秒批/秒驳)先于挂起执行时,不得覆盖已落地的结果 - if (List.of(HcsSyncConstant.SPEC_STATUS_APPROVED, HcsSyncConstant.SPEC_STATUS_REJECTED).contains(contractManage.getHcsSpecStatus())) { + // Arrays.asList 允许 null 元素:List.of 的不可变列表 contains(null) 会抛 NPE,而首次推送时 hcsSpecStatus 为 null + if (Arrays.asList(HcsSyncConstant.SPEC_STATUS_APPROVED, HcsSyncConstant.SPEC_STATUS_REJECTED).contains(contractManage.getHcsSpecStatus())) { log.info("HCS合同高风险/黑名单但特批已有终态(单次有效),跳过挂起:contractNo={},hcsSpecStatus={}", contractManage.getContractNo(), contractManage.getHcsSpecStatus()); return; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsImmediatePushSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsImmediatePushSupport.java index 24909e92..bf3980ce 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsImmediatePushSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsImmediatePushSupport.java @@ -40,6 +40,7 @@ import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import java.time.Duration; +import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.concurrent.ExecutorService; @@ -182,7 +183,7 @@ public class HcsImmediatePushSupport { || HcsSyncConstant.HCS_STATUS_SYNCED.equals(contractManage.getHcsSyncStatus())) { return; } - if (List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(contractManage.getHcsSpecStatus())) { + if (Arrays.asList(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(contractManage.getHcsSpecStatus())) { log.info("HCS合同即时推送跳过(特批挂起中):id={},hcsSpecStatus={}", id, contractManage.getHcsSpecStatus()); return; } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java index 87e33e70..ccab31e5 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java @@ -39,6 +39,7 @@ import org.springblade.transport.pojo.entity.PaymentApplication; import org.springframework.stereotype.Component; import java.time.LocalDateTime; +import java.util.Arrays; import java.util.List; /** @@ -129,7 +130,7 @@ public class HcsPaymentSyncSupport { if (payment == null) { throw new ServiceException("付款申请单不存在:" + id); } - if (!List.of(HcsSyncConstant.SPEC_STATUS_APPROVED, HcsSyncConstant.SPEC_STATUS_REJECTED).contains(result)) { + if (!Arrays.asList(HcsSyncConstant.SPEC_STATUS_APPROVED, HcsSyncConstant.SPEC_STATUS_REJECTED).contains(result)) { throw new ServiceException("特批结果仅支持 approved/rejected"); } if (!HcsSyncConstant.SPEC_STATUS_PROCESSING.equals(payment.getHcsSpecStatus())) { From 076145d7f6731775c2152af4790f15464e96a72a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Wed, 14 Oct 2026 14:11:31 +0800 Subject: [PATCH 068/124] =?UTF-8?q?:feat:=20=E5=AE=A1=E6=89=B9=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E8=87=AA=E5=8A=A8=E5=88=9B=E5=BB=BA=E5=B1=A5=E7=BA=A6?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E8=A1=8C=EF=BC=8CC103-9=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=89=8D=E7=BD=AE=E8=87=B3=E7=89=B9=E6=89=B9=E6=8C=82=E8=B5=B7?= =?UTF-8?q?=E4=B9=8B=E5=89=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/constant/HcsSyncConstant.java | 37 +++++++ .../service/IContractExeStageService.java | 9 ++ .../impl/ContractExeStageServiceImpl.java | 55 ++++++++-- .../impl/ContractManageServiceImpl.java | 4 + .../support/hcs/HcsContractSyncSupport.java | 36 ++++--- .../hcs合同/2026-10-11-hcs合同推送流程梳理.md | 101 ++++++++++++++++-- 6 files changed, 209 insertions(+), 33 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 e056a78a..3927006e 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 @@ -212,6 +212,43 @@ public final class HcsSyncConstant { */ public static final String SPEC_REVIEW_NODE = "特批审核"; + // ==================== 履约计划行(blade_contract_exe_stage,C103-9) ==================== + + /** + * 行级同步操作:无(同步成功后清除标记) + */ + public static final String ROW_OP_NONE = "none"; + + /** + * 行级同步操作:新增 + */ + public static final String ROW_OP_ADD = "add"; + + /** + * 行级同步操作:更新 + */ + public static final String ROW_OP_UPDATE = "update"; + + /** + * 行级同步操作:删除 + */ + public static final String ROW_OP_DELETE = "delete"; + + /** + * 履约类型:付款 + */ + public static final String PERFORM_TYPE_PAYMENT = "payment"; + + /** + * 履约类型:收款 + */ + public static final String PERFORM_TYPE_COLLECTION = "collection"; + + /** + * 款项性质:进度款 + */ + public static final String FUND_NATURE_PROGRESS = "progress"; + // ==================== Redis 缓存 key(照 BFI blade:third: 前缀惯例) ==================== /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java index 15133197..53421060 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java @@ -26,6 +26,7 @@ package org.springblade.transport.service; import org.springblade.core.mp.base.BaseService; +import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.HcsContractExeStage; import java.util.List; @@ -45,6 +46,14 @@ public interface IContractExeStageService extends BaseService listByContractId(Long contractId); + /** + * 审批通过自动创建默认履约计划行(合同下无规则行时):承运商合同=付款进度款(收票规则取合同结算模式), + * 客户合同=收款进度款;金额/资金日期留空,随合同链路推 C103-9 + * + * @param contractManage 合同单(审批通过) + */ + void createDefaultRowOnApprove(ContractManage contractManage); + /** * 保存合同履约规则行(按行差异置同步标记:新行/未同步行 add,已同步行 update) * diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java index 08f0cc06..0589d8b8 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java @@ -57,11 +57,6 @@ import java.util.List; @RequiredArgsConstructor public class ContractExeStageServiceImpl extends BaseServiceImpl implements IContractExeStageService { - /** - * 行级同步操作:无 - */ - private static final String ROW_OP_NONE = "none"; - private final ContractManageMapper contractManageMapper; private final HcsProperties hcsProperties; @@ -87,7 +82,7 @@ public class ContractExeStageServiceImpl extends BaseServiceImpllambdaQuery().eq(HcsContractExeStage::getContractId, contractId)) > 0) { + return; + } + HcsContractExeStage row = new HcsContractExeStage(); + row.setContractId(contractId); + if ("承运商合同".equals(contractManage.getContractCategory())) { + row.setPerformType(HcsSyncConstant.PERFORM_TYPE_PAYMENT); + row.setInvoiceRule(mapInvoiceRule(contractManage.getSettlementMode())); + } else if ("客户合同".equals(contractManage.getContractCategory())) { + row.setPerformType(HcsSyncConstant.PERFORM_TYPE_COLLECTION); + } else { + log.info("合同类别非承运商/客户,不自动创建履约计划行:contractNo={},contractCategory={}", contractManage.getContractNo(), contractManage.getContractCategory()); + return; + } + // 默认进度款计划行:金额/资金日期留空,随合同链路推 C103-9 + row.setFundNature(HcsSyncConstant.FUND_NATURE_PROGRESS); + row.setFundType(hcsProperties.getExeStage().getFundType()); + row.setIsFinish(0); + row.setRowOp(HcsSyncConstant.ROW_OP_ADD); + row.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_UNSYNCED); + row.setHcsSyncMsg("审批通过自动创建,待随合同链路同步(C103-9)"); + save(row); + log.info("审批通过自动创建履约计划行:contractNo={},contractCategory={},performType={},invoiceRule={}", + contractManage.getContractNo(), contractManage.getContractCategory(), row.getPerformType(), row.getInvoiceRule()); + } + + /** + * 结算模式文本映射 C103-9 开票规则:先款后票=payFirst、先票后款=invoiceFirst,其余(月结/现结等)不传 + */ + private String mapInvoiceRule(String settlementMode) { + if ("先款后票".equals(settlementMode)) { + return "payFirst"; + } + if ("先票后款".equals(settlementMode)) { + return "invoiceFirst"; + } + return null; + } + /** * 行字段校验 */ @@ -144,7 +181,7 @@ public class ContractExeStageServiceImpl extends BaseServiceImpllambdaUpdate() .eq(HcsContractExeStage::getContractId, contractManage.getId()) .isNull(HcsContractExeStage::getHcsStageFdId) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index e0cc305d..f7884112 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -72,9 +72,9 @@ import java.util.Objects; *

    * 扫描任务按序执行:⓪ 特批挂起门禁 → ① 客商风险校验(可配开关,仅留痕,高风险不再阻断)→ * ② 附件转传(v4 挂载点 fdFieldJson.attachment,随 C103-1 挂载)→ ③ C103-3 判重(§9-U4 查询能力联调确认)→ - * ④ C103-1 起草 / 变更单 C103-11 更新(§9-U5 定位方式待联调)→ ⑤ 高风险/黑名单挂起"特批审核" - * (外部客商管控:报文随 fdSepcailContract=true 在合规侧走特批,{@link HcsContractSpecSyncSupport} 接收结果)→ - * ⑥ 履约规则 C103-9 行级同步({@link HcsExeStageSyncSupport})。 + * ④ C103-1 起草 / 变更单 C103-11 更新(§9-U5 定位方式待联调)→ ⑤ 履约计划 C103-9 行级同步({@link HcsExeStageSyncSupport}, + * 仅依赖 hcs_fd_id,先于特批挂起执行,失败补偿不被特批门禁阻塞)→ ⑥ 高风险/黑名单挂起"特批审核" + * (外部客商管控:报文随 fdSepcailContract=true 在合规侧走特批,{@link HcsContractSpecSyncSupport} 接收结果)。 * 结果留痕:风险校验写 blade_hcs_check_log 与合同 hcs_risk_* 字段;推送结果回填 hcs_fd_id/hcs_sync_status。 * * @author Chill @@ -94,6 +94,11 @@ public class HcsContractSyncSupport { */ private static final String BLACK_STATUS_YES = "yes"; + /** + * signer 相对方单位类型:暂统一传 customer(客户,2026-10-14 联调确认,§9-U6 后续细化) + */ + private static final String SIGNER_FD_TYPE_CUSTOMER = "customer"; + private final IHcsClient hcsClient; private final HcsProperties hcsProperties; private final ContractManageMapper contractManageMapper; @@ -105,7 +110,7 @@ public class HcsContractSyncSupport { /** * 推送合同到 HCS:特批挂起门禁 → 风险校验(仅留痕,高风险不再阻断)→ 附件转传 → 判重 → 起草/更新 → 回填合规 fdId 置 synced - * → 高风险/黑名单客商合同挂起"特批审核"等待合规特批结果(报文随 fdSepcailContract=true,外部客商管控) + * → 履约计划行级同步(C103-9,先于特批挂起)→ 高风险/黑名单客商合同挂起"特批审核"等待合规特批结果(报文随 fdSepcailContract=true,外部客商管控) * * @param contractManage 合同单(approvalStatus 须为 approved/change_approved) * @return 推送结果描述(供任务汇总与 hcs_sync_msg 落库) @@ -145,17 +150,17 @@ public class HcsContractSyncSupport { markSynced(contractManage, contractManage.getHcsFdId(), "C103-11 合同更新成功"); resultMessage = "C103-11 合同更新成功"; } - // ⑤ 高风险/黑名单客商(外部客商管控):起草/更新报文已随 fdSepcailContract=true 在合规侧发起特批流程, + // ⑤ 履约规则 C103-9 行级同步(随合同链路,§5.3;仅依赖 hcs_fd_id 与特批无关,先于特批挂起执行—— + // 失败抛出落 failed 时特批未挂起,修复后可直接重推补偿,不被特批门禁阻塞) + if (hcsProperties.getExeStage().isSyncEnabled()) { + resultMessage = resultMessage + ";" + hcsExeStageSyncSupport.syncExeStages(contractManage); + } + // ⑥ 高风险/黑名单客商(外部客商管控):起草/更新报文已随 fdSepcailContract=true 在合规侧发起特批流程, // 此处挂起"特批审核"等待结果(合规推送 contractLegal/result 或定时 C103-4 查询联动恢复/驳回) if (risky) { hangSpecReview(contractManage); } - // ⑥ 履约规则 C103-9 行级同步(随合同链路,§5.3;一期暂不对接默认关,打开后失败抛出由任务落 failed,下轮凭 hcs_fd_id 走更新补偿) - if (!hcsProperties.getExeStage().isSyncEnabled()) { - return resultMessage; - } - String exeStageResult = hcsExeStageSyncSupport.syncExeStages(contractManage); - return resultMessage + ";" + exeStageResult; + return resultMessage; } /** @@ -361,7 +366,10 @@ public class HcsContractSyncSupport { settlementType = HcsContractFieldConstant.SETTLEMENT_TYPE_COLLECTION; } if (StringUtil.isNotBlank(settlementType)) { - fields.add(field(HcsContractFieldConstant.FIELD_FD_SETTLEMENT_TYPE, "合同结算类型", settlementType)); + HcsXformFieldDTO settlementField = field(HcsContractFieldConstant.FIELD_FD_SETTLEMENT_TYPE, "合同结算类型", settlementType); + // 字典类字段需带 fdIsSystem=true(合规侧按系统字典值解析,2026-10-14 联调确认) + settlementField.setFdIsSystem("true"); + fields.add(settlementField); } else { log.warn("HCS合同结算类型无法确定:contractCategory=[{}] 非承运商合同/客户合同,fdSettlementType 不传", contractManage.getContractCategory()); } @@ -409,7 +417,7 @@ public class HcsContractSyncSupport { } /** - * signer 相对方(签署方):甲/乙双方,fdType(inner/外部)判定规则待联调(§9-U6)暂不传 + * signer 相对方(签署方):甲/乙双方,fdType 暂统一传 customer(客户,2026-10-14 联调确认) */ private List buildSigners(ContractManage contractManage) { List signers = new ArrayList<>(); @@ -431,6 +439,8 @@ public class HcsContractSyncSupport { signer.setFdName(partyName); // 相对方编号:按名称反查 CustomerArchive 客商编码,反查不到留空(§9-U6) signer.setFdNumber(queryCustomerCode(partyName)); + // 单位类型:暂统一传 customer(客户),inner/外部判定规则后续联调细化(§9-U6) + signer.setFdType(SIGNER_FD_TYPE_CUSTOMER); return signer; } diff --git a/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md b/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md index 6bdeb710..9eb25194 100644 --- a/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md +++ b/doc/docs/hcs合同/2026-10-11-hcs合同推送流程梳理.md @@ -1,7 +1,7 @@ # 新建合同推送 HCS(合同合规系统)流程梳理 > 依据代码现状整理,核心类:`HcsContractSyncSupport`(blade-service/blade-transport/.../support/hcs)。 -> 对接接口:C101-1 风险校验、C103-2 附件上传、C103-3 合同判重、C103-1 合同发起、C103-11 合同更新、C103-8 特批、C103-9 履约规则;特批结果接收 `/hcs/contractLegal/result`(合规推送,替代未建设的 B103,见 §9.4)。 +> 对接接口:C101-1 风险校验、C103-2 附件上传、C103-3 合同判重、C103-1 合同发起、C103-11 合同更新、C103-8 特批、C103-9 履约计划、C108-1/C108-2 履约记录;特批结果接收 `/hcs/contractLegal/result`(合规推送,替代未建设的 B103,见 §9.4)。 > "必填" 标注来源:代码注释中标注的 v4 接口文档要求(HCS 侧),以及 TMS 推送前强校验(缺失直接失败)。 --- @@ -34,13 +34,13 @@ ④ 合同发起/更新 首推且未判重命中 → C103-1 发起(返回 fdContractId,必须持久化) 已有 hcsFdId(变更单)→ C103-11 更新(顶层 fdId 定位) -⑤ 自动特批(C103-8,高风险/黑名单 且 hcsSpecStatus ≠ approved 时) - 置 hcsSpecStatus=need + currentNode="特批审核"(TMS 流程挂起展示) - → 筛选「特批说明」附件(attachmentsJson 中 attachmentType=spec_explanation)转传 C103-2 - → 自动发起 C103-8 → hcsSpecStatus=processing - 发起失败保持 need 仅留痕,可人工经 /hcs/contract/spec-apply 重发 -⑥ 履约规则同步(C103-9,开关 exe-stage.sync-enabled,一期默认关闭) - 随合同链路行级同步,失败抛出走下轮凭 hcs_fd_id 更新补偿 +⑤ 履约计划同步(C103-9,开关 exe-stage.sync-enabled,一期默认关闭,详见 §十) + 仅依赖 hcs_fd_id,先于特批挂起执行(2026-10-14 调整); + 失败抛出走下轮凭 hcs_fd_id 更新补偿,不被特批门禁阻塞 +⑥ 自动特批挂起(高风险/黑名单 且 hcsSpecStatus ≠ approved 时) + 报文随 fdSepcailContract=true 在合规侧发起特批流程(2026-10-13 起,无独立 C103-8 发起接口) + → 置 hcsSpecStatus=processing + currentNode="特批审核"(TMS 流程挂起展示, + 等待合规推送 contractLegal/result 或 C103-4 定时查询联动;发起异常仅留痕) ``` 结果回填: @@ -139,7 +139,11 @@ | `contract.require-risk-check` | 推送前客商风险校验开关 | — | | `risk.block-blacklist` | 黑名单阻断付款提交(付款链路);合同链路不再阻断推送,高风险/黑名单转自动特批(§九) | — | | `attachment.transfer-enabled` | 附件转传开关 | 关闭时不挂附件 | -| `exe-stage.sync-enabled` | C103-9 履约规则同步开关(一期默认关) | — | +| `exe-stage.sync-enabled` | C103-9 履约计划同步开关(一期默认关) | — | +| `exe-stage.fund-type` | C103-9 行金额类型缺省值(默认 byAmount) | — | +| `operator-login-name` | C103-9 报文操作人登录名(默认 srvadmin,非承办人) | — | +| `perf-record.sync-enabled` | C108-1/2 履约记录同步开关(一期默认关) | — | +| `perf-record.xform-id` | 履约记录表单模板ID(待合规方提供) | 未配置不传 fd_xform_id | --- @@ -148,6 +152,7 @@ | 字段 | 含义 | | --- | --- | | `hcs_fd_id` | 合规合同ID(C103-1 返回的 fdContractId,判重命中也回填) | +| `hcs_exeplan_id` | 履约计划ID(C103-9 返回的 fdExeplanId,整体 update 定位用) | | `hcs_sync_status` | unsynced / synced / failed | | `hcs_retry_count` | 推送重试次数 | | `hcs_sync_time` / `hcs_sync_msg` | 最近推送时间 / 结果描述 | @@ -193,8 +198,8 @@ TMS 审批通过(approved / change_approved) → 即时推送 / 扫描兜底 → pushContract → ① 风险校验留痕(risky 标志,不阻断) → ④ C103-1 起草成功(hcs_sync_status=synced,回填 hcs_fd_id) - → ⑤ 置 hcs_spec_status=need + currentNode="特批审核"(TMS 流程挂起) - → 筛「特批说明」附件转传 C103-2 → 自动发起 C103-8 → hcs_spec_status=processing + → ⑤ C103-9 履约计划同步(先于特批挂起;失败单据落 failed,修复后重推不被特批门禁阻塞) + → ⑥ 置 hcs_spec_status=processing + currentNode="特批审核"(TMS 流程挂起,合规侧随报文 fdSepcailContract=true 走特批) ``` - 原设计"黑名单挂起不推送、人工发起特批"存在死锁(挂起时无 `hcs_fd_id`,C103-8 报文必填合规合同ID 永远失败),本次变更为 **先 C103-1 起草、后 C103-8 特批**,特批通过即合规侧放行签约,无需恢复推送; @@ -218,3 +223,77 @@ TMS 审批通过(approved / change_approved) | rejected | `approvalStatus=rejected` + `currentNode="已驳回"`,走重新编辑 → 提交 → 审批 → 重新特批闭环(重新推送时 C103-11 更新后再次自动特批),reason 随原文见 `hcs_spec_msg` | > 等效兜底:页面人工确认(`POST /hcs/contract/spec/confirm`,合同)与(`POST /hcs/spec-pay/confirm`,付款)与合规推送等效,二者均以先到为准。原推测性接收端点 `POST /hcs/callback/spec-result`(B103 候选键解析)已删除。 + +--- + +## 十、履约计划(C103-9)与履约记录(C108-1/C108-2)同步 + +> 业务定位:涉及收付款的合同须在合规侧建立履约计划,付款履约记录凭计划阶段ID(`hcs_stage_fd_id`)关联阶段。 +> 一期 `exe-stage.sync-enabled=false`、`perf-record.sync-enabled=false` 暂不上报 HCS(2026-10-09 范围调整),但 `blade_contract_exe_stage` 表、维护端点与审批标记逻辑均在运行。 + +### 10.1 数据模型与维护入口 + +`blade_contract_exe_stage` 是 TMS 侧的**合同履约计划行项目表**:合同的收付款资金计划逐行存储(如"预付款 30 万 / 进度款 50 万 / 质保金 20 万"各一行),是 C103-9 推送 HCS 的数据源。单独建表而非挂合同主表 JSON 的原因: + +- **行级同步**:C103-9 是行级 add/update/delete 操作,每行需独立 `row_op` 标记、独立回填合规阶段ID、独立同步状态 +- **删除不可逆**:已同步行必须软删后凭 `hcs_stage_fd_id` 上报 delete,直接物理删会在合规侧留孤儿数据 +- **重试粒度**:单行失败(如 add 未匹配到返回阶段ID)可单独保持 failed 下轮重试,不拖累整单 +- **一期攒数据**:开关关闭不上报,但表与维护端点照常运行,打开后可凭已有数据补推 + +行字段(`HcsContractExeStage`): + +| 字段 | 说明 | +| --- | --- | +| `perform_type` | 履约类型 payment=付款 / collection=收款 | +| `fund_nature` | 款项性质 prepayment=预付 / progress=进度 / acceptance=验收 / retention=质保 | +| `fund_amount` / `fund_date` | 计划金额(元)/ 计划资金日期 | +| `invoice_rule` / `invoice_cycle` | 开票规则 payFirst=先款后票 / invoiceFirst=先票后款;账期(天) | +| `fund_type` / `is_finish` | 金额类型(空取配置 `exe-stage.fund-type`)/ 是否完成 | +| `row_op` | 行级同步标记 none / add / update / delete | +| `hcs_stage_fd_id` | 合规阶段ID(C103-9 返回,行 update/delete 全靠它,必须持久化) | +| `hcs_sync_status` / `hcs_sync_msg` | 行级同步状态与结果 | + +> `fund_type`(金额类型)是 HCS 报文要求的**金额口径声明**(byAmount=按固定金额),一期三级兜底恒为 byAmount(建表默认 → 行值为空取 `exe-stage.fund-type` → 推送组装时再兜底);其他口径(如按比例)值域 HCS 文档未给出,待联调后放开,代码不做枚举校验。 + +维护端点 `ContractExeStageController`(列表 / 批量提交 / 删除,`ContractExeStageServiceImpl`): + +- 校验:`performType` 必填且仅 payment/collection,计划金额非负 +- 新行置 `row_op=add` 待随合同链路首推;已同步行(有 `hcs_stage_fd_id`)编辑置 update、未同步行保持 add +- 删除:已同步行软删 + `row_op=delete`(须凭合规阶段ID 上报删除,不可物理删除);未同步行直接物理删除 + +### 10.2 同步时机 + +- 合同审批通过(`ContractManageServiceImpl#approve`):未同步行(`hcs_stage_fd_id is null`)统一置 `row_op=add` +- 执行位置:`pushContract` 第⑤步(先于特批挂起,2026-10-14 调整);前置强约束:合同须已有 `hcs_fd_id`(先 C103-1 起草、后 C103-9);开关关闭时直接跳过 + +### 10.3 C103-9 报文与回填(`HcsExeStageSyncSupport`) + +顶层(`HcsExeplanSyncDTO`):`fdContractId`=`hcs_fd_id`(合规合同ID,非 TMS 主键)、`fdOuterSystem`=`src-system`、`fdLoginName`=配置 `operator-login-name`(默认 srvadmin)、`fdEopExeplanOperateType` 首次 add / 已同步 update(看 `hcs_exeplan_id`,已同步则同时传 `fdExeplanId`)。 + +行级 `fdStages[]`(对应待同步行): + +| HCS 字段 | TMS 取值 | 备注 | +| --- | --- | --- | +| `fdId` | `hcs_stage_fd_id` | add 行不传;update/delete 必传 | +| `fdEopExeplanOperateType` | `row_op` | add / update / delete | +| `fdPerformType` | `perform_type` | 必填 | +| `fdFundNature` / `fdFundAmount` / `fdFundDate` | 同名字段 | 资金日期转毫秒时间戳 | +| `fdInvoiceRule` / `fdInvoiceCycle` | 同名字段 | 账期(天) | +| `fdFundType` | `fund_type`,空取 `exe-stage.fund-type` | 默认 byAmount | +| `fdIsFinish` | `is_finish` | boolean | +| `fdExtendContent` | 固定 `"{}"` | | + +取数与回填: + +- 取数 `selectSyncRows`:`row_op <> 'none'` 的行,**含软删的 delete 行**(原生 SQL 绕过逻辑删除过滤) +- 成功回填三件事:`fdExeplanId` → `blade_contract_manage.hcs_exeplan_id`;`fdChangeStages[]` 各行合规 fdId → `hcs_stage_fd_id`;成功行清 `row_op=none` 并置行级 synced +- `fdChangeStages` 与请求行对应关系 v4 未明确(待联调):行数一致按请求行序对应;不一致按 履约类型|款项性质|金额|资金日期 组合键匹配;add 行匹配不到保持 failed 待下轮重试 +- 失败抛异常走合同 `markFailed`,下轮凭 `hcs_fd_id` 整体重推补偿(§二⑥) + +### 10.4 履约记录(付款链路,C108-1/C108-2) + +`HcsPerfRecordSyncSupport`,随付款推送链路执行(`HcsPaymentSyncSupport`,开关 `perf-record.sync-enabled`,一期默认关): + +- 付款审批通过 → C108-1 新建,返回 fdId 回填付款申请 `hcs_perf_fd_id`(立即持久化) +- 实际付款推进(`paidAmount` 变化置待同步)→ C108-2 更新,`formData.fdId`=`hcs_perf_fd_id` 必填(响应无 data,success=true 即成功) +- 关联履约阶段:按合同 + 付款类型匹配**已同步**的计划行(`hcs_stage_fd_id` 非空),无关联不传 fd_id —— 履约计划同步是履约记录关联的前置 From fcac12f4011d81fe980c149444d47e731ef7b786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 15 Oct 2026 03:33:51 +0800 Subject: [PATCH 069/124] =?UTF-8?q?fix:=20=E5=90=88=E5=90=8C=E5=B1=A5?= =?UTF-8?q?=E7=BA=A6=E8=A7=84=E5=88=99=E5=90=8C=E6=AD=A5=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java | 2 +- .../main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java | 4 ++++ .../src/main/java/org/springblade/hcs/feign/IHcsClient.java | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java index 4badd703..c08b3858 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java @@ -54,7 +54,7 @@ public class HcsSignerDTO implements Serializable { */ private String fdNumber; /** - * 单位类型:inner 表示内部单位(判定规则联调确认,§9-U6) + * 单位类型:TMS 暂统一传 customer(客户),inner/外部判定规则联调细化(§9-U6) */ private String fdType; /** diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java index 6f0d71c2..fa74f5fe 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java @@ -61,4 +61,8 @@ public class HcsXformFieldDTO implements Serializable { * 字段类型标记:时间字段传 timestamp */ private String fdType; + /** + * 是否系统字典值:字典类字段(如 fdSettlementType 合同结算类型)传 "true" + */ + private String fdIsSystem; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java index d34a7a89..d5a617ee 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java @@ -89,7 +89,7 @@ public interface IHcsClient { String CONTRACT_UPDATE_URL = "${thirdParty.hcs.contractUpdateUrl:/openapi/eop-cdraft/eopCdraftMainOpen/updateDraft}"; String CONTRACT_LIST_URL = "${thirdParty.hcs.contractListUrl:/openapi/eop-data/eopDataContractOpen/list}"; String CONTRACT_DETAIL_URL = "${thirdParty.hcs.contractDetailUrl:/openapi/eop-data/eopDataContractOpen/detail}"; - String EXEPLAN_ADD_URL = "${thirdParty.hcs.exeplanAddUrl:/openapi/eop-exeplan/eopExeplanMainOpen/add}"; + String EXEPLAN_ADD_URL = "${thirdParty.hcs.exeplanAddUrl:/openapi/eop-exeplan/lcode/ext-eop-exeplan/extEopExeplanMainOpen/syncExeplan}"; String TEMPLATE_LIST_URL = "${thirdParty.hcs.templateListUrl:/openapi/eop-cdraft/eopCdraftTemplateOpen/list}"; String CATEGORY_LIST_URL = "${thirdParty.hcs.categoryListUrl:/openapi/eop-base/eopBaseContractCategoryOpen/list}"; String CURRENCY_LIST_URL = "${thirdParty.hcs.currencyListUrl:/openapi/eop-base/eopBaseCurrencyOpen/list}"; @@ -181,7 +181,7 @@ public interface IHcsClient { HcsResult contractDetail(@RequestBody HcsContractDetailQueryDTO param); /** - * C103-9(新) 合同履约规则同步(行级增删改,与废弃旧接口同路径不同入参,务必用本新版结构) + * C103-9(新) 合同履约规则同步(行级增删改;2026-10-14 合规方确认改走 syncExeplan 统一同步路径) * * @param param 请求参数 * @return fdExeplanId 与变更阶段 fdId(均须持久化) From 4dfb8ebe9fe9521baf6f6c16c86a948ab11c2297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 15 Oct 2026 04:44:54 +0800 Subject: [PATCH 070/124] =?UTF-8?q?:refactor:=20HCS=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E5=BC=80=E5=85=B3=E9=85=8D=E7=BD=AE=E7=BB=9F=E4=B8=80=E6=94=B6?= =?UTF-8?q?=E6=95=9B=E8=87=B3HcsProperties=E5=B9=B6=E6=94=AF=E6=8C=81Nacos?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsImmediatePushSupport.java | 11 ++--- .../transport/task/HcsPushTask.java | 41 +++---------------- .../springblade/hcs/config/HcsProperties.java | 36 ++++++++++++++++ 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsImmediatePushSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsImmediatePushSupport.java index bf3980ce..12f754c1 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsImmediatePushSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsImmediatePushSupport.java @@ -29,12 +29,12 @@ import jakarta.annotation.PreDestroy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.hcs.config.HcsProperties; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.ProjectApplyMapper; import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.ProjectApply; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; @@ -77,18 +77,13 @@ public class HcsImmediatePushSupport { */ private static final AtomicInteger THREAD_COUNTER = new AtomicInteger(1); + private final HcsProperties hcsProperties; private final HcsProjectSyncSupport hcsProjectSyncSupport; private final HcsContractSyncSupport hcsContractSyncSupport; private final ProjectApplyMapper projectApplyMapper; private final ContractManageMapper contractManageMapper; private final BladeRedis bladeRedis; - /** - * 即时推送总开关(thirdParty.hcs.push.immediate-enabled,默认关闭灰度打开;关闭时完全回落扫描链路) - */ - @Value("${thirdParty.hcs.push.immediate-enabled:false}") - private boolean immediateEnabled; - /** * 推送线程池:2 线程 daemon,即时推送与定时扫描互不影响 */ @@ -120,7 +115,7 @@ public class HcsImmediatePushSupport { * 开关校验后注册提交时机:有活动事务注册 afterCommit 回调(回滚不推送),无事务(MK 回调单条更新自动提交)直接异步 */ private void submitAfterCommit(String bizType, Long id, Runnable pushAction) { - if (!immediateEnabled) { + if (!hcsProperties.getPush().isImmediateEnabled()) { return; } Runnable pushTask = () -> this.pushWithLock(bizType, id, pushAction); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java index 8f239069..874fc41f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java @@ -48,7 +48,6 @@ import org.springblade.transport.support.hcs.HcsInvoiceRegSyncSupport; import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; import org.springblade.transport.support.hcs.HcsProjectSyncSupport; import org.springblade.transport.support.hcs.HcsReceiptBillSyncSupport; -import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -111,42 +110,12 @@ public class HcsPushTask { private final HcsReceiptBillSyncSupport hcsReceiptBillSyncSupport; private final BladeRedis bladeRedis; - /** - * 项目立项(C102)推送开关,默认关闭(Nacos thirdParty.hcs.push.project.sync-enabled,灰度打开) - */ - @Value("${thirdParty.hcs.push.project.sync-enabled:false}") - private boolean projectSyncEnabled; - - /** - * 合同(C103)推送开关,默认关闭(Nacos thirdParty.hcs.push.contract.sync-enabled,灰度打开) - */ - @Value("${thirdParty.hcs.push.contract.sync-enabled:false}") - private boolean contractSyncEnabled; - - /** - * 付款链(C106 特批 / C108 履约记录)推送开关,默认关闭(Nacos thirdParty.hcs.push.payment.sync-enabled,灰度打开) - */ - @Value("${thirdParty.hcs.push.payment.sync-enabled:false}") - private boolean paymentSyncEnabled; - - /** - * 开票登记(C111)推送开关,默认关闭(Nacos thirdParty.hcs.push.invoice-application.sync-enabled,灰度打开) - */ - @Value("${thirdParty.hcs.push.invoice-application.sync-enabled:false}") - private boolean invoiceApplicationSyncEnabled; - - /** - * 收票单(C109)推送开关,默认关闭(Nacos thirdParty.hcs.push.invoice-receipt.sync-enabled,灰度打开) - */ - @Value("${thirdParty.hcs.push.invoice-receipt.sync-enabled:false}") - private boolean invoiceReceiptSyncEnabled; - /** * 项目立项(C102)定时推送:扫描审批通过且待同步/待补偿的项目,独立开关与 cron 调度 */ @Scheduled(cron = "${thirdParty.hcs.push.project.cron:0 */5 * * * ?}") public void pushHcsProject() { - this.runOnce("项目立项", HcsSyncConstant.BIZ_TYPE_PROJECT, projectSyncEnabled, this::pushUnsyncedProjects); + this.runOnce("项目立项", HcsSyncConstant.BIZ_TYPE_PROJECT, hcsProperties.getPush().getProject().isSyncEnabled(), this::pushUnsyncedProjects); } /** @@ -155,7 +124,7 @@ public class HcsPushTask { */ @Scheduled(cron = "${thirdParty.hcs.push.contract.cron:0 1/5 * * * ?}") public void pushHcsContract() { - this.runOnce("合同", HcsSyncConstant.BIZ_TYPE_CONTRACT, contractSyncEnabled, this::syncHcsContracts); + this.runOnce("合同", HcsSyncConstant.BIZ_TYPE_CONTRACT, hcsProperties.getPush().getContract().isSyncEnabled(), this::syncHcsContracts); } /** @@ -171,7 +140,7 @@ public class HcsPushTask { */ @Scheduled(cron = "${thirdParty.hcs.push.payment.cron:0 2/5 * * * ?}") public void pushHcsPayment() { - this.runOnce("付款链", HcsSyncConstant.BIZ_TYPE_PAYMENT, paymentSyncEnabled, this::pushUnsyncedPayments); + this.runOnce("付款链", HcsSyncConstant.BIZ_TYPE_PAYMENT, hcsProperties.getPush().getPayment().isSyncEnabled(), this::pushUnsyncedPayments); } /** @@ -179,7 +148,7 @@ public class HcsPushTask { */ @Scheduled(cron = "${thirdParty.hcs.push.invoice-application.cron:0 3/5 * * * ?}") public void pushHcsInvoiceApplication() { - this.runOnce("开票登记", HcsSyncConstant.BIZ_TYPE_INVOICE_APPLICATION, invoiceApplicationSyncEnabled, this::pushUnsyncedInvoiceApplications); + this.runOnce("开票登记", HcsSyncConstant.BIZ_TYPE_INVOICE_APPLICATION, hcsProperties.getPush().getInvoiceApplication().isSyncEnabled(), this::pushUnsyncedInvoiceApplications); } /** @@ -187,7 +156,7 @@ public class HcsPushTask { */ @Scheduled(cron = "${thirdParty.hcs.push.invoice-receipt.cron:0 4/5 * * * ?}") public void pushHcsInvoiceReceipt() { - this.runOnce("收票单", HcsSyncConstant.BIZ_TYPE_INVOICE_RECEIPT, invoiceReceiptSyncEnabled, this::pushUnsyncedInvoiceReceipts); + this.runOnce("收票单", HcsSyncConstant.BIZ_TYPE_INVOICE_RECEIPT, hcsProperties.getPush().getInvoiceReceipt().isSyncEnabled(), this::pushUnsyncedInvoiceReceipts); } /** diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 301a44a5..5e0ca285 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -152,6 +152,10 @@ public class HcsProperties { @Data public static class Push { + /** + * 审批通过即时推送总开关(thirdParty.hcs.push.immediate-enabled,默认关闭灰度打开;关闭时完全回落扫描链路) + */ + private boolean immediateEnabled = false; /** * 每类单据单轮扫描批量(全局) */ @@ -160,6 +164,38 @@ public class HcsProperties { * 推送失败自动重试上限,超限仅人工重推(全局) */ private int maxRetry = 5; + /** + * 项目立项(C102)推送开关(thirdParty.hcs.push.project.sync-enabled,默认关闭,灰度打开) + */ + private Task project = new Task(); + /** + * 合同(C103)推送开关(thirdParty.hcs.push.contract.sync-enabled,默认关闭,灰度打开) + */ + private Task contract = new Task(); + /** + * 付款链(C106 特批 / C108 履约记录)推送开关(thirdParty.hcs.push.payment.sync-enabled,默认关闭,灰度打开) + */ + private Task payment = new Task(); + /** + * 开票登记(C111)推送开关(thirdParty.hcs.push.invoice-application.sync-enabled,默认关闭,灰度打开) + */ + private Task invoiceApplication = new Task(); + /** + * 收票单(C109)推送开关(thirdParty.hcs.push.invoice-receipt.sync-enabled,默认关闭,灰度打开) + */ + private Task invoiceReceipt = new Task(); + } + + /** + * 单类单据推送任务配置(thirdParty.hcs.push.{bizType}.sync-enabled; + * cron 有代码默认值错峰每 5 分钟,保持 @Scheduled 占位符形式,未纳入本类) + */ + @Data + public static class Task { + /** + * 推送开关,默认关闭(灰度打开) + */ + private boolean syncEnabled = false; } @Data From f849225ccf8edba82ff9cb4cafe19193b692af2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 15 Oct 2026 12:07:56 +0800 Subject: [PATCH 071/124] =?UTF-8?q?:feat:=20=E6=96=B0=E5=A2=9EHCS=20C107-1?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AE=A4=E9=A2=86=E8=AE=B0=E5=BD=95=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hcs/dto/HcsClaimRecordAddDTO.java | 102 ++++++++++++++++++ .../org/springblade/hcs/feign/IHcsClient.java | 13 ++- 2 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsClaimRecordAddDTO.java diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsClaimRecordAddDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsClaimRecordAddDTO.java new file mode 100644 index 00000000..8185a17c --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsClaimRecordAddDTO.java @@ -0,0 +1,102 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 合同合规系统(HCS)C107-1 新增认领记录入参(将收款流水认领到合同/履约项) + *

    + * 校验:fdCollectionFlow.fdId、fdContractNumber(须在合规本地存在)、fdClaimAmount 必填, + * 认领金额必须大于 0 且不能超过该流水收款金额;fdExePlanStageId 可选,若传须属于该合同。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsClaimRecordAddDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 收款流水(fdId 必填,为合规系统流水ID) + */ + private HcsRefVO fdCollectionFlow; + /** + * 认领合同 {fdId, fdName}(fdId 为合规合同ID,随编号一并回溯) + */ + private HcsRefVO fdContract; + /** + * 认领合同编号(必填,须在合规系统本地存在) + */ + private String fdContractNumber; + /** + * 对应履约项ID(可选,须属于该合同) + */ + private String fdExePlanStageId; + /** + * 认领款项类型(prepayment=预付款,progress=进度款,acceptance=验收款,retention=质保金) + */ + private String fdFundNature; + /** + * 认领人 {fdId, fdName} + */ + private HcsRefVO fdClaimer; + /** + * 认领人名称 + */ + private String fdClaimerName; + /** + * 认领人部门 {fdId, fdName} + */ + private HcsRefVO fdClaimerDept; + /** + * 认领人部门名称 + */ + private String fdClaimerDeptName; + /** + * 认领金额(必填,必须大于0,且不能超过收款金额) + */ + private BigDecimal fdClaimAmount; + /** + * 认领日期(毫秒时间戳) + */ + private Long fdClaimDate; + /** + * 备注 + */ + private String fdRemark; + /** + * 状态:0=已认领(默认),1=已作废 + */ + private Integer fdStatus; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java index d5a617ee..a119b917 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java @@ -30,6 +30,7 @@ import org.springblade.hcs.config.HcsFeignClientConfig; import org.springblade.hcs.dto.HcsAttachmentDownloadDTO; import org.springblade.hcs.dto.HcsAttachmentVO; import org.springblade.hcs.dto.HcsCategoryVO; +import org.springblade.hcs.dto.HcsClaimRecordAddDTO; import org.springblade.hcs.dto.HcsContractDetailQueryDTO; import org.springblade.hcs.dto.HcsContractDetailVO; import org.springblade.hcs.dto.HcsContractDraftDTO; @@ -66,7 +67,7 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; /** - * 合同合规系统(HCS)接口(一期 24 个业务接口,D4) + * 合同合规系统(HCS)接口(一期 25 个业务接口,D4) *

    * v4 接口说明:认证统一由 {@link org.springblade.hcs.interceptor.HcsAuthInterceptor} 注入 * Authorization + Key-Auth 两个静态请求头,不再调用 getToken 取令牌; @@ -105,6 +106,7 @@ public interface IHcsClient { String INVOICE_REG_LIST_URL = "${thirdParty.hcs.invoiceRegListUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/list}"; String INVOICE_REG_ADD_URL = "${thirdParty.hcs.invoiceRegAddUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/add}"; String INVOICE_REG_UPDATE_URL = "${thirdParty.hcs.invoiceRegUpdateUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/update}"; + String CLAIM_RECORD_ADD_URL = "${thirdParty.hcs.claimRecordAddUrl:/openapi/eop-data/eopDataCollectionFlowClaimRecordOpen/add}"; /** * C102-1 项目立项新建 @@ -327,4 +329,13 @@ public interface IHcsClient { */ @PostMapping(INVOICE_REG_UPDATE_URL) HcsResult invoiceRegistrationUpdate(@RequestBody HcsInvoiceRegUpdateDTO param); + + /** + * C107-1 新增认领记录(将收款流水认领到合同/履约项) + * + * @param param 请求参数(fdCollectionFlow.fdId、fdContractNumber、fdClaimAmount 必填) + * @return 新增认领记录 fdId(必须持久化) + */ + @PostMapping(CLAIM_RECORD_ADD_URL) + HcsResult claimRecordAdd(@RequestBody HcsClaimRecordAddDTO param); } From 5371d618f13108d498159399e25f6d565b4d5e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 15 Oct 2026 19:41:58 +0800 Subject: [PATCH 072/124] =?UTF-8?q?:feat:=20=E9=A1=B9=E7=9B=AE=E7=AB=8B?= =?UTF-8?q?=E9=A1=B9=E4=B8=8E=E5=90=88=E5=90=8C=E6=96=B0=E5=A2=9E=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=8B=BE=E9=80=89=E6=89=B9=E9=87=8F=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HcsSyncController.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 46956b8f..70fbbb66 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -68,6 +68,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -135,6 +136,41 @@ public class HcsSyncController { return R.data(result); } + /** + * 页面勾选批量重推(项目立项/合同列表勾选行后批量推送,逐条推送互不影响,单条失败计入失败明细) + */ + @PostMapping("/sync/{bizType}/batch") + @ApiOperationSupport(order = 17) + @Operation(summary = "按勾选ID批量推送/重推合规", description = "仅支持 project(项目立项)、contract(合同),逐条重置待同步后立即推送,单条失败不影响其余,返回成功数与失败明细") + public R repushBatch(@Parameter(description = "业务类型 project/contract", required = true) @PathVariable String bizType, + @Parameter(description = "单据ID列表", required = true) @RequestBody List ids) { + if (!List.of(HcsSyncConstant.BIZ_TYPE_PROJECT, HcsSyncConstant.BIZ_TYPE_CONTRACT).contains(bizType)) { + throw new IllegalArgumentException("不支持的HCS批量推送业务类型:" + bizType); + } + if (ids == null || ids.isEmpty()) { + return R.fail("请先勾选要推送的单据"); + } + int successCount = 0; + List failureList = new ArrayList<>(); + for (Long id : ids) { + try { + if (HcsSyncConstant.BIZ_TYPE_PROJECT.equals(bizType)) { + hcsProjectSyncSupport.repushProject(id); + } else { + hcsContractSyncSupport.repushContract(id); + } + successCount++; + } catch (Exception exception) { + failureList.add(id + ":" + exception.getMessage()); + } + } + String summary = "批量推送完成:成功 " + successCount + " 条,失败 " + failureList.size() + " 条"; + if (!failureList.isEmpty()) { + summary += ";失败明细:" + String.join(";", failureList); + } + return R.data(summary); + } + /** * 特批结果人工确认(§9-U1 过渡兜底:与合规 paymentLegal/result 回调等效,均联动付款审批状态) */ From f23f73e263cefd5db1e2eecb9ed01e9351e75ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 15 Oct 2026 21:03:27 +0800 Subject: [PATCH 073/124] =?UTF-8?q?:fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=A2?= =?UTF-8?q?=E5=95=86=E5=AE=A1=E6=A0=B8=E9=80=9A=E8=BF=87=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E9=87=91=E8=9D=B6=E5=A4=B1=E8=B4=A5=E8=A2=AB=E5=90=9E=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E4=B8=94=E5=A4=B1=E8=B4=A5=E7=8A=B6=E6=80=81=E6=9C=AA?= =?UTF-8?q?=E8=90=BD=E5=BA=93=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CustomerArchiveController.java | 20 ++++--- .../service/ICustomerArchiveService.java | 8 +++ .../impl/CustomerArchiveServiceImpl.java | 56 +++++++++++++++++-- 3 files changed, 72 insertions(+), 12 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CustomerArchiveController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CustomerArchiveController.java index d0998aa3..b0580c5a 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CustomerArchiveController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CustomerArchiveController.java @@ -136,21 +136,25 @@ public class CustomerArchiveController extends BladeController { } /** - * 审核通过(通过后自动推送金蝶,推送失败不影响审批结果) + * 审核通过(通过后自动推送金蝶,推送失败不影响审批结果,失败原因以警告文案返回) */ @PostMapping("/approve") @ApiOperationSupport(order = 6) @Operation(summary = "审核通过", description = "传入id") public R approve(@Parameter(description = "主键", required = true) @RequestParam Long id) { boolean result = customerArchiveService.approve(id); - if (result) { - try { - customerArchiveService.syncKingdee(id); - } catch (Exception exception) { - log.error("客商审批通过后推送金蝶异常,id={}", id, exception); - } + if (!result) { + return R.status(false); + } + try { + customerArchiveService.syncKingdee(id); + return R.success("审核通过"); + } catch (Exception exception) { + log.error("客商审批通过后推送金蝶异常,id={}", id, exception); + String reason = exception.getMessage() == null ? "金蝶接口调用异常" : exception.getMessage(); + // 与结算/付款/开票审批口径一致:审批已生效,推送失败原因以 data=false 警告文案返回 + return R.data(Boolean.FALSE, "审核通过,但推送金蝶失败:" + reason); } - return R.status(result); } /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ICustomerArchiveService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ICustomerArchiveService.java index 459e35cd..e50f1a47 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ICustomerArchiveService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/ICustomerArchiveService.java @@ -196,6 +196,14 @@ public interface ICustomerArchiveService extends BaseService { */ CustomerArchive syncKingdee(Long id); + /** + * 推送失败状态落库(独立事务):推送主事务已回滚,失败状态与原因单独落库供页面展示与手动重推 + * + * @param id 主键 + * @param reason 失败原因 + */ + void markKingdeeSyncFailed(Long id, String reason); + /** * 定时同步金蝶客商数据:待推送客商自动推送 + 已同步客商使用状态回写 * diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java index f3545757..af8f84c2 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CustomerArchiveServiceImpl.java @@ -34,6 +34,7 @@ import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.SpringUtil; import org.springblade.transport.mk.MkProcessNodeHelper; import org.springblade.transport.support.TransportBusinessSupport; import org.springblade.core.tenant.annotation.TenantIgnore; @@ -96,6 +97,7 @@ import org.springblade.transport.pojo.vo.CustomerReceiptAccountVO; import org.springblade.transport.service.ICustomerArchiveService; import org.springblade.transport.support.KingdeeSyncLockSupport; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; @@ -528,14 +530,52 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpllambdaUpdate() + .eq(CustomerArchive::getId, id) + .eq(CustomerArchive::getApprovalStatus, APPROVAL_APPROVED) + .and(wrapper -> wrapper.isNull(CustomerArchive::getKingdeeStatus) + .or() + .notIn(CustomerArchive::getKingdeeStatus, List.of(KINGDEE_STATUS_SYNCED, KINGDEE_STATUS_EXIST))) + .set(CustomerArchive::getKingdeeStatus, KINGDEE_STATUS_FAILED) + .set(CustomerArchive::getKingdeeFailReason, failReason)); + if (updated > 0 && before != null) { + // 变更记录留档(推送主事务已回滚,此处独立事务落状态与记录) + CustomerArchive after = copyCustomer(before); + after.setKingdeeStatus(KINGDEE_STATUS_FAILED); + after.setKingdeeFailReason(failReason); + addChangeRecord(id, "推送金蝶失败:" + failReason, before, after); + } + } + /** * 组装 A902-2 报文推送金蝶并回写协同状态;detail 由调用方准备, - * 定时同步批量组装报文数据,避免逐条 detail 查询的 N+1 问题 + * 定时同步批量组装报文数据,避免逐条 detail 查询的 N+1 问题; + * 推送失败先落 failed 状态与变更记录,再抛出异常由调用方提示前端(与结算/付款/开票口径一致) */ private void pushCustomerToKingdee(Long id, CustomerArchive customer, CustomerArchive after, CustomerArchiveVO detail) { try { @@ -549,12 +589,18 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl())); - CustomerArchive after = copyCustomer(customer); - after.setKingdeeSyncTime(LocalDateTime.now()); pushCustomerToKingdee(customer.getId(), customer, after, detail); updateList.add(after); if (Objects.equals(after.getKingdeeStatus(), KINGDEE_STATUS_SYNCED)) { @@ -735,6 +781,8 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl Date: Fri, 16 Oct 2026 19:10:51 +0800 Subject: [PATCH 074/124] =?UTF-8?q?:feat:=20=E6=96=B0=E5=A2=9EHCS=E5=90=88?= =?UTF-8?q?=E5=90=8C=E5=90=88=E8=A7=84=E5=AF=B9=E6=8E=A5=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=B9=B6=E6=9B=B4=E6=96=B0dev=E7=8E=AF=E5=A2=83=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E4=B8=8E=E5=87=AD=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - blade-dev.yaml:新增 hcs 配置块(mock 开关、baseUrl、Authorization/Key-Auth、 创建单位、五类推送开关、立项/合同模板映射、风险与额度校验、特批/开票/收票单、 附件转传、主数据缓存等) - blade-dev.yaml:补充 bfi 物料映射、收款认领公告、全票池发票绑定与审批通过自动同步配置 - blade-dev.yaml:新增 MinIO 文件存储配置;caller 侧调整 lock、logging、wechat.mini 位置 - third-party-api.yaml:更新 hcs Authorization、创建单位 id/name(百色物产新源供应链有限公司)、 立项 template-code 回退为 template_15x0og、承运商合同模板 id --- doc/nacos/blade-dev.yaml | 203 ++++++++++++++++++++++++++++++--- doc/nacos/third-party-api.yaml | 8 +- 2 files changed, 192 insertions(+), 19 deletions(-) diff --git a/doc/nacos/blade-dev.yaml b/doc/nacos/blade-dev.yaml index 063e4cc1..571180d4 100644 --- a/doc/nacos/blade-dev.yaml +++ b/doc/nacos/blade-dev.yaml @@ -32,7 +32,7 @@ spring: blade: #分布式锁配置 lock: - enabled: false + enabled: true address: redis://127.0.0.1:6379 #多团队协作服务配置 loadbalancer: @@ -47,10 +47,9 @@ blade: datasource: dev: # MySql - # rewriteBatchedStatements=true:MyBatis-Plus saveBatch/updateBatchById 依赖该参数才会合并为多值语句,否则仍是逐条往返(仅 MySQL 支持,切换其他库需移除) url: jdbc:mysql://localhost:3306/transport?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true username: root - password: root + password: 123456 # PostgreSQL #url: jdbc:postgresql://127.0.0.1:5432/bladex #username: postgres @@ -76,6 +75,18 @@ blade: #username: kingbase #password: 123456 +#日志级别配置 +logging: + level: + org.springblade: debug + # 临时 + org.springframework.amqp: ERROR + org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer: OFF + # feign: debug +# logging: +# file: +# path: ./logs # 日志文件目录 +# name: ./logs/app.log # 或直接指定文件名 #第三方接口配置 thirdParty: ocr: @@ -93,12 +104,11 @@ thirdParty: queryDepartmentPageUrl: /gwzh/OA/OA_GET_DEPARTMENT_LIST queryPersonPageUrl: /gwzh/OA/OA_GET_USER_LIST authorization: ${OA_AUTHORIZATION:${IAM_SSO_AUTHORIZATION:Z3d6aF90bXMtOVJJU0RVN1U6YW0yYkcwWnBJZ0RQZmtrSjNaZkZjUDBSaGFuSEtxQng=}} - lbs: - # LBS 网关地址(车辆实时定位) - baseUrl: http://172.16.204.83:38000 - locateUrl: /gwzh/LBS/LBS_LOCATE - trackUrl: /gwzh/LBS/LBS_TRACK - authorization: ${LBS_AUTHORIZATION:${OA_AUTHORIZATION:${IAM_SSO_AUTHORIZATION:Z3d6aF90bXMtOVJJU0RVN1U6YW0yYkcwWnBJZ0RQZmtrSjNaZkZjUDBSaGFuSEtxQng=}}} + wechat: + mini: + # 微信小程序(手机号一键登录 / openid) + appId: ${WECHAT_MINI_APP_ID:} + appSecret: ${WECHAT_MINI_APP_SECRET:} track: # 轨迹开放接口地址 baseUrl: http://127.0.0.1:8080 @@ -120,7 +130,6 @@ thirdParty: processExecuteUrl: ${MK_PROCESS_EXECUTE_URL:/openapi/sys-lbpm/sysLbpmProcess/openSupport/execute} processDeleteUrl: ${MK_PROCESS_DELETE_URL:/openapi/sys-lbpm/sysLbpmProcess/openSupport/delete} getCurrentNodesUrl: ${MK_CURRENT_NODES_URL:/openapi/sys-lbpm/sysLbpmProcess/openSupport/getCurNodesInfo} - getProcessInfoUrl: ${MK_PROCESS_INFO_URL:/openapi/sys-lbpm/sysLbpmProcess/openSupport/getProcessInfo} getNodeHandlersUrl: ${MK_NODE_HANDLERS_URL:/openapi/sys-lbpm/sysLbpmProcess/openSupport/getNodeHandlerInfos} getManualNodeUrl: ${MK_MANUAL_NODE_URL:/openapi/sys-lbpm/sysLbpmTemplate/openSupport/getManualNode} pushOrgDeptUrl: ${MK_PUSH_ORG_DEPT_URL:/openapi/sys-org/v2/push/orgDept} @@ -133,11 +142,7 @@ thirdParty: downloadFileUrl: ${MK_DOWNLOAD_FILE_URL:/openapi/sys-attach/fileStream/download} queryApprovalListUrl: ${MK_QUERY_APPROVAL_LIST_URL:/openapi/lbpm-approval/lbpmApproval/portal/list} queryProcessListUrl: ${MK_QUERY_PROCESS_LIST_URL:/openapi/sys-lbpm/sysLbpmProcess/openSupport/list} - wechat: - mini: - # 微信小程序(手机号一键登录 / openid) - appId: ${WECHAT_MINI_APP_ID:} - appSecret: ${WECHAT_MINI_APP_SECRET:} + # 业财融合(BFI)应用及接口配置,敏感值通过环境变量注入 bfi: # 业财融合(BFI)应用及接口配置,敏感值通过环境变量注入 baseUrl: ${BFI_BASE_URL:http://172.16.203.134:8000/gwzh/BFI} @@ -149,6 +154,22 @@ thirdParty: language: ${BFI_LANGUAGE:zh_CN} # 数据来源系统编码(推送金蝶公共参数:客商、付款申请等统一使用),默认 WLTMS(运输TMS) srcSys: ${BFI_SRC_SYS:WLTMS} + + # 应付/应收/收票单分录物料映射(A102-2/A302-2/A303-2 共用,未配置使用代码默认值): + # 运输类按项目业务模式映射——国内运输按运单运输方式映射、国际运输映射国际货代服务; + # 装卸大类及手动添加的非运费杂费映射装卸物料 + material: + # 国内运输:运单运输方式 -> 金蝶物料编码(公路运输/铁路运输/水路运输/航空运输四种) + domestic: + "[公路运输]": ${BFI_MATERIAL_DOMESTIC_ROAD:XDWL11010001} + "[铁路运输]": ${BFI_MATERIAL_DOMESTIC_RAIL:XDWL11010002} + "[水路运输]": ${BFI_MATERIAL_DOMESTIC_WATER:XDWL11010003} + "[航空运输]": ${BFI_MATERIAL_DOMESTIC_AIR:Item-00001082} + # 国际运输业务模式物料编码(国际货运代理服务) + international: ${BFI_MATERIAL_INTERNATIONAL:Item-00001081} + # 装卸大类、手动添加非运费杂费物料编码(装卸) + loading: ${BFI_MATERIAL_LOADING:XDWL11002004} + # 付款申请推送配置(A103-3 付款申请保存) payApply: # 单据类型编码:ap_payapply_BT_S 采购付款申请、ap_payapply_oth_BT_S 其他付款申请 @@ -164,6 +185,26 @@ thirdParty: syncEnabled: ${BFI_PAY_RESULT_SYNC_ENABLED:true} # 调度 cron,默认每10分钟 cron: ${BFI_PAY_RESULT_CRON:0 */10 * * * ?} + # 收款认领公告查询配置(A301-2) + claimAnnounce: + # 查询时间窗口(月数) + months: ${BFI_CLAIM_ANNOUNCE_MONTHS:6} + # 认领人:配置后公告查询固定使用该值,不再按当前登录用户姓名查询 + claimusers: ${BFI_CLAIM_ANNOUNCE_CLAIMUSERS:徐媛} + + # 收票管理金蝶全票池发票定时绑定(A801-1 查询全票池发票数据) + invoiceReceipt: + # 绑定任务开关,默认关闭(联调稳定后开启) + syncEnabled: ${BFI_INVOICE_RECEIPT_SYNC_ENABLED:false} + # 调度 cron,默认每30分钟 + cron: ${BFI_INVOICE_RECEIPT_CRON:0 */30 * * * ?} + # 增量窗口天数(按票池更新时间),首轮/兜底全量比对窗口 + incrementDays: ${BFI_INVOICE_RECEIPT_INCREMENT_DAYS:281} + # 同步发票种类白名单(逗号分隔票易通编码,如 26,27 数电普票/专票),为空不限制 + invoiceTypes: ${BFI_INVOICE_RECEIPT_INVOICE_TYPES:26,27} + # 补偿绑定单轮限量(未绑定登记按发票号码精确补查条数上限) + compensateLimit: ${BFI_INVOICE_RECEIPT_COMPENSATE_LIMIT:200} + # 收款认领推送金蝶定时任务(A301-3 收款认领结果推送) receiptClaimPush: # 推送任务开关,默认关闭(联调稳定后开启) @@ -174,6 +215,130 @@ thirdParty: # 进程异常退出时锁在租约到期后自动释放 lockLeaseSeconds: ${BFI_RECEIPT_CLAIM_PUSH_LOCK_LEASE_SECONDS:1800} + # 审批通过自动同步金蝶(事件触发:结算单A102-2/A302-2、付款申请A103-1/A103-3、开票申请A303-1、收票A303-2+A302-6) + autoSync: + # 结算单审批后自动推送开关 + settlement: ${BFI_AUTO_SYNC_SETTLEMENT:true} + # 付款申请审批后自动推送开关 + payment: ${BFI_AUTO_SYNC_PAYMENT:true} + # 开票申请审批后自动推送开关 + invoiceApply: ${BFI_AUTO_SYNC_INVOICE_APPLY:true} + # 收票登记审批后自动推送开关 + receipt: ${BFI_AUTO_SYNC_RECEIPT:true} + # failed 单据定时重推开关(仅重推生成失败,不扫 unsynced 存量) + retryEnabled: ${BFI_AUTO_SYNC_RETRY_ENABLED:false} + # 重推调度 cron,默认每10分钟 + retryCron: ${BFI_AUTO_SYNC_RETRY_CRON:0 */10 * * * ?} + + # 合同合规系统 + hcs: + # Mock 开关(true 时 IHcsClient 走本地 JSON 桩 F:/home/tms/mock/hcs/{方法名}.json,联调前自测用,生产必须 false;改配置需重启,改桩文件即时生效) + mock-enabled: ${HCS_MOCK_ENABLED:true} + # 合同合规系统(HCS)开放接口地址(v4 接口说明:带网关前缀,直连可配,代码不感知) + baseUrl: ${HCS_BASE_URL:http://172.16.203.134:8000/gwzh/HTHG} + # Authorization 请求头整值(含 Basic 前缀,敏感值通过环境变量注入) + authorization: ${HCS_AUTHORIZATION:Basic d2Njazp0RzQjd044JWpYNmM=} + # Key-Auth 请求头值(v4 接口说明:所有接口固定携带 Authorization + Key-Auth 两个头) + key-auth: ${HCS_KEY_AUTH:3F7e8yI6RV8S53mJ9tYa0672r3W4n279} + # 来源系统标识(fd_sources,约定值 WLTMS) + src-system: ${HCS_SRC_SYSTEM:WLTMS} + # 操作人登录名(fdLoginName / curUser.fdLoginName,全部合同接口共用,默认 srvadmin) + operator-login-name: ${HCS_OPERATOR_LOGIN_NAME:13737128880} + # 创建单位 fdId(fd_creator_unit 等组织引用,HCS 组织主数据固定值,项目立项、合同等接口共用;与 name 任一为空回退单据开题部门名称仅传名称) + creator-unit-id: ${HCS_CREATOR_UNIT_ID:1k4vq0lhsw98w1gkegw1d2g9nep42p9j1cw0} + # 创建单位名称(与 creator-unit-id 配套) + creator-unit-name: ${HCS_CREATOR_UNIT_NAME:百色物产新源供应链有限公司} + + # 推送任务(审批通过即时推送 + 定时扫描兜底,HcsPushTask 五类任务独立开关) + push: + # 审批通过即时推送总开关(事务提交后异步推送,关闭时仅走扫描兜底) + immediate-enabled: ${HCS_PUSH_IMMEDIATE_ENABLED:true} + # 每类单据单轮扫描批量 + batch-size: ${HCS_PUSH_BATCH_SIZE:50} + # 推送失败自动重试上限,超限仅人工重推 + max-retry: ${HCS_PUSH_MAX_RETRY:5} + # 五类扫描任务独立开关(cron 有代码默认值错峰每5分钟,无需配置) + project: + sync-enabled: ${HCS_PUSH_PROJECT_ENABLED:false} + contract: + sync-enabled: ${HCS_PUSH_CONTRACT_ENABLED:false} + payment: + sync-enabled: ${HCS_PUSH_PAYMENT_ENABLED:false} + invoice-application: + sync-enabled: ${HCS_PUSH_INVOICE_APP_ENABLED:false} + invoice-receipt: + sync-enabled: ${HCS_PUSH_INVOICE_RCV_ENABLED:false} + # 项目立项(C102) + project: + # 立项 bpmOperation.templateCode(环境相关值,§9-U9 待合规方提供) + template-code: ${HCS_PROJECT_TEMPLATE_CODE:template_15x0og} + # 合同(C103-1/11) + contract: + # TMS 合同类别 -> HCS 模板ID(§9-U7 待合规方提供模板清单) + template-mapping: + "[承运商合同]": "1j5tddhugw3w2kiwumvajq27ediq26fp5aw0" + # TMS 币种码 -> HCS 币种名称(照金蝶 RMB->CNY 映射惯例) + currency-name-mapping: {"RMB": "人民币"} + # 合同 fdSepcailContract 固定 false(D15,配置项预留) + special-contract-enabled: ${HCS_CONTRACT_SPECIAL_ENABLED:false} + # 合同推送前是否强制客商风险校验 + require-risk-check: ${HCS_CONTRACT_REQUIRE_RISK_CHECK:true} + # 履约规则(C103-9,一期暂不对接) + exe-stage: + # 履约规则行级同步开关(默认关,对接后打开) + sync-enabled: ${HCS_EXE_STAGE_SYNC_ENABLED:false} + # 金额类型默认值(fdFundType) + fund-type: ${HCS_EXE_STAGE_FUND_TYPE:byAmount} + # 客商风险校验(C101-1) + risk: + check-on-contract: ${HCS_RISK_CHECK_ON_CONTRACT:true} + check-on-payment: ${HCS_RISK_CHECK_ON_PAYMENT:true} + # 黑名单是否阻断(合同置 failed / 付款提交拦截) + # block-blacklist: ${HCS_RISK_BLOCK_BLACKLIST:true} + # 额度校验(C106-1,一期暂不对接) + credit: + # 额度校验开关(默认关,关闭后特批无自动触发,对接后打开) + check-enabled: ${HCS_CREDIT_CHECK_ENABLED:false} + # 付款提交校验是否要求合同已推送合规 + require-contract-synced: ${HCS_CREDIT_REQUIRE_CONTRACT_SYNCED:true} + # 结算付款特批(C106-3/4) + spec-pay: + # 单据状态(示例 10) + doc-status: ${HCS_SPEC_PAY_DOC_STATUS:10} + # 付款用途/性质/类型字典值(§9-U3 待联调后配置) + payment-purpose: ${HCS_SPEC_PAY_PAYMENT_PURPOSE:2001} + payment-nature: ${HCS_SPEC_PAY_PAYMENT_NATURE:1} + payment-type: ${HCS_SPEC_PAY_PAYMENT_TYPE:1} + # 开票登记(C111) + invoice: + # TMS 发票类型 -> HCS 发票类型字典值(§9-U3 待联调后配置) + invoice-type-mapping: {"electronic_normal": "", "electronic_special": ""} + # TMS 币种码 -> HCS 币种 fdId(经 C103-12 币种表缓存取值,§9-U3 待联调后配置) + currency-id-mapping: {"RMB": ""} + # 款项性质默认值(fdFundNature) + fund-nature-default: ${HCS_INVOICE_FUND_NATURE_DEFAULT:progress} + # 收票单(C109) + receipt-bill: + # TMS 发票类型 -> HCS 收票发票类型字典值(§9-U3 待联调后配置) + invoice-type-mapping: {} + # 履约记录(C108-1/2,一期暂不对接) + perf-record: + # 履约记录同步开关(默认关,对接后打开) + sync-enabled: ${HCS_PERF_RECORD_SYNC_ENABLED:false} + # 表单模板ID(fd_xform_id,环境相关值,§9-U9 待合规方提供) + xform-id: ${HCS_PERF_RECORD_XFORM_ID:} + # 附件转传(C103-2) + attachment: + # 附件转传总开关 + transfer-enabled: ${HCS_ATTACHMENT_TRANSFER_ENABLED:true} + # TMS 文件服务下载基址(拉取附件流用) + file-download-base: ${HCS_ATTACHMENT_FILE_DOWNLOAD_BASE:} + # 主数据缓存(C103-6/7/12,启动/首次使用时拉取并缓存) + master-data: + # 缓存时长(分钟) + ttl-minutes: ${HCS_MASTER_DATA_TTL_MINUTES:120} + + #百度OCR配置,API Key和Secret Key请通过环境变量注入 baidu: ocr: @@ -185,6 +350,14 @@ baidu: request-timeout: 30s token-refresh-advance: 1m +#MinIO文件存储配置 +file: + storage: + minio: + endpoint: http://8.148.239.157:9000 + access-key-id: transport + access-key-secret: transport + bucket-name: transport powerjob: worker: diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 9db1511d..371214d5 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -151,7 +151,7 @@ thirdParty: # 合同合规系统(HCS)开放接口地址(v4 接口说明:带网关前缀,直连可配,代码不感知) baseUrl: ${HCS_BASE_URL:http://172.16.203.134:8000/gwzh/HTHG} # Authorization 请求头整值(含 Basic 前缀,敏感值通过环境变量注入) - authorization: ${HCS_AUTHORIZATION:Basic d2NjazprJDdQcVIyIXNCdjkmbkc0} + authorization: ${HCS_AUTHORIZATION:Basic d2Njazp0RzQjd044JWpYNmM=} # Key-Auth 请求头值(v4 接口说明:所有接口固定携带 Authorization + Key-Auth 两个头) key-auth: ${HCS_KEY_AUTH:3F7e8yI6RV8S53mJ9tYa0672r3W4n279} # 来源系统标识(fd_sources,约定值 WLTMS) @@ -159,9 +159,9 @@ thirdParty: # 操作人登录名(fdLoginName / curUser.fdLoginName,全部合同接口共用,默认 srvadmin) operator-login-name: ${HCS_OPERATOR_LOGIN_NAME:srvadmin} # 创建单位 fdId(fd_creator_unit 等组织引用,HCS 组织主数据固定值,项目立项、合同等接口共用;与 name 任一为空回退单据开题部门名称仅传名称) - creator-unit-id: ${HCS_CREATOR_UNIT_ID:1j56etj23w358wne0ow2k5214nk4f24213w0} + creator-unit-id: ${HCS_CREATOR_UNIT_ID:1k4vq0lhsw98w1gkegw1d2g9nep42p9j1cw0} # 创建单位名称(与 creator-unit-id 配套) - creator-unit-name: ${HCS_CREATOR_UNIT_NAME:广西物产城矿发展有限公司} + creator-unit-name: ${HCS_CREATOR_UNIT_NAME:百色物产新源供应链有限公司} # 推送任务(审批通过即时推送 + 定时扫描兜底,HcsPushTask 五类任务独立开关) push: # 审批通过即时推送总开关(事务提交后异步推送,关闭时仅走扫描兜底) @@ -189,7 +189,7 @@ thirdParty: contract: # TMS 合同类别 -> HCS 模板ID(§9-U7 合规方提供模板清单;中文键必须用 "[...]" 括号记法,否则绑定失败) template-mapping: - "[承运商合同]": "1jvnp5s7mw13gw5q4w4g9qin1n1a2rn14gw0" + "[承运商合同]": "1j5tddhugw3w2kiwumvajq27ediq26fp5aw0" # TMS 审核状态 -> HCS 合同状态(CONTRACT_STATUS 必填,§9-U3 待联调确认字典值后启用) #status-mapping: # approved: approved From 276033e7dcb61ddc043734936f49d60aa7c0517b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 17 Oct 2026 10:35:00 +0800 Subject: [PATCH 075/124] =?UTF-8?q?:feat:=20HCS=E5=90=88=E5=90=8C=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E7=AD=BE=E7=BD=B2=E6=96=B9=E5=8C=BA=E5=88=86=E7=94=B2?= =?UTF-8?q?=E6=96=B9inner=E4=B9=99=E6=96=B9supplier=E5=B9=B6=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=85=B3=E8=81=94=E9=A1=B9=E7=9B=AE=E4=BC=A0=E5=90=88?= =?UTF-8?q?=E8=A7=84=E9=A1=B9=E7=9B=AEID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/HcsContractFieldConstant.java | 5 ++ .../support/hcs/HcsContractSyncSupport.java | 58 +++++++++++++------ .../springblade/hcs/constant/HcsConstant.java | 10 ++++ .../org/springblade/hcs/dto/HcsSignerDTO.java | 2 +- .../springblade/hcs/dto/HcsXformFieldDTO.java | 4 +- 5 files changed, 57 insertions(+), 22 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java index 5de8fa5a..16de0d85 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java @@ -167,6 +167,11 @@ public final class HcsContractFieldConstant { */ public static final String FIELD_FD_DESC = "fdDesc"; + /** + * 关联项目(选填,对象传值如 {"fdId": "项目id"},传合规项目ID) + */ + public static final String FIELD_FD_PROJECT = "fdProject"; + /** * 合同结算模式:open=开口合同,close=闭口合同 */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index f7884112..3607a664 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -32,6 +32,7 @@ import org.springblade.core.log.exception.ServiceException; 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.HcsAttachmentRefDTO; import org.springblade.hcs.dto.HcsContractDraftDTO; import org.springblade.hcs.dto.HcsContractDraftVO; @@ -52,9 +53,11 @@ import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.CustomerArchiveMapper; import org.springblade.transport.mapper.HcsContractCheckLogMapper; +import org.springblade.transport.mapper.ProjectApplyMapper; import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.CustomerArchive; import org.springblade.transport.pojo.entity.HcsContractCheckLog; +import org.springblade.transport.pojo.entity.ProjectApply; import org.springframework.stereotype.Component; import java.math.BigDecimal; @@ -94,15 +97,11 @@ public class HcsContractSyncSupport { */ private static final String BLACK_STATUS_YES = "yes"; - /** - * signer 相对方单位类型:暂统一传 customer(客户,2026-10-14 联调确认,§9-U6 后续细化) - */ - private static final String SIGNER_FD_TYPE_CUSTOMER = "customer"; - private final IHcsClient hcsClient; private final HcsProperties hcsProperties; private final ContractManageMapper contractManageMapper; private final CustomerArchiveMapper customerArchiveMapper; + private final ProjectApplyMapper projectApplyMapper; private final HcsContractCheckLogMapper hcsContractCheckLogMapper; private final HcsAttachmentSupport hcsAttachmentSupport; private final HcsExeStageSyncSupport hcsExeStageSyncSupport; @@ -410,28 +409,34 @@ public class HcsContractSyncSupport { fields.add(field(HcsContractFieldConstant.FIELD_FD_SERVINGS, "合同份数", contractManage.getCopyCount() == null ? null : String.valueOf(contractManage.getCopyCount()))); // 合同说明:remark(选填) fields.add(field(HcsContractFieldConstant.FIELD_FD_DESC, "合同说明", contractManage.getRemark())); + // 关联项目(选填,对象传值):合同所选项目对应合同系统项目ID(blade_project_apply.hcs_fd_id,C102-1 立项同步回填), + // 未选择项目或项目未立项同步时不传 + Map fdProject = queryProjectFdId(contractManage.getProjectId()); + if (fdProject != null) { + fields.add(field(HcsContractFieldConstant.FIELD_FD_PROJECT, "关联项目", fdProject)); + } // TODO 待联调(v4 选填字段,暂不传):fdCoTakers 协办人(TMS 无对应)、fdUnderTaker/fdUnderTakerDept 承办人及部门(组织架构对象传值方式待确认)、 - // fdRelations 关联合同(数组)、fdProject 关联项目 {"fdId": 合规项目ID}(对象传值方式待确认,TMS projectId 可经立项 hcs_fd_id 关联)、 + // fdRelations 关联合同(数组)、 // fdContractAttribute 合同属性(枚举值文档未给出,TMS 无对应)、fdUrgencyLevel 紧急程度(TMS 无对应) return fields; } /** - * signer 相对方(签署方):甲/乙双方,fdType 暂统一传 customer(客户,2026-10-14 联调确认) + * signer 相对方(签署方):甲/乙双方,甲方 fdType=inner(内部主体),乙方 fdType=supplier(外部相对方) */ private List buildSigners(ContractManage contractManage) { List signers = new ArrayList<>(); - // 甲方相对方:fdStanding=甲,编号按名称反查(反查不到留空,§9-U6) - signers.add(signer("甲", contractManage.getPartyA())); - // 乙方相对方:fdStanding=乙 - signers.add(signer("乙", contractManage.getPartyB())); + // 甲方相对方:fdStanding=甲,内部主体 fdType=inner(编号按名称反查,反查不到留空,§9-U6) + signers.add(signer("甲", HcsConstant.SIGNER_FD_TYPE_INNER, contractManage.getPartyA())); + // 乙方相对方:fdStanding=乙,外部相对方 fdType=supplier + signers.add(signer("乙", HcsConstant.SIGNER_FD_TYPE_SUPPLIER, contractManage.getPartyB())); return signers; } /** - * 单个相对方 + * 单个相对方:甲方传 fdType=inner(内部主体),乙方传 fdType=supplier(外部相对方) */ - private HcsSignerDTO signer(String fdStanding, String partyName) { + private HcsSignerDTO signer(String fdStanding, String fdType, String partyName) { HcsSignerDTO signer = new HcsSignerDTO(); // 签署地位:甲 / 乙 signer.setFdStanding(fdStanding); @@ -439,8 +444,8 @@ public class HcsContractSyncSupport { signer.setFdName(partyName); // 相对方编号:按名称反查 CustomerArchive 客商编码,反查不到留空(§9-U6) signer.setFdNumber(queryCustomerCode(partyName)); - // 单位类型:暂统一传 customer(客户),inner/外部判定规则后续联调细化(§9-U6) - signer.setFdType(SIGNER_FD_TYPE_CUSTOMER); + // 单位类型:甲方 inner 内部主体 / 乙方 supplier 外部相对方 + signer.setFdType(fdType); return signer; } @@ -552,20 +557,35 @@ public class HcsContractSyncSupport { return customerArchive == null ? null : customerArchive.getCustomerCode(); } + /** + * 关联项目取值:合同所选项目对应合同系统项目ID(blade_project_apply.hcs_fd_id,C102-1 立项同步回填), + * 未选择项目、立项单不存在或未同步合规时返回 null 不传(fdProject 选填) + */ + private Map queryProjectFdId(Long projectId) { + if (projectId == null) { + return null; + } + ProjectApply projectApply = projectApplyMapper.selectById(projectId); + if (projectApply == null || StringUtil.isBlank(projectApply.getHcsFdId())) { + log.warn("HCS合同关联项目缺失合规项目ID:projectId=[{}] 未立项或未同步合规,fdProject 不传", projectId); + return null; + } + return Map.of("fdId", projectApply.getHcsFdId()); + } + /** * 币种名称映射:currency-name-mapping 命中取映射值,未命中传原值并告警(§9-U3) */ - private String mapCurrencyName(String currency) { - if (StringUtil.isBlank(currency)) { + private String mapCurrencyName(String currency) { if (StringUtil.isBlank(currency)) { return null; } return hcsProperties.getContract().getCurrencyNameMapping().getOrDefault(currency, currency); } /** - * 普通模板字段(字符串传值) + * 普通模板字段(字符串/对象传值) */ - private HcsXformFieldDTO field(String name, String label, String value) { + private HcsXformFieldDTO field(String name, String label, Object value) { HcsXformFieldDTO field = new HcsXformFieldDTO(); field.setName(name); field.setLabel(label); diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java index d41d18af..a6fa8bbd 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java @@ -46,4 +46,14 @@ public class HcsConstant { * 网关 Key-Auth 认证请求头名称(v4 接口说明:所有接口固定携带) */ public static final String HEADER_KEY_AUTH = "Key-Auth"; + + /** + * signer 相对方单位类型:甲方=inner(内部主体) + */ + public static final String SIGNER_FD_TYPE_INNER = "inner"; + + /** + * signer 相对方单位类型:乙方=supplier(外部相对方) + */ + public static final String SIGNER_FD_TYPE_SUPPLIER = "supplier"; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java index c08b3858..db087154 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java @@ -54,7 +54,7 @@ public class HcsSignerDTO implements Serializable { */ private String fdNumber; /** - * 单位类型:TMS 暂统一传 customer(客户),inner/外部判定规则联调细化(§9-U6) + * 单位类型:甲方=inner(内部主体),乙方=supplier(外部相对方) */ private String fdType; /** diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java index fa74f5fe..d8479c0d 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsXformFieldDTO.java @@ -54,9 +54,9 @@ public class HcsXformFieldDTO implements Serializable { */ private String label; /** - * 字段值(字符串传值) + * 字段值(金额/日期等字符串传值;对象类字段如 fdProject 以 JSON 对象传值) */ - private String value; + private Object value; /** * 字段类型标记:时间字段传 timestamp */ From 127e8a5cb655b4109d53bf4dc1048b5ef2a6cbd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 17 Oct 2026 10:41:56 +0800 Subject: [PATCH 076/124] =?UTF-8?q?:fix:=20HCS=E5=90=88=E5=90=8C=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=90=88=E5=90=8C=E9=87=91=E9=A2=9D=E4=B8=8E=E4=BB=BD?= =?UTF-8?q?=E6=95=B0=E6=8C=89v4=E5=AD=97=E6=AE=B5=E8=A1=A8=E4=BB=A5?= =?UTF-8?q?=E6=95=B0=E5=80=BC=E7=B1=BB=E5=9E=8B=E4=BC=A0=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/support/hcs/HcsContractSyncSupport.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 3607a664..008ad3ca 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -351,8 +351,8 @@ public class HcsContractSyncSupport { // 【必填】合同标题:ContractManage.contractName fields.add(field(HcsContractFieldConstant.FIELD_FD_SUBJECT, "合同标题", contractManage.getContractName())); fields.add(field(HcsContractFieldConstant.FIELD_CONTRACT_NAME, "合同名称", contractManage.getContractName())); - // 【必填】合同金额:contractAmount(字符串传值) - fields.add(field(HcsContractFieldConstant.FIELD_FD_AMOUNT, "合同金额", toPlainString(contractManage.getContractAmount()))); + // 【必填】合同金额:contractAmount(v4 字段表 fdAmount=Double,数值传值;AMOUNT 模板字段无类型说明照示例字符串传值) + fields.add(field(HcsContractFieldConstant.FIELD_FD_AMOUNT, "合同金额", contractManage.getContractAmount())); fields.add(field(HcsContractFieldConstant.FIELD_AMOUNT, "合同金额", toPlainString(contractManage.getContractAmount()))); // 币种:TMS 结算币种经 currency-name-mapping 映射(默认 RMB→人民币,照金蝶惯例) // fields.add(field(HcsContractFieldConstant.FIELD_FD_CURRENCY_ID, "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); @@ -405,8 +405,8 @@ public class HcsContractSyncSupport { } else { log.warn("HCS合同状态映射缺失:approvalStatus=[{}] 不在 contract.status-mapping,CONTRACT_STATUS 不传(§9-U3)", contractManage.getApprovalStatus()); } - // 【必填】合同份数:copyCount(v4 合同字段说明) - fields.add(field(HcsContractFieldConstant.FIELD_FD_SERVINGS, "合同份数", contractManage.getCopyCount() == null ? null : String.valueOf(contractManage.getCopyCount()))); + // 【必填】合同份数:copyCount(v4 字段表 fdServings=Integer,数值传值) + fields.add(field(HcsContractFieldConstant.FIELD_FD_SERVINGS, "合同份数", contractManage.getCopyCount())); // 合同说明:remark(选填) fields.add(field(HcsContractFieldConstant.FIELD_FD_DESC, "合同说明", contractManage.getRemark())); // 关联项目(选填,对象传值):合同所选项目对应合同系统项目ID(blade_project_apply.hcs_fd_id,C102-1 立项同步回填), From 5159bcd125185ab6aa161146b356700be6af752c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 17 Oct 2026 11:48:26 +0800 Subject: [PATCH 077/124] =?UTF-8?q?:fix:=20HCS=E5=90=88=E5=90=8C=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E7=BB=93=E7=AE=97=E7=B1=BB=E5=9E=8B=E6=94=B9=E4=BC=A0?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E5=AD=97=E5=85=B8=E5=90=8D=E5=B9=B6=E5=90=88?= =?UTF-8?q?=E5=90=8C=E4=BB=BD=E6=95=B0=E7=A9=BA=E5=80=BC=E9=BB=98=E8=AE=A4?= =?UTF-8?q?1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/HcsContractFieldConstant.java | 16 ++++++++-------- .../support/hcs/HcsContractSyncSupport.java | 12 +++++------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java index 16de0d85..798c77d1 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/constant/HcsContractFieldConstant.java @@ -180,24 +180,24 @@ public final class HcsContractFieldConstant { // ==================== 结算类型枚举值 ==================== /** - * 合同结算类型取值:付款(fdSettlementType,承运商合同固定取此值) + * 合同结算类型取值:付款(fdSettlementType,承运商合同固定取此值;合规系统字典中文名,2026-10-17 确认) */ - public static final String SETTLEMENT_TYPE_PAYMENT = "payment"; + public static final String SETTLEMENT_TYPE_PAYMENT = "付款"; /** - * 合同结算类型取值:收支双向(fdSettlementType) + * 合同结算类型取值:收支双向(fdSettlementType,合规系统字典中文名) */ - public static final String SETTLEMENT_TYPE_PAYMENT_COLLECTION = "payment_collection"; + public static final String SETTLEMENT_TYPE_PAYMENT_COLLECTION = "收支双向"; /** - * 合同结算类型取值:收款(fdSettlementType,客户合同固定取此值) + * 合同结算类型取值:收款(fdSettlementType,客户合同固定取此值;合规系统字典中文名) */ - public static final String SETTLEMENT_TYPE_COLLECTION = "collection"; + public static final String SETTLEMENT_TYPE_COLLECTION = "收款"; /** - * 合同结算类型取值:不结算(fdSettlementType) + * 合同结算类型取值:不结算(fdSettlementType,合规系统字典中文名) */ - public static final String SETTLEMENT_TYPE_NONE = "none"; + public static final String SETTLEMENT_TYPE_NONE = "不结算"; // ==================== 结算模式枚举值 ==================== diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 008ad3ca..28465d7c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -357,7 +357,8 @@ public class HcsContractSyncSupport { // 币种:TMS 结算币种经 currency-name-mapping 映射(默认 RMB→人民币,照金蝶惯例) // fields.add(field(HcsContractFieldConstant.FIELD_FD_CURRENCY_ID, "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); fields.add(field(HcsContractFieldConstant.FIELD_CURRENCY, "币种", mapCurrencyName(contractManage.getSettlementCurrency()))); - // 合同结算类型:按合同类别固定规则——承运商合同=付款,客户合同=收款(2026-10-12 确认) + // 合同结算类型:按合同类别固定规则——承运商合同=付款,客户合同=收款 + // 传中文字典名(2026-10-17 确认;此前传枚举键 collection+fdIsSystem 合规侧未命中字典落为"不结算") String settlementType = null; if ("承运商合同".equals(contractManage.getContractCategory())) { settlementType = HcsContractFieldConstant.SETTLEMENT_TYPE_PAYMENT; @@ -365,10 +366,7 @@ public class HcsContractSyncSupport { settlementType = HcsContractFieldConstant.SETTLEMENT_TYPE_COLLECTION; } if (StringUtil.isNotBlank(settlementType)) { - HcsXformFieldDTO settlementField = field(HcsContractFieldConstant.FIELD_FD_SETTLEMENT_TYPE, "合同结算类型", settlementType); - // 字典类字段需带 fdIsSystem=true(合规侧按系统字典值解析,2026-10-14 联调确认) - settlementField.setFdIsSystem("true"); - fields.add(settlementField); + fields.add(field(HcsContractFieldConstant.FIELD_FD_SETTLEMENT_TYPE, "合同结算类型", settlementType)); } else { log.warn("HCS合同结算类型无法确定:contractCategory=[{}] 非承运商合同/客户合同,fdSettlementType 不传", contractManage.getContractCategory()); } @@ -405,8 +403,8 @@ public class HcsContractSyncSupport { } else { log.warn("HCS合同状态映射缺失:approvalStatus=[{}] 不在 contract.status-mapping,CONTRACT_STATUS 不传(§9-U3)", contractManage.getApprovalStatus()); } - // 【必填】合同份数:copyCount(v4 字段表 fdServings=Integer,数值传值) - fields.add(field(HcsContractFieldConstant.FIELD_FD_SERVINGS, "合同份数", contractManage.getCopyCount())); + // 【必填】合同份数:copyCount(v4 字段表 fdServings=Integer,数值传值;空值默认 1) + fields.add(field(HcsContractFieldConstant.FIELD_FD_SERVINGS, "合同份数", contractManage.getCopyCount() == null ? 1 : contractManage.getCopyCount())); // 合同说明:remark(选填) fields.add(field(HcsContractFieldConstant.FIELD_FD_DESC, "合同说明", contractManage.getRemark())); // 关联项目(选填,对象传值):合同所选项目对应合同系统项目ID(blade_project_apply.hcs_fd_id,C102-1 立项同步回填), From d69ec1a3b4190ca0865ac90ade82c5ed57a0bd62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 17 Oct 2026 12:59:40 +0800 Subject: [PATCH 078/124] =?UTF-8?q?:fix:=20HCS=E5=B1=A5=E7=BA=A6=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E6=8E=A8=E9=80=81=E5=B1=A5=E7=BA=A6=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E7=AD=89=E5=AD=97=E5=85=B8=E5=AD=97=E6=AE=B5=E6=94=B9=E4=BC=A0?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E5=AD=97=E5=85=B8=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsExeStageSyncSupport.java | 50 ++++++++++++++++--- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java index 262e547e..07ad6d4d 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java @@ -51,6 +51,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.UnaryOperator; /** * HCS 履约规则同步支撑组件(C103-9 新版行级同步,设计文档 §5.3,ADR-0002) @@ -129,20 +130,37 @@ public class HcsExeStageSyncSupport { } // 【必填】行级操作:add / update / delete stage.setFdEopExeplanOperateType(row.getRowOp()); - // 【必填】履约类型:payment=付款 / collection=收款 - stage.setFdPerformType(row.getPerformType()); - // 【必填】款项性质:prepayment/progress/acceptance/retention - stage.setFdFundNature(row.getFundNature()); + // 【必填】履约类型:传中文字典名(2026-10-17 确认;此前传枚举键,合规侧字典不命中) + stage.setFdPerformType(dictName("履约类型", row.getPerformType(), code -> switch (code) { + case HcsSyncConstant.PERFORM_TYPE_PAYMENT -> "付款"; + case HcsSyncConstant.PERFORM_TYPE_COLLECTION -> "收款"; + default -> null; + })); + // 【必填】款项性质:传中文字典名 + stage.setFdFundNature(dictName("款项性质", row.getFundNature(), code -> switch (code) { + case "prepayment" -> "预付款"; + case HcsSyncConstant.FUND_NATURE_PROGRESS -> "进度款"; + case "acceptance" -> "验收款"; + case "retention" -> "质保金"; + default -> null; + })); // 【必填】计划金额(元) stage.setFdFundAmount(row.getFundAmount()); // 【必填】资金日期(毫秒时间戳) stage.setFdFundDate(toMillis(row.getFundDate())); - // 【必填】开票规则:payFirst=先款后票 / invoiceFirst=先票后款 - stage.setFdInvoiceRule(row.getInvoiceRule()); + // 【必填】开票规则:传中文字典名 + stage.setFdInvoiceRule(dictName("开票规则", row.getInvoiceRule(), code -> switch (code) { + case "payFirst" -> "先款后票"; + case "invoiceFirst" -> "先票后款"; + default -> null; + })); // 【必填】账期(天) stage.setFdInvoiceCycle(row.getInvoiceCycle()); - // 金额类型:行维护值,空取配置 thirdParty.hcs.exe-stage.fund-type(默认 byAmount) - stage.setFdFundType(StringUtil.isBlank(row.getFundType()) ? hcsProperties.getExeStage().getFundType() : row.getFundType()); + // 金额类型:行维护值(空取配置 thirdParty.hcs.exe-stage.fund-type),传中文字典名 + stage.setFdFundType(dictName("金额类型", StringUtil.isBlank(row.getFundType()) ? hcsProperties.getExeStage().getFundType() : row.getFundType(), code -> switch (code) { + case "byAmount" -> "按金额"; + default -> null; + })); // 是否完成 stage.setFdIsFinish(row.getIsFinish() != null && row.getIsFinish() > 0); // 扩展内容 JSON 字符串:固定 "{}" @@ -153,6 +171,22 @@ public class HcsExeStageSyncSupport { return param; } + /** + * 字典编码 → 合规中文字典名(2026-10-17 确认合规侧按中文命中字典);空值原样传, + * 未命中原值直传并告警(照 HcsProjectSyncSupport#mapSettlementType 惯例) + */ + private String dictName(String fieldLabel, String value, UnaryOperator mapping) { + if (StringUtil.isBlank(value)) { + return value; + } + String name = mapping.apply(value); + if (name == null) { + log.warn("HCS履约规则{}编码[{}]未命中中文字典映射,原值直传", fieldLabel, value); + return value; + } + return name; + } + /** * 回填:fdExeplanId → 合同 hcs_exeplan_id;变更阶段 fdId 按行回填 hcs_stage_fd_id 并清除行级操作标记 *

    From 64a14875fa552e91711d3edee3f012330ec68bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Sat, 17 Oct 2026 14:52:15 +0800 Subject: [PATCH 079/124] =?UTF-8?q?Revert=20":fix:=20HCS=E5=B1=A5=E7=BA=A6?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E6=8E=A8=E9=80=81=E5=B1=A5=E7=BA=A6=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=AD=89=E5=AD=97=E5=85=B8=E5=AD=97=E6=AE=B5=E6=94=B9?= =?UTF-8?q?=E4=BC=A0=E4=B8=AD=E6=96=87=E5=AD=97=E5=85=B8=E5=90=8D"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit d69ec1a3b4190ca0865ac90ade82c5ed57a0bd62. --- .../support/hcs/HcsExeStageSyncSupport.java | 50 +++---------------- 1 file changed, 8 insertions(+), 42 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java index 07ad6d4d..262e547e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java @@ -51,7 +51,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.function.UnaryOperator; /** * HCS 履约规则同步支撑组件(C103-9 新版行级同步,设计文档 §5.3,ADR-0002) @@ -130,37 +129,20 @@ public class HcsExeStageSyncSupport { } // 【必填】行级操作:add / update / delete stage.setFdEopExeplanOperateType(row.getRowOp()); - // 【必填】履约类型:传中文字典名(2026-10-17 确认;此前传枚举键,合规侧字典不命中) - stage.setFdPerformType(dictName("履约类型", row.getPerformType(), code -> switch (code) { - case HcsSyncConstant.PERFORM_TYPE_PAYMENT -> "付款"; - case HcsSyncConstant.PERFORM_TYPE_COLLECTION -> "收款"; - default -> null; - })); - // 【必填】款项性质:传中文字典名 - stage.setFdFundNature(dictName("款项性质", row.getFundNature(), code -> switch (code) { - case "prepayment" -> "预付款"; - case HcsSyncConstant.FUND_NATURE_PROGRESS -> "进度款"; - case "acceptance" -> "验收款"; - case "retention" -> "质保金"; - default -> null; - })); + // 【必填】履约类型:payment=付款 / collection=收款 + stage.setFdPerformType(row.getPerformType()); + // 【必填】款项性质:prepayment/progress/acceptance/retention + stage.setFdFundNature(row.getFundNature()); // 【必填】计划金额(元) stage.setFdFundAmount(row.getFundAmount()); // 【必填】资金日期(毫秒时间戳) stage.setFdFundDate(toMillis(row.getFundDate())); - // 【必填】开票规则:传中文字典名 - stage.setFdInvoiceRule(dictName("开票规则", row.getInvoiceRule(), code -> switch (code) { - case "payFirst" -> "先款后票"; - case "invoiceFirst" -> "先票后款"; - default -> null; - })); + // 【必填】开票规则:payFirst=先款后票 / invoiceFirst=先票后款 + stage.setFdInvoiceRule(row.getInvoiceRule()); // 【必填】账期(天) stage.setFdInvoiceCycle(row.getInvoiceCycle()); - // 金额类型:行维护值(空取配置 thirdParty.hcs.exe-stage.fund-type),传中文字典名 - stage.setFdFundType(dictName("金额类型", StringUtil.isBlank(row.getFundType()) ? hcsProperties.getExeStage().getFundType() : row.getFundType(), code -> switch (code) { - case "byAmount" -> "按金额"; - default -> null; - })); + // 金额类型:行维护值,空取配置 thirdParty.hcs.exe-stage.fund-type(默认 byAmount) + stage.setFdFundType(StringUtil.isBlank(row.getFundType()) ? hcsProperties.getExeStage().getFundType() : row.getFundType()); // 是否完成 stage.setFdIsFinish(row.getIsFinish() != null && row.getIsFinish() > 0); // 扩展内容 JSON 字符串:固定 "{}" @@ -171,22 +153,6 @@ public class HcsExeStageSyncSupport { return param; } - /** - * 字典编码 → 合规中文字典名(2026-10-17 确认合规侧按中文命中字典);空值原样传, - * 未命中原值直传并告警(照 HcsProjectSyncSupport#mapSettlementType 惯例) - */ - private String dictName(String fieldLabel, String value, UnaryOperator mapping) { - if (StringUtil.isBlank(value)) { - return value; - } - String name = mapping.apply(value); - if (name == null) { - log.warn("HCS履约规则{}编码[{}]未命中中文字典映射,原值直传", fieldLabel, value); - return value; - } - return name; - } - /** * 回填:fdExeplanId → 合同 hcs_exeplan_id;变更阶段 fdId 按行回填 hcs_stage_fd_id 并清除行级操作标记 *

    From 6e6e5913baa04fe3b35edfb506b5ba62508bfc47 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, 19 Oct 2026 11:12:07 +0800 Subject: [PATCH 080/124] =?UTF-8?q?:fix:=20=E5=90=88=E5=90=8C=E5=8F=91?= =?UTF-8?q?=E8=B5=B7=E9=99=84=E4=BB=B6attachment=E4=B8=8A=E7=A7=BB?= =?UTF-8?q?=E8=87=B3=E9=A1=B6=E5=B1=82=E4=B8=8EfdFieldJson=E5=90=8C?= =?UTF-8?q?=E7=BA=A7=E5=B9=B6=E5=90=8C=E6=AD=A5=E6=8E=A5=E5=8F=A3=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsContractSyncSupport.java | 14 +++++++------- .../springblade/hcs/dto/HcsContractDraftDTO.java | 5 +++++ .../hcs/dto/HcsContractFieldJsonDTO.java | 6 +----- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 28465d7c..c527c9b6 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -74,7 +74,7 @@ import java.util.Objects; * HCS 合同同步支撑组件(C103-1 发起 / C103-11 更新,设计文档 §5.2) *

    * 扫描任务按序执行:⓪ 特批挂起门禁 → ① 客商风险校验(可配开关,仅留痕,高风险不再阻断)→ - * ② 附件转传(v4 挂载点 fdFieldJson.attachment,随 C103-1 挂载)→ ③ C103-3 判重(§9-U4 查询能力联调确认)→ + * ② 附件转传(挂载点为与 fdFieldJson 同级的顶层 attachment,随 C103-1 挂载)→ ③ C103-3 判重(§9-U4 查询能力联调确认)→ * ④ C103-1 起草 / 变更单 C103-11 更新(§9-U5 定位方式待联调)→ ⑤ 履约计划 C103-9 行级同步({@link HcsExeStageSyncSupport}, * 仅依赖 hcs_fd_id,先于特批挂起执行,失败补偿不被特批门禁阻塞)→ ⑥ 高风险/黑名单挂起"特批审核" * (外部客商管控:报文随 fdSepcailContract=true 在合规侧走特批,{@link HcsContractSpecSyncSupport} 接收结果)。 @@ -129,7 +129,7 @@ public class HcsContractSyncSupport { if (hcsProperties.getContract().isRequireRiskCheck()) { risky = checkRelativeRisk(contractManage); } - // ② 附件转传(v4 已明确挂载点:C103-1 fdFieldJson.attachment,转传取得合规附件引用后随发起报文挂载) + // ② 附件转传(v4 已明确挂载点:C103-1 顶层 attachment,与 fdFieldJson 同级,转传取得合规附件引用后随发起报文挂载) List attachmentRefs = transferAttachmentsIfEnabled(contractManage); // ③④ 首推判重后起草(C103-1);已有合规ID(变更单)走更新(C103-11) String resultMessage; @@ -307,7 +307,7 @@ public class HcsContractSyncSupport { /** * 组装 C103-1/C103-11 入参(字段标注照 §3.4 规范,映射表见设计文档 §5.2); - * attachmentRefs 新建传合规附件引用列表(fdId+fdEntityKey,必填,无附件传空列表),更新传 null 不挂载 + * attachmentRefs 新建传合规附件引用列表(顶层 attachment,fdId+fdEntityKey,必填,无附件传空列表),更新传 null 不挂载 */ private HcsContractDraftDTO buildDraftParam(ContractManage contractManage, List attachmentRefs, boolean risky) { HcsContractDraftDTO param = new HcsContractDraftDTO(); @@ -325,11 +325,11 @@ public class HcsContractSyncSupport { fieldJson.setXformFields(buildXformFields(contractManage, risky)); // 相对方(签署方):甲方/乙方,编号按名称反查 CustomerArchive(§9-U6) fieldJson.setSigner(buildSigners(contractManage)); - // 【必填】附件数据:C103-1 必填(无附件传空列表),fdEntityKey=特批 eopCdraftSpecial/用印 eopCdraftSign/其他 eopCdraftOther, + // 【必填】附件数据:与 fdFieldJson 同级的顶层 attachment,C103-1 必填(无附件传空列表),fdEntityKey=特批 eopCdraftSpecial/用印 eopCdraftSign/其他 eopCdraftOther, // fdBindType=ADD;更新不挂载(传 null) if (attachmentRefs != null) { - fieldJson.setAttachment(new ArrayList<>(attachmentRefs)); - for (HcsAttachmentRefDTO attachment : fieldJson.getAttachment()) { + param.setAttachment(new ArrayList<>(attachmentRefs)); + for (HcsAttachmentRefDTO attachment : param.getAttachment()) { // 【必填】操作类型:ADD 新增 attachment.setFdBindType("ADD"); } @@ -449,7 +449,7 @@ public class HcsContractSyncSupport { /** * 附件转传(可配开关):合同主文件 approved=true(挂 eopCdraftSign)+ 其它附件(挂 eopCdraftOther), - * 返回合规附件引用列表(挂载 C103-1 fdFieldJson.attachment) + * 返回合规附件引用列表(挂载 C103-1 顶层 attachment,与 fdFieldJson 同级) */ private List transferAttachmentsIfEnabled(ContractManage contractManage) { if (!hcsProperties.getAttachment().isTransferEnabled()) { diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java index d105f8ba..56717899 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDraftDTO.java @@ -31,6 +31,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.util.List; /** * 合同合规系统(HCS)C103-1 合同发起入参(C103-11 合同更新入参结构相同,复用本 DTO) @@ -67,4 +68,8 @@ public class HcsContractDraftDTO implements Serializable { * 合同字段(模板字段 + 签署方) */ private HcsContractFieldJsonDTO fdFieldJson; + /** + * 附件数据(与 fdFieldJson 同级;C103-1 必填,无附件传空列表,C103-11 更新不传;fdEntityKey 普通附件枚举待合规方给出,暂不传) + */ + private List attachment; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java index 718c39b4..addf81ae 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractFieldJsonDTO.java @@ -36,7 +36,7 @@ import java.util.List; /** * 合同合规系统(HCS)C103-1 合同发起 fdFieldJson 节点(C103-1 新建 / C103-11 更新共用) *

    - * v4 文档已定义 attachment 附件挂载(fdId/fdBindType 必填,fdEntityKey 仅给出特批附件枚举 eopCdraftSpecial)。 + * 附件挂载在顶层报文 attachment(与 fdFieldJson 同级),见 HcsContractDraftDTO。 * * @author Chill */ @@ -54,8 +54,4 @@ public class HcsContractFieldJsonDTO implements Serializable { * 签署方(相对方)列表 */ private List signer; - /** - * 附件数据(C103-1 必填,C103-11 更新不传;fdEntityKey 普通附件枚举待合规方给出,暂不传) - */ - private List attachment; } From fac4c112aaa8ad994ca95839bf1d6022238ab1fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 20 Oct 2026 11:05:11 +0800 Subject: [PATCH 081/124] =?UTF-8?q?:feat:=20=E6=96=B0=E5=A2=9E=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E9=87=91=E8=9D=B6=E5=90=8C=E6=AD=A5=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E5=B9=B6=E5=9B=9E=E5=A1=AB=E9=87=91=E8=9D=B6?= =?UTF-8?q?ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 /hcs/projectLegal/result 免登回调端点(D902),按项目编号定位回填金蝶项目ID/编号,原文留痕 blade_hcs_check_log - 合同 contractLegal/result 回调成功分支回填金蝶合同ID - 项目/合同金蝶回调成功与失败均追加变更记录(changeRecordJson) - 项目立项/合同列表支持按是否同步金蝶、是否同步合规筛选 - 新增增量SQL:blade_project_apply.kingdee_id/kingdee_number、blade_contract_manage.kingdee_id --- .../transport/pojo/entity/ContractManage.java | 3 + .../transport/pojo/entity/ProjectApply.java | 6 + .../transport/pojo/vo/ContractManageVO.java | 8 ++ .../transport/pojo/vo/ProjectApplyVO.java | 8 ++ .../transport/constant/HcsSyncConstant.java | 5 + .../controller/HcsSyncController.java | 28 ++++ .../impl/ContractManageServiceImpl.java | 20 +++ .../service/impl/ProjectApplyServiceImpl.java | 20 +++ .../hcs/HcsContractSpecSyncSupport.java | 47 ++++++- .../support/hcs/HcsProjectSyncSupport.java | 133 ++++++++++++++++++ .../hcs/dto/HcsProjectLegalResultDTO.java | 78 ++++++++++ doc/nacos/blade.yaml | 12 +- .../blade_hcs_kingdee_id_20261020.sql | 30 ++++ 13 files changed, 394 insertions(+), 4 deletions(-) create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectLegalResultDTO.java create mode 100644 doc/sql/transport/blade_hcs_kingdee_id_20261020.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java index c443b22b..af719922 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java @@ -262,4 +262,7 @@ public class ContractManage extends TenantEntity { @Schema(description = "特批申请材料+内部审批附件JSON(含C103-2 合规附件ID)") private String hcsSpecFilesJson; + @Schema(description = "金蝶合同ID(contractLegal/result 合同特批金蝶同步结果回调回填)") + private String kingdeeId; + } diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ProjectApply.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ProjectApply.java index 0b6bdffa..46ede04c 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ProjectApply.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ProjectApply.java @@ -215,4 +215,10 @@ public class ProjectApply extends TenantEntity { @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) private String hcsSyncMsg; + @Schema(description = "金蝶项目ID(D902 项目金蝶同步结果回调回填)") + private String kingdeeId; + + @Schema(description = "金蝶项目编号(D902 项目金蝶同步结果回调回填)") + private String kingdeeNumber; + } diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java index fc429ffe..5f76a439 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java @@ -55,6 +55,14 @@ public class ContractManageVO extends ContractManage { @Schema(description = "到期快捷筛选") private String expireScope; + @TableField(exist = false) + @Schema(description = "是否已同步金蝶(金蝶合同ID是否已回填)") + private Boolean kingdeeSynced; + + @TableField(exist = false) + @Schema(description = "是否已同步合规(合规同步状态是否为 synced)") + private Boolean hcsSynced; + @TableField(exist = false) @Schema(description = "生效类型筛选") private String effectiveType; diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProjectApplyVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProjectApplyVO.java index aed01d69..c4cd0fa6 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProjectApplyVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProjectApplyVO.java @@ -86,6 +86,14 @@ public class ProjectApplyVO extends ProjectApply { @Schema(description = "是否仅查询可用于合同选择的项目(含临时项目与正式审批通过项目)") private Boolean contractSelectable; + @TableField(exist = false) + @Schema(description = "是否已同步金蝶(金蝶项目ID是否已回填)") + private Boolean kingdeeSynced; + + @TableField(exist = false) + @Schema(description = "是否已同步合规(合规同步状态是否为 synced)") + private Boolean hcsSynced; + @TableField(exist = false) @Schema(description = "资金使用风险等级:high、medium、none") private String fundUseRisk; 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 3927006e..e82d304a 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 @@ -89,6 +89,11 @@ public final class HcsSyncConstant { */ public static final String CHECK_TYPE_SPEC = "spec"; + /** + * 校验类型:项目金蝶同步结果回调(D902,projectLegal/result 推送留痕) + */ + public static final String CHECK_TYPE_KINGDEE = "kingdee"; + /** * 校验结果:通过 */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 70fbbb66..6e7a46ed 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -36,11 +36,13 @@ import lombok.extern.slf4j.Slf4j; import org.springblade.core.secure.annotation.PreAuth; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.dto.HcsAttachmentRefDTO; import org.springblade.hcs.dto.HcsContractLegalResultDTO; import org.springblade.hcs.dto.HcsCurrencyVO; import org.springblade.hcs.dto.HcsLegalResultDTO; +import org.springblade.hcs.dto.HcsProjectLegalResultDTO; import org.springblade.hcs.dto.HcsTemplateVO; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.pojo.vo.CustomerRiskVO; @@ -223,6 +225,17 @@ public class HcsSyncController { return R.data(hcsCreditCheckSupport.queryCustomerRisk(customerCode)); } + /** + * 客商风险批量查询(C101-1,客商列表页展示用,前端接入设计 §3.3): + * 按客商编号集合逐个查询(口径同 /risk),展示用不作为安全边界,单个失败跳过不阻断整页 + */ + @GetMapping("/risk/batch") + @ApiOperationSupport(order = 13) + @Operation(summary = "客商风险批量查询", description = "C101-1 按客商编号集合批量查询风险等级与黑名单状态(展示用),口径同单个查询,单个失败跳过不阻断") + public R> riskBatch(@Parameter(description = "客商编号集合,逗号分隔", required = true) @RequestParam String customerCodes) { + return R.data(hcsCreditCheckSupport.queryCustomerRiskBatch(Func.toStrList(customerCodes))); + } + /** * 附件上传到合同系统(C103-2 代理,前端接入设计 §3.2),返回合规附件ID */ @@ -293,4 +306,19 @@ public class HcsSyncController { public R paymentLegalResult(@RequestBody(required = false) HcsLegalResultDTO param) { return R.data(hcsPaymentSyncSupport.handleLegalResult(param)); } + + /** + * 项目金蝶同步结果回传接收(合规系统 projectLegal/result 推送,D902,原文留痕) + *

    + * 免登免授权:blade.secure skip-url + auth permitAll 放行(doc/nacos/blade.yaml); + * iPaaS 网关注册映射:/gwzh/HTHG/projectLegal/result → /hcs/projectLegal/result; + * 报文 {sourceSystem, projectCode, requestId, success, kingdeeId, projectNumber, reason}, + * 按 projectCode=TMS 项目编号定位,success=true 回填金蝶项目ID/编号,success=false 记录失败原因。 + */ + @PostMapping("/projectLegal/result") + @ApiOperationSupport(order = 18) + @Operation(summary = "项目金蝶同步结果回传接收", description = "合规系统推送项目金蝶同步结果(D902),按项目编号定位并回填金蝶ID,原文留痕") + public R projectLegalResult(@RequestBody(required = false) HcsProjectLegalResultDTO param) { + return R.data(hcsProjectSyncSupport.handleLegalResult(param)); + } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java index 2ef52bdb..03581c51 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java @@ -482,9 +482,29 @@ public class ContractManageServiceImpl extends BaseServiceImpl queryWrapper, Boolean kingdeeSynced, Boolean hcsSynced) { + if (Boolean.TRUE.equals(kingdeeSynced)) { + queryWrapper.isNotNull(ContractManage::getKingdeeId).ne(ContractManage::getKingdeeId, ""); + } else if (Boolean.FALSE.equals(kingdeeSynced)) { + queryWrapper.and(wrapper -> wrapper.isNull(ContractManage::getKingdeeId) + .or().eq(ContractManage::getKingdeeId, "")); + } + if (Boolean.TRUE.equals(hcsSynced)) { + queryWrapper.eq(ContractManage::getHcsSyncStatus, HcsSyncConstant.HCS_STATUS_SYNCED); + } else if (Boolean.FALSE.equals(hcsSynced)) { + queryWrapper.and(wrapper -> wrapper.isNull(ContractManage::getHcsSyncStatus) + .or().ne(ContractManage::getHcsSyncStatus, HcsSyncConstant.HCS_STATUS_SYNCED)); + } + } + private void applyEffectiveType(LambdaQueryWrapper queryWrapper, String effectiveType) { if (Func.isEmpty(effectiveType)) { return; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java index f6295f43..46f9b3fe 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java @@ -406,9 +406,29 @@ public class ProjectApplyServiceImpl extends BaseServiceImpl queryWrapper, Boolean kingdeeSynced, Boolean hcsSynced) { + if (Boolean.TRUE.equals(kingdeeSynced)) { + queryWrapper.isNotNull(ProjectApply::getKingdeeId).ne(ProjectApply::getKingdeeId, ""); + } else if (Boolean.FALSE.equals(kingdeeSynced)) { + queryWrapper.and(wrapper -> wrapper.isNull(ProjectApply::getKingdeeId) + .or().eq(ProjectApply::getKingdeeId, "")); + } + if (Boolean.TRUE.equals(hcsSynced)) { + queryWrapper.eq(ProjectApply::getHcsSyncStatus, HcsSyncConstant.HCS_STATUS_SYNCED); + } else if (Boolean.FALSE.equals(hcsSynced)) { + queryWrapper.and(wrapper -> wrapper.isNull(ProjectApply::getHcsSyncStatus) + .or().ne(ProjectApply::getHcsSyncStatus, HcsSyncConstant.HCS_STATUS_SYNCED)); + } + } + private void fillFundUseRisk(List records) { if (records == null || records.isEmpty()) { return; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index e5fec114..dad84844 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -45,8 +45,12 @@ import org.springblade.transport.pojo.entity.HcsContractCheckLog; import org.springframework.stereotype.Component; import java.time.LocalDateTime; +import java.time.LocalDate; +import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; /** * HCS 合同特批同步支撑组件(合规特批结果接收:contractLegal/result 推送 + C103-4 定时查询兜底 + 人工确认)。 @@ -169,7 +173,7 @@ public class HcsContractSpecSyncSupport { * 合同特批结果接收处理(合规 contractLegal/result 推送,2026-10-13 按合规方最新字段表修正报文结构): * 特批完成后合规侧同步金蝶并回调,报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=WCCK}; * sourceSystem 须为 WCCK(不符抛"来源系统标识错误"异常);contractCode=TMS 合同编号定位(requestId 仅请求头回显不可定位); - * success=true 联动恢复"审批通过"(kingdeeId 随留痕保存);success=false 联动合同审批驳回走重新提交闭环(reason 随原文留痕) + * success=true 联动恢复"审批通过"(金蝶合同ID回填 kingdee_id);success=false 联动合同审批驳回走重新提交闭环(reason 随原文留痕) * * @param param 合规推送报文 * @return 处理结果描述 @@ -193,9 +197,11 @@ public class HcsContractSpecSyncSupport { return "已留痕:success 字段缺失(contractNo=" + contractManage.getContractNo() + ")"; } boolean success = param.getSuccess(); - // 成功:特批完成且金蝶同步成功,恢复"审批通过";kingdeeId 随 hcs_spec_msg/留痕保存 + // 成功:特批完成且金蝶同步成功,恢复"审批通过";金蝶合同ID回填 kingdee_id 留痕保存 if (success) { syncContractOnSpecResult(contractManage, true); + contractManage.setKingdeeId(param.getKingdeeId()); + appendKingdeeResultRecord(contractManage, "金蝶同步成功:金蝶合同ID=" + param.getKingdeeId()); markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_APPROVED, "合同特批结果推送:金蝶同步成功,kingdeeId=" + param.getKingdeeId()); writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_PASS, "合同特批结果推送:" + raw); @@ -204,12 +210,49 @@ public class HcsContractSpecSyncSupport { } // 失败:特批流程已完成但金蝶同步失败,联动合同审批驳回,走重新编辑→提交→审批→重新特批闭环(失败单独重试机制待联调确认) syncContractOnSpecResult(contractManage, false); + appendKingdeeResultRecord(contractManage, "金蝶同步失败:" + param.getReason()); markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_REJECTED, "合同特批结果推送:金蝶同步失败:" + param.getReason()); writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_FAIL, "合同特批结果推送:" + raw); log.info("合同特批结果推送处理完成:contractNo={},结果=rejected,reason={}", contractManage.getContractNo(), param.getReason()); return "特批结果已处理:rejected"; } + /** + * 金蝶同步结果回填变更记录(changeRecordJson 追加一条;系统回调无登录用户,操作人记来源标识) + */ + private void appendKingdeeResultRecord(ContractManage contractManage, String changeContent) { + List records = StringUtil.isBlank(contractManage.getChangeRecordJson()) + ? new ArrayList<>() : new ArrayList<>(JSONUtil.toList(contractManage.getChangeRecordJson(), Object.class)); + Map record = new LinkedHashMap<>(); + record.put("changeDate", LocalDate.now().toString()); + record.put("handlerUserName", "合规系统回调"); + record.put("changeType", "金蝶同步结果"); + record.put("changeContent", changeContent); + record.put("status", contractManage.getApprovalStatus()); + record.put("statusName", approvalStatusName(contractManage.getApprovalStatus())); + records.add(record); + contractManage.setChangeRecordJson(JSONUtil.toJsonStr(records)); + } + + /** + * 审批状态中文名(变更记录展示用,未匹配回退原值) + */ + private String approvalStatusName(String approvalStatus) { + if (StringUtil.isBlank(approvalStatus)) { + return null; + } + return switch (approvalStatus) { + case "draft" -> "草稿"; + case "reviewing" -> "审批中"; + case "withdrawn" -> "已撤回"; + case "approved" -> "审批通过"; + case "rejected" -> "已驳回"; + case "change_reviewing" -> "变更审批中"; + case "change_approved" -> "变更审批通过"; + default -> approvalStatus; + }; + } + /** * 按 ERP 合同编号定位合同(合规推送 contractCode,合同编号唯一) */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index 45f8b7de..db8c5106 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -25,6 +25,8 @@ */ package org.springblade.transport.support.hcs; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; @@ -36,6 +38,7 @@ import org.springblade.hcs.dto.HcsPageQueryDTO; import org.springblade.hcs.dto.HcsPageVO; import org.springblade.hcs.dto.HcsProjectAddDTO; import org.springblade.hcs.dto.HcsProjectFormDataDTO; +import org.springblade.hcs.dto.HcsProjectLegalResultDTO; import org.springblade.hcs.dto.HcsProjectPropsDTO; import org.springblade.hcs.dto.HcsProjectUpdateDTO; import org.springblade.hcs.dto.HcsProjectVO; @@ -47,12 +50,17 @@ import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; import org.springblade.transport.constant.HcsFieldConstant; import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.HcsContractCheckLogMapper; import org.springblade.transport.mapper.ProjectApplyMapper; +import org.springblade.transport.pojo.entity.HcsContractCheckLog; import org.springblade.transport.pojo.entity.ProjectApply; import org.springframework.stereotype.Component; import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -76,9 +84,15 @@ public class HcsProjectSyncSupport { */ private static final BigDecimal WAN_TO_YUAN = BigDecimal.valueOf(10000); + /** + * 项目金蝶同步结果回传来源系统标识(合规方接口文档约定固定传 WCCK) + */ + private static final String LEGAL_CALLBACK_SRC_SYSTEM = "WCCK"; + private final IHcsClient hcsClient; private final HcsProperties hcsProperties; private final ProjectApplyMapper projectApplyMapper; + private final HcsContractCheckLogMapper hcsContractCheckLogMapper; /** * 推送项目立项到 HCS:判重 → 新建(C102-1)/ 更新(C102-2)→ 回填合规 fdId 置 synced @@ -257,6 +271,125 @@ public class HcsProjectSyncSupport { return page.getContent().get(0).getFdId(); } + /** + * 项目金蝶同步结果接收处理(合规 projectLegal/result 推送,D902): + * sourceSystem 须为 WCCK(不符抛"来源系统标识错误"异常);projectCode=TMS 项目编号定位(requestId 仅 X-ERP-Request-Id 回显不可定位); + * success=true 回填金蝶项目ID/编号(kingdeeId/kingdeeNumber);success=false 记录失败原因;原文留痕 blade_hcs_check_log + * + * @param param 合规推送报文 + * @return 处理结果描述 + */ + public String handleLegalResult(HcsProjectLegalResultDTO param) { + // 来源系统校验:仅接受合规方约定的 WCCK,防伪造回传 + if (!LEGAL_CALLBACK_SRC_SYSTEM.equalsIgnoreCase(param == null ? null : param.getSourceSystem())) { + log.warn("项目金蝶同步结果推送来源系统标识错误:sourceSystem={}", param == null ? null : param.getSourceSystem()); + throw new ServiceException("来源系统标识错误"); + } + String raw = JSONUtil.toJsonStr(param); + ProjectApply projectApply = locateProjectByCode(param.getProjectCode()); + if (projectApply == null) { + log.warn("项目金蝶同步结果推送未定位到项目:projectCode={},报文已留痕", param.getProjectCode()); + writeCallbackLog(null, HcsSyncConstant.CHECK_RESULT_SKIP, "项目金蝶同步结果推送未定位到项目:" + raw); + return "已留痕:未定位到项目(projectCode=" + param.getProjectCode() + ")"; + } + if (param.getSuccess() == null) { + log.warn("项目金蝶同步结果推送 success 字段缺失:projectCode={},报文已留痕", projectApply.getProjectCode()); + writeCallbackLog(projectApply, HcsSyncConstant.CHECK_RESULT_SKIP, "项目金蝶同步结果推送 success 字段缺失:" + raw); + return "已留痕:success 字段缺失(projectCode=" + projectApply.getProjectCode() + ")"; + } + if (param.getSuccess()) { + // 成功:回填金蝶项目ID/编号,同步结果信息随 hcs_sync_msg 留痕 + projectApply.setKingdeeId(param.getKingdeeId()); + projectApply.setKingdeeNumber(param.getProjectNumber()); + projectApply.setHcsSyncMsg(HcsSyncConstant.truncateMsg("项目金蝶同步结果回调:金蝶同步成功,kingdeeId=" + param.getKingdeeId() + + ",projectNumber=" + param.getProjectNumber())); + appendKingdeeResultRecord(projectApply, "金蝶同步成功:金蝶项目ID=" + param.getKingdeeId() + + ",金蝶项目编号=" + param.getProjectNumber()); + projectApplyMapper.updateById(projectApply); + writeCallbackLog(projectApply, HcsSyncConstant.CHECK_RESULT_PASS, "项目金蝶同步结果推送:" + raw); + log.info("项目金蝶同步结果推送处理完成:projectCode={},结果=success,kingdeeId={}", projectApply.getProjectCode(), param.getKingdeeId()); + return "金蝶同步结果已处理:success"; + } + // 失败:记录失败原因(金蝶同步在合规侧完成,TMS 不重推,失败重试由合规侧负责) + projectApply.setHcsSyncMsg(HcsSyncConstant.truncateMsg("项目金蝶同步结果回调:金蝶同步失败:" + param.getReason())); + appendKingdeeResultRecord(projectApply, "金蝶同步失败:" + param.getReason()); + projectApplyMapper.updateById(projectApply); + writeCallbackLog(projectApply, HcsSyncConstant.CHECK_RESULT_FAIL, "项目金蝶同步结果推送:" + raw); + log.info("项目金蝶同步结果推送处理完成:projectCode={},结果=fail,reason={}", projectApply.getProjectCode(), param.getReason()); + return "金蝶同步结果已处理:fail"; + } + + /** + * 金蝶同步结果回填变更记录(changeRecordJson 追加一条;系统回调无登录用户,操作人记来源标识) + */ + private void appendKingdeeResultRecord(ProjectApply projectApply, String changeContent) { + List records = StringUtil.isBlank(projectApply.getChangeRecordJson()) + ? new ArrayList<>() : new ArrayList<>(JSONUtil.toList(projectApply.getChangeRecordJson(), Object.class)); + Map record = new LinkedHashMap<>(); + record.put("changeDate", LocalDate.now().toString()); + record.put("handlerUserName", "合规系统回调"); + record.put("changeType", "金蝶同步结果"); + record.put("changeContent", changeContent); + record.put("status", projectApply.getApprovalStatus()); + record.put("statusName", approvalStatusName(projectApply.getApprovalStatus())); + records.add(record); + projectApply.setChangeRecordJson(JSONUtil.toJsonStr(records)); + } + + /** + * 审批状态中文名(变更记录展示用,未匹配回退原值) + */ + private String approvalStatusName(String approvalStatus) { + if (StringUtil.isBlank(approvalStatus)) { + return null; + } + return switch (approvalStatus) { + case "draft" -> "草稿"; + case "reviewing" -> "审批中"; + case "withdrawn" -> "已撤回"; + case "approved" -> "审批通过"; + case "rejected" -> "已驳回"; + case "change_reviewing" -> "变更审批中"; + case "change_rejected" -> "变更驳回"; + case "change_approved" -> "变更审批通过"; + case "voided" -> "已作废"; + default -> approvalStatus; + }; + } + + /** + * 按 ERP 项目编号定位项目(合规推送 projectCode,对应 C102 fd_num) + */ + private ProjectApply locateProjectByCode(String projectCode) { + if (StringUtil.isBlank(projectCode)) { + return null; + } + return projectApplyMapper.selectOne(Wrappers.lambdaQuery() + .eq(ProjectApply::getProjectCode, projectCode.trim()) + .last("limit 1")); + } + + /** + * 项目金蝶同步结果推送留痕(blade_hcs_check_log,biz_type=project,项目未定位到时 bizId 为空,异常不影响主流程) + */ + private void writeCallbackLog(ProjectApply projectApply, String result, String msg) { + try { + HcsContractCheckLog checkLog = new HcsContractCheckLog(); + if (projectApply != null) { + checkLog.setTenantId(projectApply.getTenantId()); + checkLog.setBizId(projectApply.getId()); + } + checkLog.setBizType(HcsSyncConstant.BIZ_TYPE_PROJECT); + checkLog.setCheckType(HcsSyncConstant.CHECK_TYPE_KINGDEE); + checkLog.setResult(result); + checkLog.setMsg(StringUtil.left(msg, HcsSyncConstant.SYNC_MSG_MAX_LENGTH)); + checkLog.setCreateTime(LocalDateTime.now()); + hcsContractCheckLogMapper.insert(checkLog); + } catch (Exception exception) { + log.error("项目金蝶同步结果推送留痕写入失败:projectCode={}", projectApply == null ? null : projectApply.getProjectCode(), exception); + } + } + /** * 单条手动重推:重置为待同步并清零重试计数后立即推送(页面"推送合规/重推"按钮入口) * diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectLegalResultDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectLegalResultDTO.java new file mode 100644 index 00000000..727c0a4b --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectLegalResultDTO.java @@ -0,0 +1,78 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

    + * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

    + * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 项目金蝶同步完成后合规系统回传 TMS 的结果报文(D902,POST /hcs/projectLegal/result,iPaaS 网关 /gwzh/HTHG/projectLegal/result) + *

    + * 定位项目用 projectCode(ERP 项目编号,对应 C102 请求中的 fd_num), + * requestId 仅是 C102 请求头 X-ERP-Request-Id 原样回传、不能用于定位; + * 未知或过期的 requestId 合规侧返回失败。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsProjectLegalResultDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * ERP 项目编号(TMS blade_project_apply.project_code,对应 C102 请求中的 fd_num,定位项目用) + */ + private String projectCode; + /** + * C102 请求头 X-ERP-Request-Id 的值,原样返回(不用于定位) + */ + private String requestId; + /** + * 金蝶同步成功传 true,失败传 false + */ + private Boolean success; + /** + * 金蝶项目 ID;成功时用于回填保存 + */ + private String kingdeeId; + /** + * 金蝶项目编号;成功时用于回填保存 + */ + private String projectNumber; + /** + * 金蝶同步失败原因;失败时建议填写 + */ + private String reason; + /** + * 来源系统标识,约定传 WCCK(最长 64 字符) + */ + private String sourceSystem; +} diff --git a/doc/nacos/blade.yaml b/doc/nacos/blade.yaml index 0b182866..f0aab0c3 100644 --- a/doc/nacos/blade.yaml +++ b/doc/nacos/blade.yaml @@ -237,11 +237,13 @@ blade: - /feign/client/businessProcess/getProcessInfo - /feign/client/customerArchive/syncProcessNode - /feign/client/mkProcess/** - # HCS 合同/付款特批结果回传:合规系统经 iPaaS 网关无令牌调用,免登免授权 + # HCS 合同/付款特批结果回传 + 项目金蝶同步结果回传:合规系统经 iPaaS 网关无令牌调用,免登免授权 - /blade-transport/hcs/contractLegal/result - /hcs/contractLegal/result - /blade-transport/hcs/paymentLegal/result - /hcs/paymentLegal/result + - /blade-transport/hcs/projectLegal/result + - /hcs/projectLegal/result #授权认证配置 auth: - method: ALL @@ -269,7 +271,7 @@ blade: - method: POST pattern: /kingdee-bfi/** expression: "permitAll()" - # HCS 合同/付款特批结果回传:合规系统经 iPaaS 网关无令牌调用,免登免授权 + # HCS 合同/付款特批结果回传 + 项目金蝶同步结果回传:合规系统经 iPaaS 网关无令牌调用,免登免授权 - method: POST pattern: /blade-transport/hcs/contractLegal/result expression: "permitAll()" @@ -282,6 +284,12 @@ blade: - method: POST pattern: /hcs/paymentLegal/result expression: "permitAll()" + - method: POST + pattern: /blade-transport/hcs/projectLegal/result + expression: "permitAll()" + - method: POST + pattern: /hcs/projectLegal/result + expression: "permitAll()" #基础认证配置 basic: - method: ALL diff --git a/doc/sql/transport/blade_hcs_kingdee_id_20261020.sql b/doc/sql/transport/blade_hcs_kingdee_id_20261020.sql new file mode 100644 index 00000000..92a8fd4e --- /dev/null +++ b/doc/sql/transport/blade_hcs_kingdee_id_20261020.sql @@ -0,0 +1,30 @@ +-- HCS 金蝶同步结果回调回填字段: +-- blade_project_apply 追加金蝶项目ID/编号(D902 项目金蝶同步结果回调 projectLegal/result 回填); +-- blade_contract_manage 追加金蝶合同ID(合同特批金蝶同步结果回调 contractLegal/result 回填)。 +-- 通过 information_schema 判断字段是否存在,可重复执行。 +SET @db_name = DATABASE(); + +-- ==================== blade_project_apply(D902 项目金蝶同步结果回填) ==================== + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_project_apply' AND column_name = 'kingdee_id'), + 'SELECT 1', + 'ALTER TABLE blade_project_apply ADD COLUMN kingdee_id varchar(64) DEFAULT NULL COMMENT ''金蝶项目ID(D902 回调回填)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_project_apply' AND column_name = 'kingdee_number'), + 'SELECT 1', + 'ALTER TABLE blade_project_apply ADD COLUMN kingdee_number varchar(64) DEFAULT NULL COMMENT ''金蝶项目编号(D902 回调回填)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- ==================== blade_contract_manage(contractLegal/result 金蝶同步结果回填) ==================== + +SET @sql = IF( + EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = @db_name AND table_name = 'blade_contract_manage' AND column_name = 'kingdee_id'), + 'SELECT 1', + 'ALTER TABLE blade_contract_manage ADD COLUMN kingdee_id varchar(64) DEFAULT NULL COMMENT ''金蝶合同ID(contractLegal/result 回调回填)''' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; From 7a480570193b10931cc87246b0e1dab8974db07a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 20 Oct 2026 16:45:52 +0800 Subject: [PATCH 082/124] =?UTF-8?q?:feat:=20=E6=96=B0=E5=A2=9E=E5=90=88?= =?UTF-8?q?=E5=90=8C=E9=87=91=E8=9D=B6=E5=90=8C=E6=AD=A5=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=EF=BC=88D903=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 /hcs/contractKingdee/result 免登回调端点,投送人/钢厂/结算中心合同共用 - 按合同编号定位回填金蝶合同ID,失败记录原因;本接口不处理法务审批结论 - contractType/sourceSystem 均按非必填处理,传值时校验来源标识为 WCCK - 回调成功/失败追加变更记录并原文留痕 blade_hcs_check_log(check_type=kingdee) --- .../controller/HcsSyncController.java | 15 +++ .../support/hcs/HcsContractSyncSupport.java | 125 ++++++++++++++++++ doc/nacos/blade.yaml | 12 +- 3 files changed, 150 insertions(+), 2 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 6e7a46ed..9442ed96 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -321,4 +321,19 @@ public class HcsSyncController { public R projectLegalResult(@RequestBody(required = false) HcsProjectLegalResultDTO param) { return R.data(hcsProjectSyncSupport.handleLegalResult(param)); } + + /** + * 合同金蝶同步结果回传接收(合规系统 contractKingdee/result 推送,D903,投送人/钢厂/结算中心合同共用,原文留痕) + *

    + * 免登免授权:blade.secure skip-url + auth permitAll 放行(doc/nacos/blade.yaml); + * iPaaS 网关注册映射:/gwzh/HTHG/contractKingdee/result → /hcs/contractKingdee/result; + * 报文 {contractType?, contractCode, requestId, success, reason?, kingdeeId?, sourceSystem?}, + * 本接口不处理法务审批结论,仅按 contractCode=TMS 合同编号定位回填金蝶合同ID/记录失败原因。 + */ + @PostMapping("/contractKingdee/result") + @ApiOperationSupport(order = 19) + @Operation(summary = "合同金蝶同步结果回传接收", description = "合规系统推送合同金蝶最终同步结果(D903,投送人/钢厂/结算中心共用),按合同编号定位回填金蝶ID,不处理法务审批结论,原文留痕") + public R contractKingdeeResult(@RequestBody(required = false) HcsContractLegalResultDTO param) { + return R.data(hcsContractSyncSupport.handleKingdeeResult(param)); + } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index c527c9b6..47e1adc2 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -25,6 +25,7 @@ */ package org.springblade.transport.support.hcs; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -37,6 +38,7 @@ import org.springblade.hcs.dto.HcsAttachmentRefDTO; import org.springblade.hcs.dto.HcsContractDraftDTO; import org.springblade.hcs.dto.HcsContractDraftVO; import org.springblade.hcs.dto.HcsContractFieldJsonDTO; +import org.springblade.hcs.dto.HcsContractLegalResultDTO; import org.springblade.hcs.dto.HcsContractVO; import org.springblade.hcs.dto.HcsPageQueryDTO; import org.springblade.hcs.dto.HcsPageVO; @@ -66,6 +68,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -97,6 +100,11 @@ public class HcsContractSyncSupport { */ private static final String BLACK_STATUS_YES = "yes"; + /** + * 合同金蝶同步结果回传来源系统标识(D903 约定传 WCCK,非必填,传值时校验) + */ + private static final String KINGDEE_CALLBACK_SRC_SYSTEM = "WCCK"; + private final IHcsClient hcsClient; private final HcsProperties hcsProperties; private final ContractManageMapper contractManageMapper; @@ -107,6 +115,123 @@ public class HcsContractSyncSupport { private final HcsExeStageSyncSupport hcsExeStageSyncSupport; private final HcsContractSpecSyncSupport hcsContractSpecSyncSupport; + /** + * 合同金蝶同步结果接收处理(合规 contractKingdee/result 推送,D903,投送人/钢厂/结算中心合同共用): + * 合规侧收到金蝶最终同步结果后通知 TMS 更新同步状态,本接口不处理法务审批结论(特批联动走 contractLegal/result + C103-4 兜底); + * contractType(deliverer/gc/sett_center)非必填仅随原文留痕;sourceSystem 非必填,传值时须为 WCCK; + * contractCode=TMS 合同编号定位(requestId 仅 X-ERP-Request-Id 回显不可定位); + * success=true 回填金蝶合同ID(kingdeeId),success=false 记录失败原因;均追加变更记录并原文留痕 blade_hcs_check_log + * + * @param param 合规推送报文 + * @return 处理结果描述 + */ + public String handleKingdeeResult(HcsContractLegalResultDTO param) { + // sourceSystem 非必填(D903),传值时仅接受合规方约定的 WCCK,防伪造回传 + String sourceSystem = param == null ? null : param.getSourceSystem(); + if (StringUtil.isNotBlank(sourceSystem) && !KINGDEE_CALLBACK_SRC_SYSTEM.equalsIgnoreCase(sourceSystem)) { + log.warn("合同金蝶同步结果推送来源系统标识错误:sourceSystem={}", sourceSystem); + throw new ServiceException("来源系统标识错误"); + } + String raw = JSONUtil.toJsonStr(param); + ContractManage contractManage = locateContractByNo(param.getContractCode()); + if (contractManage == null) { + log.warn("合同金蝶同步结果推送未定位到合同:contractCode={},报文已留痕", param.getContractCode()); + writeKingdeeCallbackLog(null, HcsSyncConstant.CHECK_RESULT_SKIP, "合同金蝶同步结果推送未定位到合同:" + raw); + return "已留痕:未定位到合同(contractCode=" + param.getContractCode() + ")"; + } + if (param.getSuccess() == null) { + log.warn("合同金蝶同步结果推送 success 字段缺失:contractNo={},报文已留痕", contractManage.getContractNo()); + writeKingdeeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, "合同金蝶同步结果推送 success 字段缺失:" + raw); + return "已留痕:success 字段缺失(contractNo=" + contractManage.getContractNo() + ")"; + } + if (param.getSuccess()) { + // 成功:回填金蝶合同ID,同步结果信息随 hcs_sync_msg 留痕,不联动审批/特批状态 + contractManage.setKingdeeId(param.getKingdeeId()); + contractManage.setHcsSyncMsg(HcsSyncConstant.truncateMsg("合同金蝶同步结果回调:金蝶同步成功,kingdeeId=" + param.getKingdeeId())); + appendKingdeeResultRecord(contractManage, "金蝶同步成功:金蝶合同ID=" + param.getKingdeeId()); + contractManageMapper.updateById(contractManage); + writeKingdeeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_PASS, "合同金蝶同步结果推送:" + raw); + log.info("合同金蝶同步结果推送处理完成:contractNo={},结果=success,kingdeeId={}", contractManage.getContractNo(), param.getKingdeeId()); + return "金蝶同步结果已处理:success"; + } + // 失败:记录失败原因(金蝶同步在合规侧完成,TMS 不重推,失败重试由合规侧负责) + contractManage.setHcsSyncMsg(HcsSyncConstant.truncateMsg("合同金蝶同步结果回调:金蝶同步失败:" + param.getReason())); + appendKingdeeResultRecord(contractManage, "金蝶同步失败:" + param.getReason()); + contractManageMapper.updateById(contractManage); + writeKingdeeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_FAIL, "合同金蝶同步结果推送:" + raw); + log.info("合同金蝶同步结果推送处理完成:contractNo={},结果=fail,reason={}", contractManage.getContractNo(), param.getReason()); + return "金蝶同步结果已处理:fail"; + } + + /** + * 按 ERP 合同编号定位合同(合规推送 contractCode,合同编号唯一) + */ + private ContractManage locateContractByNo(String contractCode) { + if (StringUtil.isBlank(contractCode)) { + return null; + } + return contractManageMapper.selectOne(Wrappers.lambdaQuery() + .eq(ContractManage::getContractNo, contractCode.trim()) + .last("limit 1")); + } + + /** + * 合同金蝶同步结果推送留痕(blade_hcs_check_log,biz_type=contract,合同未定位到时 bizId 为空,异常不影响主流程) + */ + private void writeKingdeeCallbackLog(ContractManage contractManage, String result, String msg) { + try { + HcsContractCheckLog checkLog = new HcsContractCheckLog(); + if (contractManage != null) { + checkLog.setTenantId(contractManage.getTenantId()); + checkLog.setBizId(contractManage.getId()); + } + checkLog.setBizType(HcsSyncConstant.BIZ_TYPE_CONTRACT); + checkLog.setCheckType(HcsSyncConstant.CHECK_TYPE_KINGDEE); + checkLog.setResult(result); + checkLog.setMsg(StringUtil.left(msg, HcsSyncConstant.SYNC_MSG_MAX_LENGTH)); + checkLog.setCreateTime(LocalDateTime.now()); + hcsContractCheckLogMapper.insert(checkLog); + } catch (Exception exception) { + log.error("合同金蝶同步结果推送留痕写入失败:contractNo={}", contractManage == null ? null : contractManage.getContractNo(), exception); + } + } + + /** + * 金蝶同步结果回填变更记录(changeRecordJson 追加一条;系统回调无登录用户,操作人记来源标识) + */ + private void appendKingdeeResultRecord(ContractManage contractManage, String changeContent) { + List records = StringUtil.isBlank(contractManage.getChangeRecordJson()) + ? new ArrayList<>() : new ArrayList<>(JSONUtil.toList(contractManage.getChangeRecordJson(), Object.class)); + Map record = new LinkedHashMap<>(); + record.put("changeDate", LocalDate.now().toString()); + record.put("handlerUserName", "合规系统回调"); + record.put("changeType", "金蝶同步结果"); + record.put("changeContent", changeContent); + record.put("status", contractManage.getApprovalStatus()); + record.put("statusName", approvalStatusName(contractManage.getApprovalStatus())); + records.add(record); + contractManage.setChangeRecordJson(JSONUtil.toJsonStr(records)); + } + + /** + * 审批状态中文名(变更记录展示用,未匹配回退原值) + */ + private String approvalStatusName(String approvalStatus) { + if (StringUtil.isBlank(approvalStatus)) { + return null; + } + return switch (approvalStatus) { + case "draft" -> "草稿"; + case "reviewing" -> "审批中"; + case "withdrawn" -> "已撤回"; + case "approved" -> "审批通过"; + case "rejected" -> "已驳回"; + case "change_reviewing" -> "变更审批中"; + case "change_approved" -> "变更审批通过"; + default -> approvalStatus; + }; + } + /** * 推送合同到 HCS:特批挂起门禁 → 风险校验(仅留痕,高风险不再阻断)→ 附件转传 → 判重 → 起草/更新 → 回填合规 fdId 置 synced * → 履约计划行级同步(C103-9,先于特批挂起)→ 高风险/黑名单客商合同挂起"特批审核"等待合规特批结果(报文随 fdSepcailContract=true,外部客商管控) diff --git a/doc/nacos/blade.yaml b/doc/nacos/blade.yaml index f0aab0c3..8515a4fb 100644 --- a/doc/nacos/blade.yaml +++ b/doc/nacos/blade.yaml @@ -237,13 +237,15 @@ blade: - /feign/client/businessProcess/getProcessInfo - /feign/client/customerArchive/syncProcessNode - /feign/client/mkProcess/** - # HCS 合同/付款特批结果回传 + 项目金蝶同步结果回传:合规系统经 iPaaS 网关无令牌调用,免登免授权 + # HCS 合同/付款特批结果回传 + 项目/合同金蝶同步结果回传:合规系统经 iPaaS 网关无令牌调用,免登免授权 - /blade-transport/hcs/contractLegal/result - /hcs/contractLegal/result - /blade-transport/hcs/paymentLegal/result - /hcs/paymentLegal/result - /blade-transport/hcs/projectLegal/result - /hcs/projectLegal/result + - /blade-transport/hcs/contractKingdee/result + - /hcs/contractKingdee/result #授权认证配置 auth: - method: ALL @@ -271,7 +273,7 @@ blade: - method: POST pattern: /kingdee-bfi/** expression: "permitAll()" - # HCS 合同/付款特批结果回传 + 项目金蝶同步结果回传:合规系统经 iPaaS 网关无令牌调用,免登免授权 + # HCS 合同/付款特批结果回传 + 项目/合同金蝶同步结果回传:合规系统经 iPaaS 网关无令牌调用,免登免授权 - method: POST pattern: /blade-transport/hcs/contractLegal/result expression: "permitAll()" @@ -290,6 +292,12 @@ blade: - method: POST pattern: /hcs/projectLegal/result expression: "permitAll()" + - method: POST + pattern: /blade-transport/hcs/contractKingdee/result + expression: "permitAll()" + - method: POST + pattern: /hcs/contractKingdee/result + expression: "permitAll()" #基础认证配置 basic: - method: ALL From f579a7eb20ee4d4712e0e9b915fe0b28010d6c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 20 Oct 2026 16:54:26 +0800 Subject: [PATCH 083/124] =?UTF-8?q?:refactor:=20=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E7=8A=B6=E6=80=81=E4=B8=AD=E6=96=87=E5=90=8D?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E4=B8=BA=E5=85=AC=E5=85=B1=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 审批状态中文名映射收敛至 HcsSyncConstant.approvalStatusName(金蝶回调变更记录共用) - 删除项目/合同特批/合同同步三个支撑组件中的重复私有实现 --- .../transport/constant/HcsSyncConstant.java | 21 +++++++++++++++++ .../hcs/HcsContractSpecSyncSupport.java | 21 +---------------- .../support/hcs/HcsContractSyncSupport.java | 21 +---------------- .../support/hcs/HcsProjectSyncSupport.java | 23 +------------------ 4 files changed, 24 insertions(+), 62 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 e82d304a..c4eb9884 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 @@ -301,6 +301,27 @@ public final class HcsSyncConstant { return message.length() > SYNC_MSG_MAX_LENGTH ? message.substring(0, SYNC_MSG_MAX_LENGTH) : message; } + /** + * 审批状态中文名(变更记录展示用,金蝶同步结果回调等系统链路共用;未匹配回退原值) + */ + public static String approvalStatusName(String approvalStatus) { + if (approvalStatus == null || approvalStatus.isEmpty()) { + return null; + } + return switch (approvalStatus) { + case "draft" -> "草稿"; + case "reviewing" -> "审批中"; + case "withdrawn" -> "已撤回"; + case "approved" -> "审批通过"; + case "rejected" -> "已驳回"; + case "change_reviewing" -> "变更审批中"; + case "change_rejected" -> "变更驳回"; + case "change_approved" -> "变更审批通过"; + case "voided" -> "已作废"; + default -> approvalStatus; + }; + } + private HcsSyncConstant() { } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index dad84844..f14c7565 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -229,30 +229,11 @@ public class HcsContractSpecSyncSupport { record.put("changeType", "金蝶同步结果"); record.put("changeContent", changeContent); record.put("status", contractManage.getApprovalStatus()); - record.put("statusName", approvalStatusName(contractManage.getApprovalStatus())); + record.put("statusName", HcsSyncConstant.approvalStatusName(contractManage.getApprovalStatus())); records.add(record); contractManage.setChangeRecordJson(JSONUtil.toJsonStr(records)); } - /** - * 审批状态中文名(变更记录展示用,未匹配回退原值) - */ - private String approvalStatusName(String approvalStatus) { - if (StringUtil.isBlank(approvalStatus)) { - return null; - } - return switch (approvalStatus) { - case "draft" -> "草稿"; - case "reviewing" -> "审批中"; - case "withdrawn" -> "已撤回"; - case "approved" -> "审批通过"; - case "rejected" -> "已驳回"; - case "change_reviewing" -> "变更审批中"; - case "change_approved" -> "变更审批通过"; - default -> approvalStatus; - }; - } - /** * 按 ERP 合同编号定位合同(合规推送 contractCode,合同编号唯一) */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 47e1adc2..7cd6e1c4 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -208,30 +208,11 @@ public class HcsContractSyncSupport { record.put("changeType", "金蝶同步结果"); record.put("changeContent", changeContent); record.put("status", contractManage.getApprovalStatus()); - record.put("statusName", approvalStatusName(contractManage.getApprovalStatus())); + record.put("statusName", HcsSyncConstant.approvalStatusName(contractManage.getApprovalStatus())); records.add(record); contractManage.setChangeRecordJson(JSONUtil.toJsonStr(records)); } - /** - * 审批状态中文名(变更记录展示用,未匹配回退原值) - */ - private String approvalStatusName(String approvalStatus) { - if (StringUtil.isBlank(approvalStatus)) { - return null; - } - return switch (approvalStatus) { - case "draft" -> "草稿"; - case "reviewing" -> "审批中"; - case "withdrawn" -> "已撤回"; - case "approved" -> "审批通过"; - case "rejected" -> "已驳回"; - case "change_reviewing" -> "变更审批中"; - case "change_approved" -> "变更审批通过"; - default -> approvalStatus; - }; - } - /** * 推送合同到 HCS:特批挂起门禁 → 风险校验(仅留痕,高风险不再阻断)→ 附件转传 → 判重 → 起草/更新 → 回填合规 fdId 置 synced * → 履约计划行级同步(C103-9,先于特批挂起)→ 高风险/黑名单客商合同挂起"特批审核"等待合规特批结果(报文随 fdSepcailContract=true,外部客商管控) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index db8c5106..7c4fa704 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -331,32 +331,11 @@ public class HcsProjectSyncSupport { record.put("changeType", "金蝶同步结果"); record.put("changeContent", changeContent); record.put("status", projectApply.getApprovalStatus()); - record.put("statusName", approvalStatusName(projectApply.getApprovalStatus())); + record.put("statusName", HcsSyncConstant.approvalStatusName(projectApply.getApprovalStatus())); records.add(record); projectApply.setChangeRecordJson(JSONUtil.toJsonStr(records)); } - /** - * 审批状态中文名(变更记录展示用,未匹配回退原值) - */ - private String approvalStatusName(String approvalStatus) { - if (StringUtil.isBlank(approvalStatus)) { - return null; - } - return switch (approvalStatus) { - case "draft" -> "草稿"; - case "reviewing" -> "审批中"; - case "withdrawn" -> "已撤回"; - case "approved" -> "审批通过"; - case "rejected" -> "已驳回"; - case "change_reviewing" -> "变更审批中"; - case "change_rejected" -> "变更驳回"; - case "change_approved" -> "变更审批通过"; - case "voided" -> "已作废"; - default -> approvalStatus; - }; - } - /** * 按 ERP 项目编号定位项目(合规推送 projectCode,对应 C102 fd_num) */ From c2b1e270776ee9381fc652a37f63841fd8bd8752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 20 Oct 2026 17:49:59 +0800 Subject: [PATCH 084/124] =?UTF-8?q?fix:=20=E5=90=88=E5=90=8C=E7=89=B9?= =?UTF-8?q?=E6=89=B9=E7=BB=93=E6=9E=9C=E5=9B=9E=E4=BC=A0=E6=9D=A5=E6=BA=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hcs/HcsContractSpecSyncSupport.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index f14c7565..c9476416 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -25,16 +25,17 @@ */ package org.springblade.transport.support.hcs; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsContractDetailQueryDTO; import org.springblade.hcs.dto.HcsContractDetailVO; import org.springblade.hcs.dto.HcsContractLegalResultDTO; -import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.feign.IHcsClient; import org.springblade.transport.constant.HcsSyncConstant; @@ -44,8 +45,8 @@ import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.HcsContractCheckLog; import org.springframework.stereotype.Component; -import java.time.LocalDateTime; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; @@ -60,7 +61,7 @@ import java.util.Map; * 集团审批结果经合规 contractLegal/result 接口推送 TMS(替代未建设的 B103),或定时 C103-4 查询兜底联动 → * approved 恢复流程,rejected 联动合同审批驳回。 *

    - * 结果推送报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=WCCK},原文留痕 blade_hcs_check_log。 + * 结果推送报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=},原文留痕 blade_hcs_check_log。 * * @author Chill */ @@ -79,11 +80,6 @@ public class HcsContractSpecSyncSupport { */ private static final String LEGAL_STATUS_INVALID = "approvalinvalid"; - /** - * 合同特批结果回传来源系统标识(合规方接口文档约定固定传 WCCK) - */ - private static final String LEGAL_CALLBACK_SRC_SYSTEM = "WCCK"; - /** * 结果推送原文留痕最大长度(blade_hcs_check_log.msg 为 varchar(512)) */ @@ -92,6 +88,7 @@ public class HcsContractSpecSyncSupport { private final IHcsClient hcsClient; private final ContractManageMapper contractManageMapper; private final HcsContractCheckLogMapper hcsContractCheckLogMapper; + private final HcsProperties hcsProperties; /** * 特批结果定时查询兜底(合规推送 contractLegal/result 未达/未配置时的补偿,2026-10-13): @@ -171,16 +168,16 @@ public class HcsContractSpecSyncSupport { /** * 合同特批结果接收处理(合规 contractLegal/result 推送,2026-10-13 按合规方最新字段表修正报文结构): - * 特批完成后合规侧同步金蝶并回调,报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=WCCK}; - * sourceSystem 须为 WCCK(不符抛"来源系统标识错误"异常);contractCode=TMS 合同编号定位(requestId 仅请求头回显不可定位); + * 特批完成后合规侧同步金蝶并回调,报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=}; + * sourceSystem 须为 (不符抛"来源系统标识错误"异常);contractCode=TMS 合同编号定位(requestId 仅请求头回显不可定位); * success=true 联动恢复"审批通过"(金蝶合同ID回填 kingdee_id);success=false 联动合同审批驳回走重新提交闭环(reason 随原文留痕) * * @param param 合规推送报文 * @return 处理结果描述 */ public String handleLegalResult(HcsContractLegalResultDTO param) { - // 来源系统校验:仅接受合规方约定的 WCCK,防伪造回传 - if (!LEGAL_CALLBACK_SRC_SYSTEM.equalsIgnoreCase(param == null ? null : param.getSourceSystem())) { + // 来源系统校验:仅接受合规方约定的 ,防伪造回传 + if (!StrUtil.equalsIgnoreCase(param == null ? null : param.getSourceSystem(), hcsProperties.getSrcSystem())) { log.warn("合同特批结果推送来源系统标识错误:sourceSystem={}", param == null ? null : param.getSourceSystem()); throw new ServiceException("来源系统标识错误"); } From e81eba93d0cd8a06dbb39c9dd18da9a507b4586f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 20 Oct 2026 18:21:15 +0800 Subject: [PATCH 085/124] =?UTF-8?q?fix:=20=E5=90=88=E5=90=8C=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E6=9D=A5=E6=BA=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/controller/HcsSyncController.java | 11 +++++------ .../support/hcs/HcsContractSyncSupport.java | 12 +++++------- .../transport/support/hcs/HcsProjectSyncSupport.java | 12 +++++------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 9442ed96..9b70b716 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -33,12 +33,11 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springblade.core.secure.annotation.PreAuth; import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tenant.annotation.TenantIgnore; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; -import org.springblade.hcs.dto.HcsAttachmentRefDTO; import org.springblade.hcs.dto.HcsContractLegalResultDTO; import org.springblade.hcs.dto.HcsCurrencyVO; import org.springblade.hcs.dto.HcsLegalResultDTO; @@ -51,18 +50,18 @@ import org.springblade.transport.support.hcs.HcsContractSpecSyncSupport; import org.springblade.transport.support.hcs.HcsContractSyncSupport; import org.springblade.transport.support.hcs.HcsCreditCheckSupport; import org.springblade.transport.support.hcs.HcsInvoiceRegSyncSupport; -import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; -import org.springblade.transport.support.hcs.HcsReceiptBillSyncSupport; import org.springblade.transport.support.hcs.HcsMasterDataSupport; +import org.springblade.transport.support.hcs.HcsPaymentSyncSupport; import org.springblade.transport.support.hcs.HcsProjectSyncSupport; +import org.springblade.transport.support.hcs.HcsReceiptBillSyncSupport; import org.springblade.transport.task.HcsPushTask; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @@ -72,7 +71,6 @@ import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * HCS 合规推送端点(设计文档 §5.0 手动入口) @@ -86,6 +84,7 @@ import java.util.Map; @Slf4j @RestController @AllArgsConstructor +@TenantIgnore @RequestMapping("hcs") @Tag(name = "HCS合规推送", description = "HCS合规推送端点") public class HcsSyncController { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 7cd6e1c4..a402e801 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -25,6 +25,7 @@ */ package org.springblade.transport.support.hcs; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; @@ -100,10 +101,7 @@ public class HcsContractSyncSupport { */ private static final String BLACK_STATUS_YES = "yes"; - /** - * 合同金蝶同步结果回传来源系统标识(D903 约定传 WCCK,非必填,传值时校验) - */ - private static final String KINGDEE_CALLBACK_SRC_SYSTEM = "WCCK"; + private final IHcsClient hcsClient; private final HcsProperties hcsProperties; @@ -118,7 +116,7 @@ public class HcsContractSyncSupport { /** * 合同金蝶同步结果接收处理(合规 contractKingdee/result 推送,D903,投送人/钢厂/结算中心合同共用): * 合规侧收到金蝶最终同步结果后通知 TMS 更新同步状态,本接口不处理法务审批结论(特批联动走 contractLegal/result + C103-4 兜底); - * contractType(deliverer/gc/sett_center)非必填仅随原文留痕;sourceSystem 非必填,传值时须为 WCCK; + * contractType(deliverer/gc/sett_center)非必填仅随原文留痕;sourceSystem 非必填,传值时须为 ; * contractCode=TMS 合同编号定位(requestId 仅 X-ERP-Request-Id 回显不可定位); * success=true 回填金蝶合同ID(kingdeeId),success=false 记录失败原因;均追加变更记录并原文留痕 blade_hcs_check_log * @@ -126,9 +124,9 @@ public class HcsContractSyncSupport { * @return 处理结果描述 */ public String handleKingdeeResult(HcsContractLegalResultDTO param) { - // sourceSystem 非必填(D903),传值时仅接受合规方约定的 WCCK,防伪造回传 + // sourceSystem 非必填(D903),传值时仅接受合规方约定的 ,防伪造回传 String sourceSystem = param == null ? null : param.getSourceSystem(); - if (StringUtil.isNotBlank(sourceSystem) && !KINGDEE_CALLBACK_SRC_SYSTEM.equalsIgnoreCase(sourceSystem)) { + if (!StrUtil.equalsIgnoreCase(param == null ? null : param.getSourceSystem(), hcsProperties.getSrcSystem())) { log.warn("合同金蝶同步结果推送来源系统标识错误:sourceSystem={}", sourceSystem); throw new ServiceException("来源系统标识错误"); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index 7c4fa704..3d8f785e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -25,6 +25,7 @@ */ package org.springblade.transport.support.hcs; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; @@ -84,10 +85,7 @@ public class HcsProjectSyncSupport { */ private static final BigDecimal WAN_TO_YUAN = BigDecimal.valueOf(10000); - /** - * 项目金蝶同步结果回传来源系统标识(合规方接口文档约定固定传 WCCK) - */ - private static final String LEGAL_CALLBACK_SRC_SYSTEM = "WCCK"; + private final IHcsClient hcsClient; private final HcsProperties hcsProperties; @@ -273,15 +271,15 @@ public class HcsProjectSyncSupport { /** * 项目金蝶同步结果接收处理(合规 projectLegal/result 推送,D902): - * sourceSystem 须为 WCCK(不符抛"来源系统标识错误"异常);projectCode=TMS 项目编号定位(requestId 仅 X-ERP-Request-Id 回显不可定位); + * sourceSystem 须为 (不符抛"来源系统标识错误"异常);projectCode=TMS 项目编号定位(requestId 仅 X-ERP-Request-Id 回显不可定位); * success=true 回填金蝶项目ID/编号(kingdeeId/kingdeeNumber);success=false 记录失败原因;原文留痕 blade_hcs_check_log * * @param param 合规推送报文 * @return 处理结果描述 */ public String handleLegalResult(HcsProjectLegalResultDTO param) { - // 来源系统校验:仅接受合规方约定的 WCCK,防伪造回传 - if (!LEGAL_CALLBACK_SRC_SYSTEM.equalsIgnoreCase(param == null ? null : param.getSourceSystem())) { + // 来源系统校验:仅接受合规方约定的 ,防伪造回传 + if (!StrUtil.equalsIgnoreCase(param == null ? null : param.getSourceSystem(), hcsProperties.getSrcSystem())) { log.warn("项目金蝶同步结果推送来源系统标识错误:sourceSystem={}", param == null ? null : param.getSourceSystem()); throw new ServiceException("来源系统标识错误"); } From 8c8a874522e4298017351cd3fa8eb84feb7f7a18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 20 Oct 2026 21:45:09 +0800 Subject: [PATCH 086/124] =?UTF-8?q?:feat:=20=E5=90=88=E5=90=8C=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E9=80=9A=E8=BF=87=E5=90=8C=E6=AD=A5=E6=8E=A8=E9=80=81?= =?UTF-8?q?HCS=E5=B9=B6=E5=9B=9E=E4=BC=A0=E5=A4=B1=E8=B4=A5=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ContractManageController.java | 11 +++- .../impl/ContractManageServiceImpl.java | 5 +- .../support/hcs/HcsImmediatePushSupport.java | 54 +++++++++++++++++++ 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractManageController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractManageController.java index 3ff3eaf1..364dbcc9 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractManageController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractManageController.java @@ -40,6 +40,7 @@ import org.springblade.transport.excel.ContractManageExcel; import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.vo.ContractManageVO; import org.springblade.transport.service.IContractManageService; +import org.springblade.transport.support.hcs.HcsImmediatePushSupport; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -63,6 +64,7 @@ import java.util.Map; public class ContractManageController extends BladeController { private final IContractManageService contractManageService; + private final HcsImmediatePushSupport hcsImmediatePushSupport; @GetMapping("/detail") @ApiOperationSupport(order = 1) @@ -110,7 +112,14 @@ public class ContractManageController extends BladeController { @ApiOperationSupport(order = 7) @Operation(summary = "审批通过", description = "传入id") public R approve(@Parameter(description = "主键", required = true) @RequestParam Long id) { - return R.status(contractManageService.approve(id)); + contractManageService.approve(id); + // 审批事务已提交,再同步推送合规;失败原因以警告文案返回(data=false 供前端区分提示样式),照正式结算单审批接口 + hcsImmediatePushSupport.pushContractAndWait(id); + String syncFailure = HcsImmediatePushSupport.pollSyncFailure(); + if (syncFailure != null) { + return R.data(Boolean.FALSE, "审批通过,但合规推送失败:" + syncFailure); + } + return R.success("审批通过"); } @PostMapping("/reject") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java index 03581c51..5e8f3900 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java @@ -48,7 +48,6 @@ import org.springblade.transport.service.IContractExeStageService; import org.springblade.transport.service.IContractManageService; import org.springblade.transport.support.TransportBusinessSupport; import org.springblade.transport.support.hcs.HcsCreditCheckSupport; -import org.springblade.transport.support.hcs.HcsImmediatePushSupport; import org.springblade.transport.wrapper.ContractManageWrapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -79,7 +78,6 @@ import java.util.regex.Pattern; public class ContractManageServiceImpl extends BaseServiceImpl implements IContractManageService { private final HcsContractExeStageMapper hcsContractExeStageMapper; - private final HcsImmediatePushSupport hcsImmediatePushSupport; private final HcsCreditCheckSupport hcsCreditCheckSupport; private final IContractExeStageService contractExeStageService; @@ -241,7 +239,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl + * 例外:TMS 合同/项目立项的"通过"按钮路径由 Controller 在审批事务返回后分别调用 + * {@link #pushContractAndWait(Long)}、{@link #pushProjectAndWait(Long)} 同步推送 + * (审批响应会等待附件转传 + HCS 调用完成,与正式结算单审批一致), + * 失败原因经 {@link #pollSyncFailure()} 交给 Controller 拼进审批响应(照 KingdeeApprovalSyncListener); + * MK 回调路径仍异步,避免阻塞第三方回调。 * * @author Chill */ @@ -77,6 +83,11 @@ public class HcsImmediatePushSupport { */ private static final AtomicInteger THREAD_COUNTER = new AtomicInteger(1); + /** + * 当前审批请求线程的合规推送失败原因,供审批 Controller 取走提示前端 + */ + private static final ThreadLocal SYNC_FAILURE = new ThreadLocal<>(); + private final HcsProperties hcsProperties; private final HcsProjectSyncSupport hcsProjectSyncSupport; private final HcsContractSyncSupport hcsContractSyncSupport; @@ -111,6 +122,39 @@ public class HcsImmediatePushSupport { this.submitAfterCommit(HcsSyncConstant.BIZ_TYPE_CONTRACT, id, () -> this.pushContractNow(id)); } + /** + * 合同"通过"按钮路径:在审批事务提交返回后由 Controller 同步调用,失败原因留在当前线程供其取走 + * + * @param id 合同单ID + */ + public void pushContractAndWait(Long id) { + if (!hcsProperties.getPush().isImmediateEnabled()) { + return; + } + this.pushWithLock(HcsSyncConstant.BIZ_TYPE_CONTRACT, id, () -> this.pushContractNow(id)); + } + + /** + * 项目立项"通过"按钮路径:在审批事务提交返回后由 Controller 同步调用,失败原因留在当前线程供其取走 + * + * @param id 项目立项单ID + */ + public void pushProjectAndWait(Long id) { + if (!hcsProperties.getPush().isImmediateEnabled()) { + return; + } + this.pushWithLock(HcsSyncConstant.BIZ_TYPE_PROJECT, id, () -> this.pushProjectNow(id)); + } + + /** + * 取走并清除当前审批请求的合规推送失败原因;null 表示推送成功、未触发或仍异步进行 + */ + public static String pollSyncFailure() { + String failure = SYNC_FAILURE.get(); + SYNC_FAILURE.remove(); + return failure; + } + /** * 开关校验后注册提交时机:有活动事务注册 afterCommit 回调(回滚不推送),无事务(MK 回调单条更新自动提交)直接异步 */ @@ -137,6 +181,8 @@ public class HcsImmediatePushSupport { private void pushWithLock(String bizType, Long id, Runnable pushAction) { String lockKey = HcsSyncConstant.PUSH_SINGLE_LOCK_KEY_PREFIX + bizType + ":" + id; String lockHolder = UUID.randomUUID().toString(); + // 清理同线程残留的失败原因,避免线程复用串单(同步推送路径会写入) + SYNC_FAILURE.remove(); Boolean locked = bladeRedis.getValueOps() .setIfAbsent(lockKey, lockHolder, Duration.ofSeconds(HcsSyncConstant.PUSH_SINGLE_LOCK_TTL_SECONDS)); if (!Boolean.TRUE.equals(locked)) { @@ -165,6 +211,10 @@ public class HcsImmediatePushSupport { hcsProjectSyncSupport.repushProject(id); } catch (Exception exception) { log.error("HCS项目立项即时推送失败(扫描任务将兜底补偿):id={},{}", id, exception.getMessage(), exception); + // 失败原因留在当前线程供审批 Controller 取走;异步路径无人取走,仅影响线程池自身 + String reason = exception.getMessage() == null ? "合规接口调用异常" : exception.getMessage(); + SYNC_FAILURE.set(reason.startsWith("HCS项目立项推送失败:") + ? reason.substring("HCS项目立项推送失败:".length()) : reason); } } @@ -185,6 +235,10 @@ public class HcsImmediatePushSupport { hcsContractSyncSupport.repushContract(id); } catch (Exception exception) { log.error("HCS合同即时推送失败(扫描任务将兜底补偿):id={},{}", id, exception.getMessage(), exception); + // 失败原因留在当前线程供审批 Controller 取走;异步路径无人取走,仅影响线程池自身 + String reason = exception.getMessage() == null ? "合规接口调用异常" : exception.getMessage(); + SYNC_FAILURE.set(reason.startsWith("HCS合同推送失败:") + ? reason.substring("HCS合同推送失败:".length()) : reason); } } From dea477eba29c8e9c3982449e0bb8ef5cb89158fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 20 Oct 2026 21:45:14 +0800 Subject: [PATCH 087/124] =?UTF-8?q?:feat:=20=E9=A1=B9=E7=9B=AE=E7=AB=8B?= =?UTF-8?q?=E9=A1=B9=E5=AE=A1=E6=89=B9=E9=80=9A=E8=BF=87=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=8E=A8=E9=80=81HCS=E5=B9=B6=E5=9B=9E=E4=BC=A0=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E5=8E=9F=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/controller/ProjectApplyController.java | 11 ++++++++++- .../service/impl/ProjectApplyServiceImpl.java | 5 +---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ProjectApplyController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ProjectApplyController.java index 29b3962c..83b96682 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ProjectApplyController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ProjectApplyController.java @@ -40,6 +40,7 @@ import org.springblade.transport.excel.ProjectApplyExcel; import org.springblade.transport.pojo.entity.ProjectApply; import org.springblade.transport.pojo.vo.ProjectApplyVO; import org.springblade.transport.service.IProjectApplyService; +import org.springblade.transport.support.hcs.HcsImmediatePushSupport; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -63,6 +64,7 @@ import java.util.Map; public class ProjectApplyController extends BladeController { private final IProjectApplyService projectApplyService; + private final HcsImmediatePushSupport hcsImmediatePushSupport; @GetMapping("/detail") @ApiOperationSupport(order = 1) @@ -119,7 +121,14 @@ public class ProjectApplyController extends BladeController { @ApiOperationSupport(order = 6) @Operation(summary = "审批通过", description = "传入id") public R approve(@Parameter(description = "主键", required = true) @RequestParam Long id) { - return R.status(projectApplyService.approve(id)); + projectApplyService.approve(id); + // 审批事务已提交,再同步推送合规;失败原因以警告文案返回(data=false 供前端区分提示样式),照正式结算单审批接口 + hcsImmediatePushSupport.pushProjectAndWait(id); + String syncFailure = HcsImmediatePushSupport.pollSyncFailure(); + if (syncFailure != null) { + return R.data(Boolean.FALSE, "审批通过,但合规推送失败:" + syncFailure); + } + return R.success("审批通过"); } @PostMapping("/reject") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java index 46f9b3fe..56815594 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java @@ -49,7 +49,6 @@ import org.springblade.transport.pojo.entity.TemporaryCreditLimit; import org.springblade.transport.pojo.vo.ProjectApplyVO; import org.springblade.transport.service.IProjectApplyService; import org.springblade.transport.support.TransportBusinessSupport; -import org.springblade.transport.support.hcs.HcsImmediatePushSupport; import org.springblade.transport.wrapper.ProjectApplyWrapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -96,7 +95,6 @@ public class ProjectApplyServiceImpl extends BaseServiceImpl selectProjectApplyPage(IPage page, ProjectApplyVO projectApply) { @@ -214,9 +212,8 @@ public class ProjectApplyServiceImpl extends BaseServiceImpl Date: Tue, 20 Oct 2026 21:45:37 +0800 Subject: [PATCH 088/124] =?UTF-8?q?:docs:=20=E6=9B=B4=E6=96=B0HCS=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E5=90=8C=E6=AD=A5=E6=8E=A8=E9=80=81=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-10-09-项目立项与合同HCS前端接入设计.md | 12 +++++++----- .../2026-10-12-合同特批与结算付款特批流程梳理.md | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md index 3747ff96..34e7d221 100644 --- a/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md +++ b/doc/docs/hcs合同/2026-10-09-项目立项与合同HCS前端接入设计.md @@ -263,14 +263,16 @@ export const applyContractSpec = data => 位置 `org.springblade.transport.support.hcs`,职责只有一个:**事务提交后异步触发一次单条推送**。 ```java -public void pushProjectAfterCommit(Long id) // 项目 C102 -public void pushContractAfterCommit(Long id) // 合同 C103 +public void pushProjectAfterCommit(Long id) // 项目 C102(MK 回调路径,异步) +public void pushContractAfterCommit(Long id) // 合同 C103(MK 回调路径,异步) +public void pushProjectAndWait(Long id) // 项目 C102(本地"通过"按钮,Controller 同步调用) +public void pushContractAndWait(Long id) // 合同 C103(本地"通过"按钮,Controller 同步调用) ``` 执行模型: 1. **afterCommit 触发**:审批方法在事务内调用本组件 → `TransactionSynchronizationManager.registerSynchronization` 注册 afterCommit 回调,审批事务回滚则不推送。MK 回调路径若未包事务(单条 updateById 自动提交)则直接提交异步,语义等价。 -2. **异步执行**:自建 2 线程 daemon 池(线程名 `hcs-immediate-push`,`@PreDestroy` 释放)。工程未启用 `@EnableAsync`,不为此新增全局配置;HCS 推送含风险校验+附件转传+起草可达 20s+,绝不能阻塞审批响应。 +2. **异步执行**:自建 2 线程 daemon 池(线程名 `hcs-immediate-push`,`@PreDestroy` 释放)。工程未启用 `@EnableAsync`,不为此新增全局配置;HCS 推送含风险校验+附件转传+起草可达 20s+,绝不能阻塞审批响应(例外:本地「通过」按钮走 `pushProjectAndWait/pushContractAndWait`,事务提交后同步执行,失败原因回传前端)。 3. **执行体**(与 HcsPushTask 同线程模型,无租户上下文,与定时扫描行为一致): - 开关:`thirdParty.hcs.push.immediate-enabled`(默认 false,灰度打开) - 短路:查库 `approvalStatus ∉ {approved, change_approved}` 或 `hcs_sync_status = synced` → 跳过(已被扫描/人工重推处理过) @@ -281,8 +283,8 @@ public void pushContractAfterCommit(Long id) // 合同 C103 | 入口 | 位置 | 触发调用 | |---|---|---| -| 本地审批 | `ProjectApplyServiceImpl.approve()`(事务内,含变更通过,现有置 unsynced 行之后) | `pushProjectAfterCommit(id)` | -| 本地审批 | `ContractManageServiceImpl.approve()`(事务内,含变更通过 + 履约行置 add,`updateById` 之后) | `pushContractAfterCommit(id)` | +| 本地审批 | `ProjectApplyController.approve()`(审批事务返回后同步推送) | `pushProjectAndWait(id)`,失败原因经 `pollSyncFailure()` 以 `data=false` 回传前端 | +| 本地审批 | `ContractManageController.approve()`(审批事务返回后同步推送) | `pushContractAndWait(id)`,失败原因同上 | | MK 回调 | `MkProcessBizHandlers.ProjectHandler.approveFromProcess()`(`updateById` 返回 true 后) | `pushProjectAfterCommit(id)` | | MK 回调 | `MkProcessBizHandlers.ContractHandler.approveFromProcess()`(同上) | `pushContractAfterCommit(id)` | diff --git a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md index 226669cb..333d1017 100644 --- a/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md +++ b/doc/docs/hcs合同/2026-10-12-合同特批与结算付款特批流程梳理.md @@ -71,13 +71,14 @@ need(存量遗留,2026-10-13 起不再产生;重推时自愈:报文带 ### 2.3 阶段 B:审批通过 → 推送(报文带特批标记)→ 挂起 -审批通过:`POST /contract-manage/approve` → `ContractManageServiceImpl#approve`:置 `hcsSyncStatus=unsynced`(推送零埋点 ADR-0001)→ `hcsImmediatePushSupport.pushContractAfterCommit(id)`。 +审批通过:`POST /contract-manage/approve` → `ContractManageServiceImpl#approve`:置 `hcsSyncStatus=unsynced`(推送零埋点 ADR-0001);审批事务提交返回后由 `ContractManageController#approve` 同步调用 `hcsImmediatePushSupport.pushContractAndWait(id)`,失败原因经 `pollSyncFailure()` 以警告文案(`data=false`)回传前端。 合同推送共 3 个入口,收敛到 `HcsContractSyncSupport#pushContract`: | 入口 | 位置 | 说明 | | --- | --- | --- | | 即时推送 | `HcsImmediatePushSupport#pushContractAfterCommit` | afterCommit 异步(2 线程 daemon 池),开关 `push.immediate-enabled` 默认 false;`pushContractNow` 对特批挂起中(processing)短路跳过 | +| 审批按钮同步推送 | `ContractManageController#approve` → `HcsImmediatePushSupport#pushContractAndWait` | 审批事务提交返回后同步推送(响应等待附件转传 + HCS 调用),失败原因经 `pollSyncFailure()` 拼入响应 `data=false` | | 定时扫描 | `HcsPushTask#pushHcsContract`(cron 默认 `0 1/5 * * * ?`) | `pushUnsyncedContracts`:`approvalStatus ∈ {approved, change_approved}` 且 `hcs_sync_status ∈ {unsynced, failed}` 且重试未超限;同轮附带特批结果查询兜底(见 §2.5) | | 手动重推 | `HcsSyncController POST /hcs/sync/contract/{id}` → `repushContract` | 特批审核中(processing)不可推 | From a38503b8fb2cbb4213dc63c66af1a99a92f1850b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 20 Oct 2026 21:48:53 +0800 Subject: [PATCH 089/124] =?UTF-8?q?:fix:=20=E9=A1=B9=E7=9B=AE=E7=AB=8B?= =?UTF-8?q?=E9=A1=B9=E6=8E=A8=E9=80=81=E6=88=90=E5=8A=9F=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=B1=95=E7=A4=BA=E9=A1=B9=E7=9B=AE=E7=BC=96?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/support/hcs/HcsProjectSyncSupport.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index 3d8f785e..edc1c366 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -107,12 +107,14 @@ public class HcsProjectSyncSupport { return "判重命中,回填已有合规项目ID"; } String fdId = addProject(projectApply); - markSynced(projectApply, fdId, "C102-1 项目立项新建成功"); - return "C102-1 项目立项新建成功"; + String addMessage = "项目立项新建成功:" + projectApply.getProjectCode(); + markSynced(projectApply, fdId, addMessage); + return addMessage; } updateProject(projectApply); - markSynced(projectApply, projectApply.getHcsFdId(), "C102-2 项目立项更新成功"); - return "C102-2 项目立项更新成功"; + String updateMessage = "项目立项更新成功:" + projectApply.getProjectCode(); + markSynced(projectApply, projectApply.getHcsFdId(), updateMessage); + return updateMessage; } /** From a5085a91d6c95539bdace67ae601ae1391759c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 20 Oct 2026 21:48:57 +0800 Subject: [PATCH 090/124] =?UTF-8?q?:fix:=20=E5=90=88=E5=90=8C=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E6=88=90=E5=8A=9F=E6=8F=90=E7=A4=BA=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E5=90=88=E5=90=8C=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/support/hcs/HcsContractSyncSupport.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index a402e801..588e493c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -245,13 +245,13 @@ public class HcsContractSyncSupport { } else { String fdContractId = draftContract(contractManage, attachmentRefs, risky); // 先持久化合规合同ID(调用方必须保存),履约规则同步失败时下轮凭其走更新补偿 - markSynced(contractManage, fdContractId, "C103-1 合同发起成功"); - resultMessage = "C103-1 合同发起成功"; + resultMessage = "合同发起成功:" + contractManage.getContractNo(); + markSynced(contractManage, fdContractId, resultMessage); } } else { updateContract(contractManage, risky); - markSynced(contractManage, contractManage.getHcsFdId(), "C103-11 合同更新成功"); - resultMessage = "C103-11 合同更新成功"; + resultMessage = "合同更新成功:" + contractManage.getContractNo(); + markSynced(contractManage, contractManage.getHcsFdId(), resultMessage); } // ⑤ 履约规则 C103-9 行级同步(随合同链路,§5.3;仅依赖 hcs_fd_id 与特批无关,先于特批挂起执行—— // 失败抛出落 failed 时特批未挂起,修复后可直接重推补偿,不被特批门禁阻塞) From 1ba114e859097737f06e21d161c510cdaece2100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 20 Oct 2026 21:49:01 +0800 Subject: [PATCH 091/124] =?UTF-8?q?:fix:=20=E5=B1=A5=E7=BA=A6=E8=A7=84?= =?UTF-8?q?=E5=88=99=E5=90=8C=E6=AD=A5=E6=8F=90=E7=A4=BA=E5=8E=BB=E9=99=A4?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=BC=96=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ContractExeStageServiceImpl.java | 8 ++++---- .../transport/support/hcs/HcsExeStageSyncSupport.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java index 0589d8b8..06d49d3f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java @@ -84,7 +84,7 @@ public class ContractExeStageServiceImpl extends BaseServiceImpl Date: Wed, 21 Oct 2026 15:48:41 +0800 Subject: [PATCH 092/124] =?UTF-8?q?:fix:=20=E5=90=88=E5=90=8C=E7=89=B9?= =?UTF-8?q?=E6=89=B9=E9=99=84=E4=BB=B6=E5=BD=92=E5=8F=A3=E4=BD=90=E8=AF=81?= =?UTF-8?q?=E6=9D=90=E6=96=99=E5=8C=BA=E6=A0=A1=E9=AA=8C=E5=B9=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=89=B9=E6=89=B9=E9=99=84=E4=BB=B6=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ContractManageServiceImpl.java | 28 ++++++++++---- ...contract_spec_attachment_dict_20261017.sql | 37 +++++++++++++++++++ 2 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 doc/sql/transport/blade_contract_spec_attachment_dict_20261017.sql diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java index 5e8f3900..754e7d93 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java @@ -161,7 +161,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl HcsSyncConstant.ATTACHMENT_TYPE_SPEC_EXPLANATION .equals(Objects.toString(attachment.get(HcsSyncConstant.ATTACHMENT_TYPE_FIELD), null))); - if (!hasSpecExplanation) { - throw new ServiceException("合同相对方存在高风险/黑名单客商,必须上传「特批说明」类型附件后再提交审批"); - } } /** diff --git a/doc/sql/transport/blade_contract_spec_attachment_dict_20261017.sql b/doc/sql/transport/blade_contract_spec_attachment_dict_20261017.sql new file mode 100644 index 00000000..bdb0a1ca --- /dev/null +++ b/doc/sql/transport/blade_contract_spec_attachment_dict_20261017.sql @@ -0,0 +1,37 @@ +-- 特批附件归口「附件(佐证材料等)」区上传(产品口径 2026-10-17)。 +-- ① 下架用印材料字典 contract_attachment_type 中的特批附件(隐藏,逻辑删除,幂等); +-- ② 新建佐证材料附件类型字典 contract_supporting_attachment_type:特批附件/其他文件。 +-- 佐证材料区此前取不到字典时前端走兜底选项,落库后各环境与前端兜底保持一致。 + +-- ① 用印材料字典下架特批附件 +UPDATE blade_dict_biz +SET is_deleted = 1 +WHERE code = 'contract_attachment_type' AND dict_key = '特批附件' AND tenant_id = '000000' AND is_deleted = 0; + +-- ② 佐证材料附件类型字典父项 +INSERT INTO blade_dict_biz (id, tenant_id, parent_id, code, dict_key, dict_value, sort, remark, is_sealed, status, is_deleted) +SELECT 2099700000000000001, '000000', 0, 'contract_supporting_attachment_type', '-1', '佐证材料附件类型', 1, NULL, 0, 1, 0 +WHERE NOT EXISTS ( + SELECT 1 FROM blade_dict_biz + WHERE code = 'contract_supporting_attachment_type' AND dict_key = '-1' AND tenant_id = '000000' AND is_deleted = 0 +); + +-- ③ 子项:特批附件(高风险/黑名单客商合同必传,fileType=特批附件) +INSERT INTO blade_dict_biz (id, tenant_id, parent_id, code, dict_key, dict_value, sort, remark, is_sealed, status, is_deleted) +SELECT 2099700000000000002, '000000', + (SELECT id FROM blade_dict_biz WHERE code = 'contract_supporting_attachment_type' AND dict_key = '-1' AND tenant_id = '000000' AND is_deleted = 0 LIMIT 1), + 'contract_supporting_attachment_type', '特批附件', '特批附件', 1, NULL, 0, 1, 0 +WHERE NOT EXISTS ( + SELECT 1 FROM blade_dict_biz + WHERE code = 'contract_supporting_attachment_type' AND dict_key = '特批附件' AND tenant_id = '000000' AND is_deleted = 0 +); + +-- ④ 子项:其他文件(佐证材料历史唯一类型) +INSERT INTO blade_dict_biz (id, tenant_id, parent_id, code, dict_key, dict_value, sort, remark, is_sealed, status, is_deleted) +SELECT 2099700000000000003, '000000', + (SELECT id FROM blade_dict_biz WHERE code = 'contract_supporting_attachment_type' AND dict_key = '-1' AND tenant_id = '000000' AND is_deleted = 0 LIMIT 1), + 'contract_supporting_attachment_type', '其他文件', '其他文件', 2, NULL, 0, 1, 0 +WHERE NOT EXISTS ( + SELECT 1 FROM blade_dict_biz + WHERE code = 'contract_supporting_attachment_type' AND dict_key = '其他文件' AND tenant_id = '000000' AND is_deleted = 0 +); From 26c9a32c6bcbf5c1dde10fcc348873516feb9d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Wed, 21 Oct 2026 17:37:48 +0800 Subject: [PATCH 093/124] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AE=A2?= =?UTF-8?q?=E5=95=86=E9=A3=8E=E9=99=A9=E6=89=B9=E9=87=8F=E4=B8=8E=E6=8C=89?= =?UTF-8?q?=E5=90=8D=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=8F=8A=E9=A3=8E?= =?UTF-8?q?=E9=99=A9=E7=AD=89=E7=BA=A7=E8=BD=AC=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit C101-1 展示链路:/hcs/risk/batch 批量查询(单失败跳过)、/hcs/risk/by-name 按名称查询(反查编号不阻断);CustomerRiskVO 回填 customerCode 并新增 riskLevelName 服务端转义(黑名单优先,0=低/1=中/2=高风险) --- .../transport/pojo/vo/CustomerRiskVO.java | 6 +++ .../controller/HcsSyncController.java | 11 +++++ .../support/hcs/HcsCreditCheckSupport.java | 42 +++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java index 1b523f3a..da93615f 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java @@ -45,6 +45,9 @@ public class CustomerRiskVO implements Serializable { @Serial private static final long serialVersionUID = 1L; + @Schema(description = "客商编号") + private String customerCode; + @Schema(description = "客商类型:internal内部组织(默认无风险)/external外部客商") private String customerKind; @@ -57,6 +60,9 @@ public class CustomerRiskVO implements Serializable { @Schema(description = "风险等级:0=低风险,1=中风险,2=高风险") private String fdRiskLevel; + @Schema(description = "风险等级名称(服务端转义:黑名单/高风险/中风险/低风险,黑名单优先;无等级为空)") + private String riskLevelName; + @Schema(description = "是否高风险/黑名单客商(外部客商专用,内部组织恒为 false)") private Boolean risky; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 9b70b716..993d414d 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -235,6 +235,17 @@ public class HcsSyncController { return R.data(hcsCreditCheckSupport.queryCustomerRiskBatch(Func.toStrList(customerCodes))); } + /** + * 客商风险按名称查询(C101-1,客商档案表单展示用,前端接入设计 §3.3): + * 按名称反查客商编号后口径同 /risk;反查不到客商编号不阻断(risky=false,§9-U6) + */ + @GetMapping("/risk/by-name") + @ApiOperationSupport(order = 14) + @Operation(summary = "客商风险按名称查询", description = "C101-1 按客商名称查询风险(展示用),名称反查编号后口径同编号查询,反查不到默认无风险") + public R riskByName(@Parameter(description = "客商名称", required = true) @RequestParam String customerName) { + return R.data(hcsCreditCheckSupport.queryCustomerRiskByName(customerName)); + } + /** * 附件上传到合同系统(C103-2 代理,前端接入设计 §3.2),返回合规附件ID */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java index 1331708b..8d2d8288 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java @@ -30,6 +30,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.jackson.JsonUtil; +import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsCreditCheckDTO; @@ -52,6 +53,7 @@ import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -207,6 +209,7 @@ public class HcsCreditCheckSupport { .eq(CustomerArchive::getIsDeleted, 0) .last("limit 1")); CustomerRiskVO riskVO = new CustomerRiskVO(); + riskVO.setCustomerCode(customerCode); riskVO.setCustomerName(customerArchive == null ? customerCode : customerArchive.getFullName()); // 内部组织类型客商默认无风险;档案不存在按外部客商查询(不静默放行) boolean internal = customerArchive != null && HcsSyncConstant.CUSTOMER_KIND_INTERNAL.equals(customerArchive.getCustomerKind()); @@ -230,6 +233,7 @@ public class HcsCreditCheckSupport { boolean risky = HcsSyncConstant.RISK_LEVEL_HIGH.equals(riskLevel) || BLACK_STATUS_YES.equalsIgnoreCase(blackStatus); riskVO.setFdBlackStatus(blackStatus); riskVO.setFdRiskLevel(riskLevel); + riskVO.setRiskLevelName(riskLevelName(blackStatus, riskLevel)); riskVO.setRisky(risky); if (risky) { riskVO.setRiskTip("【" + riskVO.getCustomerName() + "】:被列入外部黑名单;涉贪污受贿裁判相关提及方(3年以上及其他);被执行人信息;买卖合同纠纷;劳动纠纷;重大纠纷"); @@ -267,6 +271,44 @@ public class HcsCreditCheckSupport { return queryCustomerRisk(customerCode); } + /** + * 风险等级转义(C101-1 枚举 0=低风险/1=中风险/2=高风险):黑名单状态优先展示,无等级返回空 + */ + private String riskLevelName(String blackStatus, String riskLevel) { + if (BLACK_STATUS_YES.equalsIgnoreCase(blackStatus)) { + return "黑名单"; + } + return switch (Objects.toString(riskLevel, "")) { + case "2" -> "高风险"; + case "1" -> "中风险"; + case "0" -> "低风险"; + default -> null; + }; + } + + /** + * 客商风险批量查询(C101-1,客商列表页展示用,前端接入设计 §3.3): + * 逐个复用 {@link #queryCustomerRisk}(内部客商默认无风险,外部客商查 C101-1,与付款页面展示口径一致); + * C101-1 仅支持单编号查询,逐个串行调用;展示场景单个失败跳过不阻断整页(强制校验仍在合同/付款链路) + * + * @param customerCodes 客商编号集合 + * @return 风险展示信息列表(查询失败的客商不在结果中) + */ + public List queryCustomerRiskBatch(List customerCodes) { + List riskList = new ArrayList<>(); + if (Func.isEmpty(customerCodes)) { + return riskList; + } + for (String customerCode : customerCodes) { + try { + riskList.add(this.queryCustomerRisk(customerCode)); + } catch (Exception exception) { + log.error("客商风险批量查询单个失败,跳过:customerCode={}", customerCode, exception); + } + } + return riskList; + } + /** * 按名称反查客商档案(内部/外部类型判断与客商编码获取共用;查不到返回 null) */ From 0a1324f90d117245b808bb58d26040b97cd5d5a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Wed, 21 Oct 2026 18:56:37 +0800 Subject: [PATCH 094/124] =?UTF-8?q?:fix:=20HCS=E5=90=88=E5=90=8C=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E7=9B=B8=E5=AF=B9=E6=96=B9=E5=8D=95=E4=BD=8D=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E6=8C=89=E5=AE=A2=E5=95=86=E6=A1=A3=E6=A1=88=E5=86=85?= =?UTF-8?q?=E9=83=A8=E7=BB=84=E7=BB=87=E4=BC=98=E5=85=88=E5=88=A4=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsContractSyncSupport.java | 65 +++++++++++++++---- .../springblade/hcs/constant/HcsConstant.java | 4 ++ .../org/springblade/hcs/dto/HcsSignerDTO.java | 2 +- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 588e493c..4766bbd5 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -524,29 +524,56 @@ public class HcsContractSyncSupport { } /** - * signer 相对方(签署方):甲/乙双方,甲方 fdType=inner(内部主体),乙方 fdType=supplier(外部相对方) + * signer 相对方(签署方):甲/乙双方。fdType 档案优先:客商档案为内部组织(customerKind=internal/内部组织) + * 的一方为我方签约主体传 inner,另一方传 customer(外部相对方,2026-10-14 联调口径); + * 双方均非内部组织或查不到档案时按合同类别推定(承运商合同甲=inner,客户合同乙=inner,其余 customer); + * 丙方(三方合同)TMS 无签约主体字段来源,暂不支持 */ private List buildSigners(ContractManage contractManage) { List signers = new ArrayList<>(); - // 甲方相对方:fdStanding=甲,内部主体 fdType=inner(编号按名称反查,反查不到留空,§9-U6) - signers.add(signer("甲", HcsConstant.SIGNER_FD_TYPE_INNER, contractManage.getPartyA())); - // 乙方相对方:fdStanding=乙,外部相对方 fdType=supplier - signers.add(signer("乙", HcsConstant.SIGNER_FD_TYPE_SUPPLIER, contractManage.getPartyB())); + // 甲乙方各反查一次客商档案,编号与内部组织判定共用查询结果 + CustomerArchive partyAArchive = queryCustomerArchive(contractManage.getPartyA()); + CustomerArchive partyBArchive = queryCustomerArchive(contractManage.getPartyB()); + boolean partyAInternal = isInternalCustomer(partyAArchive); + boolean partyBInternal = isInternalCustomer(partyBArchive); + String partyAType; + String partyBType; + if (partyAInternal || partyBInternal) { + // 档案命中:内部组织一方=我方签约主体(inner),外部一方统一 customer + partyAType = partyAInternal ? HcsConstant.SIGNER_FD_TYPE_INNER : HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + partyBType = partyBInternal ? HcsConstant.SIGNER_FD_TYPE_INNER : HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + } else if ("承运商合同".equals(contractManage.getContractCategory())) { + // 兜底:档案未命中内部组织,按类别推定——我方为付款/发包方,签约主体在甲方 + partyAType = HcsConstant.SIGNER_FD_TYPE_INNER; + partyBType = HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + } else if ("客户合同".equals(contractManage.getContractCategory())) { + // 兜底:我方为收款/承运方,签约主体在乙方 + partyAType = HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + partyBType = HcsConstant.SIGNER_FD_TYPE_INNER; + } else { + // 兜底:其他类别双方统一 customer(2026-10-14 联调口径) + partyAType = HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + partyBType = HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + } + // 甲方相对方:fdStanding=甲(编号按名称反查,反查不到留空,§9-U6) + signers.add(signer("甲", partyAType, contractManage.getPartyA(), partyAArchive)); + // 乙方相对方:fdStanding=乙 + signers.add(signer("乙", partyBType, contractManage.getPartyB(), partyBArchive)); return signers; } /** - * 单个相对方:甲方传 fdType=inner(内部主体),乙方传 fdType=supplier(外部相对方) + * 单个相对方:fdType 由签约主体落位规则决定(我方主体 inner,外部相对方 customer) */ - private HcsSignerDTO signer(String fdStanding, String fdType, String partyName) { + private HcsSignerDTO signer(String fdStanding, String fdType, String partyName, CustomerArchive customerArchive) { HcsSignerDTO signer = new HcsSignerDTO(); // 签署地位:甲 / 乙 signer.setFdStanding(fdStanding); // 相对方名称:TMS 甲乙方名称 signer.setFdName(partyName); // 相对方编号:按名称反查 CustomerArchive 客商编码,反查不到留空(§9-U6) - signer.setFdNumber(queryCustomerCode(partyName)); - // 单位类型:甲方 inner 内部主体 / 乙方 supplier 外部相对方 + signer.setFdNumber(customerArchive == null ? null : customerArchive.getCustomerCode()); + // 单位类型:inner 内部主体(我方签约主体)/ customer 外部相对方 signer.setFdType(fdType); return signer; } @@ -649,14 +676,30 @@ public class HcsContractSyncSupport { * 按名称反查客商编码(照 KingdeeApBillSyncSupport#queryCustomerCode 惯例,查不到返回 null) */ private String queryCustomerCode(String partyName) { + CustomerArchive customerArchive = queryCustomerArchive(partyName); + return customerArchive == null ? null : customerArchive.getCustomerCode(); + } + + /** + * 按名称反查客商档案(全称或简称精确匹配,查不到返回 null) + */ + private CustomerArchive queryCustomerArchive(String partyName) { if (StringUtil.isBlank(partyName)) { return null; } - CustomerArchive customerArchive = customerArchiveMapper.selectOne(Wrappers.lambdaQuery() + return customerArchiveMapper.selectOne(Wrappers.lambdaQuery() .and(wrapper -> wrapper.eq(CustomerArchive::getFullName, partyName).or().eq(CustomerArchive::getShortName, partyName)) .eq(CustomerArchive::getIsDeleted, 0) .last("limit 1")); - return customerArchive == null ? null : customerArchive.getCustomerCode(); + } + + /** + * 内部组织客商判定(集团内我方签约主体,档案登记 customerKind=internal/内部组织) + */ + private boolean isInternalCustomer(CustomerArchive customerArchive) { + return customerArchive != null + && (HcsSyncConstant.CUSTOMER_KIND_INTERNAL.equals(customerArchive.getCustomerKind()) + || "内部组织".equals(customerArchive.getCustomerKind())); } /** diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java index a6fa8bbd..83ca8ddb 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java @@ -56,4 +56,8 @@ public class HcsConstant { * signer 相对方单位类型:乙方=supplier(外部相对方) */ public static final String SIGNER_FD_TYPE_SUPPLIER = "supplier"; + /** + * signer 相对方单位类型:客户=customer + */ + public static final String SIGNER_FD_TYPE_CUSTOMER = "customer"; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java index db087154..6f5df361 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java @@ -54,7 +54,7 @@ public class HcsSignerDTO implements Serializable { */ private String fdNumber; /** - * 单位类型:甲方=inner(内部主体),乙方=supplier(外部相对方) + * 单位类型:我方签约主体=inner(内部主体,客商档案内部组织),外部相对方=customer */ private String fdType; /** From 2b581b730547656ea2250fccee5acdda180f7e1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 11:35:21 +0800 Subject: [PATCH 095/124] =?UTF-8?q?:fix:=20=E7=BB=9F=E4=B8=80=E5=86=85?= =?UTF-8?q?=E9=83=A8=E7=BB=84=E7=BB=87=E5=AE=A2=E5=95=86=E5=88=A4=E5=AE=9A?= =?UTF-8?q?=E5=8F=A3=E5=BE=84=E3=80=81=E7=B2=BE=E7=AE=80=E9=AB=98=E9=A3=8E?= =?UTF-8?q?=E9=99=A9=E6=8F=90=E7=A4=BA=E6=96=87=E6=A1=88=E5=B9=B6=E7=A7=BB?= =?UTF-8?q?=E9=99=A4mock=E6=8E=A7=E5=88=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HcsMockController.java | 123 ------------------ .../support/hcs/HcsContractSyncSupport.java | 38 ++---- .../support/hcs/HcsCreditCheckSupport.java | 21 ++- 3 files changed, 32 insertions(+), 150 deletions(-) delete mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsMockController.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsMockController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsMockController.java deleted file mode 100644 index 247f0e87..00000000 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsMockController.java +++ /dev/null @@ -1,123 +0,0 @@ -/** - * BladeX Commercial License Agreement - * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. - *

    - * Use of this software is governed by the Commercial License Agreement - * obtained after purchasing a license from BladeX. - *

    - * 1. This software is for development use only under a valid license - * from BladeX. - *

    - * 2. Redistribution of this software's source code to any third party - * without a commercial license is strictly prohibited. - *

    - * 3. Licensees may copyright their own code but cannot use segments - * from this software for such purposes. Copyright of this software - * remains with BladeX. - *

    - * Using this software signifies agreement to this License, and the software - * must not be used for illegal purposes. - *

    - * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is - * not liable for any claims arising from secondary or illegal development. - *

    - * Author: Chill Zhuang (bladejava@qq.com) - */ -package org.springblade.transport.controller; - -import cn.hutool.core.util.StrUtil; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.springblade.core.log.exception.ServiceException; -import org.springblade.core.tenant.annotation.TenantIgnore; -import org.springblade.core.tool.api.R; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; -import java.util.Objects; - -/** - * HCS 合规回调 Mock 端点 - *

    - * 合同法务审批结果回调(D103)、付款法务审批结果回调(D104)、项目金蝶同步结果回调(D902)、 - * 合同金蝶同步结果回传接收(D903)四个入站回调的纯 mock 实现:仅校验来源系统标识后返回固定结果, - * 不读写业务数据、不联动状态。真实处理逻辑保留在对应 Support 中,联调时把端点切回 - * {@link } 并调用 Support 方法即可。 - * - * @author Chill - */ -@Slf4j -@RestController -@TenantIgnore -@RequestMapping("hcs") -@Tag(name = "HCS合规回调Mock", description = "HCS合规回调Mock端点(仅自测,返回固定 mock 数据)") -public class HcsMockController { - - /** - * 来源系统标识(合规方约定值,与 third-party.hcs.src-system 默认值一致) - */ - private static final String SOURCE_SYSTEM = "WLTMS"; - - /** - * 合同法务审批结果回调(D103) - */ - @PostMapping("/contractLegal/result") - @ApiOperationSupport(order = 15) - @Operation(summary = "合同法务审批结果回调Mock", description = "D103 合规推送合同特批(金蝶同步)结果,仅校验来源系统并返回 mock 数据") - public R contractLegalResult(@RequestBody(required = false) Map param) { - this.checkSourceSystem("合同法务审批结果", param); - return R.data("mock特批结果已处理:approved"); - } - - /** - * 付款法务审批结果回调(D104) - */ - @PostMapping("/paymentLegal/result") - @ApiOperationSupport(order = 16) - @Operation(summary = "付款法务审批结果回调Mock", description = "D104 合规推送付款特批结果,仅校验来源系统并返回 mock 数据") - public R paymentLegalResult(@RequestBody(required = false) Map param) { - this.checkSourceSystem("付款法务审批结果", param); - return R.data("mock付款特批结果接收已处理:approved"); - } - - /** - * 项目金蝶同步结果回调(D902) - */ - @PostMapping("/projectLegal/result") - @ApiOperationSupport(order = 18) - @Operation(summary = "项目金蝶同步结果回调Mock", description = "D902 合规推送项目金蝶同步结果,仅校验来源系统并返回 mock 数据") - public R projectLegalResult(@RequestBody(required = false) Map param) { - this.checkSourceSystem("项目金蝶同步结果", param); - return R.data("mock项目金蝶同步结果接收已处理:approved"); - } - - /** - * 合同金蝶同步结果回传接收(D903) - */ - @PostMapping("/contractKingdee/result") - @ApiOperationSupport(order = 19) - @Operation(summary = "合同金蝶同步结果回传接收Mock", description = "D903 合规推送合同金蝶最终同步结果,仅校验来源系统并返回 mock 数据") - public R contractKingdeeResult(@RequestBody(required = false) Map param) { - this.checkSourceSystem("合同金蝶同步结果", param); - return R.data("mock合同金蝶同步结果接收处理:approved"); - } - - /** - * 来源系统校验:仅接受合规方约定的来源标识,防伪造回传 - * - * @param bizName 业务名称(日志用) - * @param param 回调报文 - */ - private void checkSourceSystem(String bizName, Map param) { - String sourceSystem = param == null ? null : Objects.toString(param.get("sourceSystem"), null); - if (!StrUtil.equalsIgnoreCase(sourceSystem, SOURCE_SYSTEM)) { - log.warn("{}推送来源系统标识错误:sourceSystem={}", bizName, sourceSystem); - throw new ServiceException("来源系统标识错误"); - } - } -} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 4766bbd5..e8634615 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -337,22 +337,29 @@ public class HcsContractSyncSupport { } /** - * 查询单方客商风险:按名称反查客商编号(§9-U6 编码体系联调确认),反查不到记 skip 留痕不阻断 + * 查询单方客商风险:按名称反查客商档案(§9-U6 编码体系联调确认),反查不到记 skip 留痕不阻断; + * 内部组织客商默认无风险跳过(与展示/提交/付款链路口径一致,不调 C101-1) */ private RiskResult queryRisk(ContractManage contractManage, String standing, String partyName) { - String customerCode = queryCustomerCode(partyName); - if (StringUtil.isBlank(customerCode)) { + CustomerArchive customerArchive = queryCustomerArchive(partyName); + if (customerArchive == null) { writeCheckLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, standing + "方[" + partyName + "]反查不到客商编号,跳过风险校验(§9-U6)", null); return new RiskResult(null, null, false); } + // 内部组织类型客商默认无风险,不调 C101-1(与展示/提交/付款链路口径一致) + if (HcsCreditCheckSupport.isInternalCustomer(customerArchive)) { + writeCheckLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, + standing + "方[" + partyName + "]为内部组织客商,默认无风险跳过校验", null); + return new RiskResult(null, null, false); + } HcsRiskQueryDTO param = new HcsRiskQueryDTO(); // 【必填】客商编号:按甲乙方名称反查 CustomerArchive 客商编码(§9-U6) - param.setFdNumber(customerCode); + param.setFdNumber(customerArchive.getCustomerCode()); HcsResult result = hcsClient.getRelativeRisk(param); if (result == null || !result.isSuccess()) { log.error("HCS客商风险查询失败响应:{},contractNo={},standing={},fdNumber={}", - result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo(), standing, customerCode); + result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo(), standing, customerArchive.getCustomerCode()); throw new HcsException("C101-1 客商风险查询失败:" + (result == null ? "响应为空" : result.getMsg())); } HcsRiskVO risk = result.getData(); @@ -534,8 +541,8 @@ public class HcsContractSyncSupport { // 甲乙方各反查一次客商档案,编号与内部组织判定共用查询结果 CustomerArchive partyAArchive = queryCustomerArchive(contractManage.getPartyA()); CustomerArchive partyBArchive = queryCustomerArchive(contractManage.getPartyB()); - boolean partyAInternal = isInternalCustomer(partyAArchive); - boolean partyBInternal = isInternalCustomer(partyBArchive); + boolean partyAInternal = HcsCreditCheckSupport.isInternalCustomer(partyAArchive); + boolean partyBInternal = HcsCreditCheckSupport.isInternalCustomer(partyBArchive); String partyAType; String partyBType; if (partyAInternal || partyBInternal) { @@ -672,14 +679,6 @@ public class HcsContractSyncSupport { return templateId; } - /** - * 按名称反查客商编码(照 KingdeeApBillSyncSupport#queryCustomerCode 惯例,查不到返回 null) - */ - private String queryCustomerCode(String partyName) { - CustomerArchive customerArchive = queryCustomerArchive(partyName); - return customerArchive == null ? null : customerArchive.getCustomerCode(); - } - /** * 按名称反查客商档案(全称或简称精确匹配,查不到返回 null) */ @@ -693,15 +692,6 @@ public class HcsContractSyncSupport { .last("limit 1")); } - /** - * 内部组织客商判定(集团内我方签约主体,档案登记 customerKind=internal/内部组织) - */ - private boolean isInternalCustomer(CustomerArchive customerArchive) { - return customerArchive != null - && (HcsSyncConstant.CUSTOMER_KIND_INTERNAL.equals(customerArchive.getCustomerKind()) - || "内部组织".equals(customerArchive.getCustomerKind())); - } - /** * 关联项目取值:合同所选项目对应合同系统项目ID(blade_project_apply.hcs_fd_id,C102-1 立项同步回填), * 未选择项目、立项单不存在或未同步合规时返回 null 不传(fdProject 选填) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java index 8d2d8288..2b158e4e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java @@ -118,7 +118,7 @@ public class HcsCreditCheckSupport { return; } // 内部组织类型客商默认无风险,不查 C101-1(与 queryCustomerRisk 展示口径一致) - if (HcsSyncConstant.CUSTOMER_KIND_INTERNAL.equals(customerArchive.getCustomerKind())) { + if (isInternalCustomer(customerArchive)) { writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_RISK, HcsSyncConstant.CHECK_RESULT_SKIP, "收款方[" + payment.getPayeeName() + "]为内部组织客商,默认无风险跳过校验", null); return; @@ -212,7 +212,7 @@ public class HcsCreditCheckSupport { riskVO.setCustomerCode(customerCode); riskVO.setCustomerName(customerArchive == null ? customerCode : customerArchive.getFullName()); // 内部组织类型客商默认无风险;档案不存在按外部客商查询(不静默放行) - boolean internal = customerArchive != null && HcsSyncConstant.CUSTOMER_KIND_INTERNAL.equals(customerArchive.getCustomerKind()); + boolean internal = isInternalCustomer(customerArchive); riskVO.setCustomerKind(internal ? HcsSyncConstant.CUSTOMER_KIND_INTERNAL : "external"); if (internal) { riskVO.setRisky(Boolean.FALSE); @@ -236,7 +236,9 @@ public class HcsCreditCheckSupport { riskVO.setRiskLevelName(riskLevelName(blackStatus, riskLevel)); riskVO.setRisky(risky); if (risky) { - riskVO.setRiskTip("【" + riskVO.getCustomerName() + "】:被列入外部黑名单;涉贪污受贿裁判相关提及方(3年以上及其他);被执行人信息;买卖合同纠纷;劳动纠纷;重大纠纷"); + // 风险提示固定短文案(C101-1 未返回风险项明细,不拼接枚举清单):黑名单与高风险区分表述 + riskVO.setRiskTip("【" + riskVO.getCustomerName() + "】:" + + (BLACK_STATUS_YES.equalsIgnoreCase(blackStatus) ? "被列入外部黑名单" : "为高风险客商")); } try { HcsContractCheckLog checkLog = new HcsContractCheckLog(); @@ -271,6 +273,19 @@ public class HcsCreditCheckSupport { return queryCustomerRisk(customerCode); } + /** + * 内部组织客商判定(集团内我方签约主体,档案登记 customerKind=internal/内部组织); + * 展示、提交校验、付款校验、合同推送、signer 单位类型各链路统一复用本判定 + * + * @param customerArchive 客商档案 + * @return 是否内部组织客商 + */ + public static boolean isInternalCustomer(CustomerArchive customerArchive) { + return customerArchive != null + && (HcsSyncConstant.CUSTOMER_KIND_INTERNAL.equals(customerArchive.getCustomerKind()) + || "内部组织".equals(customerArchive.getCustomerKind())); + } + /** * 风险等级转义(C101-1 枚举 0=低风险/1=中风险/2=高风险):黑名单状态优先展示,无等级返回空 */ From 5b9a55d1b7cc88680baea7be1068ba3c89990061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 14:02:20 +0800 Subject: [PATCH 096/124] =?UTF-8?q?fix:=20=E4=BB=98=E6=AC=BE=E7=89=B9?= =?UTF-8?q?=E6=89=B9=E6=9C=AA=E5=AE=8C=E6=88=90=E6=97=B6=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E9=87=91=E8=9D=B6=E5=90=8C=E6=AD=A5=EF=BC=8C=E7=89=B9=E6=89=B9?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E5=90=8E=E8=87=AA=E5=8A=A8=E8=A1=A5=E6=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/KingdeeApprovalSyncListener.java | 11 +++++++++++ .../support/hcs/HcsPaymentSyncSupport.java | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java index 185a0c56..50a9ebd0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java @@ -22,7 +22,9 @@ package org.springblade.transport.listener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.transport.config.BfiProperties; +import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.event.KingdeeBillApprovedEvent; +import org.springblade.transport.pojo.entity.PaymentApplication; import org.springblade.transport.service.IFormalSettlementService; import org.springblade.transport.service.IInvoiceApplicationService; import org.springblade.transport.service.IInvoiceReceiptService; @@ -115,6 +117,15 @@ public class KingdeeApprovalSyncListener { if (!bfiProperties.getAutoSync().isPayment()) { return; } + // 付款特批未完成(高风险/黑名单/额度超额)时金蝶必然拒推:跳过而非置失败, + // 特批通过后由 HcsPaymentSyncSupport 重新发布本事件自动补推 + PaymentApplication payment = paymentApplicationService.getById(id); + if (payment != null && payment.getHcsSpecStatus() != null + && List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PUSHING, + HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(payment.getHcsSpecStatus())) { + log.info("付款申请[{}]审批通过自动同步金蝶跳过(付款特批未完成):hcsSpecStatus={}", id, payment.getHcsSpecStatus()); + return; + } log.info("付款申请[{}]审批通过自动同步金蝶开始", id); String kingdeeBillId = paymentApplicationService.syncKingdee(id); log.info("付款申请[{}]审批通过自动同步金蝶完成:kingdeeBillId={}", id, kingdeeBillId); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java index ccab31e5..bc1008f0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java @@ -34,8 +34,10 @@ import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.constant.TransportBusiConstant; +import org.springblade.transport.event.KingdeeBillApprovedEvent; import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.pojo.entity.PaymentApplication; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -66,6 +68,7 @@ public class HcsPaymentSyncSupport { private final HcsProperties hcsProperties; private final HcsSpecPaySyncSupport hcsSpecPaySyncSupport; private final HcsPerfRecordSyncSupport hcsPerfRecordSyncSupport; + private final ApplicationEventPublisher eventPublisher; /** * 推送付款申请到 HCS:特批(如需)→ 履约记录(新建/更新)→ 回填整体同步状态 @@ -140,6 +143,7 @@ public class HcsPaymentSyncSupport { syncPaymentOnSpecResult(payment, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(result)); payment.setHcsSpecStatus(result); paymentApplicationMapper.updateById(payment); + publishKingdeeAutoSyncOnSpecApproved(payment, result); log.info("HCS特批结果人工确认:paymentNo={},specFdId={},结果={}", payment.getPaymentNo(), payment.getHcsSpecFdId(), result); return "特批结果已确认:" + result; } @@ -179,10 +183,22 @@ public class HcsPaymentSyncSupport { syncPaymentOnSpecResult(payment, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(status)); payment.setHcsSpecStatus(status); paymentApplicationMapper.updateById(payment); + publishKingdeeAutoSyncOnSpecApproved(payment, status); log.info("付款特批结果推送处理完成:paymentNo={},结果={},reason={}", payment.getPaymentNo(), status, param.getReason()); return "特批结果已处理:" + status; } + /** + * 特批通过后自动补推金蝶:审批通过时因特批挂起已跳过同步(见 KingdeeApprovalSyncListener), + * 此处重新发布审批通过事件复用同一条自动推送链(开关、失败落库与重推兜底口径不变) + */ + private void publishKingdeeAutoSyncOnSpecApproved(PaymentApplication payment, String specStatus) { + if (!HcsSyncConstant.SPEC_STATUS_APPROVED.equals(specStatus)) { + return; + } + eventPublisher.publishEvent(new KingdeeBillApprovedEvent(KingdeeBillApprovedEvent.BIZ_PAYMENT_APPLICATION, payment.getId())); + } + /** * 特批结果联动付款审批状态(handleLegalResult 与 confirmSpecResult 共用,仅改字段,随 updateById 落库): * approved 恢复"审批通过"展示并放行(审批状态保持 approved,金蝶推送门禁解除); From f3d899dcb8c3d03e1d84d28fdc0d36cc9233b095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 14:42:01 +0800 Subject: [PATCH 097/124] =?UTF-8?q?feat:=20=E5=AE=A1=E6=89=B9=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E6=8F=90=E7=A4=BA=E6=8B=BC=E6=8E=A5=E9=87=91=E8=9D=B6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=90=8C=E6=AD=A5=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FormalSettlementController.java | 6 ++++- .../InvoiceApplicationController.java | 6 ++++- .../controller/InvoiceReceiptController.java | 6 ++++- .../PaymentApplicationController.java | 6 ++++- .../SettlementAdjustmentController.java | 4 +++ .../listener/KingdeeApprovalSyncListener.java | 26 +++++++++++++++++++ 6 files changed, 50 insertions(+), 4 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java index 01a53d18..82477ac2 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java @@ -202,12 +202,16 @@ public class FormalSettlementController extends BladeController { return approveResponse(); } - /** 审批接口统一响应:审批已生效,自动推送失败原因以警告文案返回(data=false 供前端区分提示样式) */ + /** 审批接口统一响应:审批已生效,自动推送结果(成功单据号/失败原因)一并返回;失败用 data=false 供前端区分提示样式 */ private R approveResponse() { String syncFailure = KingdeeApprovalSyncListener.pollSyncFailure(); + String syncResult = KingdeeApprovalSyncListener.pollSyncResult(); if (syncFailure != null) { return R.data(Boolean.FALSE, "审批通过,但自动同步金蝶失败:" + syncFailure); } + if (syncResult != null) { + return R.success("审批通过,已同步金蝶:" + syncResult); + } return R.success("审批通过"); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceApplicationController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceApplicationController.java index bbe0bcf3..34c74ec3 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceApplicationController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceApplicationController.java @@ -134,12 +134,16 @@ public class InvoiceApplicationController extends BladeController { return approveResponse(); } - /** 审批接口统一响应:审批已生效,自动推送失败原因以警告文案返回(data=false 供前端区分提示样式) */ + /** 审批接口统一响应:审批已生效,自动推送结果(成功单据号/失败原因)一并返回;失败用 data=false 供前端区分提示样式 */ private R approveResponse() { String syncFailure = KingdeeApprovalSyncListener.pollSyncFailure(); + String syncResult = KingdeeApprovalSyncListener.pollSyncResult(); if (syncFailure != null) { return R.data(Boolean.FALSE, "审批通过,但自动同步金蝶失败:" + syncFailure); } + if (syncResult != null) { + return R.success("审批通过,已同步金蝶:" + syncResult); + } return R.success("审批通过"); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceReceiptController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceReceiptController.java index 59eb30b6..c9023ceb 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceReceiptController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceReceiptController.java @@ -150,12 +150,16 @@ public class InvoiceReceiptController extends BladeController { return approveResponse(); } - /** 审批接口统一响应:审批已生效,自动推送失败原因以警告文案返回(data=false 供前端区分提示样式) */ + /** 审批接口统一响应:审批已生效,自动推送结果(成功单据号/失败原因)一并返回;失败用 data=false 供前端区分提示样式 */ private R approveResponse() { String syncFailure = KingdeeApprovalSyncListener.pollSyncFailure(); + String syncResult = KingdeeApprovalSyncListener.pollSyncResult(); if (syncFailure != null) { return R.data(Boolean.FALSE, "审批通过,但自动同步金蝶失败:" + syncFailure); } + if (syncResult != null) { + return R.success("审批通过,已同步金蝶:" + syncResult); + } return R.success("审批通过"); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/PaymentApplicationController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/PaymentApplicationController.java index ae6f6796..b24f3980 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/PaymentApplicationController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/PaymentApplicationController.java @@ -99,12 +99,16 @@ public class PaymentApplicationController extends BladeController { return approveResponse(); } - /** 审批接口统一响应:审批已生效,自动推送失败原因以警告文案返回(data=false 供前端区分提示样式) */ + /** 审批接口统一响应:审批已生效,自动推送结果(成功单据号/失败原因)一并返回;失败用 data=false 供前端区分提示样式 */ private R approveResponse() { String syncFailure = KingdeeApprovalSyncListener.pollSyncFailure(); + String syncResult = KingdeeApprovalSyncListener.pollSyncResult(); if (syncFailure != null) { return R.data(Boolean.FALSE, "审批通过,但自动同步金蝶失败:" + syncFailure); } + if (syncResult != null) { + return R.success("审批通过,已同步金蝶:" + syncResult); + } return R.success("审批通过"); } @PostMapping("/return") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/SettlementAdjustmentController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/SettlementAdjustmentController.java index d03d8d1d..86772411 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/SettlementAdjustmentController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/SettlementAdjustmentController.java @@ -39,12 +39,16 @@ public class SettlementAdjustmentController extends BladeController { String hint = service.approve(request); // 未推送场景自动推送失败原因以警告文案返回(data=false 供前端区分提示样式) String syncFailure = KingdeeApprovalSyncListener.pollSyncFailure(); + String syncResult = KingdeeApprovalSyncListener.pollSyncResult(); if (Func.isNotBlank(syncFailure)) { return R.data(Boolean.FALSE, "审批通过,但自动同步金蝶失败:" + syncFailure); } if (Func.isNotBlank(hint)) { return R.data(Boolean.TRUE, "审批通过;" + hint); } + if (Func.isNotBlank(syncResult)) { + return R.success("审批通过,已同步金蝶:" + syncResult); + } return R.success("审批通过"); } @PostMapping("/return") public R returnBill(@RequestBody SettlementAdjustmentStatusRequest request) { service.returnBill(request); return R.success("已驳回"); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java index 50a9ebd0..fbecca86 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java @@ -68,6 +68,9 @@ public class KingdeeApprovalSyncListener { /** 当前审批请求线程的自动推送失败原因,供 Controller 取走提示前端(见类注释线程说明) */ private static final ThreadLocal SYNC_FAILURE = new ThreadLocal<>(); + /** 当前审批请求线程的自动推送成功结果(金蝶单据号/推送摘要),供 Controller 拼进提示文案 */ + private static final ThreadLocal SYNC_RESULT = new ThreadLocal<>(); + /** * 取走并清除当前审批请求的自动推送失败原因;null 表示推送成功或未触发推送。 * 须在 service.approve 返回后立即调用(监听器在审批事务提交时同步执行完毕)。 @@ -78,6 +81,23 @@ public class KingdeeApprovalSyncListener { return failure; } + /** + * 取走并清除当前审批请求的自动推送成功结果;null 表示推送失败或未触发推送。 + * 与 {@link #pollSyncFailure()} 成对调用,避免线程复用导致结果串单。 + */ + public static String pollSyncResult() { + String result = SYNC_RESULT.get(); + SYNC_RESULT.remove(); + return result; + } + + /** 记录本次自动推送的成功结果,空值不记录(未触发推送/接口无返回) */ + private static void recordResult(String result) { + if (result != null && !result.isBlank()) { + SYNC_RESULT.set(result); + } + } + /** * 事务提交后同步推送。fallbackExecution=true 兜底:approve 未开启事务时事件不再被默认丢弃。 * @@ -86,6 +106,7 @@ public class KingdeeApprovalSyncListener { @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, fallbackExecution = true) public void onBillApproved(KingdeeBillApprovedEvent event) { SYNC_FAILURE.remove(); + SYNC_RESULT.remove(); try { switch (event.bizType()) { case KingdeeBillApprovedEvent.BIZ_FORMAL_SETTLEMENT -> pushSettlement(event.id()); @@ -97,6 +118,7 @@ public class KingdeeApprovalSyncListener { } catch (Exception exception) { // 推送失败只记日志(失败状态已在推送方法内独立事务落库),不影响审批结果,交给重推任务与手动按钮兜底; // 原因暂存线程变量,由审批 Controller 取走提示前端 + SYNC_RESULT.remove(); log.error("审批通过自动同步金蝶失败 bizType={} id={}", event.bizType(), event.id(), exception); String reason = exception.getMessage() == null ? "金蝶接口调用异常" : exception.getMessage(); // 手动按钮同文案已带"推送金蝶失败:"前缀,拼提示时去掉避免重复 @@ -110,6 +132,7 @@ public class KingdeeApprovalSyncListener { } log.info("正式结算单[{}]审批通过自动同步金蝶开始", id); String billNo = formalSettlementService.syncKingdee(id); + recordResult(billNo); log.info("正式结算单[{}]审批通过自动同步金蝶完成:billNo={}", id, billNo); } @@ -128,6 +151,7 @@ public class KingdeeApprovalSyncListener { } log.info("付款申请[{}]审批通过自动同步金蝶开始", id); String kingdeeBillId = paymentApplicationService.syncKingdee(id); + recordResult(kingdeeBillId); log.info("付款申请[{}]审批通过自动同步金蝶完成:kingdeeBillId={}", id, kingdeeBillId); } @@ -137,6 +161,7 @@ public class KingdeeApprovalSyncListener { } log.info("开票申请[{}]审批通过自动同步金蝶开始", id); String billNo = invoiceApplicationService.syncKingdee(id); + recordResult(billNo); log.info("开票申请[{}]审批通过自动同步金蝶完成:billNo={}", id, billNo); } @@ -146,6 +171,7 @@ public class KingdeeApprovalSyncListener { } log.info("收票登记[{}]审批通过自动推送金蝶收票单开始", id); String summary = invoiceReceiptService.pushKingdeeReceivedInvoice(List.of(id), true); + recordResult(summary); log.info("收票登记[{}]审批通过自动推送金蝶收票单完成:{}", id, summary); } } From fc691bcc16efb2b750626a31f621f4e9030d2074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 16:05:02 +0800 Subject: [PATCH 098/124] =?UTF-8?q?fix:=20=E5=90=88=E5=90=8C=E7=89=B9?= =?UTF-8?q?=E6=89=B9=E5=9B=9E=E8=B0=83=E6=8E=A5=E5=8F=A3D103?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/springblade/transport/controller/HcsSyncController.java | 2 +- .../transport/support/hcs/HcsContractSpecSyncSupport.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 993d414d..2b35b54c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -288,7 +288,7 @@ public class HcsSyncController { } /** - * 合同特批结果回传接收(合规系统 contractLegal/result 推送,替代未建设的 B103,原文留痕) + * 合同特批结果回传接收(合规系统 contractLegal/result 推送,替代未建设的 D103,原文留痕) *

    * 免登免授权:blade.secure skip-url + auth permitAll 放行(doc/nacos/blade.yaml); * iPaaS 网关注册映射:/gwzh/HTHG/contractLegal/result → /hcs/contractLegal/result; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index c9476416..9c99fbfc 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -58,7 +58,7 @@ import java.util.Map; *

    * 业务闭环(2026-10-13 起):高风险/黑名单客商合同随 C103-1/C103-11 报文 fdSepcailContract=true 在合规侧走特批流程 * (C103-8 独立发起接口合规未提供,已删除),TMS 挂起"特批审核"(processing)→ - * 集团审批结果经合规 contractLegal/result 接口推送 TMS(替代未建设的 B103),或定时 C103-4 查询兜底联动 → + * 集团审批结果经合规 contractLegal/result 接口推送 TMS(替代未建设的 D103),或定时 C103-4 查询兜底联动 → * approved 恢复流程,rejected 联动合同审批驳回。 *

    * 结果推送报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=},原文留痕 blade_hcs_check_log。 From 2afc18b8de2de67986019db2e274913dafa138d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 16:25:10 +0800 Subject: [PATCH 099/124] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9EHcsPushTask?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E9=80=BB=E8=BE=91=E4=B8=8E?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E6=A2=B3=E7=90=86=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6-10-22-HcsPushTask定时任务逻辑与流程梳理.md | 210 ++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 doc/docs/hcs合同/2026-10-22-HcsPushTask定时任务逻辑与流程梳理.md diff --git a/doc/docs/hcs合同/2026-10-22-HcsPushTask定时任务逻辑与流程梳理.md b/doc/docs/hcs合同/2026-10-22-HcsPushTask定时任务逻辑与流程梳理.md new file mode 100644 index 00000000..97e6ee15 --- /dev/null +++ b/doc/docs/hcs合同/2026-10-22-HcsPushTask定时任务逻辑与流程梳理.md @@ -0,0 +1,210 @@ +# HcsPushTask 定时任务逻辑与流程梳理 + +> 代码:`blade-service/blade-transport/src/main/java/org/springblade/transport/task/HcsPushTask.java` +> 定位:HCS(合同合规系统)合规推送的**兜底定时扫描**。审批代码零埋点——扫描只认「审批通过 + 待同步/失败未超限」的单据,与审批入口(/approve、MK 回调)无关;失败由下轮扫描自动补偿,超限仅人工重推(D7)。 + +--- + +## 1. 总体机制 + +| 机制 | 说明 | +| --- | --- | +| 调度 | 五类任务独立 `@Scheduled`,cron 走 Nacos `thirdParty.hcs.push.{bizType}.cron`,默认每 5 分钟、分钟位 0/1/2/3/4 错峰,避免同刻并发与 HCS 接口流量尖峰 | +| 开关 | 每任务独立开关 `thirdParty.hcs.push.{bizType}.sync-enabled`(默认关,灰度打开);未开启时本轮直接跳过 | +| 防重 | 按业务类型隔离的 Redis 分布式锁(`blade:third:hcs:push:task:lock:{bizType}`),setIfAbsent 抢锁 + 持有值比对释放,TTL 240s;多实例部署时同任务只有一台执行,任务间互不阻塞 | +| 批量 | `batch-size`(单轮扫描条数上限)、`max-retry`(重试上限)为全局配置 `thirdParty.hcs.push.*` | +| 复用 | 扫描与推送逻辑(pushUnsyncedXxx)同时供手动端点 HcsSyncController 复用(页面"推送合规/重推"按钮) | + +--- + +## 2. 五类任务总览 + +| bizType | 任务 | 默认 cron | 覆盖合规接口 | 推送 Support | +| --- | --- | --- | --- | --- | +| project | 项目立项 | `0 */5 * * * ?` | C102-1/2/3 | HcsProjectSyncSupport | +| contract | 合同(含特批兜底) | `0 1/5 * * * ?` | C101-1、C103-1/11/3/4/9、C103-2 附件 | HcsContractSyncSupport + HcsContractSpecSyncSupport | +| payment | 付款链(特批+履约) | `0 2/5 * * * ?` | C106-3/4、C108-1/2 | HcsPaymentSyncSupport(编排)→ HcsSpecPaySyncSupport / HcsPerfRecordSyncSupport | +| invoice-application | 开票登记 | `0 3/5 * * * ?` | C111-1/2/3、C103-2 附件 | HcsInvoiceRegSyncSupport | +| invoice-receipt | 收票单 | `0 4/5 * * * ?` | C109-1/2、C103-2 附件 | HcsReceiptBillSyncSupport | + +--- + +## 3. 统一扫描条件(状态口径) + +各任务扫描 SQL 口径一致(payment/invoice 两类只认 `approved`,不含变更通过): + +1. **审批状态**:`approvalStatus IN (approved, change_approved)`(合同/项目);付款、开票、收票仅 `approved`; +2. **同步状态**:`hcs_sync_status IN (unsynced, failed)`; +3. **重试门槛**:`hcs_retry_count IS NULL OR < max-retry`; +4. `limit batch-size` 控制单轮量。 + +逐条推送:成功由 Support 内 `markSynced` 回填(`hcs_fd_id` 合规ID、`synced`、清零重试、记 `hcs_sync_time/msg`);异常由任务统一 `markFailed`(`failed`、重试+1、失败原因截断 500 字落 `hcs_sync_msg`)。 + +### 同步状态机(hcs_sync_status) + +``` +unsynced(审批通过初始态) + │ 扫描推送成功 + ├──→ synced(终态,回填 hcs_fd_id) + │ 推送异常 + └──→ failed(重试+1) + │ 未超限:下轮扫描自动补偿 + ├──→ synced + └──→ 超限:停留 failed,仅人工重推(重推重置 unsynced + 清零计数) +``` + +--- + +## 4. 各任务流程与接口明细 + +### 4.1 项目立项(C102) + +**流程**(HcsProjectSyncSupport.pushProject): + +1. 无合规ID(首推)→ **C102-3 列表判重**(conditions=`fd_num=项目编号`),命中直接回填 fdId 置 synced,跳过新建; +2. 未命中 → **C102-1 新建**(模板编码取配置 `project.template-code`,操作 drafter_submit 直接提交,金额万元×10000 转元),回填 fdId; +3. 已有合规ID(变更单 change_approved)→ **C102-2 更新**(formData.fdId 必填)。 + +| 接口 | 用途 | +| --- | --- | +| C102-3 | 项目立项列表查询(判重) | +| C102-1 | 项目立项新建 | +| C102-2 | 项目立项更新 | + +**附带回调**(非本任务,同 Support):合规 `projectLegal/result` 推送(D902)→ 回填金蝶项目ID/编号(kingdeeId/kingdeeNumber),原文留痕 `blade_hcs_check_log`。 + +### 4.2 合同(C103)—— 最复杂链路 + +任务为组合动作:`pushUnsyncedContracts()` + `hcsContractSpecSyncSupport.syncProcessingSpecResults()`(特批结果查询兜底)。 + +**推送流程**(HcsContractSyncSupport.pushContract,按序): + +| 步骤 | 动作 | 接口 | +| --- | --- | --- | +| ⓪ 门禁 | 特批中(hcsSpecStatus=processing)的合同跳过推送,等待结果恢复;need 不拦截(重推时随报文自愈转特批) | — | +| ① 风险校验 | 开关 `contract.require-risk-check`;甲乙双方各查一次 C101-1(**不跳过内部组织客商**,仅名称反查不到编号记 skip;等级取甲方优先非空值、黑名单任一方为是),留痕 hcs_risk_* 字段与 check_log;**仅留痕不阻断**,高风险/黑名单触发后续自动特批。注:提交环节的阻断校验在合同/付款 submit 时已完成(见 §6 C101-1 全景),此步是推送链路的复核留痕 | **C101-1** 客商风险查询 | +| ② 附件转传 | 开关 `attachment.transfer-enabled`;合同主文件→eopCdraftSign、特批附件→eopCdraftSpecial、其它→eopCdraftOther;转传命中映射表(blade_hcs_attachment_sync)直接复用 | **C103-2** 附件上传 | +| ③ 判重 | conditions=`fdNumber=合同编号`,命中回填 fdId 置 synced | **C103-3** 合同列表查询 | +| ④ 起草/更新 | 首推 **C103-1 合同发起**(fdFieldJson 模板字段 + signer 相对方 + 顶层 attachment 挂载;高风险/黑名单或强制开关时报文带 `fdSepcailContract=true` 在合规侧走特批);变更单走 **C103-11 合同更新**(顶层 fdId 定位) | **C103-1** / **C103-11** | +| ⑤ 履约计划 | 开关 `exe-stage.sync-enabled`;C103-9 行级同步(add/update/delete 标记),仅依赖 hcs_fd_id、失败不受特批门禁阻塞 | **C103-9** 履约规则同步(exeplanAdd) | +| ⑥ 挂起特批 | 风险客商(且特批无终态)→ hcsSpecStatus=processing、currentNode="特批审核",等待结果 | — | + +**特批结果闭环**(HcsContractSpecSyncSupport,三条入口等效): + +1. 合规推送 `contractLegal/result`:success=true → 恢复"审批通过"(金蝶合同ID回填 kingdee_id,特批 approved);false → 联动合同审批驳回(rejected),走重新提交闭环; +2. **定时 C103-4 兜底**(本任务每轮执行):扫描特批中(processing 且已有 hcs_fd_id)的合同(limit 50),查合同详情 fdApprovalStatus——`approved` 联动通过、`approvalinvalid` 联动驳回、其余等待中跳过; +3. 人工确认(页面按钮,与推送等效)。 + +| 接口 | 用途 | +| --- | --- | +| C101-1 | 客商风险等级/黑名单查询(甲乙各一次) | +| C103-2 | 合同附件上传(multipart) | +| C103-3 | 合同列表查询(判重) | +| C103-1 | 合同发起(新建,返回 fdContractId 必须持久化) | +| C103-11 | 合同更新(变更单) | +| C103-9 | 履约规则/计划行级同步 | +| C103-4 | 合同详情查询(特批结果兜底,fdId 定位) | + +**附带回调**(非本任务):`contractKingdee/result` 推送(D903)→ 回填金蝶合同ID,仅留痕不联动审批。 + +### 4.3 付款链(C106-3 特批 + C108 履约) + +**流程**(HcsPaymentSyncSupport.pushPayment,编排组件): + +1. **① 结算付款特批**:仅当 `hcs_spec_status=need`(提交时高风险/黑名单须特批附件,或额度超额标记)时触发——未发起走 **C106-3 特批发起**(返回双层嵌套 data.data.fdId → hcs_spec_fd_id,状态置 processing),已发起走 **C106-4 特批更新**;发起后挂起 currentNode="特批审核"; +2. **② 履约记录**:开关 `perf-record.sync-enabled`(**一期默认关**,关闭时直接置 synced)——无记录ID走 **C108-1 新建**(回填 hcs_perf_fd_id),实际付款推进走 **C108-2 更新**。 + +特批结果入口(非扫描,同 Support):合规 `paymentLegal/result` 推送(requestId=付款申请ID,APPROVED/REJECTED)或人工确认——通过恢复"审批通过"放行,驳回联动付款审批驳回(returned)。 + +| 接口 | 用途 | +| --- | --- | +| C106-3 | 结算付款特批流程发起 | +| C106-4 | 结算付款特批流程更新 | +| C108-1 | 履约记录新建 | +| C108-2 | 履约记录更新 | + +### 4.4 开票登记(C111) + +**流程**(HcsInvoiceRegSyncSupport.pushInvoiceRegistration): + +1. 无合规ID → **C111-1 列表判重**(conditions=`fdNumber=申请单号`),命中回填; +2. 未命中 → **C111-2 新增**(合同编号经"开票申请→应收结算关联→正式结算单"链路回溯,回溯不到直接失败;币种按 RMB 取 `invoice.currency-id-mapping`;附件经 C103-2 转传);若金蝶已开票完成(kingdeeStatus=invoiced)则紧接着回填票据日期; +3. 已有合规ID(金蝶开票完成后回写置待同步)→ **C111-3 更新**(回填 fdBillDate/fdStatus=已开票)。 + +| 接口 | 用途 | +| --- | --- | +| C111-1 | 开票登记列表查询(判重) | +| C111-2 | 开票登记新增 | +| C111-3 | 开票登记更新(票据日期/状态回填) | +| C103-2 | 附件转传 | + +### 4.5 收票单(C109) + +**流程**(HcsReceiptBillSyncSupport.pushReceiptBill): + +1. 无合规ID → **C109-1 新建**(税率 TMS 整数÷100 转小数;合同主题/编号经"收票→结算关联→结算单合同"回溯,回溯不到取页面人工补录 hcs_contract_id/hcs_contract_no;附件挂 fdEntityKey=fd_attach;返回**双层嵌套** data.data.fdId)→ 立即持久化 hcs_fd_id → 任务层 markSynced; +2. 已有合规ID → **C109-2 更新**(顶层 fdId 必填,只传变更字段、不带文档状态)。 + +注:收票单是唯一在任务循环内显式调用 `markSynced` 的(Support 内只持久化 fdId),其余任务由 Support 内部回填。 + +| 接口 | 用途 | +| --- | --- | +| C109-1 | 收票单新建 | +| C109-2 | 收票单更新 | +| C103-2 | 附件转传 | + +--- + +## 5. 状态字段速查 + +| 字段 | 取值 | 含义 | +| --- | --- | --- | +| approvalStatus | draft/reviewing/withdrawn/**approved**/rejected/change_reviewing/change_approved/change_rejected/voided | TMS 审批状态;扫描只认 approved、change_approved(付款/开票/收票仅 approved) | +| hcs_sync_status | **unsynced / synced / failed** | 合规推送整体状态(任务补偿的依据) | +| hcs_retry_count | 整数 | 失败重试次数,≥ max-retry 停止自动补偿 | +| hcs_fd_id | — | 合规侧单据ID(项目/合同/开票登记),有值走更新链路 | +| hcs_spec_status | none/need/pushing/**processing**/approved/rejected | 特批状态;need 触发付款 C106-3,processing 挂起"特批审核"并阻塞合同重推 | +| hcs_spec_fd_id | — | 合规特批流程ID(付款 C106-3 返回) | +| hcs_perf_fd_id | — | 合规履约记录ID(C108-1 返回) | +| hcs_risk_level / hcs_black_status / hcs_risk_time | — | 合同客商风险校验留痕(C101-1 结果) | +| kingdee_id / kingdee_number | — | 金蝶同步结果回填(合规 result 回调) | + +--- + +## 6. C101-1 客商风险校验全景(最新口径) + +C101-1(`getRelativeRisk`,入参 fdNumber=客商编号,返回 fdRiskLevel 0=低/1=中/2=高、fdBlackStatus yes/no)在链路中共有 4 类调用场景。风险判定口径统一:**风险等级=2 或 黑名单=yes 即风险客商**;但「内部组织客商跳过查询」仅适用于场景 1/2/4(HcsCreditCheckSupport 统一入口),**场景 3(合同推送链路)未做内部组织跳过,甲乙双方均直接调 C101-1**,仅名称反查不到客商编号时记 skip。 + +| # | 场景 | 入口 | 开关 | 行为 | +| --- | --- | --- | --- | --- | +| 1 | **合同提交校验**(阻断) | ContractManageServiceImpl.validateSpecExplanationOnSubmit(新增/变更/重新提交等 4 处调用) | 无开关,始终执行 | 甲、乙方各自独立实时查(`isRiskyCustomer(partyA) \|\| isRiskyCustomer(partyB)`,queryCustomerRiskByName 名称反查编号,反查不到记 risky=false 不阻断);风险客商**必须已上传「特批附件」**,否则阻断提交(attachmentsJson 与 contractFileJson 均认可,历史已传兼容放行) | +| 2 | **付款提交校验**(提示+转特批) | PaymentApplicationServiceImpl 提交事务内 → HcsCreditCheckSupport.checkOnSubmit | `risk.check-on-payment` | 收款方反查档案:反查不到/内部组织 → skip 留痕不阻断;外部客商查询 C101-1,风险客商**必须上传「特批附件」**(attachmentType=special_approval,阻断提示),通过后置 `hcs_spec_status=need`、**清空旧 hcs_spec_fd_id**(特批单次有效,重新提交须重新发起 C106-3) | +| 3 | **合同推送留痕**(不阻断) | HcsPushTask 合同链路步骤① → HcsContractSyncSupport.checkRelativeRisk | `contract.require-risk-check` | **甲乙双方必各调一次 C101-1(此链路不跳过内部组织客商)**,仅名称反查不到编号时记 skip;结果留痕 hcs_risk_level(甲乙取甲方优先的非空值)/hcs_black_status(任一方黑名单即 yes)/hcs_risk_time 与 check_log;风险客商 → C103-1/C103-11 报文带 `fdSepcailContract=true` + 挂起"特批审核"(见 §4.2) | +| 4 | **页面展示查询** | HcsSyncController:`GET /hcs/risk?customerCode=`(单个)、`GET /hcs/risk/batch`(客商列表页批量,单个失败跳过)、`GET /hcs/risk/by-name`(按名称,合同前端校验用) | — | HcsCreditCheckSupport.queryCustomerRisk:内部客商直接 risky=false;外部客商查询后组装 CustomerRiskVO(fdBlackStatus/fdRiskLevel/riskLevelName/risky/riskTip);riskTip 为固定短文案(C101-1 不返回风险项明细):黑名单="被列入外部黑名单"、高风险="为高风险客商" | + +各场景均留痕 `blade_hcs_check_log`(check_type=risk,result=pass/fail/skip)。 + +### 6.1 风险客商管控闭环(合同/付款两条线) + +``` +提交时(阻断门禁):C101-1 查甲乙/收款方 → 风险客商须传「特批附件」方可提交 + │ +合同线:推送 C103-1/C103-11 报文 fdSepcailContract=true(合规侧走特批流程) + │ TMS 挂起"特批审核"(hcs_spec_status=processing) + └→ 结果:contractLegal/result 推送 或 C103-4 定时查询兜底 + approved → 恢复"审批通过";驳回 → 联动合同审批驳回 + +付款线:提交置 hcs_spec_status=need + │ 审批通过后扫描任务发起 C106-3(挂起"特批审核") + └→ 结果:paymentLegal/result 推送 或 人工确认 + APPROVED → 恢复放行;REJECTED → 联动付款审批驳回(returned) +``` + +--- + +## 7. 与本任务相关的其他链路(简述) + +- **即时推送**(HcsImmediatePushSupport):审批通过瞬间单条推送,Redis 单条锁(TTL 120s)防与扫描任务并发双推;失败落 failed 由本任务兜底。 +- **手动重推**(各 Support.repushXxx / HcsSyncController):重置 unsynced + 清零计数后立即推送;合同特批中(processing)禁止重推。 +- **主数据**(HcsMasterDataSupport):C103-6 模板 / C103-7 分类 / C103-12 币种列表,Redis 缓存,非本任务调度。 +- **额度校验 C106-1**:付款提交时同步调用(开关 `credit.check-enabled`,一期默认关);以 `fdIsCredit` 为准判定,通过置 hcs_credit_status=pass,超额**不拦截**提交、置 over 并标记 `hcs_spec_status=need` 转特批链路;校验依赖合同已推送合规(hcs_fd_id),未推送时按 `credit.require-contract-synced` 配置阻断或跳过。 From dcda231c5169f9ded3c1243ed191080c188eaa7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 16:33:00 +0800 Subject: [PATCH 100/124] =?UTF-8?q?feat:=20=E4=BB=98=E6=AC=BE=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E9=80=9A=E8=BF=87=E7=B4=AF=E5=8A=A0=E5=B1=A5=E7=BA=A6?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E6=AC=BE=E9=A1=B9=E9=87=91=E9=A2=9D=E5=B9=B6?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E5=90=88=E5=90=8C=E7=B3=BB=E7=BB=9F=EF=BC=8C?= =?UTF-8?q?=E9=87=91=E8=9D=B6=E4=BB=98=E6=AC=BE=E7=94=B3=E8=AF=B7=E6=90=BA?= =?UTF-8?q?=E5=B8=A6=E5=B1=A5=E7=BA=A6=E8=AE=A1=E5=88=92id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/entity/HcsContractExeStage.java | 2 +- .../transport/constant/HcsSyncConstant.java | 15 +++++ .../service/IContractExeStageService.java | 19 +++++++ .../impl/ContractExeStageServiceImpl.java | 57 +++++++++++++++++++ .../impl/PaymentApplicationServiceImpl.java | 37 ++++++++++-- .../support/hcs/HcsExeStageSyncSupport.java | 2 +- .../support/hcs/HcsPaymentSyncSupport.java | 40 +++++++++++-- .../support/hcs/HcsPerfRecordSyncSupport.java | 17 ++---- .../hcs/dto/HcsExeplanStageDTO.java | 2 +- 9 files changed, 168 insertions(+), 23 deletions(-) diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractExeStage.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractExeStage.java index 95bdb385..eb42723f 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractExeStage.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/HcsContractExeStage.java @@ -67,7 +67,7 @@ public class HcsContractExeStage extends TenantEntity { @Schema(description = "款项性质 prepayment/progress/acceptance/retention") private String fundNature; - @Schema(description = "计划金额(元)") + @Schema(description = "款项金额(元,付款审批通过按申请付款金额累加更新)") private BigDecimal fundAmount; @Schema(description = "计划资金日期") 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 c4eb9884..42eaaf09 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 @@ -254,6 +254,21 @@ public final class HcsSyncConstant { */ public static final String FUND_NATURE_PROGRESS = "progress"; + /** + * 款项性质:预付款 + */ + public static final String FUND_NATURE_PREPAYMENT = "prepayment"; + + /** + * 付款类型→款项性质映射:正式结算付款对应进度款计划行,预付款(进度预付/项目预付)对应预付款计划行 + * + * @param paymentType 付款申请付款类型 + * @return 款项性质 + */ + public static String fundNatureOfPayment(String paymentType) { + return TransportBusiConstant.PAYMENT_TYPE_SETTLEMENT.equals(paymentType) ? FUND_NATURE_PROGRESS : FUND_NATURE_PREPAYMENT; + } + // ==================== Redis 缓存 key(照 BFI blade:third: 前缀惯例) ==================== /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java index 53421060..30c85811 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java @@ -28,6 +28,7 @@ package org.springblade.transport.service; import org.springblade.core.mp.base.BaseService; import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.HcsContractExeStage; +import org.springblade.transport.pojo.entity.PaymentApplication; import java.util.List; @@ -46,6 +47,24 @@ public interface IContractExeStageService extends BaseService listByContractId(Long contractId); + /** + * 匹配合同的付款履约计划行(已同步,优先按款项性质精确匹配,无则取首条付款行兜底) + * + * @param contractId 合同ID + * @param fundNature 款项性质(progress/prepayment 等,空则直接取首条付款行) + * @return 付款履约计划行,无已同步付款行时返回 null + */ + HcsContractExeStage findPaymentStageRow(Long contractId, String fundNature); + + /** + * 付款审批通过累加履约计划行款项金额(款项金额=申请付款金额,多次付款累加更新): + * 按款项性质匹配付款计划行,原子累加 fund_amount;已同步行置 row_op=update 凭已存合规阶段ID 随 C103-9 重推, + * 未同步行保持 add 待合同链路首推(首推即携带累加后金额) + * + * @param payment 付款申请单(审批通过) + */ + void accumulatePaidAmountOnApprove(PaymentApplication payment); + /** * 审批通过自动创建默认履约计划行(合同下无规则行时):承运商合同=付款进度款(收票规则取合同结算模式), * 客户合同=收款进度款;金额/资金日期留空,随合同链路推 C103-9 diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java index 06d49d3f..fada11b8 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractExeStageServiceImpl.java @@ -38,6 +38,7 @@ import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.HcsContractExeStageMapper; import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.HcsContractExeStage; +import org.springblade.transport.pojo.entity.PaymentApplication; import org.springblade.transport.service.IContractExeStageService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -67,6 +68,62 @@ public class ContractExeStageServiceImpl extends BaseServiceImpllambdaQuery() + .eq(HcsContractExeStage::getContractId, contractId) + .eq(HcsContractExeStage::getPerformType, HcsSyncConstant.PERFORM_TYPE_PAYMENT) + .eq(HcsContractExeStage::getFundNature, fundNature) + .isNotNull(HcsContractExeStage::getHcsStageFdId) + .orderByAsc(HcsContractExeStage::getId) + .last("limit 1"), false); + if (natureRow != null) { + return natureRow; + } + } + // 兜底:无该款项性质已同步行时取首条已同步付款行(与 C108 履约记录历史口径一致) + return getOne(Wrappers.lambdaQuery() + .eq(HcsContractExeStage::getContractId, contractId) + .eq(HcsContractExeStage::getPerformType, HcsSyncConstant.PERFORM_TYPE_PAYMENT) + .isNotNull(HcsContractExeStage::getHcsStageFdId) + .orderByAsc(HcsContractExeStage::getId) + .last("limit 1"), false); + } + + @Override + public void accumulatePaidAmountOnApprove(PaymentApplication payment) { + if (payment == null || payment.getContractId() == null || payment.getAppliedAmount() == null) { + return; + } + String fundNature = HcsSyncConstant.fundNatureOfPayment(payment.getPaymentType()); + HcsContractExeStage stageRow = this.findPaymentStageRow(payment.getContractId(), fundNature); + // 仅精确匹配款项性质的计划行累加,兜底行款项性质不一致时不累加(避免预付款金额计入进度款计划) + if (stageRow == null || !fundNature.equals(stageRow.getFundNature())) { + log.info("付款审批未匹配到款项性质[{}]的履约计划行,跳过款项金额累加:paymentNo={},contractId={}", + fundNature, payment.getPaymentNo(), payment.getContractId()); + return; + } + // 原子累加防并发付款审批丢失更新(coalesce 兼容多数据库) + update(Wrappers.lambdaUpdate() + .eq(HcsContractExeStage::getId, stageRow.getId()) + .setSql("fund_amount = coalesce(fund_amount, 0) + " + payment.getAppliedAmount().toPlainString())); + boolean resyncNeeded = StringUtil.isNotBlank(stageRow.getHcsStageFdId()); + if (resyncNeeded) { + // 已同步行置 update 凭已存合规阶段ID 随 C103-9 重推;未同步行保持 add 待合同链路首推 + update(Wrappers.lambdaUpdate() + .eq(HcsContractExeStage::getId, stageRow.getId()) + .set(HcsContractExeStage::getRowOp, HcsSyncConstant.ROW_OP_UPDATE) + .set(HcsContractExeStage::getHcsSyncStatus, HcsSyncConstant.HCS_STATUS_UNSYNCED) + .set(HcsContractExeStage::getHcsSyncMsg, "付款审批款项金额累加,待重推C103-9")); + } + log.info("付款审批履约计划款项金额累加:paymentNo={},stageRowId={},累加金额={},rowOp={}", + payment.getPaymentNo(), stageRow.getId(), payment.getAppliedAmount(), resyncNeeded ? "update" : "add(待合同链路首推)"); + } + @Override @Transactional(rollbackFor = Exception.class) public boolean submitRows(Long contractId, List rows) { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java index f9d256ef..d87ba919 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java @@ -86,6 +86,7 @@ import org.springblade.transport.pojo.entity.FormalSettlement; import org.springblade.transport.pojo.entity.FormalSettlementDetail; import org.springblade.transport.pojo.entity.FormalSettlementPayment; import org.springblade.transport.pojo.entity.FormalSettlementSource; +import org.springblade.transport.pojo.entity.HcsContractExeStage; import org.springblade.transport.pojo.entity.KingdeeBillLock; import org.springblade.transport.pojo.entity.PaymentApplication; import org.springblade.transport.pojo.entity.PaymentApplicationInvoice; @@ -98,6 +99,7 @@ import org.springblade.transport.pojo.entity.TemporaryCreditLimit; import org.springblade.transport.pojo.vo.PaymentApplicationReferenceAmountVO; import org.springblade.transport.pojo.vo.PaymentApplicationVO; import org.springblade.transport.service.IFormalSettlementService; +import org.springblade.transport.service.IContractExeStageService; import org.springblade.transport.service.IKingdeeBillLockService; import org.springblade.transport.service.IPaymentApplicationService; import org.springblade.transport.service.ISettlementProjectAdvanceWriteOffService; @@ -177,6 +179,7 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl selectPage(IPage page, PaymentApplicationVO query) { @@ -524,6 +527,8 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl - * 编排顺序:特批(提交时高风险/黑名单须特批附件或额度超额标记 need 时发起)→ 履约记录(审批通过新建 / 实际付款推进更新)。 + * 编排顺序:特批(提交时高风险/黑名单须特批附件或额度超额标记 need 时发起)→ 履约计划重推(付款审批款项金额累加行)→ 履约记录(审批通过新建 / 实际付款推进更新)。 * 特批流程ID 与履约记录ID 在各自 Support 内即时持久化;整体同步状态(hcs_sync_status)由本组件统一回写。 * 特批发起后 TMS 挂起 currentNode="特批审核",合规 paymentLegal/result 回调联动付款审批状态 * (通过恢复"审批通过"放行 / 驳回联动审批驳回走重新提交闭环),人工确认等效兜底。 @@ -65,13 +67,15 @@ public class HcsPaymentSyncSupport { private static final List APPROVED_STATUSES = List.of("approved"); private final PaymentApplicationMapper paymentApplicationMapper; + private final ContractManageMapper contractManageMapper; private final HcsProperties hcsProperties; private final HcsSpecPaySyncSupport hcsSpecPaySyncSupport; + private final HcsExeStageSyncSupport hcsExeStageSyncSupport; private final HcsPerfRecordSyncSupport hcsPerfRecordSyncSupport; private final ApplicationEventPublisher eventPublisher; /** - * 推送付款申请到 HCS:特批(如需)→ 履约记录(新建/更新)→ 回填整体同步状态 + * 推送付款申请到 HCS:特批(如需)→ 履约计划重推(C103-9 款项金额累加行)→ 履约记录(新建/更新)→ 回填整体同步状态 * * @param payment 付款申请单(approvalStatus=approved) * @return 推送结果描述 @@ -82,7 +86,16 @@ public class HcsPaymentSyncSupport { if (HcsSyncConstant.SPEC_STATUS_NEED.equals(payment.getHcsSpecStatus())) { result.append(hcsSpecPaySyncSupport.pushSpecPay(payment)); } - // ② 履约记录:审批通过新建 C108-1 / 实际付款推进更新 C108-2(一期暂不对接默认关) + // ② 履约计划重推(C103-9 行级更新):付款审批通过累加款项金额置 row_op=update 的计划行, + // 凭已存合规阶段ID 重推;独立于履约记录开关,推送失败抛出由付款链置 failed 重试兜底 + String stageResult = this.pushExeStageUpdate(payment); + if (StringUtil.isNotBlank(stageResult)) { + if (result.length() > 0) { + result.append(";"); + } + result.append(stageResult); + } + // ③ 履约记录:审批通过新建 C108-1 / 实际付款推进更新 C108-2(一期暂不对接默认关) if (!hcsProperties.getPerfRecord().isSyncEnabled()) { markSynced(payment, result.toString()); return result.toString(); @@ -95,6 +108,25 @@ public class HcsPaymentSyncSupport { return result.toString(); } + /** + * 履约计划重推(C103-9):聚合合同下 row_op 非 none 的计划行(含付款审批累加款项金额的 update 行)凭已存 fdId 重推; + * 合同尚未推送合规时计划行随合同链路首推(首推即携带累加后金额),此处跳过 + * + * @param payment 付款申请单 + * @return 推送结果描述,无待同步行返回空串 + */ + private String pushExeStageUpdate(PaymentApplication payment) { + if (payment.getContractId() == null) { + return ""; + } + ContractManage contractManage = contractManageMapper.selectById(payment.getContractId()); + if (contractManage == null || StringUtil.isBlank(contractManage.getHcsFdId())) { + return ""; + } + String stageResult = hcsExeStageSyncSupport.syncExeStages(contractManage); + return "履约规则无待同步行".equals(stageResult) ? "" : stageResult; + } + /** * 单条手动重推:重置为待同步并清零重试计数后立即推送(页面"推送合规/重推"按钮入口) * diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java index 149c8b0f..7e7aa5a0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPerfRecordSyncSupport.java @@ -25,7 +25,6 @@ */ package org.springblade.transport.support.hcs; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.tool.utils.StringUtil; @@ -42,11 +41,11 @@ import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; -import org.springblade.transport.mapper.HcsContractExeStageMapper; import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.HcsContractExeStage; import org.springblade.transport.pojo.entity.PaymentApplication; +import org.springblade.transport.service.IContractExeStageService; import org.springframework.stereotype.Component; import java.time.LocalDate; @@ -76,7 +75,7 @@ public class HcsPerfRecordSyncSupport { private final IHcsClient hcsClient; private final HcsProperties hcsProperties; private final ContractManageMapper contractManageMapper; - private final HcsContractExeStageMapper hcsContractExeStageMapper; + private final IContractExeStageService contractExeStageService; private final PaymentApplicationMapper paymentApplicationMapper; private final HcsAttachmentSupport hcsAttachmentSupport; @@ -203,17 +202,11 @@ public class HcsPerfRecordSyncSupport { } /** - * 匹配合同的付款履约规则行(perform_type=payment 且已同步,取第一条) + * 匹配合同的付款履约计划行(优先按付款类型映射的款项性质精确匹配,无则取首条已同步付款行兜底) */ private HcsContractExeStage findPaymentStageRow(PaymentApplication payment) { - if (payment.getContractId() == null) { - return null; - } - return hcsContractExeStageMapper.selectOne(Wrappers.lambdaQuery() - .eq(HcsContractExeStage::getContractId, payment.getContractId()) - .eq(HcsContractExeStage::getPerformType, "payment") - .isNotNull(HcsContractExeStage::getHcsStageFdId) - .last("limit 1")); + return contractExeStageService.findPaymentStageRow(payment.getContractId(), + HcsSyncConstant.fundNatureOfPayment(payment.getPaymentType())); } /** diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageDTO.java index 1f6246c3..21dbc7ac 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsExeplanStageDTO.java @@ -71,7 +71,7 @@ public class HcsExeplanStageDTO implements Serializable { */ private Integer fdInvoiceCycle; /** - * 计划金额(元) + * 款项金额(元,付款审批通过按申请付款金额累加更新) */ private BigDecimal fdFundAmount; /** From ced382f3f7475fbf981a581dfcc1d34df7f09098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 19:06:47 +0800 Subject: [PATCH 101/124] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9E=E4=BB=98?= =?UTF-8?q?=E6=AC=BE=E5=AE=A1=E6=89=B9=E5=B1=A5=E7=BA=A6=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E6=AC=BE=E9=A1=B9=E9=87=91=E9=A2=9D=E7=B4=AF=E5=8A=A0=E4=B8=8E?= =?UTF-8?q?=E9=87=91=E8=9D=B6=E4=BB=98=E6=AC=BE=E7=94=B3=E8=AF=B7=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E6=B5=81=E7=A8=8B=E6=A2=B3=E7=90=86=E3=80=81=E4=BB=98?= =?UTF-8?q?=E6=AC=BE=E4=BD=9C=E5=BA=9F=E5=BD=B1=E5=93=8D=E5=88=86=E6=9E=90?= =?UTF-8?q?=E4=B8=8E=E8=A1=A5=E9=BD=90=E6=96=B9=E6=A1=88=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...项金额累加与金蝶付款申请携带履约计划id业务流程梳理.md | 155 ++++++++++++++++++ ...¯¹履约计划款项金额与履约记录的影响分析与补齐方案.md | 72 ++++++++ 2 files changed, 227 insertions(+) create mode 100644 doc/docs/hcs合同/2026-10-22-付款审批履约计划款项金额累加与金蝶付款申请携带履约计划id业务流程梳理.md create mode 100644 doc/docs/hcs合同/2026-10-22-付款申请作废对履约计划款项金额与履约记录的影响分析与补齐方案.md diff --git a/doc/docs/hcs合同/2026-10-22-付款审批履约计划款项金额累加与金蝶付款申请携带履约计划id业务流程梳理.md b/doc/docs/hcs合同/2026-10-22-付款审批履约计划款项金额累加与金蝶付款申请携带履约计划id业务流程梳理.md new file mode 100644 index 00000000..3225c4be --- /dev/null +++ b/doc/docs/hcs合同/2026-10-22-付款审批履约计划款项金额累加与金蝶付款申请携带履约计划id业务流程梳理.md @@ -0,0 +1,155 @@ +# 付款审批履约计划款项金额累加与金蝶付款申请携带履约计划id 业务逻辑与流程梳理 + +> 需求:① 审批通过后,更新合同履约计划并自动推送合同系统(HCS),款项金额=申请付款金额,多次付款累加更新;② 审批通过自动推送金蝶付款申请,报文携带关联的履约计划id(进度款计划id),用于合同系统关联履约付款数据与履约计划。 +> 关键口径:HCS 接口文档(桂物合同集成接口-apifox导入-KeyAuth.json)中履约计划行金额字段 `fdFundAmount` 的定义即**「款项金额,必填」**,本地 `blade_contract_exe_stage.fund_amount` 与之映射——累加直接落在该字段,无需新增数据库列。 +> 代码改动日期:2026-10-22,`mvn compile` 通过。 + +--- + +## 1. 业务逻辑总览 + +| # | 规则 | 说明 | +| --- | --- | --- | +| 1 | 款项金额=申请付款金额,多次付款累加 | 付款申请**审批通过**时,按 `coalesce(fund_amount, 0) + applied_amount` 原子累加到匹配的履约计划行(SQL 原子累加,防多笔付款并发审批丢失更新) | +| 2 | 款项性质匹配 | `settlement`(正式结算付款)→ 进度款行 `progress`;`progress_advance`/`project_advance`(预付款)→ 预付款行 `prepayment`(`HcsSyncConstant.fundNatureOfPayment`) | +| 3 | 仅精确性质行累加 | 匹配不到该性质的已同步付款计划行时**跳过累加**(日志留痕),兜底匹配到的异性质行不累加,避免预付款金额误计入进度款计划 | +| 4 | 已同步行重推、未同步行随首推 | 计划行已有合规阶段ID(hcs_stage_fd_id)→ 置 `row_op=update` + 待同步,随付款链凭 fdId 重推 C103-9;未同步行保持 `row_op=add`,合同链路首推时即携带累加后金额 | +| 5 | 金蝶报文携带履约计划id | A103-1/A103-3 付款申请分录备注 `e_remark` 携带 `履约计划id:{hcs_stage_fd_id}`(进度款计划行的合规阶段ID,合同系统凭此关联);原 `remark` 有值时拼接其后 | +| 6 | 无关联不传、异常不阻断 | 无匹配计划行时不携带履约计划id(与 C108 履约记录 §5.6「无关联则不传」同口径);计划行查询异常仅告警,不阻断金蝶推送 | + +--- + +## 2. 业务流程 + +### 2.1 问题1:付款审批 → 履约计划款项金额累加 → 推送合同系统 + +``` +付款申请审批通过(/approve 或 MK 审批流回调,同一事务内) + │ + ├─① approve():approvalStatus=approved、hcs_sync_status=unsynced(HCS 零埋点,ADR-0001) + │ + ├─② accumulatePaidAmountOnApprove()(事务内落库) + │ 按 contractId + performType=payment + fundNature(按付款类型映射)匹配已同步计划行 + │ ├─ 精确命中 → fund_amount 原子累加申请金额 + │ │ ├─ 行已同步 → row_op=update、hcs_sync_status=unsynced(待重推 C103-9) + │ │ └─ 行未同步 → 保持 row_op=add(合同链路首推即携带累加金额) + │ └─ 未命中/性质不一致 → 跳过累加,仅日志 + │ + └─③ HCS付款链定时任务 pushHcsPayment(cron 默认 0 2/5 * * * ?,开关 thirdParty.hcs.push.payment.sync-enabled) + 扫描「approved + unsynced/failed 未超限」的付款申请 → HcsPaymentSyncSupport.pushPayment + ① 特批(如需 C106-3) + ② 履约计划重推 C103-9(新增):聚合合同下 row_op≠none 的计划行凭已存 fdId 行级更新 + │ ├─ 整体操作类型:有 fdExeplanId → update(首次 add 的判断逻辑不变) + │ ├─ 合同尚未推送合规(hcs_fd_id 空)→ 跳过(计划行随合同链路首推) + │ └─ 推送失败 → 抛出,由付款链统一 markFailed → 下轮自动重试 + ③ 履约记录 C108-1/2(原有,开关 thirdParty.hcs.push.perf-record…… 独立) + ④ 成功 markSynced 回填整体状态 +``` + +### 2.2 问题2:付款审批 → 自动推送金蝶付款申请(携带履约计划id) + +``` +付款申请审批通过事务提交 + │ KingdeeBillApprovedEvent(BIZ_PAYMENT_APPLICATION) + ▼ +KingdeeApprovalSyncListener(AFTER_COMMIT,失败不影响审批结果) + │ 前置门禁:付款特批未完成(need/pushing/processing)→ 跳过,特批通过后由 HcsPaymentSyncSupport 重新发布事件补推 + ▼ +syncKingdee → doSyncKingdee(单据级事务,幂等预检 + 特批门禁) + ├─ 正式结算付款(settlement_payment)→ A103-1 应付下推(前置 A102-4 校验应付单已生成) + └─ 预付款(progress_advance/project_advance)→ A103-3 直接保存 + ▼ +分录备注 e_remark = 「履约计划id:{hcs_stage_fd_id}」(+ 原备注) + ├─ 计划行匹配:findPaymentStageRow(contractId, fundNatureOfPayment(paymentType)) + │ 优先按款项性质精确匹配已同步付款行 → 无则取首条已同步付款行兜底(与 C108 口径一致) + └─ 无关联不传 / 查询异常仅告警不阻断推送 + ▼ +成功:回填 kingdeeBillId/No、置 synced,联带锁单(lockBusiData)+ 附件上传(A902) +失败:markKingdeeSyncFailed → 定时重推任务(KingdeeAutoSyncRetryTask)与手动「同步金蝶」兜底(重推同样携带履约计划id) +``` + +### 2.3 履约记录(C108)——合同系统的履约付款数据 + +履约记录是付款申请在合同系统的**履约付款数据载体**:每笔审批通过的付款申请在 HCS 生成一条履约记录,凭 `fd_id`(来源履约计划项ID = 计划行 hcs_stage_fd_id)挂在对应履约计划行下,与 §2.1 履约计划款项金额累加、§2.2 金蝶付款申请携带计划id 共同完成「合同系统关联履约付款数据和履约计划」。 + +**生命周期**(HcsPerfRecordSyncSupport.pushPerfRecord): + +``` +付款申请审批通过(approve 置 hcs_sync_status=unsynced) + │ 付款链定时任务扫描(HcsPaymentSyncSupport.pushPayment 第③步,开关 third-party.hcs.push.perf-record.sync-enabled,默认关) + ▼ +无 hcs_perf_fd_id → C108-1 新建 + │ 返回 fdId 立即回填 hcs_perf_fd_id 并持久化(后续更新全靠它) + ▼ +实际付款推进:金蝶付款结果回写任务(A103-2,PaymentKingdeeResultTask → applyPayApplyResult) + │ paidAmount 变化且已有 hcs_perf_fd_id → 置 hcs_sync_status=unsynced + ▼ +下轮付款链扫描 → C108-2 更新(formData.fdId 必填,响应 success 即成功,幂等可重试) +``` + +**报文字段映射**(formData 动态属性,§5.6): + +| 报文字段 | 取值 | 说明 | +| --- | --- | --- | +| fdApplyAmount | appliedAmount | 申请金额(本笔申请付款金额,字符串传值) | +| fdFactAmount | paidAmount | 实际金额(金蝶实付回写后更新) | +| fdApplyNo【必填】 | paymentNo | 付款申请单号 | +| fdPlanDate【必填】 | applyDate | 计划日期(毫秒时间戳) | +| fdPalnType | paymentType | 计划类型(原文拼写 fd_paln_type 必须沿用) | +| fdProperty | 计划行 fundNature | 款项性质(无关联计划行不传) | +| fd_id | 计划行 hcs_stage_fd_id | **来源履约计划项ID**:履约记录与履约计划的挂接键(无关联不传) | +| fdContractId【必填】 | 合同 hcs_fd_id | HCS 合同ID | +| fdBusinessId | payment.id | TMS 付款申请主键(溯源,v4) | +| fdCreateTime / fdXformId | createTime / 配置 | 创建时间戳、表单模板ID(perf-record.xform-id,未配置不传) | + +**附件转传**(C108-1):开关 `third-party.hcs.attachment.transfer-enabled` 开启且付款申请有附件时,经 C103-2 转传后挂 `fd_plan_att` 实体键;无附件传空列表。 + +**状态与重试**:履约记录与特批、履约计划重推共用付款申请的 `hcs_sync_status` 状态机(unsynced→synced/failed→下轮重试,超限人工重推);C108-2 更新按 fdId 幂等,重试无副作用。手动入口:付款申请页「推送合规/重推」按钮(HcsPaymentSyncSupport.repushPayment,重置 unsynced 清零计数立即推送)。 + +--- + +## 3. 字段与状态口径 + +| 字段 | 口径 | +| --- | --- | +| `blade_contract_exe_stage.fund_amount` | 语义修正为**款项金额**(HCS `fdFundAmount` 文档定义):付款审批通过按申请付款金额累加更新;承运商合同默认进度款计划行金额本就留空,首次累加即等于申请付款金额 | +| `row_op` | `none`(已同步无变更)/ `add`(新行/未同步行)/ `update`(已同步行编辑或款项金额累加)/ `delete`(软删行待上报) | +| `hcs_sync_status`(计划行) | 累加后已同步行置 `unsynced`,`hcs_sync_msg=「付款审批款项金额累加,待重推C103-9」`;C103-9 推送成功后清除标记置 synced | +| `hcs_stage_fd_id` | 合规阶段ID(C103-9 返回),行级 update/delete 必传;金蝶备注携带的「履约计划id」即此值——合同系统(HCS)只认自己的阶段ID,不认 TMS 本地主键 | +| 付款类型→款项性质 | `settlement_payment→progress`;`progress_advance`/`project_advance→prepayment` | + +--- + +## 4. 代码改动清单(2026-10-22) + +| 文件 | 改动 | +| --- | --- | +| `service/impl/ContractExeStageServiceImpl.java` | 新增 `findPaymentStageRow(contractId, fundNature)`(性质精确匹配→首条付款行兜底)与 `accumulatePaidAmountOnApprove(payment)`(原子累加 + 标记重推) | +| `service/IContractExeStageService.java` | 上述两方法接口声明 | +| `service/impl/PaymentApplicationServiceImpl.java` | `approve()` 审批通过事务内调用累加;新增 `bfiExeStageRemark()`,A103-1/A103-3 分录备注携带履约计划id | +| `support/hcs/HcsPaymentSyncSupport.java` | `pushPayment()` 编排插入第②步 `pushExeStageUpdate()`:调 `HcsExeStageSyncSupport.syncExeStages` 重推 C103-9 款项金额累加行 | +| `support/hcs/HcsPerfRecordSyncSupport.java` | C108 计划行匹配收敛到 `IContractExeStageService.findPaymentStageRow`(原"取第一条付款行"升级为先按性质精确匹配) | +| `constant/HcsSyncConstant.java` | 新增 `FUND_NATURE_PREPAYMENT` 常量与 `fundNatureOfPayment()` 映射 | +| `pojo/entity/HcsContractExeStage.java`、`blade-hcs-api/HcsExeplanStageDTO.java`、`HcsExeStageSyncSupport.java` | `fundAmount/fdFundAmount` 注释语义修正为「款项金额」(照 HCS 接口文档) | + +--- + +## 5. 配置与开关(全部复用既有配置,无新增) + +| 配置 | 作用 | 默认 | +| --- | --- | --- | +| `thirdParty.hcs.push.payment.sync-enabled` / `.cron` | 付款链任务(含新增的履约计划重推)开关与调度 | 关 / 每 5 分钟 | +| `thirdParty.hcs.push.perf-record.sync-enabled`(hcsProperties.perfRecord) | C108 履约记录开关(关闭时付款链仅推特批+履约计划重推) | 关 | +| `bfi.auto-sync.payment`(BfiProperties) | 审批通过自动推金蝶付款申请开关 | — | +| `thirdParty.hcs.exe-stage.fund-type` | C103-9 金额类型兜底值 | byAmount | + +--- + +## 6. 边界与联调注意事项 + +1. **预付款不误计**:预付款类型匹配不到预付款计划行时跳过累加(不落入进度款行);若业务要求预付款也强制累加,需另行确认落行规则。 +2. **款项金额不含原计划金额**:累加基于 0 起算(默认承运商进度款计划行金额留空,天然吻合);业务自维护了计划金额的行,累加值不会叠加在计划金额上——语义为「累计申请付款金额」,如需「计划金额+累加」口径需再确认。 +3. **重试自愈**:C103-9 履约计划重推失败 → 付款申请整体置 failed → 下轮付款链重试(C108 走 C108-2 幂等更新,无副作用);重试超限后页面「推送合规/重推」人工兜底。 +4. **竞态窗口**:付款审批早于合同首次 C103-9 同步完成时(极少见),计划行仍为 add 未同步——本次只累加金额不置 update,由合同链路首推携带累加后金额,不会产生重复行。 +5. **金蝶备注长度**:`e_remark` 为金蝶非必传文本字段,拼接「履约计划id + 原备注」后长度上限需联调确认(超长会被金蝶强校验拦截时,可改为只送履约计划id)。 +6. **HCS 侧回显**:款项金额经 C103-9 行级 update 覆盖 HCS 履约计划行金额,HCS 页面展示口径变化需与合规侧确认(原计划金额被累计付款金额覆盖属本需求的预期行为)。 diff --git a/doc/docs/hcs合同/2026-10-22-付款申请作废对履约计划款项金额与履约记录的影响分析与补齐方案.md b/doc/docs/hcs合同/2026-10-22-付款申请作废对履约计划款项金额与履约记录的影响分析与补齐方案.md new file mode 100644 index 00000000..c9a6f572 --- /dev/null +++ b/doc/docs/hcs合同/2026-10-22-付款申请作废对履约计划款项金额与履约记录的影响分析与补齐方案.md @@ -0,0 +1,72 @@ +# 付款申请作废对履约计划款项金额与履约记录的影响分析与补齐方案 + +> 结论先行:**目前付款申请作废不会同步修改 HCS 侧数据**——履约计划行款项金额不回减、履约记录不删除不更新,且作废单因状态不在扫描范围,即使本地置了重推标记也没有推送驱动。本文梳理现状、影响与补齐方案(截至 2026-10-22,配套提交 dcda231c)。 +> 关联文档:`2026-10-22-付款审批履约计划款项金额累加与金蝶付款申请携带履约计划id业务流程梳理.md` + +--- + +## 1. 作废现有处理范围(PaymentApplicationServiceImpl.voidBill) + +| 处理 | 说明 | +| --- | --- | +| ✅ 门禁 | 仅审批通过(approved)可作废;金蝶锁单中(lockBusiData 未解锁)禁止作废 | +| ✅ 本地回滚 | 汇票占用释放、联动作废预结算预付记录、删除项目预付核销行、刷新结算单已付汇总 | +| ✅ 状态 | approvalStatus=voided、currentNode=已作废 | +| ❌ 履约计划行款项金额 | 不回减、不重推 C103-9 | +| ❌ 履约记录(C108) | 不删除、不更新 | +| ❌ 金蝶付款申请单 | 不联动金蝶删单(既有行为,另行评估) | + +--- + +## 2. 影响分析 + +| # | 数据 | 作废后状态 | 影响 | +| --- | --- | --- | --- | +| 1 | 履约计划行款项金额(本地 fund_amount) | 审批时累加的申请金额**永久留存** | 本地计划行金额虚高 | +| 2 | HCS 履约计划行(fdFundAmount) | 已推送的累加金额**不会被修正** | 合规侧计划金额虚高,且本地后续修正也无法触达(见 §3) | +| 3 | 履约记录(C108) | 已新建的记录**继续挂在 HCS 计划行下**,实付金额口径也不再更新 | 合规侧展示已作废付款的履约付款数据 | + +--- + +## 3. 连锁问题:作废单没有重推驱动 + +付款链定时任务扫描条件为 `approvalStatus = approved`(不含 voided/returned)。作废后该单永远不再进入扫描: + +- 本地计划行即使置 `row_op=update`,也不会被付款链推送; +- 只能等**同合同下一笔付款审批**(pushPayment 第②步会捎带重推该合同全部待同步计划行)、或合同页手动重推时捎带; +- 长期无付款的合同,错误金额将一直停留在 HCS。 + +--- + +## 4. 补齐方案 + +### 4.1 履约计划款项金额回减(建议实施) + +1. **回减**:`voidBill` 事务内,按审批累加的同一匹配规则(合同 + performType=payment + 款项性质精确匹配)找到计划行,`fund_amount = coalesce(fund_amount,0) - applied_amount` 原子回减(防并发);已同步行置 `row_op=update` + 待同步。 +2. **重推驱动**:作废单进不了付款链扫描,需新增轻量事件(如 `HcsPaymentVoidedEvent`)+ AFTER_COMMIT 监听器,事务提交后直接调 `HcsExeStageSyncSupport.syncExeStages(contract)` 重推 C103-9(复用既有行级 update 凭 fdId 更新链路,失败仅告警落库待补偿)。 +3. **回减为负保护**:若计划行金额已不足回减(如同行金额被业务编辑过),按 0 兜底并在日志/同步信息中标注,避免推送负数金额。 + +### 4.2 履约记录(受接口限制,待外部确认) + +C108 仅有新建(C108-1)/更新(C108-2)接口,**无删除/作废接口**: + +- 程序上无法清除 HCS 侧已生成的履约记录; +- 可选过渡口径(需与合规侧确认):a) 合规侧人工删除;b) HCS 扩展作废接口后 TMS 对接;c) C108-2 更新金额为 0/备注作废标识(语义是否被合规侧接受待确认)。 + +--- + +## 5. 待确认事项 + +| # | 事项 | 确认方 | +| --- | --- | --- | +| 1 | 作废是否需要回减履约计划款项金额(还是保留作为"历史发生额") | 业务 | +| 2 | C108 履约记录作废/删除的合规侧处理方式(人工/接口扩展/更新为0) | 合规侧 | +| 3 | 金蝶付款申请单是否需要联动作废/删单(现状:不联动) | 业务+财务 | +| 4 | 已作废单若金蝶侧已实付(先付款后作废的极端场景),回减与实付口径冲突如何处理 | 业务 | + +--- + +## 6. 临时兜底(方案实施前的人工处理) + +1. 发现作废单导致计划行金额虚高:合同履约规则页编辑该行金额(自动置 update),随后同合同任一付款审批或合同手动重推捎带 C103-9 修正; +2. HCS 侧履约记录:联系合规管理员人工删除。 From fa08c1dd90754e292dfdc68c4cf9772187c254c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 19:10:16 +0800 Subject: [PATCH 102/124] =?UTF-8?q?feat:=20HCS=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E6=96=B0=E5=A2=9EC104-2=E6=94=B6=E6=AC=BE=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E4=B8=8E=E8=AE=A4=E9=A2=86?= =?UTF-8?q?=E9=93=BE=E5=90=8C=E6=AD=A5=E5=BC=80=E5=85=B3=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - IHcsClient 新增 C104-2 collectionFlowList 接口(按明细流水号定位合规收款流水ID) - 新增 HcsCollectionFlowVO 收款流水分页行出参 - HcsPerfRecordPropsDTO 补充接口新版 fd_plan_id(必填)与 fd_jd_doc_no 字段 - HcsProperties 新增 claim 认领链同步开关(thirdParty.hcs.claim.sync-enabled,默认关) --- .../springblade/hcs/config/HcsProperties.java | 12 +++ .../hcs/dto/HcsCollectionFlowVO.java | 74 +++++++++++++++++++ .../hcs/dto/HcsPerfRecordPropsDTO.java | 10 +++ .../org/springblade/hcs/feign/IHcsClient.java | 11 +++ 4 files changed, 107 insertions(+) create mode 100644 blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCollectionFlowVO.java diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 5e0ca285..919b333f 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -124,6 +124,10 @@ public class HcsProperties { * 收票单(C109)配置 */ private ReceiptBill receiptBill = new ReceiptBill(); + /** + * 收款认领链(C103-9 更新履约计划 + C107-1 认领记录 + C108-1 履约流水)配置 + */ + private Claim claim = new Claim(); /** * 附件转传(C103-2)配置 */ @@ -322,6 +326,14 @@ public class HcsProperties { private String xformId = ""; } + @Data + public static class Claim { + /** + * 收款认领链同步开关(金蝶认领推送 A301-3 成功后推 C103-9/C107-1/C108-1,默认关) + */ + private boolean syncEnabled = false; + } + @Data public static class Attachment { /** diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCollectionFlowVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCollectionFlowVO.java new file mode 100644 index 00000000..ebc3af2a --- /dev/null +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsCollectionFlowVO.java @@ -0,0 +1,74 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for their own commercial purposes. + *

    + * Using this software signifies agreement to this license agreement and terms of use, + * and you expressly agree to be bound by the terms of use of this software. + *

    + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.hcs.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 合同合规系统(HCS)C104-2 收款流水分页行(认领记录推送前按明细流水号定位合规侧收款流水ID) + *

    + * 合规侧收款流水由合规自 ERP 侧同步(fdDataSource 默认 erp),TMS 以明细流水号(fdDetailSerialNumber) + * 精确匹配取 fdId,供 C107-1 认领记录的 fdCollectionFlow.fdId 引用。 + * + * @author Chill + */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class HcsCollectionFlowVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 合规收款流水ID(C107-1 fdCollectionFlow.fdId 引用) + */ + private String fdId; + /** + * 认领公告 + */ + private String fdClaimNotice; + /** + * 明细流水号(与 TMS blade_kingdee_receipt_flow.detail_serial_no 同源) + */ + private String fdDetailSerialNumber; + /** + * 收款金额 + */ + private BigDecimal fdCollectionAmount; + /** + * 认领状态:0=未认领,1=部分认领,2=认领完成 + */ + private Integer fdClaimStatus; + /** + * 已认领金额 + */ + private BigDecimal fdClaimedAmount; +} diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java index 20fcbcf3..2ba5302f 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsPerfRecordPropsDTO.java @@ -92,6 +92,16 @@ public class HcsPerfRecordPropsDTO implements Serializable { */ @JsonProperty("fd_id") private String fdId; + /** + * 履约计划id(关联履约阶段 hcs_stage_fd_id,接口必填,HCS 只认自己的阶段ID) + */ + @JsonProperty("fd_plan_id") + private String fdPlanId; + /** + * 金蝶单据号(溯源用) + */ + @JsonProperty("fd_jd_doc_no") + private String fdJdDocNo; /** * 合同ID(HCS 合同ID) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java index a119b917..916c36f0 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/feign/IHcsClient.java @@ -31,6 +31,7 @@ import org.springblade.hcs.dto.HcsAttachmentDownloadDTO; import org.springblade.hcs.dto.HcsAttachmentVO; import org.springblade.hcs.dto.HcsCategoryVO; import org.springblade.hcs.dto.HcsClaimRecordAddDTO; +import org.springblade.hcs.dto.HcsCollectionFlowVO; import org.springblade.hcs.dto.HcsContractDetailQueryDTO; import org.springblade.hcs.dto.HcsContractDetailVO; import org.springblade.hcs.dto.HcsContractDraftDTO; @@ -107,6 +108,7 @@ public interface IHcsClient { String INVOICE_REG_ADD_URL = "${thirdParty.hcs.invoiceRegAddUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/add}"; String INVOICE_REG_UPDATE_URL = "${thirdParty.hcs.invoiceRegUpdateUrl:/openapi/eop-data/eopDataInvoiceRegistrationOpen/update}"; String CLAIM_RECORD_ADD_URL = "${thirdParty.hcs.claimRecordAddUrl:/openapi/eop-data/eopDataCollectionFlowClaimRecordOpen/add}"; + String COLLECTION_FLOW_LIST_URL = "${thirdParty.hcs.collectionFlowListUrl:/openapi/eop-data/eopDataCollectionFlowOpen/list}"; /** * C102-1 项目立项新建 @@ -338,4 +340,13 @@ public interface IHcsClient { */ @PostMapping(CLAIM_RECORD_ADD_URL) HcsResult claimRecordAdd(@RequestBody HcsClaimRecordAddDTO param); + + /** + * C104-2 查询收款流水列表(认领记录推送前按明细流水号定位合规侧收款流水ID) + * + * @param param 分页查询参数(conditions.fdDetailSerialNumber 按明细流水号精确查询) + * @return 收款流水分页数据 + */ + @PostMapping(COLLECTION_FLOW_LIST_URL) + HcsResult> collectionFlowList(@RequestBody HcsPageQueryDTO param); } From 5c8324b8a6ea0f765926d60228342907b71f1299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 19:10:22 +0800 Subject: [PATCH 103/124] =?UTF-8?q?feat:=20=E9=87=91=E8=9D=B6=E8=AE=A4?= =?UTF-8?q?=E9=A2=86=E6=8E=A8=E9=80=81=E5=AE=8C=E6=88=90=E5=90=8E=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=90=88=E5=90=8C=E5=90=88=E8=A7=84=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=EF=BC=88C103-9/C107-1/C108-1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 HcsClaimSyncSupport 认领链编排:金蝶认领推送(A301-3)成功后按合同分组推送 ① C103-9 认领金额原子累加收款计划行并重推(未推送合规随合同链路首推) ② C107-1 按「认领主单×合同」推送认领记录(合规流水ID经C104-2定位) ③ C108-1 按合同新增履约流水(fd_plan_id=收款计划行合规阶段ID) - IContractExeStageService 新增 findCollectionStageRow / accumulateClaimedAmountOnPush - ReceiptFlowServiceImpl.pushClaimLocked 事务提交后挂钩,失败仅日志不影响金蝶推送结果 - 单合同失败不影响其余合同;开关关闭零开销 --- .../service/IContractExeStageService.java | 20 + .../impl/ContractExeStageServiceImpl.java | 54 +++ .../service/impl/ReceiptFlowServiceImpl.java | 11 +- .../support/hcs/HcsClaimSyncSupport.java | 370 ++++++++++++++++++ 4 files changed, 453 insertions(+), 2 deletions(-) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsClaimSyncSupport.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java index 30c85811..6c8937b7 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractExeStageService.java @@ -30,6 +30,7 @@ import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.HcsContractExeStage; import org.springblade.transport.pojo.entity.PaymentApplication; +import java.math.BigDecimal; import java.util.List; /** @@ -56,6 +57,25 @@ public interface IContractExeStageService extends BaseServicelambdaQuery() + .eq(HcsContractExeStage::getContractId, contractId) + .eq(HcsContractExeStage::getPerformType, HcsSyncConstant.PERFORM_TYPE_COLLECTION) + .eq(HcsContractExeStage::getFundNature, fundNature) + .isNotNull(HcsContractExeStage::getHcsStageFdId) + .orderByAsc(HcsContractExeStage::getId) + .last("limit 1"), false); + if (natureRow != null) { + return natureRow; + } + } + // 兜底:无该款项性质已同步行时取首条已同步收款行 + return getOne(Wrappers.lambdaQuery() + .eq(HcsContractExeStage::getContractId, contractId) + .eq(HcsContractExeStage::getPerformType, HcsSyncConstant.PERFORM_TYPE_COLLECTION) + .isNotNull(HcsContractExeStage::getHcsStageFdId) + .orderByAsc(HcsContractExeStage::getId) + .last("limit 1"), false); + } + + @Override + public void accumulateClaimedAmountOnPush(Long contractId, BigDecimal claimedAmount) { + if (contractId == null || claimedAmount == null || claimedAmount.signum() <= 0) { + return; + } + HcsContractExeStage stageRow = this.findCollectionStageRow(contractId, HcsSyncConstant.FUND_NATURE_PROGRESS); + if (stageRow == null) { + log.info("收款认领未匹配到已同步收款履约计划行,跳过款项金额累加:contractId={}", contractId); + return; + } + // 原子累加防并发认领推送丢失更新(coalesce 兼容多数据库) + update(Wrappers.lambdaUpdate() + .eq(HcsContractExeStage::getId, stageRow.getId()) + .setSql("fund_amount = coalesce(fund_amount, 0) + " + claimedAmount.toPlainString())); + boolean resyncNeeded = StringUtil.isNotBlank(stageRow.getHcsStageFdId()); + if (resyncNeeded) { + // 已同步行置 update 凭已存合规阶段ID 随 C103-9 重推;未同步行保持 add 待合同链路首推 + update(Wrappers.lambdaUpdate() + .eq(HcsContractExeStage::getId, stageRow.getId()) + .set(HcsContractExeStage::getRowOp, HcsSyncConstant.ROW_OP_UPDATE) + .set(HcsContractExeStage::getHcsSyncStatus, HcsSyncConstant.HCS_STATUS_UNSYNCED) + .set(HcsContractExeStage::getHcsSyncMsg, "收款认领金额累加,待重推C103-9")); + } + log.info("收款认领履约计划款项金额累加:contractId={},stageRowId={},累加金额={},rowOp={}", + contractId, stageRow.getId(), claimedAmount, resyncNeeded ? "update" : "add(待合同链路首推)"); + } + @Override @Transactional(rollbackFor = Exception.class) public boolean submitRows(Long contractId, List rows) { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java index e6c6aecd..899315a4 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java @@ -65,6 +65,7 @@ import org.springblade.transport.service.IFormalSettlementService; import org.springblade.transport.service.IReceiptFlowService; import org.springblade.transport.support.KingdeeSyncLockSupport; import org.springblade.transport.support.TransportBusinessSupport; +import org.springblade.transport.support.hcs.HcsClaimSyncSupport; import org.springblade.transport.wrapper.ReceiptFlowWrapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -130,6 +131,7 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl selectPage(IPage page, ReceiptFlowVO query) { @@ -904,10 +906,15 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl doPushClaimToKingdee(flowId, announce)); + ReceiptClaimPushResult result = transactionTemplate.execute(status -> doPushClaimToKingdee(flowId, announce)); + if (result != null && result.isSuccess()) { + hcsClaimSyncSupport.pushClaimToHcs(flowId); + } + return result; } /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsClaimSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsClaimSyncSupport.java new file mode 100644 index 00000000..f53798b4 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsClaimSyncSupport.java @@ -0,0 +1,370 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

    + * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

    + * 1. This software is for development use only under a valid license + * from BladeX. + *

    + * 2. Redistribution of this software's source code to any third party + * is strictly prohibited. + *

    + * 3. Licensees may copyright their own code but cannot use segments + * from this software for their own commercial purposes. + *

    + * Using this software signifies agreement to this license agreement and terms of use, + * and you expressly agree to be bound by the terms of use of this software. + *

    + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + *

    + * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.support.hcs; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.hcs.config.HcsProperties; +import org.springblade.hcs.dto.HcsClaimRecordAddDTO; +import org.springblade.hcs.dto.HcsCollectionFlowVO; +import org.springblade.hcs.dto.HcsFormSaveVO; +import org.springblade.hcs.dto.HcsIdVO; +import org.springblade.hcs.dto.HcsMechanismsDTO; +import org.springblade.hcs.dto.HcsPageQueryDTO; +import org.springblade.hcs.dto.HcsPageVO; +import org.springblade.hcs.dto.HcsPerfRecordFormDataDTO; +import org.springblade.hcs.dto.HcsPerfRecordPropsDTO; +import org.springblade.hcs.dto.HcsPerfRecordSaveDTO; +import org.springblade.hcs.dto.HcsRefVO; +import org.springblade.hcs.dto.HcsResult; +import org.springblade.hcs.dto.HcsUserRefVO; +import org.springblade.hcs.exception.HcsException; +import org.springblade.hcs.feign.IHcsClient; +import org.springblade.transport.constant.HcsSyncConstant; +import org.springblade.transport.mapper.ContractManageMapper; +import org.springblade.transport.mapper.FormalSettlementMapper; +import org.springblade.transport.mapper.KingdeeReceiptFlowMapper; +import org.springblade.transport.mapper.ReceiptClaimMapper; +import org.springblade.transport.mapper.ReceiptClaimSettlementMapper; +import org.springblade.transport.pojo.entity.ContractManage; +import org.springblade.transport.pojo.entity.FormalSettlement; +import org.springblade.transport.pojo.entity.HcsContractExeStage; +import org.springblade.transport.pojo.entity.KingdeeReceiptFlow; +import org.springblade.transport.pojo.entity.ReceiptClaim; +import org.springblade.transport.pojo.entity.ReceiptClaimSettlement; +import org.springblade.transport.service.IContractExeStageService; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * HCS 收款认领链推送编排支撑组件(C103-9 更新履约计划 + C107-1 认领记录 + C108-1 履约流水) + *

    + * 触发点:金蝶认领推送(A301-3)成功之后(手动按钮与定时任务共用钩子),开关 thirdParty.hcs.claim.sync-enabled。 + * 编排顺序:先 C103-9(认领金额累加到收款履约计划行并重推,C107-1/C108-1 引用其返回的阶段ID), + * 再按「认领主单 × 合同」推 C107-1(合规流水ID 经 C104-2 按明细流水号定位),最后按合同推 C108-1 履约流水。 + * 合同未推送合规(hcs_fd_id 空)时仅累加计划行金额,随合同链路首推。 + * 推送失败仅记日志不回滚金蝶推送结果(单合同失败不影响其余合同)。 + * + * @author Chill + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class HcsClaimSyncSupport { + + /** + * 认领完成状态(与 ReceiptFlowServiceImpl.CLAIMED 同值) + */ + private static final String CLAIMED = "claimed"; + + private final IHcsClient hcsClient; + private final HcsProperties hcsProperties; + private final KingdeeReceiptFlowMapper receiptFlowMapper; + private final ReceiptClaimMapper claimMapper; + private final ReceiptClaimSettlementMapper claimSettlementMapper; + private final FormalSettlementMapper formalSettlementMapper; + private final ContractManageMapper contractManageMapper; + private final IContractExeStageService contractExeStageService; + private final HcsExeStageSyncSupport hcsExeStageSyncSupport; + + /** + * 金蝶认领推送成功后推送合同合规(C103-9 → C107-1 → C108-1) + *

    + * 开关关闭或推送异常均静默返回,不影响金蝶认领推送主流程与事务。 + * + * @param flowId 收款流水ID + */ + public void pushClaimToHcs(Long flowId) { + if (!hcsProperties.getClaim().isSyncEnabled()) { + return; + } + try { + doPushClaimToHcs(flowId); + } catch (Exception exception) { + log.error("HCS收款认领链推送异常 flowId:{}", flowId, exception); + } + } + + /** + * 推送主体:归集有效认领分摊(按合同分组)→ 逐合同推送(单合同失败不影响其余合同) + */ + private void doPushClaimToHcs(Long flowId) { + KingdeeReceiptFlow flow = receiptFlowMapper.selectById(flowId); + if (flow == null) { + return; + } + // 未作废认领主单(作废认领不同步合规) + List claims = claimMapper.selectList(Wrappers.lambdaQuery() + .eq(ReceiptClaim::getReceiptFlowId, flowId) + .eq(ReceiptClaim::getClaimStatus, CLAIMED)); + if (claims.isEmpty()) { + return; + } + // 有效分摊行(作废时已置 status=0) + List allocations = claimSettlementMapper.selectList( + Wrappers.lambdaQuery() + .eq(ReceiptClaimSettlement::getReceiptFlowId, flowId) + .eq(ReceiptClaimSettlement::getStatus, 1) + .eq(ReceiptClaimSettlement::getIsDeleted, 0)); + if (allocations.isEmpty()) { + return; + } + // 结算单批量定位合同(一次 IN 查询,避免逐行 N+1) + Map settlements = formalSettlementMapper.selectBatchIds( + allocations.stream().map(ReceiptClaimSettlement::getFormalSettlementId) + .filter(Objects::nonNull).distinct().toList()).stream() + .collect(Collectors.toMap(FormalSettlement::getId, item -> item, (first, second) -> first)); + // 合同id → 认领主单id → 分摊金额 + Map> amountByContractByClaim = new LinkedHashMap<>(); + for (ReceiptClaimSettlement allocation : allocations) { + FormalSettlement settlement = settlements.get(allocation.getFormalSettlementId()); + if (settlement == null || settlement.getContractId() == null + || allocation.getReceiptClaimId() == null || allocation.getAllocatedReceiptAmount() == null) { + continue; + } + amountByContractByClaim + .computeIfAbsent(settlement.getContractId(), key -> new LinkedHashMap<>()) + .merge(allocation.getReceiptClaimId(), allocation.getAllocatedReceiptAmount(), BigDecimal::add); + } + if (amountByContractByClaim.isEmpty()) { + log.info("HCS收款认领链推送跳过:分摊行未关联合同 flowId={}", flowId); + return; + } + // 合规侧收款流水ID(C107-1 必填引用,一次定位全部合同共用;定位失败仅跳过 C107-1,不阻塞履约计划更新) + String hcsCollectionFlowId = null; + try { + hcsCollectionFlowId = locateHcsCollectionFlowId(flow); + } catch (Exception exception) { + log.error("HCS收款流水定位失败 flowId:{},跳过C107-1认领记录推送", flowId, exception); + } + for (Map.Entry> contractEntry : amountByContractByClaim.entrySet()) { + try { + pushOneContract(flow, claims, contractEntry.getKey(), contractEntry.getValue(), hcsCollectionFlowId); + } catch (Exception exception) { + log.error("HCS收款认领链推送失败 flowId:{},contractId:{}", flowId, contractEntry.getKey(), exception); + } + } + } + + /** + * 推送单个合同:① C103-9 更新履约计划(认领金额累加重推)→ ② C107-1 认领记录(按认领主单分组)→ ③ C108-1 履约流水 + */ + private void pushOneContract(KingdeeReceiptFlow flow, List claims, Long contractId, + Map amountByClaim, String hcsCollectionFlowId) { + ContractManage contractManage = contractManageMapper.selectById(contractId); + if (contractManage == null) { + log.warn("HCS收款认领链推送跳过:合同不存在 contractId={}", contractId); + return; + } + BigDecimal claimedTotal = amountByClaim.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add); + // ① C103-9 更新合同履约计划:认领金额累加到收款计划行;已同步行置 update 凭阶段ID 重推 + contractExeStageService.accumulateClaimedAmountOnPush(contractId, claimedTotal); + HcsContractExeStage stageRow = contractExeStageService.findCollectionStageRow(contractId, HcsSyncConstant.FUND_NATURE_PROGRESS); + if (StringUtil.isNotBlank(contractManage.getHcsFdId())) { + // 行级重推(无待同步行返回提示,不视为失败);合同未推送合规时随合同链路首推 + hcsExeStageSyncSupport.syncExeStages(contractManage); + } + // ② C107-1 认领记录:按「认领主单 × 合同」推送,金额为该认领主单分摊到本合同的金额 + if (StringUtil.isBlank(hcsCollectionFlowId)) { + log.warn("HCS认领记录推送跳过:未定位到合规收款流水 flowId={},detailSerialNo={}", flow.getId(), flow.getDetailSerialNo()); + } else { + Map claimsById = claims.stream() + .collect(Collectors.toMap(ReceiptClaim::getId, item -> item, (first, second) -> first)); + for (Map.Entry claimEntry : amountByClaim.entrySet()) { + pushClaimRecord(flow, claimsById.get(claimEntry.getKey()), contractManage, stageRow, claimEntry.getValue(), hcsCollectionFlowId); + } + } + // ③ C108-1 履约流水:按合同一条,须已推送合规且存在已同步收款计划行(fd_plan_id 必填) + if (StringUtil.isBlank(contractManage.getHcsFdId())) { + log.info("HCS履约流水推送跳过:合同尚未推送合规 contractNo={}", contractManage.getContractNo()); + return; + } + if (stageRow == null || StringUtil.isBlank(stageRow.getHcsStageFdId())) { + log.info("HCS履约流水推送跳过:无已同步收款履约计划行 contractNo={}", contractManage.getContractNo()); + return; + } + pushPerfRecord(flow, contractManage, stageRow, claimedTotal, latestClaimDate(claims)); + } + + /** + * C107-1 认领记录推送(单认领主单 × 单合同) + */ + private void pushClaimRecord(KingdeeReceiptFlow flow, ReceiptClaim claim, ContractManage contractManage, + HcsContractExeStage stageRow, BigDecimal claimAmount, String hcsCollectionFlowId) { + if (claim == null || claimAmount == null || claimAmount.signum() <= 0) { + return; + } + HcsClaimRecordAddDTO param = new HcsClaimRecordAddDTO(); + // 【必填】收款流水引用(合规侧流水ID,C104-2 按明细流水号定位) + HcsRefVO collectionFlow = new HcsRefVO(); + collectionFlow.setFdId(hcsCollectionFlowId); + param.setFdCollectionFlow(collectionFlow); + // 认领合同引用(fdId 为合规合同ID) + HcsRefVO contractRef = new HcsRefVO(); + contractRef.setFdId(contractManage.getHcsFdId()); + contractRef.setFdName(contractManage.getContractName()); + param.setFdContract(contractRef); + // 【必填】认领合同编号(须在合规系统本地存在) + param.setFdContractNumber(contractManage.getContractNo()); + // 对应履约项ID 与 认领款项类型(取合同收款计划行,无已同步行不传) + if (stageRow != null) { + param.setFdExePlanStageId(stageRow.getHcsStageFdId()); + param.setFdFundNature(stageRow.getFundNature()); + } + // 认领人/部门:TMS 与合规用户不同源,仅传名称(§9-U2) + param.setFdClaimer(HcsRefVO.ofName(claim.getClaimerName())); + param.setFdClaimerName(claim.getClaimerName()); + param.setFdClaimerDept(HcsRefVO.ofName(claim.getClaimerDeptName())); + param.setFdClaimerDeptName(claim.getClaimerDeptName()); + // 【必填】认领金额 + param.setFdClaimAmount(claimAmount); + param.setFdClaimDate(toMillis(claim.getClaimDate())); + param.setFdRemark(claim.getRemark()); + // 状态 0=已认领(仅推送未作废认领) + param.setFdStatus(0); + log.info("HCS认领记录推送开始 flowId:{},claimId:{},contractNo:{},认领金额 {}", + flow.getId(), claim.getId(), contractManage.getContractNo(), claimAmount); + HcsResult result = hcsClient.claimRecordAdd(param); + if (result == null || !result.isSuccess()) { + log.error("HCS认领记录推送失败响应:{},claimId={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), claim.getId()); + throw new HcsException("C107-1 认领记录推送失败:" + (result == null ? "响应为空" : result.getMsg())); + } + // shortcut: C107-1 返回 fdId 未持久化(认领作废同步 C107-3 未实现,重推会重复);需作废联动时先落库 + log.info("HCS认领记录推送成功 flowId:{},claimId:{},contractNo:{},claimRecordFdId:{}", + flow.getId(), claim.getId(), contractManage.getContractNo(), + result.getData() == null ? "响应未返回" : result.getData().getFdId()); + } + + /** + * C108-1 履约流水推送(单合同一条:申请金额=实际金额=该合同累计认领金额) + */ + private void pushPerfRecord(KingdeeReceiptFlow flow, ContractManage contractManage, + HcsContractExeStage stageRow, BigDecimal claimedTotal, LocalDate planDate) { + // 表单模板ID(配置 perf-record.xform-id,环境值 §9-U9,未配置不传) + String xformId = StringUtil.isBlank(hcsProperties.getPerfRecord().getXformId()) ? null : hcsProperties.getPerfRecord().getXformId(); + HcsPerfRecordPropsDTO props = new HcsPerfRecordPropsDTO(); + // 【必填】申请编号:收款通知单号,兜底明细流水号 + props.setFdApplyNo(firstNonBlank(flow.getReceiptNoticeNo(), flow.getDetailSerialNo())); + // 申请金额 / 实际金额:该合同累计认领金额 + props.setFdApplyAmount(claimedTotal.toPlainString()); + props.setFdFactAmount(claimedTotal.toPlainString()); + // 【必填】履约日期:最近认领日期(毫秒时间戳) + props.setFdPlanDate(toMillis(planDate)); + // 履约类型:收款 + props.setFdPalnType(HcsSyncConstant.PERFORM_TYPE_COLLECTION); + // 履约性质:收款计划行款项性质 + props.setFdProperty(stageRow.getFundNature()); + // 履约计划id / 来源履约计划项ID:收款计划行合规阶段ID(HCS 只认自己的阶段ID) + props.setFdId(stageRow.getHcsStageFdId()); + props.setFdPlanId(stageRow.getHcsStageFdId()); + // 金蝶单据号:A301-3 推送返回的金蝶收款单号 + props.setFdJdDocNo(flow.getKingdeeBillNo()); + // 【必填】合同ID:HCS 合同ID + props.setFdContractId(contractManage.getHcsFdId()); + // 业务ID:TMS 收款流水ID(溯源) + props.setFdBusinessId(String.valueOf(flow.getId())); + props.setFdCreateTime(System.currentTimeMillis()); + props.setFdXformId(xformId); + HcsPerfRecordFormDataDTO formData = new HcsPerfRecordFormDataDTO(); + formData.setFdXformId(xformId); + formData.setDynamicProps(props); + // 机制数据(C108-1 必填):认领附件暂不转传,传空列表 + HcsMechanismsDTO mechanisms = new HcsMechanismsDTO(); + mechanisms.setAttachment(List.of()); + HcsPerfRecordSaveDTO param = new HcsPerfRecordSaveDTO(); + param.setCurUser(HcsUserRefVO.ofLoginName(hcsProperties.getOperatorLoginName())); + param.setFormData(formData); + param.setMechanisms(mechanisms); + log.info("HCS履约流水新建开始 flowId:{},contractNo:{},认领金额 {}", flow.getId(), contractManage.getContractNo(), claimedTotal); + HcsResult result = hcsClient.perfRecordAdd(param); + if (result == null || !result.isSuccess() || result.getData() == null || StringUtil.isBlank(result.getData().getFdId())) { + log.error("HCS履约流水新建失败响应:{},contractNo={}", result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), contractManage.getContractNo()); + throw new HcsException("C108-1 履约流水新建失败:" + (result == null ? "响应为空" : result.getMsg())); + } + // shortcut: 履约流水 fdId 未持久化(认领链无 C108-2 更新场景);需推进实际金额更新时先落库 + log.info("HCS履约流水新建成功 flowId:{},contractNo:{},perfFdId:{}", + flow.getId(), contractManage.getContractNo(), result.getData().getFdId()); + } + + /** + * C104-2 定位合规侧收款流水ID:按明细流水号精确查询(合规流水由合规自 ERP 同步,TMS 镜像同源) + */ + private String locateHcsCollectionFlowId(KingdeeReceiptFlow flow) { + if (StringUtil.isBlank(flow.getDetailSerialNo())) { + log.warn("HCS收款流水定位跳过:流水缺少明细流水号 flowId={}", flow.getId()); + return null; + } + HcsPageQueryDTO param = new HcsPageQueryDTO(); + param.setColumns(List.of("fdId", "fdClaimNotice", "fdDetailSerialNumber", "fdCollectionAmount", "fdClaimStatus", "fdClaimedAmount")); + param.setConditions(Map.of("fdDetailSerialNumber", flow.getDetailSerialNo())); + param.setOffset(0); + param.setPageSize(10); + HcsResult> result = hcsClient.collectionFlowList(param); + if (result == null || !result.isSuccess() || result.getData() == null) { + throw new HcsException("C104-2 收款流水查询失败:" + (result == null ? "响应为空" : result.getMsg())); + } + return result.getData().getContent().stream() + .filter(item -> flow.getDetailSerialNo().equals(item.getFdDetailSerialNumber())) + .map(HcsCollectionFlowVO::getFdId) + .filter(StringUtil::isNotBlank) + .findFirst().orElse(null); + } + + /** + * 最近认领日期(C108-1 履约日期) + */ + private LocalDate latestClaimDate(List claims) { + return claims.stream() + .map(ReceiptClaim::getClaimDate) + .filter(Objects::nonNull) + .max(LocalDate::compareTo) + .orElse(LocalDate.now()); + } + + private String firstNonBlank(String... values) { + for (String value : values) { + if (Func.isNotEmpty(value)) { + return value.trim(); + } + } + return null; + } + + private Long toMillis(LocalDate localDate) { + return localDate == null ? null : localDate.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } +} From 62f523928aeffc37e5df5fdd25803565a1265206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 19:10:52 +0800 Subject: [PATCH 104/124] =?UTF-8?q?chore:=20=E8=A1=A5=E5=85=85=E6=94=B6?= =?UTF-8?q?=E6=AC=BE=E8=AE=A4=E9=A2=86=E5=90=88=E8=A7=84=E9=93=BENacos?= =?UTF-8?q?=E5=BC=80=E5=85=B3=E9=85=8D=E7=BD=AE=E6=A0=B7=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - third-party-api.yaml / blade-dev.yaml hcs 节点新增 claim.sync-enabled(HCS_CLAIM_SYNC_ENABLED,默认关) --- doc/nacos/blade-dev.yaml | 4 ++++ doc/nacos/third-party-api.yaml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/doc/nacos/blade-dev.yaml b/doc/nacos/blade-dev.yaml index 571180d4..67ad9acd 100644 --- a/doc/nacos/blade-dev.yaml +++ b/doc/nacos/blade-dev.yaml @@ -327,6 +327,10 @@ thirdParty: sync-enabled: ${HCS_PERF_RECORD_SYNC_ENABLED:false} # 表单模板ID(fd_xform_id,环境相关值,§9-U9 待合规方提供) xform-id: ${HCS_PERF_RECORD_XFORM_ID:} + # 收款认领链(金蝶认领推送成功后:C103-9 更新履约计划 + C107-1 认领记录 + C108-1 履约流水) + claim: + # 认领链同步总开关(默认关,对接后打开) + sync-enabled: ${HCS_CLAIM_SYNC_ENABLED:false} # 附件转传(C103-2) attachment: # 附件转传总开关 diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 8ca005cc..201d6ddc 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -250,6 +250,10 @@ thirdParty: sync-enabled: ${HCS_PERF_RECORD_SYNC_ENABLED:false} # 表单模板ID(fd_xform_id,环境相关值,§9-U9 待合规方提供) xform-id: ${HCS_PERF_RECORD_XFORM_ID:} + # 收款认领链(金蝶认领推送成功后:C103-9 更新履约计划 + C107-1 认领记录 + C108-1 履约流水) + claim: + # 认领链同步总开关(默认关,对接后打开) + sync-enabled: ${HCS_CLAIM_SYNC_ENABLED:false} # 附件转传(C103-2) attachment: # 附件转传总开关 From 3e01a32cc6c589b968f8055f8727b20393ac72cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 19:11:13 +0800 Subject: [PATCH 105/124] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9E=E6=94=B6?= =?UTF-8?q?=E6=AC=BE=E8=AE=A4=E9=A2=86=E5=90=8C=E6=AD=A5=E5=90=88=E5=90=8C?= =?UTF-8?q?=E5=90=88=E8=A7=84=E4=B8=9A=E5=8A=A1=E6=B5=81=E7=A8=8B=E6=A2=B3?= =?UTF-8?q?=E7=90=86=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 收款认领推送金蝶完成后同步合同合规(C103-9履约计划/C107-1认领记录/C108-1履约流水) 含业务逻辑总览、全链路流程、接口与字段映射、代码改动清单、启用操作过程与边界说明 --- ...(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理.md | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 doc/docs/hcs合同/2026-10-22-收款认领推送金蝶完成后同步合同合规系统(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理.md diff --git a/doc/docs/hcs合同/2026-10-22-收款认领推送金蝶完成后同步合同合规系统(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理.md b/doc/docs/hcs合同/2026-10-22-收款认领推送金蝶完成后同步合同合规系统(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理.md new file mode 100644 index 00000000..553257f6 --- /dev/null +++ b/doc/docs/hcs合同/2026-10-22-收款认领推送金蝶完成后同步合同合规系统(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理.md @@ -0,0 +1,182 @@ +# 收款认领推送金蝶完成后同步合同合规系统(C103-9 履约计划 + C107-1 认领记录 + C108-1 履约流水)业务流程梳理 + +> 需求:金蝶认领推送(A301-3)完成后,把认领记录推送给合同合规系统(HCS)——① C103-9 更新合同履约计划(认领金额累加到收款计划行并重推);② C107-1 新增认领记录;③ C108-1 新增履约流水。整体做一个开关。 +> 关键口径:C107-1 的 `fdCollectionFlow.fdId` 为**合规系统自己的收款流水ID**(非 TMS 本地主键),经 C104-2 按明细流水号定位(合规侧流水由合规自 ERP 同步,与 TMS A301-2 镜像同源);C107-1/C108-1 引用的履约项ID 均为 C103-9 返回的阶段ID(hcs_stage_fd_id)。 +> 代码改动日期:2026-10-22,`mvn compile` 通过。 + +--- + +## 1. 业务逻辑总览 + +| # | 规则 | 说明 | +| --- | --- | --- | +| 1 | 触发点唯一:A301-3 推送成功之后 | 挂在 `pushClaimLocked`(金蝶认领推送事务模板)返回成功后执行,手动「推送金蝶」按钮与定时任务两条路共用;金蝶推送事务已提交,合规推送失败不影响金蝶推送结果 | +| 2 | 总开关 | `thirdParty.hcs.claim.sync-enabled`(`HcsProperties.claim.syncEnabled`,默认 false),关闭时整个认领链不执行、零开销 | +| 3 | 按合同分组推送 | 有效认领分摊行(`blade_receipt_claim_settlement` status=1 且未删)经结算单 `contract_id` 归集,逐合同推送;**单合同失败不影响其余合同** | +| 4 | 编排顺序:C103-9 → C107-1 → C108-1 | 先更新履约计划(认领金额累加重推),因为 C107-1 的 `fdExePlanStageId` 与 C108-1 的 `fd_plan_id` 都引用 C103-9 返回的阶段ID(与付款链 C103-9→C108 同口径) | +| 5 | 认领金额累加口径 | `coalesce(fund_amount, 0) + 认领金额` 原子累加到收款计划行(防并发丢更新);已同步行置 `row_op=update` 凭阶段ID 重推 C103-9,未同步行保持 `add` 待合同链路首推(首推即携带累加后金额)——与付款审批累加逻辑完全对称 | +| 6 | 只推未作废认领 | 认领主单 `claim_status=claimed` 才推;作废认领的分摊行在作废时已置 status=0,天然排除。且已推送金蝶的认领禁止作废(voidClaim 闸门),已同步合规的认领不存在后续被作废的场景 | +| 7 | 合同未推送合规降级 | `hcs_fd_id` 为空时只累加本地计划行金额,不推 C103-9/C107-1 的合同引用/C108-1,随合同链路首推补齐 | +| 8 | 失败只留痕不重试 | 认领链任何一步失败仅 error 日志,**无自动重试、无失败状态落库**;且金蝶推送 `push_status=pushed` 为终态闸门,重推金蝶不会再触发合规链(见 §6 边界) | + +--- + +## 2. 业务流程 + +### 2.1 全链路(业务视角) + +``` +金蝶认领公告同步(A301-2)→ 流水落库 blade_kingdee_receipt_flow + ▼ +用户认领(选应收正式结算单 + 分摊金额)→ 认领主单 + 分摊行落库,流水累计认领金额 + ▼ +推送金蝶 A301-3(手动「推送金蝶」按钮 / 定时任务 ReceiptClaimPushTask,10分钟) + │ 闸门:公告id存在 + 未推送过(pushed 终态)+ 认领完成(claimed)+ 公告对账一致 + ▼ +A301-3 推送成功(push_status=pushed、回填金蝶收款单号)★事务已提交 + ▼ +HCS 收款认领链(开关 thirdParty.hcs.claim.sync-enabled,失败仅日志) + ├─① 归集:有效分摊行 × 结算单 → 按合同分组(合同id → 认领主单id → 金额) + └─② 逐合同推送(单合同失败 continue 下一合同) + ├─ C103-9 更新履约计划:认领金额累加收款计划行 → 已同步行重推 + ├─ C104-2 定位合规收款流水ID(明细流水号精确匹配,一次定位全程共用;失败仅跳过 C107-1) + ├─ C107-1 认领记录 × N(按「认领主单 × 合同」分组,每组合一条) + └─ C108-1 履约流水 × 1(按合同一条:金额=该合同累计认领金额) +``` + +### 2.2 代码视角(HcsClaimSyncSupport.pushClaimToHcs) + +``` +ReceiptFlowServiceImpl.pushClaimLocked(flowId, announce) + │ transactionTemplate.execute(doPushClaimToKingdee) ← 金蝶推送事务 + │ result.isSuccess() ? + ▼ yes +hcsClaimSyncSupport.pushClaimToHcs(flowId) + ├─ 开关关闭 → return(静默) + ├─ try doPushClaimToHcs(flowId) catch → log.error(不外抛) + │ + ├─ 查询数据(流水重读 + 认领主单 claimed + 分摊行 status=1/is_deleted=0) + ├─ 结算单批量 selectBatchIds → 合同id 归集(LinkedHashMap 保序) + ├─ locateHcsCollectionFlowId:C104-2 按 detail_serial_no 查 fdId + │ └─ 异常/查不到 → null,后续 C107-1 跳过(C103-9/C108-1 照常) + │ + └─ for each contractId: + ├─ accumulateClaimedAmountOnPush(contractId, 合同累计认领金额) + │ ├─ findCollectionStageRow(progress 精确匹配 → 首条已同步收款行兜底) + │ ├─ fund_amount 原子累加(setSql coalesce) + │ └─ 行已同步 → row_op=update + unsynced("收款认领金额累加,待重推C103-9") + ├─ 合同已推送合规(hcs_fd_id 非空)→ syncExeStages 重推 C103-9(无待同步行返回提示非失败) + ├─ C107-1 × 认领主单数:claimRecordAdd(流水引用+合同+阶段ID+认领人+金额+日期+备注,fdStatus=0) + └─ C108-1 × 1:perfRecordAdd(须有已同步收款计划行提供 fd_plan_id,否则跳过) +``` + +--- + +## 3. 接口清单(本次涉及 HCS 接口) + +| 接口 | Feign 方法 | 路径 | 触发时机 | 说明 | +| --- | --- | --- | --- | --- | +| C103-9 履约规则同步 | `exeplanAdd` | `/openapi/eop-exeplan/lcode/ext-eop-exeplan/extEopExeplanMainOpen/syncExeplan` | 认领金额累加后(合同已推送合规时) | 复用既有 `HcsExeStageSyncSupport.syncExeStages`,聚合 row_op≠none 行整体 update | +| C104-2 查询收款流水列表 | `collectionFlowList`(**新增**) | `/openapi/eop-data/eopDataCollectionFlowOpen/list` | C107-1 推送前一次 | conditions `fdDetailSerialNumber`=流水明细流水号 → 取合规 `fdId` | +| C107-1 新增认领记录 | `claimRecordAdd` | `/openapi/eop-data/eopDataCollectionFlowClaimRecordOpen/add` | 每个认领主单 × 合同一条 | 必填:fdCollectionFlow.fdId、fdContractNumber、fdClaimAmount;fdStatus 固定 0 | +| C108-1 履约记录新建 | `perfRecordAdd` | `/openapi/sys-modeling/apis/data/km-pay-receive/V1/dataSync/add` | 每合同一条 | 必填:fd_apply_no、fd_contract_id、fd_plan_date、**fd_plan_id**(接口新版必填,取收款计划行阶段ID) | + +> Feign 降级工厂与本地 Mock 均为通用代理实现,新增方法零改动;本地联调可在 mock 目录放 `collectionFlowList.json` / `claimRecordAdd.json` / `perfRecordAdd.json` 桩文件(有桩走桩、无桩透传真实接口)。 + +### 3.1 C107-1 请求字段映射 + +| HCS 字段 | TMS 取值 | 说明 | +| --- | --- | --- | +| `fdCollectionFlow.fdId` | C104-2 按流水 `detail_serial_no` 定位的合规流水ID | 【必填】合规侧收款流水,非 TMS 主键 | +| `fdContract` | 合同 `hcs_fd_id` + `contract_name` | 合规合同引用 | +| `fdContractNumber` | 合同 `contract_no` | 【必填】须在合规本地存在 | +| `fdExePlanStageId` | 收款计划行 `hcs_stage_fd_id`(无已同步行不传) | 对应履约项 | +| `fdFundNature` | 收款计划行 `fund_nature`(无行不传) | 认领款项类型 | +| `fdClaimer` / `fdClaimerName` | 认领主单 `claimer_name`(仅名称引用) | TMS 与合规用户不同源(§9-U2) | +| `fdClaimerDept` / `fdClaimerDeptName` | 认领主单 `claimer_dept_name` | 同上 | +| `fdClaimAmount` | 该认领主单分摊到本合同的金额合计 | 【必填】>0 | +| `fdClaimDate` | 认领主单 `claim_date`(毫秒时间戳) | | +| `fdRemark` | 认领主单 `remark` | | +| `fdStatus` | 固定 0(已认领) | 作废=1 本期未接 | + +### 3.2 C108-1 请求字段映射(dynamicProps) + +| HCS 字段 | TMS 取值 | 说明 | +| --- | --- | --- | +| `fd_apply_no` | 流水 `receipt_notice_no`(兜底 `detail_serial_no`) | 【必填】申请编号=收款通知单号 | +| `fd_apply_amount` / `fd_fact_amount` | 该合同累计认领金额(字符串传值) | 申请=实际(认领即到账口径) | +| `fd_plan_date` | 名下认领主单最近 `claim_date`(毫秒) | 【必填】履约日期 | +| `fd_paln_type` | 固定 `collection` | 履约类型(原文拼写 paln) | +| `fd_property` | 收款计划行 `fund_nature` | 履约性质 | +| `fd_id` / `fd_plan_id` | 收款计划行 `hcs_stage_fd_id` | 履约计划id【必填】,无已同步行整条跳过 | +| `fd_jd_doc_no` | 流水 `kingdee_bill_no`(A301-3 返回收款单号) | 金蝶单据号溯源 | +| `fd_contract_id` | 合同 `hcs_fd_id` | 【必填】 | +| `fd_business_id` | 流水主键 `id` | 溯源 | +| `fd_xform_id` | 配置 `thirdParty.hcs.perf-record.xform-id`(未配置不传) | 表单模板 | +| `mechanisms.attachment` | 空列表 | C108-1 必填节点;认领附件暂不转传 | + +--- + +## 4. 代码改动清单(2026-10-22) + +| 文件 | 改动 | +| --- | --- | +| `support/hcs/HcsClaimSyncSupport.java`(新增) | 认领链编排:归集分组 → C103-9 累加重推 → C104-2 定位 → C107-1 × N → C108-1 × 1;开关守卫 + 异常内吞(不影响金蝶推送) | +| `service/impl/ReceiptFlowServiceImpl.java` | `pushClaimLocked` 金蝶推送事务成功后挂钩 `pushClaimToHcs`(手动/定时共用);注入 support | +| `feign/IHcsClient.java` | 新增 C104-2 `collectionFlowList` 与路径常量 | +| `dto/HcsCollectionFlowVO.java`(新增) | C104-2 分页行出参 | +| `dto/HcsPerfRecordPropsDTO.java` | 补充 `fd_plan_id`(fd_plan_id)、`fdJdDocNo`(fd_jd_doc_no)——接口文档新版必填/新增字段 | +| `config/HcsProperties.java` | 新增 `Claim` 配置节(`claim.syncEnabled`,默认 false) | +| `service/IContractExeStageService.java` + Impl | 新增 `findCollectionStageRow`(progress 精确匹配→首条收款行兜底)与 `accumulateClaimedAmountOnPush`(原子累加+标记重推) | +| `doc/nacos/third-party-api.yaml`、`blade-dev.yaml` | hcs 节点新增 `claim.sync-enabled` 配置样例 | + +> 无数据库表结构变更、无新增定时任务、无新增页面。 + +--- + +## 5. 操作过程 + +### 5.1 前置条件(联调/生产启用前逐项确认) + +| # | 条件 | 不满足时的表现 | +| --- | --- | --- | +| 1 | 合同已推送合规(`blade_contract_manage.hcs_fd_id` 非空)且 C103-9 计划行已同步 | 只累加本地金额不推合规;C108-1 跳过(缺 fd_plan_id) | +| 2 | 合同下有**已同步**收款履约计划行(performType=collection,优先 progress) | 金额不累加、C107-1 不带履约项、C108-1 跳过 | +| 3 | 合规侧已存在同明细流水号的收款流水(合规自 ERP 同步) | C104-2 查不到 → 仅 C107-1 跳过 | +| 4 | HCS 配置可用(baseUrl/鉴权头/xform-id 等,与付款链共用) | 对应接口失败,error 日志留痕 | + +### 5.2 开关配置(Nacos `third-party-api.yaml` / 环境覆盖) + +```yaml +thirdParty: + hcs: + claim: + sync-enabled: ${HCS_CLAIM_SYNC_ENABLED:false} # 默认关,联调/灰度后打开 +``` + +代码内配置键为 `third-party.hcs.claim.sync-enabled`(横线小写),YAML 驼峰 `thirdParty.hcs.claim.*` 经宽松绑定等价生效,与既有 hcs 配置同节点。 + +### 5.3 业务操作步骤 + +1. 收款流水页「同步流水」(A301-2)拉取认领公告; +2. 流水认领(选应收正式结算单、分摊金额); +3. 「推送金蝶」手动推送,或等定时任务(10 分钟一轮)自动推送; +4. A301-3 成功后系统自动推合规,无需人工操作;日志关键字 `HCS收款认领链` / `HCS认领记录推送` / `HCS履约流水`。 + +### 5.4 失败排查 + +- 看应用日志 `HCS收款认领链推送失败`(含 contractId)与 `HCS收款流水定位失败`,失败原因随 HCS 响应 msg/traceId 记录; +- **无自动重试**:修复问题后无法通过「重推金蝶」重新触发(pushed 终态闸门拦截);数据修正需人工在合规侧补录,或后续迭代增加按流水的合规重推入口。 + +--- + +## 6. 边界与注意事项 + +1. **失败无重试、无状态落库**(本期 shortcut):认领链失败仅日志,金蝶推送终态后不可重触发;如需闭环,后续给流水加 hcs 同步状态列 + 定时补偿(照付款链模式)。 +2. **认领作废与合规数据天然隔离**:已推送金蝶的认领禁止作废(`voidClaim` 闸门:「该认领已推送金蝶,不允许作废」),而认领链仅在推送金蝶成功后触发——已同步合规的认领不可能再被作废,无需 C107-3 作废同步;作废只发生在推送金蝶前(认领链未触发),仅在本地回退(认领主单置 voided、分摊行置无效、流水累计金额/认领状态重算、结算单收款汇总刷新)。若未来放开「推送后作废」,需先持久化 C107-1/履约流水 fdId 再接 C107-3。 +3. **认领附件未转传**:C108-1 的 mechanisms.attachment 传空列表;需附件时接 C103-2 转传(照付款链 HcsAttachmentSupport 模式)。 +4. **款项性质无来源**:认领分摊不区分款项性质,累加固定落在 progress(精确匹配)→ 首条收款行(兜底);若合同收款计划含预付款行,认领金额不会计入预付款行——业务要求分性质拆分时需认领页增加性质字段。 +5. **C103-9 覆盖口径与付款链一致**:认领金额累加覆盖 HCS 计划行款项金额(原计划金额被累计认领金额覆盖属预期行为),需与合规侧确认展示口径。 +6. **金额口径**:C107-1/C108-1 金额为「分摊/累计认领金额」(2 位小数,随认领校验规则);同一流水多次认领后一次性推送金蝶,认领链按推送时点的全量有效分摊归集,不区分历史认领主单先后。 +7. **合规流水定位依赖明细流水号一致**:C104-2 按 `fdDetailSerialNumber` 精确匹配(与 A301-2 detailid 同源),合规侧同步口径变化(如明细流水号为空)会导致 C107-1 全部跳过。 +8. **并发安全**:金蝶推送侧已有行锁 + 终态闸门防双推,认领链单实例单流水触发一次;计划行累加为 SQL 原子操作,多流水并发认领不丢更新。 From f38ab3896fbec672c44a0b6ed60322e360a94bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 19:18:29 +0800 Subject: [PATCH 106/124] =?UTF-8?q?fix:=20=E9=A1=B9=E7=9B=AE=E7=AB=8B?= =?UTF-8?q?=E9=A1=B9=E6=8E=A5=E5=8F=A3=E6=96=B0=E5=A2=9Eerp=E8=AF=B7?= =?UTF-8?q?=E6=B1=82id=20=E4=BC=A0=E9=A1=B9=E7=9B=AEid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transport/support/hcs/HcsProjectSyncSupport.java | 5 +++++ .../java/org/springblade/hcs/dto/HcsProjectPropsDTO.java | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index edc1c366..e24d8e16 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -180,6 +180,11 @@ public class HcsProjectSyncSupport { HcsProjectPropsDTO props = new HcsProjectPropsDTO(); // 【必填】项目名称:ProjectApply.projectName props.setFdProName(projectApply.getProjectName()); + + // erp请求id + Long id = projectApply.getId(); + props.setFdErpRequestId(String.valueOf(id)); + // 项目简称:ProjectApply.projectShortName props.setFdProSimpleName(projectApply.getProjectShortName()); // 【必填】项目编号:ProjectApply.projectCode(判重候选键) diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java index 9467e425..75310d50 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsProjectPropsDTO.java @@ -51,6 +51,13 @@ public class HcsProjectPropsDTO implements Serializable { */ @JsonProperty("fd_pro_name") private String fdProName; + + /** + * erp请求id 传项目id + */ + @JsonProperty("fd_erp_request_id") + private String fdErpRequestId; + /** * 项目简称 */ From 0c9f9dcb8b8f6da74a7824bfb76127b419f4be28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 19:35:12 +0800 Subject: [PATCH 107/124] =?UTF-8?q?refactor:=20=E6=94=B6=E6=AC=BE=E8=AE=A4?= =?UTF-8?q?=E9=A2=86=E5=90=88=E8=A7=84=E9=93=BE=E5=A4=8D=E7=94=A8=E5=B1=A5?= =?UTF-8?q?=E7=BA=A6=E8=AE=A1=E5=88=92=E4=B8=8E=E5=B1=A5=E7=BA=A6=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=97=A2=E6=9C=89=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除独立 claim.sync-enabled 开关(HcsProperties.Claim 配置节与 Nacos 配置样例) - 认领链门禁改为复用既有开关:exe-stage.sync-enabled 门禁 C103-9 更新履约计划与 C107-1 认领记录(与合同链履约计划同步同开关);perf-record.sync-enabled 门禁 C108-1 履约流水(与付款链履约记录同步同开关) - 同步更新业务流程梳理文档的开关说明与启用条件 --- .../support/hcs/HcsClaimSyncSupport.java | 17 ++++++++--- .../springblade/hcs/config/HcsProperties.java | 12 -------- ...(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理.md | 29 +++++++++++-------- doc/nacos/blade-dev.yaml | 4 --- doc/nacos/third-party-api.yaml | 4 --- 5 files changed, 30 insertions(+), 36 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsClaimSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsClaimSyncSupport.java index f53798b4..a74391fd 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsClaimSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsClaimSyncSupport.java @@ -73,7 +73,9 @@ import java.util.stream.Collectors; /** * HCS 收款认领链推送编排支撑组件(C103-9 更新履约计划 + C107-1 认领记录 + C108-1 履约流水) *

    - * 触发点:金蝶认领推送(A301-3)成功之后(手动按钮与定时任务共用钩子),开关 thirdParty.hcs.claim.sync-enabled。 + * 触发点:金蝶认领推送(A301-3)成功之后(手动按钮与定时任务共用钩子)。 + * 开关复用既有配置(不单独新增):exe-stage.sync-enabled 门禁 C103-9/C107-1(与合同链履约计划同步同开关), + * perf-record.sync-enabled 门禁 C108-1(与付款链履约记录同步同开关)。 * 编排顺序:先 C103-9(认领金额累加到收款履约计划行并重推,C107-1/C108-1 引用其返回的阶段ID), * 再按「认领主单 × 合同」推 C107-1(合规流水ID 经 C104-2 按明细流水号定位),最后按合同推 C108-1 履约流水。 * 合同未推送合规(hcs_fd_id 空)时仅累加计划行金额,随合同链路首推。 @@ -104,12 +106,14 @@ public class HcsClaimSyncSupport { /** * 金蝶认领推送成功后推送合同合规(C103-9 → C107-1 → C108-1) *

    - * 开关关闭或推送异常均静默返回,不影响金蝶认领推送主流程与事务。 + * 复用既有开关:exe-stage.sync-enabled(履约计划同步)门禁 C103-9/C107-1, + * perf-record.sync-enabled(履约记录同步)门禁 C108-1;开关关闭或推送异常均静默返回, + * 不影响金蝶认领推送主流程与事务。 * * @param flowId 收款流水ID */ public void pushClaimToHcs(Long flowId) { - if (!hcsProperties.getClaim().isSyncEnabled()) { + if (!hcsProperties.getExeStage().isSyncEnabled()) { return; } try { @@ -208,7 +212,12 @@ public class HcsClaimSyncSupport { pushClaimRecord(flow, claimsById.get(claimEntry.getKey()), contractManage, stageRow, claimEntry.getValue(), hcsCollectionFlowId); } } - // ③ C108-1 履约流水:按合同一条,须已推送合规且存在已同步收款计划行(fd_plan_id 必填) + // ③ C108-1 履约流水:按合同一条(开关 perf-record.sync-enabled,与付款链履约记录同步同开关), + // 须已推送合规且存在已同步收款计划行(fd_plan_id 必填) + if (!hcsProperties.getPerfRecord().isSyncEnabled()) { + log.info("HCS履约流水推送跳过:履约记录同步开关未开启 contractNo={}", contractManage.getContractNo()); + return; + } if (StringUtil.isBlank(contractManage.getHcsFdId())) { log.info("HCS履约流水推送跳过:合同尚未推送合规 contractNo={}", contractManage.getContractNo()); return; diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 919b333f..5e0ca285 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -124,10 +124,6 @@ public class HcsProperties { * 收票单(C109)配置 */ private ReceiptBill receiptBill = new ReceiptBill(); - /** - * 收款认领链(C103-9 更新履约计划 + C107-1 认领记录 + C108-1 履约流水)配置 - */ - private Claim claim = new Claim(); /** * 附件转传(C103-2)配置 */ @@ -326,14 +322,6 @@ public class HcsProperties { private String xformId = ""; } - @Data - public static class Claim { - /** - * 收款认领链同步开关(金蝶认领推送 A301-3 成功后推 C103-9/C107-1/C108-1,默认关) - */ - private boolean syncEnabled = false; - } - @Data public static class Attachment { /** diff --git a/doc/docs/hcs合同/2026-10-22-收款认领推送金蝶完成后同步合同合规系统(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理.md b/doc/docs/hcs合同/2026-10-22-收款认领推送金蝶完成后同步合同合规系统(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理.md index 553257f6..47071b63 100644 --- a/doc/docs/hcs合同/2026-10-22-收款认领推送金蝶完成后同步合同合规系统(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理.md +++ b/doc/docs/hcs合同/2026-10-22-收款认领推送金蝶完成后同步合同合规系统(C103-9履约计划-C107-1认领记录-C108-1履约流水)业务流程梳理.md @@ -1,6 +1,6 @@ # 收款认领推送金蝶完成后同步合同合规系统(C103-9 履约计划 + C107-1 认领记录 + C108-1 履约流水)业务流程梳理 -> 需求:金蝶认领推送(A301-3)完成后,把认领记录推送给合同合规系统(HCS)——① C103-9 更新合同履约计划(认领金额累加到收款计划行并重推);② C107-1 新增认领记录;③ C108-1 新增履约流水。整体做一个开关。 +> 需求:金蝶认领推送(A301-3)完成后,把认领记录推送给合同合规系统(HCS)——① C103-9 更新合同履约计划(认领金额累加到收款计划行并重推);② C107-1 新增认领记录;③ C108-1 新增履约流水。开关复用既有配置(exe-stage / perf-record),不单独新增。 > 关键口径:C107-1 的 `fdCollectionFlow.fdId` 为**合规系统自己的收款流水ID**(非 TMS 本地主键),经 C104-2 按明细流水号定位(合规侧流水由合规自 ERP 同步,与 TMS A301-2 镜像同源);C107-1/C108-1 引用的履约项ID 均为 C103-9 返回的阶段ID(hcs_stage_fd_id)。 > 代码改动日期:2026-10-22,`mvn compile` 通过。 @@ -11,7 +11,7 @@ | # | 规则 | 说明 | | --- | --- | --- | | 1 | 触发点唯一:A301-3 推送成功之后 | 挂在 `pushClaimLocked`(金蝶认领推送事务模板)返回成功后执行,手动「推送金蝶」按钮与定时任务两条路共用;金蝶推送事务已提交,合规推送失败不影响金蝶推送结果 | -| 2 | 总开关 | `thirdParty.hcs.claim.sync-enabled`(`HcsProperties.claim.syncEnabled`,默认 false),关闭时整个认领链不执行、零开销 | +| 2 | 开关复用既有配置(不新增) | `exe-stage.sync-enabled`(履约计划同步,与合同链 C103-9 同开关)门禁 C103-9/C107-1;`perf-record.sync-enabled`(履约记录同步,与付款链 C108 同开关)门禁 C108-1。exe-stage 关闭时整个认领链不执行、零开销 | | 3 | 按合同分组推送 | 有效认领分摊行(`blade_receipt_claim_settlement` status=1 且未删)经结算单 `contract_id` 归集,逐合同推送;**单合同失败不影响其余合同** | | 4 | 编排顺序:C103-9 → C107-1 → C108-1 | 先更新履约计划(认领金额累加重推),因为 C107-1 的 `fdExePlanStageId` 与 C108-1 的 `fd_plan_id` 都引用 C103-9 返回的阶段ID(与付款链 C103-9→C108 同口径) | | 5 | 认领金额累加口径 | `coalesce(fund_amount, 0) + 认领金额` 原子累加到收款计划行(防并发丢更新);已同步行置 `row_op=update` 凭阶段ID 重推 C103-9,未同步行保持 `add` 待合同链路首推(首推即携带累加后金额)——与付款审批累加逻辑完全对称 | @@ -35,13 +35,13 @@ ▼ A301-3 推送成功(push_status=pushed、回填金蝶收款单号)★事务已提交 ▼ -HCS 收款认领链(开关 thirdParty.hcs.claim.sync-enabled,失败仅日志) +HCS 收款认领链(开关 exe-stage.sync-enabled 门禁 C103-9/C107-1、perf-record.sync-enabled 门禁 C108-1,失败仅日志) ├─① 归集:有效分摊行 × 结算单 → 按合同分组(合同id → 认领主单id → 金额) └─② 逐合同推送(单合同失败 continue 下一合同) ├─ C103-9 更新履约计划:认领金额累加收款计划行 → 已同步行重推 ├─ C104-2 定位合规收款流水ID(明细流水号精确匹配,一次定位全程共用;失败仅跳过 C107-1) ├─ C107-1 认领记录 × N(按「认领主单 × 合同」分组,每组合一条) - └─ C108-1 履约流水 × 1(按合同一条:金额=该合同累计认领金额) + └─ C108-1 履约流水 × 1(perf-record 开关开启时;须有已同步收款计划行提供 fd_plan_id) ``` ### 2.2 代码视角(HcsClaimSyncSupport.pushClaimToHcs) @@ -52,7 +52,7 @@ ReceiptFlowServiceImpl.pushClaimLocked(flowId, announce) │ result.isSuccess() ? ▼ yes hcsClaimSyncSupport.pushClaimToHcs(flowId) - ├─ 开关关闭 → return(静默) + ├─ exe-stage.sync-enabled 关闭 → return(静默,整个认领链不执行) ├─ try doPushClaimToHcs(flowId) catch → log.error(不外抛) │ ├─ 查询数据(流水重读 + 认领主单 claimed + 分摊行 status=1/is_deleted=0) @@ -67,7 +67,7 @@ hcsClaimSyncSupport.pushClaimToHcs(flowId) │ └─ 行已同步 → row_op=update + unsynced("收款认领金额累加,待重推C103-9") ├─ 合同已推送合规(hcs_fd_id 非空)→ syncExeStages 重推 C103-9(无待同步行返回提示非失败) ├─ C107-1 × 认领主单数:claimRecordAdd(流水引用+合同+阶段ID+认领人+金额+日期+备注,fdStatus=0) - └─ C108-1 × 1:perfRecordAdd(须有已同步收款计划行提供 fd_plan_id,否则跳过) + └─ C108-1 × 1:perfRecordAdd(perf-record 开关开启时;须有已同步收款计划行提供 fd_plan_id,否则跳过) ``` --- @@ -126,9 +126,9 @@ hcsClaimSyncSupport.pushClaimToHcs(flowId) | `feign/IHcsClient.java` | 新增 C104-2 `collectionFlowList` 与路径常量 | | `dto/HcsCollectionFlowVO.java`(新增) | C104-2 分页行出参 | | `dto/HcsPerfRecordPropsDTO.java` | 补充 `fd_plan_id`(fd_plan_id)、`fdJdDocNo`(fd_jd_doc_no)——接口文档新版必填/新增字段 | -| `config/HcsProperties.java` | 新增 `Claim` 配置节(`claim.syncEnabled`,默认 false) | +| `config/HcsProperties.java` | 无改动(认领链复用既有 `exe-stage` / `perf-record` 开关,未新增配置项) | | `service/IContractExeStageService.java` + Impl | 新增 `findCollectionStageRow`(progress 精确匹配→首条收款行兜底)与 `accumulateClaimedAmountOnPush`(原子累加+标记重推) | -| `doc/nacos/third-party-api.yaml`、`blade-dev.yaml` | hcs 节点新增 `claim.sync-enabled` 配置样例 | +| `doc/nacos/third-party-api.yaml`、`blade-dev.yaml` | 无改动(复用既有 exe-stage / perf-record 开关,未新增配置项) | > 无数据库表结构变更、无新增定时任务、无新增页面。 @@ -144,17 +144,22 @@ hcsClaimSyncSupport.pushClaimToHcs(flowId) | 2 | 合同下有**已同步**收款履约计划行(performType=collection,优先 progress) | 金额不累加、C107-1 不带履约项、C108-1 跳过 | | 3 | 合规侧已存在同明细流水号的收款流水(合规自 ERP 同步) | C104-2 查不到 → 仅 C107-1 跳过 | | 4 | HCS 配置可用(baseUrl/鉴权头/xform-id 等,与付款链共用) | 对应接口失败,error 日志留痕 | +| 5 | 开关:`exe-stage.sync-enabled=true`(C108-1 另需 `perf-record.sync-enabled=true`) | exe-stage 关→整链不执行;perf-record 关→仅跳过 C108-1 | -### 5.2 开关配置(Nacos `third-party-api.yaml` / 环境覆盖) +### 5.2 开关配置(复用既有配置,无新增配置项) ```yaml thirdParty: hcs: - claim: - sync-enabled: ${HCS_CLAIM_SYNC_ENABLED:false} # 默认关,联调/灰度后打开 + # 履约规则行级同步开关:门禁认领链 C103-9 更新履约计划 + C107-1 认领记录(当前环境已开) + exe-stage: + sync-enabled: ${HCS_EXE_STAGE_SYNC_ENABLED:true} + # 履约记录同步开关:门禁认领链 C108-1 履约流水(一期暂不对接,默认关) + perf-record: + sync-enabled: ${HCS_PERF_RECORD_SYNC_ENABLED:false} ``` -代码内配置键为 `third-party.hcs.claim.sync-enabled`(横线小写),YAML 驼峰 `thirdParty.hcs.claim.*` 经宽松绑定等价生效,与既有 hcs 配置同节点。 +与合同链 C103-9、付款链 C108 共用同一开关,语义一致:exe-stage 开=履约计划同步对接;perf-record 开=履约记录同步对接。代码内配置键为 `third-party.hcs.exe-stage.sync-enabled` / `third-party.hcs.perf-record.sync-enabled`(横线小写),YAML 驼峰经宽松绑定等价生效。 ### 5.3 业务操作步骤 diff --git a/doc/nacos/blade-dev.yaml b/doc/nacos/blade-dev.yaml index 67ad9acd..571180d4 100644 --- a/doc/nacos/blade-dev.yaml +++ b/doc/nacos/blade-dev.yaml @@ -327,10 +327,6 @@ thirdParty: sync-enabled: ${HCS_PERF_RECORD_SYNC_ENABLED:false} # 表单模板ID(fd_xform_id,环境相关值,§9-U9 待合规方提供) xform-id: ${HCS_PERF_RECORD_XFORM_ID:} - # 收款认领链(金蝶认领推送成功后:C103-9 更新履约计划 + C107-1 认领记录 + C108-1 履约流水) - claim: - # 认领链同步总开关(默认关,对接后打开) - sync-enabled: ${HCS_CLAIM_SYNC_ENABLED:false} # 附件转传(C103-2) attachment: # 附件转传总开关 diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 201d6ddc..8ca005cc 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -250,10 +250,6 @@ thirdParty: sync-enabled: ${HCS_PERF_RECORD_SYNC_ENABLED:false} # 表单模板ID(fd_xform_id,环境相关值,§9-U9 待合规方提供) xform-id: ${HCS_PERF_RECORD_XFORM_ID:} - # 收款认领链(金蝶认领推送成功后:C103-9 更新履约计划 + C107-1 认领记录 + C108-1 履约流水) - claim: - # 认领链同步总开关(默认关,对接后打开) - sync-enabled: ${HCS_CLAIM_SYNC_ENABLED:false} # 附件转传(C103-2) attachment: # 附件转传总开关 From e3672b2dfaee4138adb2e364c9af5b3173ade34e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 19:37:28 +0800 Subject: [PATCH 108/124] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3Nacos=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=BE=AE=E4=BF=A1=E5=B0=8F=E7=A8=8B=E5=BA=8F=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=BC=A9=E8=BF=9B=E5=B1=82=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - blade-dev.yaml wechat/mini 节点缩进错位,wechat 提升为 thirdParty 一级子节点、mini 归其下 --- doc/nacos/blade-dev.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/nacos/blade-dev.yaml b/doc/nacos/blade-dev.yaml index 571180d4..d7b1e962 100644 --- a/doc/nacos/blade-dev.yaml +++ b/doc/nacos/blade-dev.yaml @@ -104,8 +104,8 @@ thirdParty: queryDepartmentPageUrl: /gwzh/OA/OA_GET_DEPARTMENT_LIST queryPersonPageUrl: /gwzh/OA/OA_GET_USER_LIST authorization: ${OA_AUTHORIZATION:${IAM_SSO_AUTHORIZATION:Z3d6aF90bXMtOVJJU0RVN1U6YW0yYkcwWnBJZ0RQZmtrSjNaZkZjUDBSaGFuSEtxQng=}} - wechat: - mini: + wechat: + mini: # 微信小程序(手机号一键登录 / openid) appId: ${WECHAT_MINI_APP_ID:} appSecret: ${WECHAT_MINI_APP_SECRET:} From 476e996ef2895a46ac1140b6fded765cf34908dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 19:37:45 +0800 Subject: [PATCH 109/124] =?UTF-8?q?feat:=20=E6=94=B6=E7=A5=A8=E5=8F=91?= =?UTF-8?q?=E7=A5=A8=E5=90=8C=E6=AD=A5=E6=96=B0=E5=A2=9E=E5=AE=A2=E5=95=86?= =?UTF-8?q?=E5=8D=95=E4=BD=8D=E8=BF=87=E6=BB=A4=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - blade-dev.yaml 收票回写配置新增 customerUnitsOnly(BFI_INVOICE_RECEIPT_CUSTOMER_UNITS_ONLY,默认关): 开启后只同步开票单位(销方)与受票单位(购方)税号均已登记在客商发票信息中的发票,前端票池展示查询同用此开关过滤 --- doc/nacos/blade-dev.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/nacos/blade-dev.yaml b/doc/nacos/blade-dev.yaml index d7b1e962..cb27d2df 100644 --- a/doc/nacos/blade-dev.yaml +++ b/doc/nacos/blade-dev.yaml @@ -204,6 +204,8 @@ thirdParty: invoiceTypes: ${BFI_INVOICE_RECEIPT_INVOICE_TYPES:26,27} # 补偿绑定单轮限量(未绑定登记按发票号码精确补查条数上限) compensateLimit: ${BFI_INVOICE_RECEIPT_COMPENSATE_LIMIT:200} + # 客商单位过滤开关:开启后只同步开票单位(销方)与受票单位(购方)税号均已登记在客商发票信息中的发票,前端票池展示查询同用此开关过滤 + customerUnitsOnly: ${BFI_INVOICE_RECEIPT_CUSTOMER_UNITS_ONLY:false} # 收款认领推送金蝶定时任务(A301-3 收款认领结果推送) receiptClaimPush: From 12d8d0b775b6cdd290b1bcc553725f967a6c00ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 23 Oct 2026 10:13:56 +0800 Subject: [PATCH 110/124] =?UTF-8?q?feat:=20=E4=BB=98=E6=AC=BE=E7=89=B9?= =?UTF-8?q?=E6=89=B9C106-3/4=E6=96=B0=E5=A2=9E=E6=B5=81=E7=A8=8B=E6=A8=A1?= =?UTF-8?q?=E6=9D=BFID=E5=AD=97=E6=AE=B5=EF=BC=88fdTemplateId=EF=BC=8CNaco?= =?UTF-8?q?s=E5=8F=AF=E9=85=8D=E7=BD=AE=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/hcs/HcsSpecPaySyncSupport.java | 13 +++++++++++++ .../org/springblade/hcs/config/HcsProperties.java | 4 ++++ .../org/springblade/hcs/dto/HcsSpecPaySaveDTO.java | 4 ++++ doc/nacos/blade-dev.yaml | 2 ++ doc/nacos/third-party-api.yaml | 2 ++ 5 files changed, 25 insertions(+) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java index a9fdcfa9..6f4de144 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsSpecPaySyncSupport.java @@ -118,6 +118,8 @@ public class HcsSpecPaySyncSupport { param.setFdId(payment.getHcsSpecFdId()); // 【必填】操作人登录名:付款申请创建人登录名(§9-U2) param.setFdLoginName(operatorLoginName); + // 【必填】流程模板ID:公司流程模板(spec-pay.template-mapping 按租户配置,环境/公司相关) + param.setFdTemplateId(requireTemplateId(payment)); HcsSpecPayFormDataDTO formData = new HcsSpecPayFormDataDTO(); HcsSpecPayPropsDTO props = new HcsSpecPayPropsDTO(); // 【必填】合同:传合规合同ID(blade_contract_manage.hcs_fd_id,非名称) @@ -202,6 +204,17 @@ public class HcsSpecPaySyncSupport { return result.getData().getData().getFdId(); } + /** + * 付款特批流程模板ID(fdTemplateId 必填,spec-pay.template-id,每个环境/公司不同) + */ + private String requireTemplateId(PaymentApplication payment) { + String templateId = hcsProperties.getSpecPay().getTemplateId(); + if (StringUtil.isBlank(templateId)) { + throw new HcsException("C106 特批推送失败,未配置付款特批流程模板ID(thirdParty.hcs.spec-pay.template-id)"); + } + return templateId; + } + /** * 合规合同ID(fd_contract_name 必填,合同未推送时失败提示) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 5e0ca285..dc2b4b2a 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -284,6 +284,10 @@ public class HcsProperties { * 付款类型字典值(fd_payment_type,§9-U3 待联调后配置) */ private String paymentType = ""; + /** + * 付款特批流程模板ID(fdTemplateId,每个环境/公司不同,按环境在 Nacos 维护) + */ + private String templateId = ""; } @Data diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPaySaveDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPaySaveDTO.java index a184785d..993f57f2 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPaySaveDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSpecPaySaveDTO.java @@ -55,6 +55,10 @@ public class HcsSpecPaySaveDTO implements Serializable { * 操作人登录名(必填) */ private String fdLoginName; + /** + * 流程模板ID(公司流程模板ID,发起必填;每个环境/公司不同,经 Nacos spec-pay.template-mapping 配置) + */ + private String fdTemplateId; /** * 特批表单数据 */ diff --git a/doc/nacos/blade-dev.yaml b/doc/nacos/blade-dev.yaml index cb27d2df..745bff6e 100644 --- a/doc/nacos/blade-dev.yaml +++ b/doc/nacos/blade-dev.yaml @@ -311,6 +311,8 @@ thirdParty: payment-purpose: ${HCS_SPEC_PAY_PAYMENT_PURPOSE:2001} payment-nature: ${HCS_SPEC_PAY_PAYMENT_NATURE:1} payment-type: ${HCS_SPEC_PAY_PAYMENT_TYPE:1} + # 付款特批流程模板ID(fdTemplateId,每个环境/公司模板不同,WLTMS 示例值,按环境维护) + template-id: ${HCS_SPEC_PAY_TEMPLATE_ID:1k5hp8mu5w9dwajnhw1g78dm3pd4a1r11aw0} # 开票登记(C111) invoice: # TMS 发票类型 -> HCS 发票类型字典值(§9-U3 待联调后配置) diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 8ca005cc..7d46eb22 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -232,6 +232,8 @@ thirdParty: payment-purpose: ${HCS_SPEC_PAY_PAYMENT_PURPOSE:} payment-nature: ${HCS_SPEC_PAY_PAYMENT_NATURE:} payment-type: ${HCS_SPEC_PAY_PAYMENT_TYPE:} + # 付款特批流程模板ID(fdTemplateId,每个环境/公司模板不同,按环境维护) + template-id: ${HCS_SPEC_PAY_TEMPLATE_ID:1k5hp8mu5w9dwajnhw1g78dm3pd4a1r11aw0} # 开票登记(C111) invoice: # TMS 发票类型 -> HCS 发票类型字典值(§9-U3 待联调后配置) From 7f68798505c3b5b83f426192c98590644e90a186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 23 Oct 2026 11:32:25 +0800 Subject: [PATCH 111/124] =?UTF-8?q?docs:=20=E8=A1=A5=E5=85=85HCS=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E4=BA=94=E7=B1=BB=E6=89=AB=E6=8F=8F=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E5=BC=80=E5=85=B3=E9=85=8D=E7=BD=AE=E8=AF=B4?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/nacos/blade-dev.yaml | 8 +++++++- doc/nacos/third-party-api.yaml | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/doc/nacos/blade-dev.yaml b/doc/nacos/blade-dev.yaml index 745bff6e..7607c247 100644 --- a/doc/nacos/blade-dev.yaml +++ b/doc/nacos/blade-dev.yaml @@ -259,16 +259,22 @@ thirdParty: batch-size: ${HCS_PUSH_BATCH_SIZE:50} # 推送失败自动重试上限,超限仅人工重推 max-retry: ${HCS_PUSH_MAX_RETRY:5} - # 五类扫描任务独立开关(cron 有代码默认值错峰每5分钟,无需配置) + # 五类扫描任务独立开关(灰度逐类打开;扫描只认审批通过且未同步/失败未超限的单据,失败由下轮自动补偿,超限人工重推) + # 各任务 cron 有代码默认值每5分钟、分钟位 0/1/2/3/4 错峰,无需配置;多实例按任务 Redis 分布式锁防重扫(TTL 240s) project: + # 项目立项(C102)定时推送 sync-enabled: ${HCS_PUSH_PROJECT_ENABLED:false} contract: + # 合同(C103)定时推送(含风险校验/附件转传/履约规则 C103-9,及特批 C103-4 结果查询兜底) sync-enabled: ${HCS_PUSH_CONTRACT_ENABLED:false} payment: + # 付款链定时推送(特批 C106-3 + 履约记录 C108) sync-enabled: ${HCS_PUSH_PAYMENT_ENABLED:false} invoice-application: + # 开票登记(C111)定时推送(含金蝶开票完成后回填) sync-enabled: ${HCS_PUSH_INVOICE_APP_ENABLED:false} invoice-receipt: + # 收票单(C109)定时推送 sync-enabled: ${HCS_PUSH_INVOICE_RCV_ENABLED:false} # 项目立项(C102) project: diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 7d46eb22..e9750a85 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -178,16 +178,22 @@ thirdParty: batch-size: ${HCS_PUSH_BATCH_SIZE:50} # 推送失败自动重试上限,超限仅人工重推 max-retry: ${HCS_PUSH_MAX_RETRY:5} - # 五类扫描任务独立开关(cron 有代码默认值错峰每5分钟,无需配置) + # 五类扫描任务独立开关(灰度逐类打开;扫描只认审批通过且未同步/失败未超限的单据,失败由下轮自动补偿,超限人工重推) + # 各任务 cron 有代码默认值每5分钟、分钟位 0/1/2/3/4 错峰,无需配置;多实例按任务 Redis 分布式锁防重扫(TTL 240s) project: + # 项目立项(C102)定时推送 sync-enabled: ${HCS_PUSH_PROJECT_ENABLED:false} contract: + # 合同(C103)定时推送(含风险校验/附件转传/履约规则 C103-9,及特批 C103-4 结果查询兜底) sync-enabled: ${HCS_PUSH_CONTRACT_ENABLED:false} payment: + # 付款链定时推送(特批 C106-3 + 履约记录 C108) sync-enabled: ${HCS_PUSH_PAYMENT_ENABLED:false} invoice-application: + # 开票登记(C111)定时推送(含金蝶开票完成后回填) sync-enabled: ${HCS_PUSH_INVOICE_APP_ENABLED:false} invoice-receipt: + # 收票单(C109)定时推送 sync-enabled: ${HCS_PUSH_INVOICE_RCV_ENABLED:false} # 项目立项(C102) project: From f3699c9cf04d9be4a63acd7b80a224f3473a5153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 23 Oct 2026 15:57:51 +0800 Subject: [PATCH 112/124] =?UTF-8?q?fix:=20=E5=90=88=E5=90=8C=E7=89=B9?= =?UTF-8?q?=E6=89=B9=E7=BB=93=E6=9E=9C=E5=9B=9E=E4=BC=A0=E6=94=B9=E6=8C=89?= =?UTF-8?q?=E5=90=88=E8=A7=84=E5=90=88=E5=90=8CID=EF=BC=88hcs=5Ffd=5Fid?= =?UTF-8?q?=EF=BC=89=E5=AE=9A=E4=BD=8D=E5=90=88=E5=90=8C=E5=B9=B6=E8=81=94?= =?UTF-8?q?=E5=8A=A8=E5=AE=A1=E6=89=B9=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HcsSyncController.java | 8 +- .../hcs/HcsContractSpecSyncSupport.java | 91 +++++++------------ .../hcs/dto/HcsLegalResultDTO.java | 6 +- 3 files changed, 41 insertions(+), 64 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 2b35b54c..e192d772 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -292,13 +292,13 @@ public class HcsSyncController { *

    * 免登免授权:blade.secure skip-url + auth permitAll 放行(doc/nacos/blade.yaml); * iPaaS 网关注册映射:/gwzh/HTHG/contractLegal/result → /hcs/contractLegal/result; - * 报文 {sourceSystem, requestId=TMS合同ID, status=APPROVED/REJECTED, reason}, - * approved 恢复流程展示,rejected 联动合同审批驳回。 + * 报文 {sourceSystem, requestId=合规合同ID(hcs_fd_id), id, status=APPROVED/REJECTED, reason}, + * 按 requestId=hcs_fd_id 定位合同,approved 恢复流程展示,rejected 联动合同审批驳回。 */ @PostMapping("/contractLegal/result") @ApiOperationSupport(order = 15) - @Operation(summary = "合同特批结果回传接收", description = "合规系统推送合同特批(金蝶同步)结果,按合同编号定位并联动特批状态,原文留痕") - public R contractLegalResult(@RequestBody(required = false) HcsContractLegalResultDTO param) { + @Operation(summary = "合同特批结果回传接收", description = "合规系统推送合同特批结果,按合规合同ID(hcs_fd_id=requestId)定位并联动特批状态,原文留痕") + public R contractLegalResult(@RequestBody(required = false) HcsLegalResultDTO param) { return R.data(hcsContractSpecSyncSupport.handleLegalResult(param)); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index 9c99fbfc..7a25effe 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -35,7 +35,7 @@ import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsContractDetailQueryDTO; import org.springblade.hcs.dto.HcsContractDetailVO; -import org.springblade.hcs.dto.HcsContractLegalResultDTO; +import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.feign.IHcsClient; import org.springblade.transport.constant.HcsSyncConstant; @@ -45,13 +45,9 @@ import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.HcsContractCheckLog; import org.springframework.stereotype.Component; -import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; /** * HCS 合同特批同步支撑组件(合规特批结果接收:contractLegal/result 推送 + C103-4 定时查询兜底 + 人工确认)。 @@ -61,7 +57,7 @@ import java.util.Map; * 集团审批结果经合规 contractLegal/result 接口推送 TMS(替代未建设的 D103),或定时 C103-4 查询兜底联动 → * approved 恢复流程,rejected 联动合同审批驳回。 *

    - * 结果推送报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=},原文留痕 blade_hcs_check_log。 + * 结果推送报文 {sourceSystem, requestId=合规合同ID, id, status=APPROVED/REJECTED, reason},原文留痕 blade_hcs_check_log。 * * @author Chill */ @@ -167,79 +163,56 @@ public class HcsContractSpecSyncSupport { } /** - * 合同特批结果接收处理(合规 contractLegal/result 推送,2026-10-13 按合规方最新字段表修正报文结构): - * 特批完成后合规侧同步金蝶并回调,报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=}; - * sourceSystem 须为 (不符抛"来源系统标识错误"异常);contractCode=TMS 合同编号定位(requestId 仅请求头回显不可定位); - * success=true 联动恢复"审批通过"(金蝶合同ID回填 kingdee_id);success=false 联动合同审批驳回走重新提交闭环(reason 随原文留痕) + * 合同特批结果接收处理(合规 contractLegal/result 推送,2026-10-23 按联调实际报文修正): + * 报文 {sourceSystem, requestId=合规合同ID, id, status=APPROVED/REJECTED, reason}; + * sourceSystem 须与 third-party.hcs.src-system 一致(不符抛"来源系统标识错误"异常); + * requestId 即合规合同ID(与 id 同值),按 blade_contract_manage.hcs_fd_id 定位合同; + * approved 联动恢复"审批通过",rejected 联动合同审批驳回走重新提交闭环(reason 随原文留痕) * * @param param 合规推送报文 * @return 处理结果描述 */ - public String handleLegalResult(HcsContractLegalResultDTO param) { - // 来源系统校验:仅接受合规方约定的 ,防伪造回传 + public String handleLegalResult(HcsLegalResultDTO param) { + // 来源系统校验:仅接受合规方约定的来源标识,防伪造回传 if (!StrUtil.equalsIgnoreCase(param == null ? null : param.getSourceSystem(), hcsProperties.getSrcSystem())) { log.warn("合同特批结果推送来源系统标识错误:sourceSystem={}", param == null ? null : param.getSourceSystem()); throw new ServiceException("来源系统标识错误"); } String raw = JSONUtil.toJsonStr(param); - ContractManage contractManage = locateContractByNo(param.getContractCode()); + String requestId = param.getRequestId(); + ContractManage contractManage = locateContractByFdId(requestId); if (contractManage == null) { - log.warn("合同特批结果推送未定位到合同:contractCode={},报文已留痕", param.getContractCode()); + log.warn("合同特批结果推送未定位到合同:requestId={},报文已留痕", requestId); writeCallbackLog(null, HcsSyncConstant.CHECK_RESULT_SKIP, "合同特批结果推送未定位到合同:" + raw); - return "已留痕:未定位到合同(contractCode=" + param.getContractCode() + ")"; + return "已留痕:未定位到合同(requestId=" + requestId + ")"; } - if (param.getSuccess() == null) { - log.warn("合同特批结果推送 success 字段缺失:contractNo={},报文已留痕", contractManage.getContractNo()); - writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, "合同特批结果推送 success 字段缺失:" + raw); - return "已留痕:success 字段缺失(contractNo=" + contractManage.getContractNo() + ")"; + String normalizedStatus = param.getStatus() == null ? "" : param.getStatus().trim(); + if (!HcsSyncConstant.LEGAL_RESULT_APPROVED.equalsIgnoreCase(normalizedStatus) + && !HcsSyncConstant.LEGAL_RESULT_REJECTED.equalsIgnoreCase(normalizedStatus)) { + log.warn("合同特批结果推送状态未识别:contractNo={},status={},报文已留痕", contractManage.getContractNo(), param.getStatus()); + writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, "合同特批结果推送状态未识别:" + raw); + return "已留痕:状态字段未识别(contractNo=" + contractManage.getContractNo() + ")"; } - boolean success = param.getSuccess(); - // 成功:特批完成且金蝶同步成功,恢复"审批通过";金蝶合同ID回填 kingdee_id 留痕保存 - if (success) { - syncContractOnSpecResult(contractManage, true); - contractManage.setKingdeeId(param.getKingdeeId()); - appendKingdeeResultRecord(contractManage, "金蝶同步成功:金蝶合同ID=" + param.getKingdeeId()); - markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_APPROVED, - "合同特批结果推送:金蝶同步成功,kingdeeId=" + param.getKingdeeId()); - writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_PASS, "合同特批结果推送:" + raw); - log.info("合同特批结果推送处理完成:contractNo={},结果=approved,kingdeeId={}", contractManage.getContractNo(), param.getKingdeeId()); - return "特批结果已处理:approved"; - } - // 失败:特批流程已完成但金蝶同步失败,联动合同审批驳回,走重新编辑→提交→审批→重新特批闭环(失败单独重试机制待联调确认) - syncContractOnSpecResult(contractManage, false); - appendKingdeeResultRecord(contractManage, "金蝶同步失败:" + param.getReason()); - markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_REJECTED, "合同特批结果推送:金蝶同步失败:" + param.getReason()); - writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_FAIL, "合同特批结果推送:" + raw); - log.info("合同特批结果推送处理完成:contractNo={},结果=rejected,reason={}", contractManage.getContractNo(), param.getReason()); - return "特批结果已处理:rejected"; + boolean approved = HcsSyncConstant.LEGAL_RESULT_APPROVED.equalsIgnoreCase(normalizedStatus); + // 特批结果联动合同审批状态(通过恢复展示,驳回联动审批驳回),随 markSpec 一并落库 + syncContractOnSpecResult(contractManage, approved); + markSpec(contractManage, approved ? HcsSyncConstant.SPEC_STATUS_APPROVED : HcsSyncConstant.SPEC_STATUS_REJECTED, + "合同特批结果推送:" + normalizedStatus + (StringUtil.isBlank(param.getReason()) ? "" : ",reason=" + param.getReason())); + writeCallbackLog(contractManage, approved ? HcsSyncConstant.CHECK_RESULT_PASS : HcsSyncConstant.CHECK_RESULT_FAIL, + "合同特批结果推送:" + raw); + log.info("合同特批结果推送处理完成:contractNo={},结果={},reason={}", contractManage.getContractNo(), normalizedStatus, param.getReason()); + return "特批结果已处理:" + (approved ? "approved" : "rejected"); } /** - * 金蝶同步结果回填变更记录(changeRecordJson 追加一条;系统回调无登录用户,操作人记来源标识) + * 按合规合同ID定位合同(合规推送 requestId/id,即 blade_contract_manage.hcs_fd_id) */ - private void appendKingdeeResultRecord(ContractManage contractManage, String changeContent) { - List records = StringUtil.isBlank(contractManage.getChangeRecordJson()) - ? new ArrayList<>() : new ArrayList<>(JSONUtil.toList(contractManage.getChangeRecordJson(), Object.class)); - Map record = new LinkedHashMap<>(); - record.put("changeDate", LocalDate.now().toString()); - record.put("handlerUserName", "合规系统回调"); - record.put("changeType", "金蝶同步结果"); - record.put("changeContent", changeContent); - record.put("status", contractManage.getApprovalStatus()); - record.put("statusName", HcsSyncConstant.approvalStatusName(contractManage.getApprovalStatus())); - records.add(record); - contractManage.setChangeRecordJson(JSONUtil.toJsonStr(records)); - } - - /** - * 按 ERP 合同编号定位合同(合规推送 contractCode,合同编号唯一) - */ - private ContractManage locateContractByNo(String contractCode) { - if (StringUtil.isBlank(contractCode)) { + private ContractManage locateContractByFdId(String requestId) { + if (StringUtil.isBlank(requestId)) { return null; } return contractManageMapper.selectOne(Wrappers.lambdaQuery() - .eq(ContractManage::getContractNo, contractCode.trim()) + .eq(ContractManage::getHcsFdId, requestId.trim()) .last("limit 1")); } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java index eb0604a2..b74880d9 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java @@ -51,9 +51,13 @@ public class HcsLegalResultDTO implements Serializable { */ private String sourceSystem; /** - * 业务单据ID(合同特批=TMS 合同ID,付款特批=TMS 付款申请ID) + * 定位单据ID(付款特批=TMS 付款申请ID;合同特批=合规合同ID,与 id 同值,按 blade_contract_manage.hcs_fd_id 匹配) */ private String requestId; + /** + * 合规侧单据ID(合同特批回传携带,与 requestId 同值=合规合同ID;付款特批回传不传,忽略) + */ + private String id; /** * 审批结果:APPROVED 通过 / REJECTED 驳回 */ From 34f9085daafbd332b355951130b9bfa1d287f91c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 23 Oct 2026 16:36:46 +0800 Subject: [PATCH 113/124] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9EHCS=E5=90=88?= =?UTF-8?q?=E5=90=8C=E7=AE=A1=E7=90=86=E6=93=8D=E4=BD=9C=E6=89=8B=E5=86=8C?= =?UTF-8?q?=E5=8F=8A=E7=BA=AF=E6=93=8D=E4=BD=9C=E7=89=88=EF=BC=88=E5=90=AB?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=88=AA=E5=9B=BE=E4=B8=8E=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=AF=B4=E6=98=8E=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hcs合同/2026-10-23-HCS合同管理操作手册.md | 714 ++++++++++++++++++ .../01-合同列表.png | Bin 0 -> 159889 bytes .../02-合同列表状态与操作列.png | Bin 0 -> 131819 bytes .../03-合同列表筛选.png | Bin 0 -> 178364 bytes .../04-新增合同-基本信息.png | Bin 0 -> 106069 bytes .../05-新增合同-计费结算与附件.png | Bin 0 -> 83578 bytes .../06-合同详情-基本信息与合规信息.png | Bin 0 -> 118369 bytes .../07-合同详情-附件佐证材料.png | Bin 0 -> 83751 bytes .../08-合同详情-变更记录.png | Bin 0 -> 78210 bytes .../09-合同变更-基本信息.png | Bin 0 -> 109238 bytes .../10-合同变更-原因与材料.png | Bin 0 -> 84998 bytes .../11-附件上传弹窗.png | Bin 0 -> 134874 bytes .../12-特批待发起.png | Bin 0 -> 124437 bytes .../13-确认特批结果.png | Bin 0 -> 122150 bytes .../14-待推送与推送失败列表.png | Bin 0 -> 134140 bytes .../15-手动推送合规确认.png | Bin 0 -> 134404 bytes ...026-10-23-HCS合同管理操作手册(纯操作版).md | 647 ++++++++++++++++ doc/docs/hcs合同/images/01-合同列表.png | Bin 0 -> 159889 bytes .../images/02-合同列表状态与操作列.png | Bin 0 -> 131819 bytes doc/docs/hcs合同/images/03-合同列表筛选.png | Bin 0 -> 178364 bytes .../hcs合同/images/04-新增合同-基本信息.png | Bin 0 -> 106069 bytes .../images/05-新增合同-计费结算与附件.png | Bin 0 -> 83578 bytes .../images/06-合同详情-基本信息与合规信息.png | Bin 0 -> 118369 bytes .../images/07-合同详情-附件佐证材料.png | Bin 0 -> 83751 bytes .../hcs合同/images/08-合同详情-变更记录.png | Bin 0 -> 78210 bytes .../hcs合同/images/09-合同变更-基本信息.png | Bin 0 -> 109238 bytes .../hcs合同/images/10-合同变更-原因与材料.png | Bin 0 -> 84998 bytes doc/docs/hcs合同/images/11-附件上传弹窗.png | Bin 0 -> 134874 bytes doc/docs/hcs合同/images/12-特批待发起.png | Bin 0 -> 124437 bytes doc/docs/hcs合同/images/13-确认特批结果.png | Bin 0 -> 122150 bytes .../images/14-待推送与推送失败列表.png | Bin 0 -> 134140 bytes .../hcs合同/images/15-手动推送合规确认.png | Bin 0 -> 134404 bytes 32 files changed, 1361 insertions(+) create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册.md create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/01-合同列表.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/02-合同列表状态与操作列.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/03-合同列表筛选.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/04-新增合同-基本信息.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/05-新增合同-计费结算与附件.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/06-合同详情-基本信息与合规信息.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/07-合同详情-附件佐证材料.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/08-合同详情-变更记录.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/09-合同变更-基本信息.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/10-合同变更-原因与材料.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/11-附件上传弹窗.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/12-特批待发起.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/13-确认特批结果.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/14-待推送与推送失败列表.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/15-手动推送合规确认.png create mode 100644 doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).md create mode 100644 doc/docs/hcs合同/images/01-合同列表.png create mode 100644 doc/docs/hcs合同/images/02-合同列表状态与操作列.png create mode 100644 doc/docs/hcs合同/images/03-合同列表筛选.png create mode 100644 doc/docs/hcs合同/images/04-新增合同-基本信息.png create mode 100644 doc/docs/hcs合同/images/05-新增合同-计费结算与附件.png create mode 100644 doc/docs/hcs合同/images/06-合同详情-基本信息与合规信息.png create mode 100644 doc/docs/hcs合同/images/07-合同详情-附件佐证材料.png create mode 100644 doc/docs/hcs合同/images/08-合同详情-变更记录.png create mode 100644 doc/docs/hcs合同/images/09-合同变更-基本信息.png create mode 100644 doc/docs/hcs合同/images/10-合同变更-原因与材料.png create mode 100644 doc/docs/hcs合同/images/11-附件上传弹窗.png create mode 100644 doc/docs/hcs合同/images/12-特批待发起.png create mode 100644 doc/docs/hcs合同/images/13-确认特批结果.png create mode 100644 doc/docs/hcs合同/images/14-待推送与推送失败列表.png create mode 100644 doc/docs/hcs合同/images/15-手动推送合规确认.png diff --git a/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册.md b/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册.md new file mode 100644 index 00000000..808af093 --- /dev/null +++ b/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册.md @@ -0,0 +1,714 @@ +# HCS 合同管理操作手册 + +> **文档日期**:2026-10-23 +> **适用系统**:运输板块数字化管理平台(TMS) +> **适用对象**:合同经办人、合同负责人、合同审批人、合规管理员 +> **文档目的**:介绍合同新增、审批、变更、附件归档及 HCS 合规同步的完整操作方法 +> **截图说明**:本文截图取自测试环境,合同编号、客商名称、金额等均为测试数据;不同环境因角色权限、功能开关不同,页面按钮和状态可能略有差异,以实际页面为准。 + +--- + +## 1. 先了解合同管理与 HCS + +### 1.1 合同管理负责什么 + +合同管理模块用于管理运输业务合同的完整生命周期: + +1. **起草合同**:录入合同基本信息、计费方案、结算规则、付款比例及附件。 +2. **合同审批**:支持临时合同审批和正式合同审批。 +3. **合规同步**:合同审批通过后,将合同推送至 HCS 合同合规系统;正式合同及合同变更是合规同步的主要场景。 +4. **合同变更**:正式合同信息发生变化时,通过变更流程修改并重新审批。 +5. **附件归档**:上传用印材料、双章归档文件、特批附件等材料。 + +### 1.2 关键名词 + +| 名词 | 说明 | +| --- | --- | +| HCS | 桂物合同合规系统,负责合同合规校验、客商风险校验、合同特批及金蝶同步 | +| 合规状态 | 合同推送 HCS 的结果,分为“待推送”“已推送”“推送失败” | +| 合规合同ID | 合同成功推送 HCS 后,由 HCS 返回的合同唯一标识 | +| 金蝶合同ID | 合同在 HCS 完成合规及金蝶同步后,回写到 TMS 的金蝶合同编号 | +| 特批 | 高风险或黑名单客商合同,需经集团特批后才能完成合规流程 | +| 临时合同 | 用于提前生效的合同,审批通过后有 **30 天** 临时效力 | +| 正式合同 | 完成正式审批、可长期履约的合同,是 HCS 合规同步与归档的主要对象 | +| 合同变更 | 正式合同内容发生变化时发起的变更审批流程 | + +### 1.3 使用前必须知道的规则 + +- 页面中带 `*` 的字段为必填项;保存草稿时可先填写部分信息,提交临时合同或正式合同前需补全。 +- 合同编号可不填写,系统会按合同负责部门配置的规则自动生成;如业务要求手工编号,可直接填写。 +- 临时合同审批通过后有效期为 **30 天**(自提交临时合同审批之日起算),到期前应及时转为正式合同。 +- 高风险、黑名单客商合同,**提交审批前必须上传“特批附件”**,否则系统会阻止提交。 +- 合同审批通过后,系统会将合同推送 HCS;正式合同与合同变更是合规同步、归档的主要场景。是否自动推送由环境开关决定,也可在页面手动推送。 +- 合同已推送 HCS 后,如需修改合同信息,必须走“变更”流程,**不要重复新增合同**,否则会在合规系统产生重复合同。 +- 合同列表默认按创建时间倒序排列。 + +--- + +## 2. 业务流程总览 + +### 2.1 合同全生命周期 + +```mermaid +flowchart TD + A["新增合同"] --> B["保存草稿"] + B --> C["提交临时合同"] + C --> D["临时合同审批"] + D -->|驳回| B + D -->|通过| E["临时合同生效
    30 天临时效力"] + B --> F["提交正式合同"] + E -->|转正式合同| F + F --> G["正式合同审批"] + G -->|驳回| E + G -->|通过| H["推送 HCS 合规系统"] + H --> I{"客商风险校验"} + I -->|正常| J["合规状态:已推送
    回填合规合同ID"] + I -->|高风险/黑名单| K["特批中
    等待合规特批结果"] + K -->|通过| J + K -->|驳回| L["合同审批驳回
    修改后重新提交"] + J --> M["签订 / 用印 / 双章归档"] + M --> N["发起变更 → 变更审批 → HCS 更新"] +``` + +### 2.2 一句话理解流程 + +1. **先起草**:新增合同,填写基本信息、计费结算、附件。 +2. **再审批**:可先提交临时合同快速生效,也可以直接提交正式合同。 +3. **后合规**:合同审批通过后,系统自动/手动推送 HCS,高风险客商进入特批。 +4. **有变化走变更**:正式合同内容变化时发起变更,变更审批通过后更新 HCS。 + +> 上图和流程以正式合同办理为主线。临时合同审批通过后,系统同样会置为待推送并尝试推送 HCS;正式合同与合同变更审批通过是合规同步、归档和金蝶回写的关键节点。 + +--- + +## 3. 进入合同管理 + +登录系统后,在左侧菜单依次点击: + +**合同管理 → 合同管理** + +![合同列表](images/01-合同列表.png) + +> 合同管理列表页 + +列表页由上到下分为四部分: + +1. **搜索区**:按合同编号、名称、项目、状态等条件查询。 +2. **到期标签**:全部、30天内到期、90天内到期、90天以上到期、已到期。 +3. **工具栏**:新增、批量导出、批量推送合规。 +4. **合同列表**:展示合同及操作入口。 + +--- + +## 4. 查询合同 + +### 4.1 搜索条件 + +在搜索区填写条件后点击“查询”;点击“重置”清空条件。搜索条件超过一行时,可点击“展开/收起”查看全部条件。 + +![合同列表筛选](images/03-合同列表筛选.png) + +> 合同搜索区 + +| 搜索项 | 说明 | +| --- | --- | +| 签约类型 | 新签、续签、补充协议 | +| 合同类别 | 客户合同、承运商合同、补充协议(对应新增页面的“合同类型”) | +| 所属项目 | 选择合同关联的项目 | +| 是否同步合规 | 是 / 否 | +| 合同名称 | 支持模糊查询 | +| 是否同步金蝶 | 是 / 否 | +| 合同编号 | 支持模糊查询 | +| 合规状态 | 待推送 / 已推送 / 推送失败 | +| 生效类型 | 未生效 / 临时生效 / 正式生效 / 已过期 | +| 归档状态 | 未归档 / 已归档 | +| 审核状态 | 草稿 / 审批中 / 审批通过 / 已驳回 / 已撤回 / 变更审批中 / 变更审批通过 / 变更驳回 | +| 合同负责部门 | 选择部门 | +| 合同阶段 | 草稿 / 临时合同 / 正式合同 / 已终止 | + +### 4.2 到期标签 + +列表上方提供 5 个到期标签,标签后的数字为对应合同数量: + +- **全部**:全部合同。 +- **30天内到期**:合同结束日期在未来 30 天内。 +- **90天内到期**:合同结束日期在未来 31~90 天内。 +- **90天以上到期**:合同结束日期在 90 天以后。 +- **已到期**:合同结束日期已过。 + +点击标签即可筛选对应合同。 + +### 4.3 列表字段 + +| 字段 | 说明 | +| --- | --- | +| 合同编号 / 合同名称 | 合同唯一编号和名称,点击名称可打开详情 | +| 所属项目 / 合同负责部门 | 合同归属项目及负责部门 | +| 合同类别 / 签约类型 | 合同业务分类及签约方式 | +| 甲方 / 乙方 | 合同双方 | +| 合同金额 | 合同含税金额 | +| 合同阶段 | 草稿 / 临时合同 / 正式合同 / 已终止 | +| 审核状态 | 当前审批状态 | +| 归档状态 | 未归档 / 已归档 | +| 合规状态 | 待推送 / 已推送 / 推送失败;鼠标悬停可查看失败原因 | +| 金蝶合同ID | 合规同步完成后回写的金蝶合同编号 | +| 当前节点 / 当前处理人 | 当前审批节点及处理人 | +| 创建人 / 创建时间 | 合同创建信息 | +| 操作 | 查看、编辑、复制、变更、附件上传、推送合规等 | + +### 4.4 操作列说明 + +![合同列表状态与操作列](images/02-合同列表状态与操作列.png) + +> 合同列表中的状态与操作列(示例) + +操作列会根据合同状态、当前登录人权限动态显示: + +| 合同状态 | 常见操作 | +| --- | --- | +| 草稿 | 查看、编辑、复制、删除 | +| 临时合同 - 审批中 | 查看、撤回、通过/驳回(审批人)、流程 | +| 临时合同 - 审批通过 | 查看、复制、转正式合同、流程 | +| 临时合同 - 已驳回 | 查看、编辑、复制、重新提交转正 | +| 正式合同 - 审批中 | 查看、撤回、通过/驳回(审批人)、流程 | +| 正式合同 - 审批通过 / 变更审批通过 | 查看、复制、变更、附件上传、流程、推送合规(未同步时) | +| 正式合同 - 变更审批中 | 查看、通过/驳回(审批人)、撤回变更、流程 | +| 正式合同 - 变更驳回 | 查看、编辑变更内容、重新提交变更 | + +> 说明: +> - “复制”会以当前合同为模板打开新增页面,便于快速新建相似合同。 +> - 只有草稿状态的合同可以删除。 +> - 只有审批通过且未同步合规的合同显示“推送合规”。 + +--- + +## 5. 新增合同 + +### 5.1 新增入口 + +在合同列表页点击左上角 **新增** 按钮,进入“新增合同管理”页面。 + +![新增合同-基本信息](images/04-新增合同-基本信息.png) + +> 新增合同页面 + +### 5.2 填写基本信息 + +按照页面从上到下依次填写: + +| 字段 | 填写说明 | +| --- | --- | +| 签约类型 `*` | 选择新签、续签或补充协议 | +| 合同编号 | 不填写时按部门规则自动生成;也可手工录入 | +| 合同名称 `*` | 最多 100 个字符 | +| 合同类型 `*` | 选择客户合同、承运商合同或补充协议 | +| 项目 `*` | 选择合同关联的项目 | +| 合同负责部门 `*` | 选择负责该合同的部门 | +| 甲方 `*` | 选择甲方客商 | +| 乙方 `*` | 选择乙方客商 | +| 签订日期 `*` | 选择合同签订日期 | +| 申请日期 | 提交正式合同时系统自动填充为当天,无需手工填写 | +| 合同期限 `*` | 填写合同开始日期和结束日期 | +| 回款账期 | 填写回款账期天数 | +| 合同金额 `*` | 填写合同金额,不能小于 0 | +| 是否范本 | 选择“是/否” | +| 原件合同编号 | 如有原件合同,填写原件编号 | +| 是否电子章 | 选择“是/否” | +| 开票周期 | 填写开票周期天数 | +| 结算币种 `*` | 选择人民币等结算币种 | +| 合同格式 `*` | 选择合同格式 | +| 一式 | 填写合同份数 | +| 是否需要加盖法人章 `*` | 选择“是/否” | +| 结算方式 `*` | 选择先票后款、先款后票、月结等 | +| 经办人 | 自动带出当前登录人,不可修改 | +| 合同主要内容 | 填写合同主要条款,最多 1000 字 | +| 其他事项说明 | 填写补充说明,长度以页面提示为准 | + +> 提示:保存草稿时系统仅校验合同名称、合同类型、结算币种等基础信息;提交临时合同或正式合同时会校验更多必填项,请以页面提示为准。 + +### 5.3 上传用印材料 + +在“用印材料”区域: + +1. 点击表格下方的 **上传附件**。 +2. 选择附件类型:用印材料、双章归档文件、其他文件。 +3. 上传文件,支持 pdf、bmp、jpeg、png、jpg、doc、docx、ppt、pptx、xlsx、xls、eml、msg、zip,单个文件不超过 50MB。 +4. 上传完成后可在表格中查看文件名、大小、上传人、上传时间。 +5. 需要下载时,勾选附件后点击 **批量下载**。 + +> 说明:附件类型选择“双章归档文件”并上传后,合同审批通过时归档状态会自动变为“已归档”。 + +### 5.4 填写计费与结算 + +继续向下填写以下区域: + +![新增合同-计费结算与附件](images/05-新增合同-计费结算与附件.png) + +> 计费、结算、付款比例与附件区域 + +**计费信息** + +- 费用生成模式:系统生成 / 账单导入生成。 +- 点击 **添加** 新增计费方案,填写方案名称、运输方式。 + +**结算单规则** + +- 分为“预结算配置”和“正式结算配置”两个页签。 +- 每个页签可设置是否自动生成结算单(开启 / 关闭)。 + +**付款比例设置** + +- 点击 **添加**,填写付款笔数、付款比例上限(%)、备注。 + +**附件(佐证材料等)** + +- 用于上传佐证材料、特批附件等。 +- 附件类型:特批附件、其他文件。 +- 高风险/黑名单客商合同必须在此处上传类型为 **特批附件** 的文件。 + +### 5.5 选择提交方式 + +页面底部提供 4 个按钮: + +| 按钮 | 适用场景 | 提交后状态 | +| --- | --- | --- | +| 关闭 | 放弃本次填写 | 不保存 | +| 保存 | 信息尚未填全,先暂存 | 合同阶段为“草稿”,审核状态为“草稿” | +| 提交临时合同 | 需要合同尽快生效 | 合同阶段为“临时合同”,进入临时合同审批 | +| 提交正式合同 | 合同信息完整,直接走正式审批 | 直接进入正式合同审批 | + +> 说明: +> - 提交临时合同前,至少需填写签约类型、合同名称、合同类型、所属项目、合同负责部门、甲方、乙方、合同金额。 +> - 提交正式合同前,需完整填写合同期限、签订日期、结算方式、合同格式、合同金额等字段,并完成计费方案、结算规则、付款比例校验。 +> - 无论选择哪种提交方式,高风险/黑名单客商合同都必须先上传“特批附件”。 + +--- + +## 6. 合同审批与状态 + +### 6.1 审批人操作 + +审批人在合同列表操作列进行审批: + +| 操作 | 说明 | +| --- | --- | +| 通过 | 审批通过;系统会尝试推送合规(是否即时推送由环境配置决定),请稍候 | +| 驳回 | 审批驳回,合同退回经办人修改 | +| 撤回 | 提交人可在审批中撤回;普通审批撤回后为“已撤回”,可修改后重新提交 | +| 流程 | 查看审批流程;如提示“流程实例为空”,说明该合同未生成外部流程实例,以审核状态为准 | + +> 重要:点击“通过”后,系统会尝试推送 HCS(是否即时推送由环境配置决定),页面会显示“正在推送合规,请稍候…”。如果提示 **“审批通过,但合规推送失败:原因”**,表示合同审批已通过,但合规推送失败,请按第 11 章处理,不要重复审批;如未开启即时推送,可在合同列表手动点击“推送合规”。 + +### 6.2 合同阶段说明 + +| 合同阶段 | 含义 | +| --- | --- | +| 草稿 | 已保存但未提交审批 | +| 临时合同 | 正在走临时合同审批,或临时合同已审批通过(30 天临时效力) | +| 正式合同 | 正在走正式合同审批,或正式合同已审批通过 | +| 已终止 | 合同已终止(当前版本前端暂未开放终止入口) | + +### 6.3 审核状态说明 + +| 审核状态 | 含义 | +| --- | --- | +| 草稿 | 尚未提交审批 | +| 审批中 | 临时合同或正式合同审批中 | +| 审批通过 | 审批完成 | +| 已驳回 | 审批被驳回,需修改后重新提交 | +| 已撤回 | 提交人主动撤回,可修改后重新提交 | +| 变更审批中 | 合同变更审批中 | +| 变更审批通过 | 合同变更审批完成 | +| 变更驳回 | 合同变更被驳回,可修改后重新提交变更 | + +### 6.4 其他状态说明 + +| 状态 | 说明 | +| --- | --- | +| 归档状态:未归档 | 尚未上传双章归档文件 | +| 归档状态:已归档 | 已上传双章归档文件,合同审批通过后自动置为已归档 | +| 合规状态:待推送 | 合同已审批通过,等待推送 HCS | +| 合规状态:已推送 | 合同已成功提交至 HCS,已回填合规合同ID | +| 合规状态:推送失败 | 推送 HCS 失败,鼠标悬停合规状态可查看失败原因 | +| 当前节点:特批审核 | 高风险/黑名单合同正在等待合规特批结果 | + +--- + +## 7. 临时合同转正式合同 + +### 7.1 适用条件 + +- 合同阶段为“临时合同”,审核状态为“审批通过”。 +- 临时合同被驳回时,可先编辑修改,再点击“重新提交转正”。 + +### 7.2 操作步骤 + +1. 在合同列表找到临时合同。 +2. 点击操作列的 **转正式合同**。 +3. 在确认弹窗中点击“确定”。 +4. 系统提示“已提交正式合同审批”。 + +### 7.3 提交后的变化 + +- 合同阶段变为“正式合同”。 +- 审核状态变为“审批中”。 +- 当前节点为“正式合同审批”。 +- 申请日期自动更新为当天。 +- 正式审批通过后,系统推送 HCS 合规系统。 + +> 临时合同有效期为 30 天,请及时转正式合同,避免临时效力到期影响业务。 + +--- + +## 8. 查看合同详情 + +在合同列表点击 **合同名称** 或操作列的 **查看**,进入合同详情页。 + +![合同详情-基本信息与合规信息](images/06-合同详情-基本信息与合规信息.png) + +> 合同详情:基本信息与合规信息 + +详情页包含以下区域: + +### 8.1 基本信息 + +展示签约类型、合同编号、合同名称、合同类型、项目、甲方、乙方、合同期限、合同负责部门、经办人、归档状态、签订日期、申请日期、合同格式、结算币种、结算方式、开票周期、回款账期、合同金额、是否范本、原件合同编号、是否电子章、合同主要内容、其他事项说明等。 + +**风险客商提示**:如果甲方或乙方属于高风险/黑名单客商,基本信息下方会显示红色提示,列明风险原因,并提示“提交前须上传特批附件”。 + +### 8.2 合规信息 + +合规信息区域展示: + +| 字段 | 说明 | +| --- | --- | +| 合规同步状态 | 待推送 / 已推送 / 推送失败 | +| 合规合同ID | HCS 返回的合同唯一标识 | +| 客商风险 | 是否黑名单、风险等级 | +| 特批状态 | 待特批 / 特批中 / 特批通过 / 特批驳回 | +| 特批说明 | 特批原因或处理说明 | + +### 8.3 用印材料与附件 + +向下滚动可查看用印材料、计费信息、结算单规则、付款比例设置、附件(佐证材料等)。 + +![合同详情-附件佐证材料](images/07-合同详情-附件佐证材料.png) + +> 合同详情:计费、结算、付款比例与佐证材料 + +### 8.4 变更记录 + +详情页底部展示合同的变更记录,包括变更日期、经办人、变更类型、变更内容、变更原因、状态。 + +![合同详情-变更记录](images/08-合同详情-变更记录.png) + +> 合同详情:附件与变更记录 + +--- + +## 9. 附件上传与归档 + +### 9.1 适用条件 + +只有**正式合同**且审核状态为“审批通过”或“变更审批通过”时,才显示“附件上传”操作。 + +### 9.2 操作步骤 + +1. 在合同列表找到正式合同。 +2. 点击操作列 **附件上传**。 + +![附件上传弹窗](images/11-附件上传弹窗.png) + +> 附件上传弹窗 + +3. 选择 **附件位置**: + - **用印材料**:可上传用印材料、双章归档文件、其他文件。 + - **附件(佐证材料等)**:可上传特批附件、其他文件。 +4. 选择 **附件类型**。 +5. 将文件拖入上传区域,或点击上传区域选择文件。 +6. 点击 **确定** 保存。 + +### 9.3 上传限制 + +- 支持 pdf、bmp、jpeg、png、jpg、doc、docx、ppt、pptx、xlsx、xls、eml、msg、zip 格式。 +- 单个文件不超过 50MB。 +- 上传人、上传时间由系统自动记录。 + +### 9.4 归档规则 + +- 上传附件类型为 **双章归档文件** 后,合同归档状态会在审批通过或附件保存后变为“已归档”。 +- 双章归档文件属于用印材料,请在“附件位置”中选择“用印材料”。 + +--- + +## 10. 合同变更 + +### 10.1 适用条件 + +只有**正式合同**,且审核状态为“审批通过”“变更审批通过”或“变更驳回”时,才允许发起变更。 + +### 10.2 发起变更 + +1. 在合同列表找到正式合同。 +2. 点击操作列 **变更**(变更驳回后可点击“重新提交变更”)。 +3. 进入“合同变更”页面。 + +![合同变更-基本信息](images/09-合同变更-基本信息.png) + +> 合同变更页面 + +4. 修改需要变更的内容:基本信息、用印材料、计费信息、结算单规则、付款比例、附件等。 +5. 页面会展示风险客商提示;如存在高风险/黑名单客商,变更提交前同样必须上传“特批附件”。 + +### 10.3 填写变更原因与材料 + +![合同变更-原因与材料](images/10-合同变更-原因与材料.png) + +> 合同变更:变更原因与变更材料 + +1. 在“变更原因”中填写本次变更的原因,最多 500 字。 +2. 在“变更材料”区域上传相关附件。 +3. 点击页面底部 **提交**。 +4. 在确认弹窗中点击“确定”。 + +### 10.4 变更审批 + +- 提交后审核状态变为“变更审批中”。 +- 审批人可执行“通过”“驳回”“撤回变更”。 +- 审批通过后,审核状态变为“变更审批通过”,系统按合规合同ID更新 HCS;如该合同尚未推送过,则按首次推送处理。 +- 审批驳回后,审核状态变为“变更驳回”,可点击“重新提交变更”重新填写变更原因后再次提交。 + +> 说明: +> - 变更审批通过后,变更附件会合并到合同附件中,变更原因、变更内容会被清空,变更记录保留。 +> - 页面中的“终止合同”选项当前版本暂未开放,请选择“合同信息变更”。 + +--- + +## 11. HCS 合规推送 + +### 11.1 什么时候推送 + +合同满足以下条件后进入合规推送流程: + +- 审核状态为“审批通过”或“变更审批通过”; +- 合规状态为“待推送”或“推送失败”。 + +> 说明:临时合同审批通过后系统同样会置为待推送并尝试推送;正式合同与合同变更审批通过是合规同步的主要场景,也是归档、金蝶回写的关键节点。 + +系统支持两种触发方式: + +1. **自动推送**:审批通过后系统会尝试即时推送;同时后台定时任务每 5 分钟扫描待推送/推送失败的合同进行补偿。即时推送和定时任务是否启用均由环境配置决定。 +2. **手动推送**:在合同列表点击“推送合规”或“批量推送合规”。 + +### 11.2 系统会推送什么 + +![待推送与推送失败列表](images/14-待推送与推送失败列表.png) + +> 列表中的待推送、推送失败状态 + +推送 HCS 时,系统会依次完成: + +| 步骤 | 内容 | +| --- | --- | +| ① 客商风险校验 | 校验甲乙双方是否高风险/黑名单(C101-1) | +| ② 附件转传 | 将合同附件转传到合规系统(C103-2) | +| ③ 合同判重 | 按合同编号等信息判断合规系统是否已存在(C103-3) | +| ④ 起草 / 更新 | 首次推送起草合同(C103-1);已有合规合同ID时更新合同(C103-11) | +| ⑤ 履约计划同步 | 同步合同履约计划/履约规则(C103-9),系统自动创建默认履约计划,无需人工维护 | +| ⑥ 特批 | 高风险/黑名单客商合同自动进入特批流程 | + +### 11.3 手动推送单条合同 + +1. 在合同列表找到“待推送”或“推送失败”的合同。 +2. 点击操作列 **推送合规**。 + +![手动推送合规确认](images/15-手动推送合规确认.png) + +> 手动推送合规确认 + +3. 在确认弹窗中点击“确定”。 +4. 页面显示“正在推送合规,请稍候…”,请勿重复点击。 +5. 推送完成后列表自动刷新,合规状态变为“已推送”或“推送失败”。 + +### 11.4 批量推送合规 + +1. 在合同列表勾选需要推送的合同。 +2. 点击工具栏 **批量推送合规**。 +3. 在确认弹窗中点击“确定”。 + +> 批量推送要求选中的合同全部满足:审核状态为“审批通过”或“变更审批通过”,且合规状态不是“已推送”。如存在不符合条件的合同,系统会提示“选中数据中有 N 条不符合推送条件”,请重新选择。 +> +> 特批中的合同请勿勾选,需等待特批结果后再处理,系统会拒绝重推。 + +### 11.5 推送成功后的结果 + +推送成功后: + +- 合规状态变为“已推送”。 +- 详情页“合规信息”中回填“合规合同ID”。 +- 金蝶合同ID由合规系统/金蝶同步完成后回写,可在合同列表查看;如暂时为空,可稍后刷新。 + +> 注意:“已推送”表示合同已成功提交至合规系统;如客商为高风险/黑名单,特批状态可能仍为“特批中”,需等待特批结果。 + +### 11.6 推送失败的处理 + +1. 鼠标悬停在列表的合规状态“推送失败”上,查看失败原因。 +2. 也可进入合同详情,在“合规信息”中查看失败说明。 +3. 根据原因修正数据(如合同类别未配置合规模板、附件异常、客商信息异常等)。 +4. 重新点击“推送合规”。 + +系统默认会对推送失败的合同自动重试,最多重试 5 次;超过重试次数后,需要人工排查并手动重推(手动重推会将重试次数清零)。 + +> 特批中的合同不允许重复推送,请等待特批结果后再操作。 + +--- + +## 12. 合同特批(高风险/黑名单客商) + +### 12.1 什么情况需要特批 + +当合同甲方或乙方为外部客商,且命中以下任一情况时,需要走特批流程: + +- 客商为黑名单; +- 客商风险等级为高风险。 + +### 12.2 提交前:上传特批附件 + +1. 在新增/编辑合同页面,滚动到“附件(佐证材料等)”区域。 +2. 点击上传,附件类型选择 **特批附件**。 +3. 上传特批申请材料及内部审批流程附件。 + +> 未上传特批附件时提交,系统会提示:**“合同相对方存在高风险/黑名单客商,必须上传「特批附件」类型附件后再提交审批”**。 + +### 12.3 查看特批状态 + +高风险/黑名单合同详情页会显示: + +- 红色“风险客商提示”,列明风险原因; +- 合规信息中的“客商风险”“特批状态”“特批说明”。 + +![特批待发起](images/12-特批待发起.png) + +> 高风险客商合同详情(测试环境截图,图中“特批说明”的 C103-8 接口报错为测试环境历史数据) + +特批状态说明: + +| 特批状态 | 含义 | +| --- | --- | +| 待特批 | 历史数据停留在待发起状态,正常新流程不会长期停留在此状态 | +| 特批中 | 合规系统正在审批特批,当前节点显示“特批审核” | +| 特批通过 | 特批完成,可继续后续流程 | +| 特批驳回 | 特批未通过,合同审批会被联动驳回 | + +### 12.4 特批的正常流程 + +1. 合同上传特批附件后提交审批。 +2. 合同审批通过并推送 HCS。 +3. 风险校验命中高风险/黑名单,合同自动进入“特批中”,当前节点为“特批审核”。 +4. 合规系统完成特批后,将结果推送回 TMS;系统定时查询也会补偿获取结果。 +5. 特批通过:合同恢复为“审批通过”;如合规侧已完成金蝶同步,金蝶合同ID会同时回填。 +6. 特批驳回:合同审批状态联动变为“已驳回”,需修改合同后重新提交审批、重新推送。 + +### 12.5 人工确认特批结果 + +特批结果通常由合规系统自动回写。如结果未自动回传,合规管理员可在合同详情页人工确认: + +1. 打开合同详情,确认特批状态为“特批中”。 +2. 点击“合规信息”右上角的 **确认特批结果**。 + +![确认特批结果](images/13-确认特批结果.png) + +> 确认特批结果 + +3. 在输入框中输入 `approved`(通过)或 `rejected`(驳回)。 +4. 点击“确定”。 + +> 人工确认仅允许在“特批中”状态操作,结果只支持 `approved` 和 `rejected`。确认后合同状态会按结果联动变化,请确认结果无误后再提交。 + +### 12.6 关于“发起特批”按钮 + +合同详情页右上角的 **发起特批** 是旧版独立发起入口。当前合规接口已改为随合同推送自动发起特批,正常流程**无需点击该按钮**;点击后如提示接口不存在,不影响合同数据。如特批状态长时间停留在“待特批”,请联系系统管理员重新推送合同。 + +--- + +## 13. 常见问题 + +**Q1:审批通过后,合规状态一直显示“待推送”怎么办?** + +A:可能当前环境未开启自动推送,或后台扫描任务尚未执行。可先点击操作列“推送合规”手动推送;仍无法推送时联系系统管理员检查推送开关和任务状态。 + +**Q2:推送失败了怎么办?** + +A:将鼠标悬停在“推送失败”上查看原因,或在合同详情“合规信息”中查看。修正数据后点击“推送合规”重推。系统默认自动重试 5 次,超限后必须人工重推。 + +**Q3:提交时提示必须上传“特批附件”怎么办?** + +A:说明合同甲方或乙方命中高风险/黑名单。请在“附件(佐证材料等)”区域上传附件,并将附件类型选择为“特批附件”,然后重新提交。 + +**Q4:临时合同和正式合同有什么区别?** + +A:临时合同用于提前生效,审批通过后有 30 天临时效力;正式合同用于长期履约,是 HCS 合规同步和归档的主要对象。临时合同审批通过后应及时点击“转正式合同”。 + +**Q5:为什么列表里没有“转正式合同”?** + +A:只有合同阶段为“临时合同”,且审核状态为“审批通过”时才显示;临时合同被驳回时显示“重新提交转正”。 + +**Q6:为什么没有“附件上传”按钮?** + +A:只有正式合同,且审核状态为“审批通过”或“变更审批通过”时才允许上传附件。 + +**Q7:金蝶合同ID为什么为空?** + +A:金蝶合同ID由合规系统完成金蝶同步后回写,可能存在延迟。推送成功后可稍后刷新查看;长时间为空请联系系统管理员。 + +**Q8:合同推送 HCS 后还能修改吗?** + +A:不能直接编辑。请通过“变更”流程修改,变更审批通过后系统会更新 HCS,避免产生重复合同或数据不一致。 + +**Q9:变更页面里的“终止合同”为什么不能提交?** + +A:当前版本“终止合同”选项暂未开放,请选择“合同信息变更”完成信息调整;如确需终止合同,请联系系统管理员。 + +**Q10:上传“双章归档文件”后,归档状态为什么没有变化?** + +A:请确认附件位置选择的是“用印材料”,附件类型为“双章归档文件”,并确认合同已审批通过。保存后刷新列表查看;如仍未变化,请联系系统管理员。 + +**Q11:点击“流程”提示“流程实例为空,无法查看流程”怎么办?** + +A:说明该合同没有关联外部审批流程实例。请以列表/详情中的审核状态和当前节点为准;如需查看审批流转,请联系系统管理员。 + +**Q12:批量推送合规提示“选中数据中有 N 条不符合推送条件”怎么办?** + +A:批量推送只允许“审批通过/变更审批通过”且未同步的合同。请取消勾选不符合条件的合同,或单独对符合条件的合同发起推送。 + +--- + +## 14. 操作权限速查 + +| 操作 | 所需条件 | +| --- | --- | +| 新增合同 | 具有合同管理新增权限 | +| 编辑合同 | 草稿、已撤回、已驳回、变更驳回状态 | +| 删除合同 | 草稿状态 | +| 复制合同 | 具有合同管理复制权限,复制后为新增草稿 | +| 转正式合同 | 临时合同 + 审批通过 | +| 变更 | 正式合同 + 审批通过 / 变更审批通过 | +| 重新提交变更 | 正式合同 + 变更驳回 | +| 附件上传 | 正式合同 + 审批通过 / 变更审批通过 | +| 推送合规 | 审批通过 / 变更审批通过 + 未同步 | +| 通过 / 驳回 | 审批中 / 变更审批中 + 审批权限 | +| 撤回 | 审批中(撤回变更仅限变更审批中) | + +--- + +## 15. 注意事项 + +1. 合同编号不填写时按部门规则自动生成;手工编号请确保唯一。 +2. 合同金额不能小于 0,金额类字段请按实际合同金额填写。 +3. 高风险/黑名单客商合同必须上传“特批附件”,新增、变更、重新提交时均需保留。 +4. 临时合同有效期为 30 天,请及时转正式合同。 +5. 合同审批通过后会自动进入合规推送,请耐心等待,不要重复点击审批或推送。 +6. 已推送 HCS 的合同需要修改时,必须走“变更”流程,禁止重复新建合同。 +7. 推送失败时先查看失败原因,修正后再重推;特批中的合同不要重推。 +8. 合同列表默认按创建时间倒序,审批、归档、合规状态请以页面实时显示为准。 +9. 本文截图取自测试环境,正式环境的数据和按钮以实际权限配置为准。 diff --git a/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/01-合同列表.png b/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/01-合同列表.png new file mode 100644 index 0000000000000000000000000000000000000000..7553fe867161a89a2a123dda3a3d027ec797351f GIT binary patch literal 159889 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 literal 0 HcmV?d00001 diff --git a/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/02-合同列表状态与操作列.png b/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/02-合同列表状态与操作列.png new file mode 100644 index 0000000000000000000000000000000000000000..1c4ec31cdaa737b057db8bf15ac3a4ebd698bc06 GIT binary patch literal 131819 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 literal 0 HcmV?d00001 diff --git a/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/03-合同列表筛选.png b/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/03-合同列表筛选.png new file mode 100644 index 0000000000000000000000000000000000000000..d59436f08c184ce6304fc2b79a64780580b27c22 GIT binary patch literal 178364 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
    >UZtY!TCJ@2&h*Kpyl3UtrQf9`tb# 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%0Dm<_7cHkH6EA| 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 mt1G2~{R-eY=$Lf09~sio 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%0A0aR!S~=MK9QhjQX$9 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�(a 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 z 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

    )sL({W&d;cXWfn`NC~*^ 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 z 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%0D6X@9Rw{I`@+SSi#J89v4~uH{yQ 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:&C0+;3u3slh-Ofwz{cQkXDbw2H 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

    O|S+_Wb*=d+Qx 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 literal 0 HcmV?d00001 diff --git a/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/11-附件上传弹窗.png b/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/11-附件上传弹窗.png new file mode 100644 index 0000000000000000000000000000000000000000..ca69250e62d970874f3614f27909084d8b017624 GIT binary patch literal 134874 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 literal 0 HcmV?d00001 diff --git a/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/08-合同详情-变更记录.png b/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/08-合同详情-变更记录.png new file mode 100644 index 0000000000000000000000000000000000000000..5039d0bdbc4c63e916f8dc858adda811dbca41ff GIT binary patch literal 78210 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 W9=z1fNjT#Vk4A9y+I!RGSmGaI0+_=9 literal 0 HcmV?d00001 diff --git a/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/09-合同变更-基本信息.png b/doc/docs/hcs合同/2026-10-23-HCS合同管理操作手册(纯操作版).assets/09-合同变更-基本信息.png new file mode 100644 index 0000000000000000000000000000000000000000..d678cc82240ed271905a5bc5d5831e93f17cdc0c GIT binary patch literal 109238 zcmc$_cT`i|*Di`Eq9Uj$C|yNFx`Om7QUruZmu{g+3oV2m6cs@rbVNu%dXIESC?dUg zA|(mZA=Cf~HMzX6`1`(b#<=5tXN-Hs+5d#>?6udNbFEpP`7A=8>8R6RV7)*^MMbai zL`9E^iZ+Of>WtJm>f<|hB}Uh%s4i1!s5~<8PFca6_cz$7qfh|U=gpL_DZik;la`*T zba^g@$|bkr#+llwQ8S=;1fw6FLH-pd85CC5VaH#dL^XZpZI^zwa^c*PC*2DMfmHE2*z)rW!X&=lc7( zTVGxW!i(`(sDCc!HFKQjM&-BO~WKl$_Ad1`y}7t8oJtf&9nF{d(!Q~zIn&J8;I z=SSgl21+N-DHUkcs<00XmVH(M$LMfu$LQN-?Z>gp+?pHF^HmvVqqaYp!9MyEgXlw@ z;;{I~Z8laF{yxtm;l~eeKZeO@l5`j+w2N2xG7h?O;!Eq4byDNK-chlhjQk3G2B?v+ z^x}$^1Z#|F;M4)|0g54eEX3%^Q#*}i9{mO$uK14P$Ag@g|09)H7BTTxF<~uH=9Q7J zTFS0bRd6V*A@s8x=g4Ncsh-E(^z=%{r4B8MPa*nSti=V=^8TXkQKp@-Zk34dnf{ZR z``INgM%|AdN!6@#?D#fhp&%8r@%GNc?+Ib~Bm52)JGcYX+_c(%tfZYVZk5xwzB*ck zxIpoL8j^k=aCx<)M8crlO;pfIsDh*{J#AII+jJC8V{t-PiwBdDpAP=p3$Cho_Lni#A7lwz z*NZx#ci(f;Le)}=3P@~5R({!mv+dCt+_%#|EBK?loV-=+@KhDbn`rkf8(-?CA-lQs zYr-em2BpzQ3`Lhn<6k)ZY8@AIUoo)g=|BoczYJ#QIM`W9b19(cq~sSA484wtiK&Nd zrFBF@WX=30?erbE9rPW7uM6;}o%-{xwDZU7ED4qdqR}HGXtY+{_Ugbb;p|}3^jC|s z&F!mxIwPM`r2TARkA$G-);C^M8B^|E+IK3NO`BABB9Tbzk8I0nkGh~i>GvVQHwm8} zUm(nx;M4H47^xbcn);+v;ZUy$KFr)$yY%D#n7>i8R)v8hF+X-tY`Xb)wU$ALg2vlR zzl!v~*u?c_0pQZf?ig@7(sSk4qn}Mb^Pz!Tqsan1-QeJVq<1LGQg?#uwDi2WEr|-A zx#iyQIA`RI{_NNs{3WzaBccGg-{W3mWj)BcH$uu(&trgrY%x1>nSFy{r?%6cj~TN3 z-0Zm~P}Te?B_6VtK*%m!aBZ(bh7EVh`qeR8-Xc75Wz!2jV2|xl&tjrq7C9eX@0S&R zw<*yO&xTv}+6d-8kL*&bTj7^A^vmwGv-bAh z9f;j&a|DEZ&}d`$ZKpGeZ{%>Q%#+BKz;h`jH*WTU!4|Oz92DsfRd7ovi_4o+1q^5sY7wn~5X80n{fCbMZ z3|Vau%?hPYD10PSa@6DEGg9{xL@2J==u7yJy+&w%B3-LtU0wXzm}1Jm+@l%$Sawd* zs`FB7yAWol6&U!K)s+ICB`YwpV7;{uKC#Uihw7Q$0tVheaC(x{&zKjW