✨ 收票管理金蝶全票池同步:镜像表新增票池字段(幂等脚本)与实体字段备注

This commit is contained in:
刘泉佳
2026-09-21 13:18:41 +08:00
parent 933f9ffdb9
commit 69fee13242
3 changed files with 218 additions and 0 deletions
@@ -48,36 +48,123 @@ import java.time.LocalDate;
@Schema(description = "收票登记")
public class InvoiceReceipt extends TenantEntity {
@Serial private static final long serialVersionUID = 1L;
/**
* 关联金蝶票据池镜像主键(blade_kingdee_invoice_pool.id)
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long kingdeeInvoicePoolId;
/**
* 发票号码(同租户唯一,一张发票仅可登记一次)
*/
private String invoiceNo;
/**
* 开票日期
*/
private LocalDate invoiceDate;
/**
* 发票类型(如「数电发票(增值税专用发票)」)
*/
private String invoiceType;
/**
* 税率(百分数,13 表示 13%)
*/
private BigDecimal taxRate;
/**
* 开票金额
*/
private BigDecimal invoiceAmount;
/**
* 税额
*/
private BigDecimal taxAmount;
/**
* 受票单位(购方)
*/
private String receiverName;
/**
* 开票单位(销方)
*/
private String issuerName;
/**
* 所属项目id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long projectId;
/**
* 所属项目名称
*/
private String projectName;
/**
* 所属组织id
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long deptId;
/**
* 所属组织名称
*/
private String deptName;
/**
* 付款方
*/
private String payerName;
/**
* 收款方
*/
private String payeeName;
/**
* 开票单位开户银行
*/
private String bankName;
/**
* 开票单位银行账号
*/
private String bankAccount;
/**
* 开票单位开户网点
*/
private String issuingBank;
/**
* 联系电话
*/
private String phone;
/**
* 客户邮箱(分号分隔,最多 3 个)
*/
private String customerEmails;
/**
* 部门邮箱(分号分隔,最多 3 个)
*/
private String departmentEmails;
/**
* 审批状态(draft 草稿 / reviewing 审批中 / approved 审批通过 / returned 已驳回 / voided 已作废)
*/
private String approvalStatus;
/**
* 当前审批节点
*/
private String currentNode;
/**
* 当前处理人
*/
private String currentProcessor;
/**
* 金蝶单据号(绑定票池后取发票流水号 serialNo)
*/
private String kingdeeBillNo;
/**
* 金蝶同步状态(unsynced 未同步 / synced 已同步 / failed 同步失败)
*/
private String kingdeeStatus;
/**
* 附件信息JSON
*/
private String attachmentsJson;
/**
* 备注(最多 200 字)
*/
private String remark;
/**
* 作废原因
*/
private String voidReason;
}
@@ -47,22 +47,92 @@ import java.time.LocalDateTime;
@Schema(description = "金蝶进项发票票据池镜像")
public class KingdeeInvoicePool extends TenantEntity {
@Serial private static final long serialVersionUID = 1L;
/**
* 发票号码(同租户唯一,A801-1 invoiceNo,镜像 upsert 匹配键)
*/
private String invoiceNo;
/**
* 金蝶发票流水号(票池唯一标识,A801-1 serialNo)
*/
private String serialNo;
/**
* 开票日期
*/
private LocalDate invoiceDate;
/**
* 发票类型(票易通编码转名称后落库,如「数电发票(增值税专用发票)」)
*/
private String invoiceType;
/**
* 税率(百分数,13 表示 13%)
*/
private BigDecimal taxRate;
/**
* 开票金额(A801-1 价税合计 totalAmount)
*/
private BigDecimal invoiceAmount;
/**
* 税额
*/
private BigDecimal taxAmount;
/**
* 受票单位(购方名称,A801-1 buyerName)
*/
private String receiverName;
/**
* 购方税号(A801-1 buyerTaxNo)
*/
private String buyerTaxNo;
/**
* 开票单位(销方名称,A801-1 salerName)
*/
private String issuerName;
/**
* 销方税号(A801-1 salerTaxNo)
*/
private String salerTaxNo;
/**
* 开票单位开户银行
*/
private String bankName;
/**
* 开票单位银行账号
*/
private String bankAccount;
/**
* 开票单位开户网点
*/
private String issuingBank;
/**
* 联系电话
*/
private String phone;
/**
* 客户邮箱(分号分隔,最多 3 个)
*/
private String customerEmails;
/**
* 部门邮箱(分号分隔,最多 3 个)
*/
private String departmentEmails;
/**
* 金蝶单据号(票池发票取发票流水号 serialNo)
*/
private String kingdeeBillNo;
/**
* 金蝶同步状态(unsynced 未同步 / synced 已同步 / failed 同步失败)
*/
private String kingdeeStatus;
/**
* 查验状态(A801-1 checkStatus,0 未查验 / 1 通过 / 2 不通过)
*/
private String checkStatus;
/**
* 附件信息JSON(结构 {"source":"piaozone","path":"A801-2下载path","name":"文件名"})
*/
private String attachmentsJson;
/**
* 票池数据更新时间(A801-1 billCreateTime,镜像排序字段)
*/
private LocalDateTime sourceUpdatedTime;
}
@@ -0,0 +1,61 @@
-- 收票管理:金蝶全票池发票同步(A801-1 查询 + 批量同步 + 定时绑定关联)
-- 票据池镜像表新增金蝶票池字段:
-- serial_no 发票流水号(票池唯一标识,A801-1 serialNo,同步回填 kingdee_bill_no)
-- buyer_tax_no 购方税号(A801-1 buyerTaxNo)
-- saler_tax_no 销方税号(A801-1 salerTaxNo)
-- check_status 查验状态(A801-1 checkStatus,0 未查验 / 1 通过 / 2 不通过)
-- 由手动批量同步与定时绑定任务按 tenant_id + invoice_no upsert 回填;
-- 发票号码唯一索引 uk_kingdee_invoice_pool_no(tenant_id, invoice_no)建表时已存在,无需新增
-- 以下结构升级支持重复执行
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `serial_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶发票流水号(票池唯一标识)'' AFTER `invoice_no`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'serial_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `buyer_tax_no` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''购方税号'' AFTER `receiver_name`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'buyer_tax_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `saler_tax_no` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''销方税号'' AFTER `issuer_name`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'saler_tax_no'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;
SET @ddl_sql = (
SELECT IF(COUNT(*) = 0,
'ALTER TABLE `blade_kingdee_invoice_pool` ADD COLUMN `check_status` varchar(8) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''查验状态(0未查验/1通过/2不通过)'' AFTER `kingdee_status`',
'SELECT 1')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'blade_kingdee_invoice_pool'
AND COLUMN_NAME = 'check_status'
);
PREPARE ddl_stmt FROM @ddl_sql;
EXECUTE ddl_stmt;
DEALLOCATE PREPARE ddl_stmt;