From da1ddf7b9f2ba509d232d4e22dd70d962a212764 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, 2 Nov 2026 19:53:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=93=E7=AE=97=E5=8D=95=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=8C=87=E5=AE=9A=E5=A4=B1=E8=B4=A5=E6=82=AC=E6=B5=AE?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E5=A4=B1=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/pojo/vo/FormalSettlementVO.java | 4 ++ .../impl/FormalSettlementServiceImpl.java | 59 +++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/FormalSettlementVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/FormalSettlementVO.java index b879bd0c..8010f82c 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/FormalSettlementVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/FormalSettlementVO.java @@ -48,6 +48,10 @@ public class FormalSettlementVO extends FormalSettlement implements KingdeeUnloc @TableField(exist = false) private Integer attachmentCount; @TableField(exist = false) private String attachmentSyncStatus; @TableField(exist = false) private String attachmentSyncStatusName; + @TableField(exist = false) @Schema(description = "已指定应付聚合态(assigned全部已指定/failed存在指定失败/unspecified存在未指定),空展示-") + private String kingdeeAssignStatus; + @TableField(exist = false) @Schema(description = "指定失败原因(存在指定失败时聚合各票原因,悬浮展示)") + private String kingdeeAssignFailReason; @TableField(exist = false) @Schema(description = "金蝶锁状态:locked-锁定中/failed-锁定失败;unlocked为终态不返回,null=无锁或已解锁") private String kingdeeLockStatus; @TableField(exist = false) @Schema(description = "金蝶锁失败原因(仅锁定失败时有值)") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java index 294693d0..6dec9268 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java @@ -226,9 +226,68 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl voPage = result.convert(item -> this.toVO(item, writeOffAmounts)); fillAttachmentSyncStatus(voPage.getRecords()); fillKingdeeLockStatus(voPage.getRecords()); + fillKingdeeAssignStatus(voPage.getRecords()); return voPage; } + /** + * 填充已指定应付聚合态:按本页结算单一次批量查认领关系与收票登记,避免 N+1。 + * 聚合规则:任一指定失败 → failed;全部已指定 → assigned;其余(有认领但未指定/未推送)→ unspecified; + * 无认领收票或全部认领票无效不填充,前端展示"-" + * + * @param rows 本页 VO 列表 + */ + private void fillKingdeeAssignStatus(List rows) { + if (Func.isEmpty(rows)) { + return; + } + List relations = invoiceReceiptSettlementMapper.selectList( + Wrappers.lambdaQuery() + .in(InvoiceReceiptSettlement::getFormalSettlementId, + rows.stream().map(FormalSettlementVO::getId).filter(Objects::nonNull).toList())); + if (relations.isEmpty()) { + return; + } + List receiptIds = relations.stream() + .map(InvoiceReceiptSettlement::getInvoiceReceiptId).filter(Objects::nonNull).distinct().toList(); + Map receiptById = invoiceReceiptMapper.selectByIds(receiptIds).stream() + .filter(receipt -> !TransportBusiConstant.VOIDED.equals(receipt.getApprovalStatus()) + && !Objects.equals(receipt.getIsDeleted(), 1)) + .collect(Collectors.toMap(InvoiceReceipt::getId, receipt -> receipt, (left, right) -> left)); + Map> receiptsBySettlement = new HashMap<>(); + for (InvoiceReceiptSettlement relation : relations) { + InvoiceReceipt receipt = receiptById.get(relation.getInvoiceReceiptId()); + if (receipt == null) { + continue; + } + receiptsBySettlement.computeIfAbsent(relation.getFormalSettlementId(), key -> new ArrayList<>()) + .add(receipt); + } + for (FormalSettlementVO vo : rows) { + List claimed = receiptsBySettlement.get(vo.getId()); + if (Func.isEmpty(claimed)) { + continue; + } + List statuses = claimed.stream() + .map(receipt -> Func.toStrWithEmpty(receipt.getKingdeePushStatus(), + KingdeeBfiConstant.RECEIVED_PUSH_UNSYNCED)) + .toList(); + String status = statuses.contains(KingdeeBfiConstant.RECEIVED_PUSH_FAILED) ? "failed" + : statuses.stream().allMatch(KingdeeBfiConstant.RECEIVED_PUSH_ASSIGNED::equals) + ? "assigned" : "unspecified"; + vo.setKingdeeAssignStatus(status); + // 指定失败行聚合各票失败原因,供悬浮展示 + if ("failed".equals(status)) { + vo.setKingdeeAssignFailReason(claimed.stream() + .filter(receipt -> KingdeeBfiConstant.RECEIVED_PUSH_FAILED.equals( + Func.toStrWithEmpty(receipt.getKingdeePushStatus(), KingdeeBfiConstant.RECEIVED_PUSH_UNSYNCED))) + .map(receipt -> "发票" + Func.toStrWithEmpty(receipt.getInvoiceNo(), String.valueOf(receipt.getId())) + + ":" + Func.toStrWithEmpty(receipt.getKingdeePushMsg(), "推送失败")) + .collect(Collectors.joining(";"))); + } + } + } + /** * 填充金蝶锁状态标识(locked-锁定中/failed-锁定失败;unlocked 终态不返回): * 锁表按本页源单一次批量查询,避免 N+1;locked 时前端可禁用编辑/作废,