From 2ddee7c8951a117e839c10d88dbb0a43d222a5e8 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, 16 Oct 2026 00:15:40 +0800 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20=E4=BB=98=E6=AC=BE=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E9=87=91=E8=9D=B6=E7=94=9F=E6=88=90=E5=8D=B3=E5=9B=9E?= =?UTF-8?q?=E6=98=BE=E9=A2=84=E7=BB=93=E7=AE=97=E9=A2=84=E4=BB=98=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E4=BD=9C=E5=BA=9F/=E8=A7=A3=E9=94=81?= =?UTF-8?q?=E8=81=94=E5=8A=A8=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PaymentApplicationServiceImpl.java | 43 ++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) 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 742b5931..eb8e1d83 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 @@ -421,6 +421,8 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpllambdaUpdate() + .eq(PreSettlementAdvance::getPreSettlementId, entity.getPreSettlementId()) + .eq(PreSettlementAdvance::getAdvanceNo, entity.getPaymentNo()) + .eq(PreSettlementAdvance::getIsDeleted, 0) + .ne(PreSettlementAdvance::getBillStatus, "paid") + .set(PreSettlementAdvance::getBillStatus, TransportBusiConstant.VOIDED)); + refreshPreSettlementAdvanceSummary(entity.getPreSettlementId()); + } + private BigDecimal findPreSettlementPaid(Long preSettlementId) { return preSettlementAdvanceMapper.selectList(Wrappers.lambdaQuery() .eq(PreSettlementAdvance::getPreSettlementId, preSettlementId) From 591b93f1573442d63db4ea508f37636364acf8d4 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, 16 Oct 2026 00:15:49 +0800 Subject: [PATCH 2/9] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9E=E4=BB=98?= =?UTF-8?q?=E6=AC=BE=E7=94=B3=E8=AF=B7=E7=94=9F=E6=88=90=E5=8D=B3=E5=9B=9E?= =?UTF-8?q?=E6=98=BE=E9=A2=84=E4=BB=98=E4=BF=A1=E6=81=AF=E6=94=B9=E9=80=A0?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...即回显预结算预付信息(synced提前建档-作废联动清理).md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 doc/docs/业务流程/2026-10-16-付款申请金蝶生成即回显预结算预付信息(synced提前建档-作废联动清理).md diff --git a/doc/docs/业务流程/2026-10-16-付款申请金蝶生成即回显预结算预付信息(synced提前建档-作废联动清理).md b/doc/docs/业务流程/2026-10-16-付款申请金蝶生成即回显预结算预付信息(synced提前建档-作废联动清理).md new file mode 100644 index 00000000..1cd0cae7 --- /dev/null +++ b/doc/docs/业务流程/2026-10-16-付款申请金蝶生成即回显预结算预付信息(synced提前建档-作废联动清理).md @@ -0,0 +1,53 @@ +# 付款申请金蝶生成即回显预结算预付信息:synced 提前建档 + 作废联动清理 + +> 日期:2026-10-16 +> 关联文档: +> - `doc/docs/业务流程/2026-09-29-预付款申请A103-3金蝶链路补齐方案(e_bebank_number统一-消失解锁-回写默认开启).md`(A103-3 推送与 A103-2 消失解锁) +> - `doc/docs/业务流程/2026-09-17-付款管理金蝶付款结果定时回写(A103-2付款申请单查询+A103-4付款处理查询)技术文档.md`(回写任务与 `applyPayApplyResult`) +> - `doc/docs/业务流程/2026-09-20-应付申请与付款申请同步处理全链路业务流程(A102-2下推-A102-4查询-A103-1生成-A103-2回写).md` + +## 1. 背景与问题 + +排查预结算单 YJ2026101500001(已完成预结算审批、付款申请 FKD2026101500001 审批、金蝶付款申请单生成 FKSQ-00000229):预结算单详情页"预付信息"卡片始终空白。 + +根因:`blade_pre_settlement_advance`(预付记录表,详情接口 `advances` 字段的数据源)此前**只在金蝶回写"付款完成"(`kingdeeStatus=paid`)时才写入**(`applyPayApplyResult` → `syncPreSettlementAdvance`)。付款申请推进到"已生成"(synced)阶段不落记录,页面预付信息必须等付款完成才可见;且基本信息区的预付申请/已付金额来自付款申请实时汇总(`fillPaymentApplicationAmounts`),金额有值、明细卡片空白,容易误判。 + +## 2. 改造内容(`PaymentApplicationServiceImpl`) + +| # | 变更点 | 变更前 | 变更后 | +|---|---|---|---| +| 1 | `syncPreSettlementAdvance` | 无参方法,写死 `billStatus="paid"`、已付=申请全额 | 参数化 `(entity, billStatus, paidAmount)`,建档与付款完成共用;按付款申请单号查重幂等 | +| 2 | `doSyncKingdee` synced 落库处 | 仅更新付款申请状态 | **生成成功即建档**:`approved` / 已付 0,同事务落库,预付信息提前回显 | +| 3 | `applyPayApplyResult` paid 分支 | 调原方法 | `paid` / 申请全额(语义不变),已建档时更新为已付款 | +| 4 | `applyPayApplyResult` 勾稽分支(新增) | failed 单据经 A103-2 勾稽确认 synced/paying 时不落预付记录 | 与推送成功同语义,`approved` / 已付 0 建档 | +| 5 | 新增 `voidPreSettlementAdvance` | 无 | 按付款申请单号将未付预付记录置 `voided`(`paid` 记录不联动,付款完成事实不回退),并刷新预结算汇总 | +| 6 | `voidBill`(付款申请作废) | 不清理预付记录 | 联动作废,避免残留记录阻断预结算作废(`PreSettlementServiceImpl#voidBill` 的"存在关联预付申请"拦截) | +| 7 | `unlockBill`(金蝶反审核解锁,含 A103-2 连续两轮消失判定) | 不清理预付记录 | 联动作废,重推生成新单后重新建档 | + +建档/作废后的联动刷新(`refreshPreSettlementAdvanceSummary` 预结算 advance_no/预付金额列、`formal_settlement_source` 预付金额、正式结算付款汇总)复用原有尾部逻辑,无需额外改动。转正式结算时来源表预付金额不再恒为 0。 + +## 3. 状态与联动时序 + +| 付款申请阶段 | 预付记录(blade_pre_settlement_advance) | 页面预付信息 | +|---|---|---| +| 审批通过、未推送 | 不存在 | 空白 | +| 金蝶付款申请单生成成功(synced) | `approved` / 已付 0(提前建档) | **回显**(状态"审批通过") | +| 付款中(paying)/ 勾稽确认已生成 | `approved`(补建或维持) | 回显 | +| 付款完成(paid 回写) | `paid` / 已付全额 | 回显(状态"已付款") | +| 付款申请作废 / 金蝶反审核解锁 | 未付记录置 `voided`(`paid` 不动) | 消失(汇总同步扣减) | + +前端零改动:`pre-settlement-editor.vue` 的 `advanceStatusName` 已含 `approved→审批通过` 映射。 + +## 4. 定时任务影响 + +- **付款结果回写任务(`syncKingdeePaymentResult`)**:零改动。轮询条件基于付款申请自身状态,不依赖预付记录表;paid 回写时命中已有记录更新,不产生重复。 +- **失败重推(`retryKingdeeFailed`)**:failed 阶段未建档,重推成功经 synced 建档一次,幂等查重兜底。 +- **A103-4 付款记录回填、金蝶单据锁补偿**:不涉及预付记录表,无影响。 + +## 5. 行为变化与存量数据 + +| 项 | 说明 | +|---|---| +| 预结算作废拦截提前 | "存在关联预付申请,请先作废预付申请"从付款完成后提前到金蝶生成即生效——作废预结算前需先作废付款申请(预期收紧) | +| 存量单据不自动补 | 改造上线前已 synced 的付款申请(如 FKD2026101500001)不会重推(状态门禁跳过 synced),预付记录要等 paid 回写补建;需立即回显的,手工补一条 `blade_pre_settlement_advance`(`advance_no=付款申请单号`、`bill_status='approved'`、已付 0) | +| 金额模糊匹配触发提前 | synced 建档时同额未付记录的兜底匹配与 paid 阶段同一逻辑,仅触发时点提前;如出现误绑定,可将模糊匹配收敛到 paid 分支 | From a76bd01482fbf712ab060aed32d0c6a94a9b9e99 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, 16 Oct 2026 00:33:19 +0800 Subject: [PATCH 3/9] =?UTF-8?q?:feat:=20=E9=87=91=E8=9D=B6=E7=A5=A8?= =?UTF-8?q?=E6=B1=A0=E6=96=B0=E5=A2=9E=E5=AE=A2=E5=95=86=E5=8D=95=E4=BD=8D?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=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 thirdParty.bfi.invoiceReceipt.customerUnitsOnly(默认 false)控制是否只同步开票单位与受票单位税号均已登记在客商发票信息中的发票,前端票池展示同用此开关 --- .../org/springblade/transport/config/BfiProperties.java | 6 ++++++ doc/nacos/third-party-api.yaml | 2 ++ 2 files changed, 8 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 f2e38a9d..760d80ec 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 @@ -307,6 +307,12 @@ public class BfiProperties { */ private String invoiceTypes = ""; + /** + * 客商单位过滤开关:开启后只同步开票单位(销方)与受票单位(购方)税号均已登记在 + * 客商发票信息(blade_customer_invoice_info)中的发票,前端票池展示查询同用此开关过滤,默认关闭 + */ + private boolean customerUnitsOnly = false; + /** * 同步 single-flight 锁租约秒数,须大于最坏一轮耗时;进程异常退出时锁在租约到期后自动释放 */ diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index caa5f604..bdd092fd 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -118,6 +118,8 @@ thirdParty: incrementDays: ${BFI_INVOICE_RECEIPT_INCREMENT_DAYS:30} # 同步发票种类白名单(逗号分隔票易通编码,如 26,27 数电普票/专票),为空不限制 invoiceTypes: ${BFI_INVOICE_RECEIPT_INVOICE_TYPES:26,27} + # 客商单位过滤开关:开启后只同步开票单位(销方)与受票单位(购方)税号均已登记在客商发票信息中的发票,前端票池展示查询同用此开关过滤 + customerUnitsOnly: ${BFI_INVOICE_RECEIPT_CUSTOMER_UNITS_ONLY:false} # 补偿绑定单轮限量(未绑定登记按发票号码精确补查条数上限) compensateLimit: ${BFI_INVOICE_RECEIPT_COMPENSATE_LIMIT:200} # single-flight 分布式锁租约秒数,须大于最坏一轮耗时;进程异常退出时锁在租约到期后自动释放 From e8a933cf9ebe21b706bfd3b60e11fb25aeb0b037 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, 16 Oct 2026 00:33:28 +0800 Subject: [PATCH 4/9] =?UTF-8?q?:feat:=20=E9=87=91=E8=9D=B6=E7=A5=A8?= =?UTF-8?q?=E6=B1=A0=E5=90=8C=E6=AD=A5=E4=B8=8E=E5=B1=95=E7=A4=BA=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8C=89=E5=AE=A2=E5=95=86=E5=8D=95=E4=BD=8D=E8=BF=87?= =?UTF-8?q?=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 定时同步拉取后按客商发票信息税号集过滤,销/购方税号未同时登记的发票不入镜像(短页判定按原始条数,过滤不影响切片续扫);票池统一分页查询增加双 EXISTS 过滤与同步同开关同口径,收票登记选票与结算单认领两处展示自动生效 --- .../mapper/KingdeeInvoicePoolMapper.java | 10 +-- .../mapper/KingdeeInvoicePoolMapper.xml | 12 ++++ .../impl/InvoiceReceiptServiceImpl.java | 71 +++++++++++++++---- 3 files changed, 74 insertions(+), 19 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeInvoicePoolMapper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeInvoicePoolMapper.java index 29ddf75d..abdb5c3f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeInvoicePoolMapper.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeInvoicePoolMapper.java @@ -44,11 +44,13 @@ public interface KingdeeInvoicePoolMapper extends BaseMapper /** * 金蝶票据池镜像统一分页查询:仅出可用票(剩余可用金额>0 且未使用),认领/登记标记由 EXISTS 子查询直出 * - * @param page 分页参数 - * @param query 统一查询条件(已在上层完成 trim 与日期格式校验) - * @param tenantId 当前租户 + * @param page 分页参数 + * @param query 统一查询条件(已在上层完成 trim 与日期格式校验) + * @param tenantId 当前租户 + * @param customerUnitsOnly 客商单位过滤开关:开启时只出销/购方税号均登记在客商发票信息中的发票(与定时同步同开关) * @return 统一视图分页 */ IPage selectInvoicePoolPage(IPage page, - @Param("query") KingdeeInvoicePoolQueryDTO query, @Param("tenantId") String tenantId); + @Param("query") KingdeeInvoicePoolQueryDTO query, @Param("tenantId") String tenantId, + @Param("customerUnitsOnly") boolean customerUnitsOnly); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeInvoicePoolMapper.xml b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeInvoicePoolMapper.xml index b25b0ddc..0c1e7969 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeInvoicePoolMapper.xml +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeInvoicePoolMapper.xml @@ -39,12 +39,24 @@ AND p.available_amount > 0 AND p.amount_use_status = '0' + + + AND EXISTS (SELECT 1 FROM blade_customer_invoice_info ci + WHERE ci.is_deleted = 0 AND ci.status = 1 AND ci.tenant_id = p.tenant_id AND ci.tax_no = p.saler_tax_no) + AND EXISTS (SELECT 1 FROM blade_customer_invoice_info cj + WHERE cj.is_deleted = 0 AND cj.status = 1 AND cj.tenant_id = p.tenant_id AND cj.tax_no = p.buyer_tax_no) + +