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 67859e1c..6e96c2ee 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 @@ -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; } diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/KingdeeInvoicePool.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/KingdeeInvoicePool.java index 261110c3..89d9e2e8 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/KingdeeInvoicePool.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/KingdeeInvoicePool.java @@ -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; } diff --git a/doc/sql/transport/blade_kingdee_invoice_pool_a8011_20260920.sql b/doc/sql/transport/blade_kingdee_invoice_pool_a8011_20260920.sql new file mode 100644 index 00000000..d499ee03 --- /dev/null +++ b/doc/sql/transport/blade_kingdee_invoice_pool_a8011_20260920.sql @@ -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;