!6 fix: 项目+合同对接合同系统

Merge pull request !6 from mindless/feature/hcs-api-p0
This commit is contained in:
2026-10-27 06:24:01 +00:00
committed by Gitee
187 changed files with 18843 additions and 169 deletions
@@ -220,4 +220,53 @@ 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;
@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;
@Schema(description = "金蝶合同ID(contractLegal/result 合同特批金蝶同步结果回调回填)")
private String kingdeeId;
}
@@ -0,0 +1,78 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* 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,单附件行级,照金蝶附件同步表设计)
* <p>
* 仅落成功记录: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;
}
@@ -0,0 +1,79 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* 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;
}
@@ -0,0 +1,101 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* 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)
* <p>
* 合同维度的资金计划阶段,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;
}
@@ -183,4 +183,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;
}
@@ -180,4 +180,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;
}
@@ -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;
}
@@ -198,4 +198,27 @@ 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;
@Schema(description = "金蝶项目ID(D902 项目金蝶同步结果回调回填)")
private String kingdeeId;
@Schema(description = "金蝶项目编号(D902 项目金蝶同步结果回调回填)")
private String kingdeeNumber;
}
@@ -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;
@@ -0,0 +1,72 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* 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)
* <p>
* 内部组织类型客商默认无风险(不调 C101-1);外部客商高风险/黑名单时 risky=true 并返回 riskTip
*
* @author Chill
*/
@Data
@Schema(description = "客商风险展示")
public class CustomerRiskVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "客商编号")
private String customerCode;
@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 = "风险等级名称(服务端转义:黑名单/高风险/中风险/低风险,黑名单优先;无等级为空)")
private String riskLevelName;
@Schema(description = "是否高风险/黑名单客商(外部客商专用,内部组织恒为 false)")
private Boolean risky;
@Schema(description = "风险客商提示文案(基本信息备注后展示,安全客商为空)")
private String riskTip;
}
@@ -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;