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 时前端可禁用编辑/作废,