feat: 开票申请查看增加每张发票金蝶开票状态与结果备注

This commit is contained in:
刘泉佳
2026-10-29 18:17:23 +08:00
parent 3f23baccd8
commit 6e5b6958ea
2 changed files with 42 additions and 3 deletions
@@ -26,6 +26,7 @@
package org.springblade.transport.pojo.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.transport.pojo.entity.InvoiceApplicationLine;
@@ -44,4 +45,8 @@ import java.util.List;
public class InvoiceApplicationSheetVO extends InvoiceApplicationSheet {
@Serial private static final long serialVersionUID = 1L;
@TableField(exist = false) private List<InvoiceApplicationLine> lines;
@Schema(description = "开票状态名称(按金蝶回写的发票结果实时推导:已开票/未开票)")
@TableField(exist = false) private String invoiceStatusName;
@Schema(description = "金蝶开票结果备注(本张发票经 A303-5 回写的发票号、开票日期、价税合计汇总)")
@TableField(exist = false) private String kingdeeResultRemark;
}
@@ -138,6 +138,9 @@ public class InvoiceApplicationServiceImpl extends BaseServiceImpl<InvoiceApplic
implements IInvoiceApplicationService {
/** A303-5 开票结果批量查询单批单据编号上限(接口限制 50) */
private static final int INVOICE_RESULT_QUERY_BATCH = 50;
/** 张次开票状态展示文案(按金蝶回写的发票结果实时推导) */
private static final String INVOICE_STATUS_INVOICED = "已开票";
private static final String INVOICE_STATUS_UNINVOICED = "未开票";
/** 金蝶开票结果回写 single-flight 锁键前缀(多副本定时任务与手动触发共用) */
private static final String INVOICE_RESULT_SYNC_LOCK_PREFIX = "transport:invoice-application:kingdee-invoice-result-sync:";
private final InvoiceApplicationSettlementMapper settlementRelationMapper;
@@ -251,10 +254,23 @@ public class InvoiceApplicationServiceImpl extends BaseServiceImpl<InvoiceApplic
vo.setSettlements(relations);
List<InvoiceApplicationSheet> sheets = sheetMapper.selectList(Wrappers.<InvoiceApplicationSheet>lambdaQuery()
.eq(InvoiceApplicationSheet::getInvoiceApplicationId, id).orderByAsc(InvoiceApplicationSheet::getSheetNo));
List<InvoiceApplicationInvoice> invoices = invoiceApplicationInvoiceMapper.selectList(
Wrappers.<InvoiceApplicationInvoice>lambdaQuery()
.eq(InvoiceApplicationInvoice::getInvoiceApplicationId, id)
.orderByAsc(InvoiceApplicationInvoice::getCreateTime));
vo.setInvoices(invoices);
// 每张发票的金蝶开票结果:按张次金蝶单号归集,查看页展示开票状态与结果备注
Map<String, List<InvoiceApplicationInvoice>> invoicesBySerialNo = invoices.stream()
.filter(invoice -> Func.isNotBlank(invoice.getSerialNo()))
.collect(Collectors.groupingBy(invoice -> Func.toStr(invoice.getSerialNo()).trim()));
vo.setSheets(sheets.stream().map(sheet -> {
InvoiceApplicationSheetVO sheetVO = Objects.requireNonNull(BeanUtil.copyProperties(sheet, InvoiceApplicationSheetVO.class));
sheetVO.setLines(lineMapper.selectList(Wrappers.<InvoiceApplicationLine>lambdaQuery()
.eq(InvoiceApplicationLine::getInvoiceSheetId, sheet.getId()).orderByAsc(InvoiceApplicationLine::getLineNo)));
List<InvoiceApplicationInvoice> sheetInvoices =
invoicesBySerialNo.get(Func.toStr(sheet.getKingdeeBillNo()).trim());
sheetVO.setInvoiceStatusName(Func.isEmpty(sheetInvoices) ? INVOICE_STATUS_UNINVOICED : INVOICE_STATUS_INVOICED);
sheetVO.setKingdeeResultRemark(Func.isEmpty(sheetInvoices) ? "" : kingdeeResultRemark(sheetInvoices));
return sheetVO;
}).toList());
vo.setDetails(applicationDetailMapper.selectList(Wrappers.<InvoiceApplicationDetail>lambdaQuery()
@@ -262,9 +278,6 @@ public class InvoiceApplicationServiceImpl extends BaseServiceImpl<InvoiceApplic
vo.setRecords(recordMapper.selectList(Wrappers.<InvoiceApplicationRecord>lambdaQuery()
.eq(InvoiceApplicationRecord::getInvoiceApplicationId, id)
.orderByAsc(InvoiceApplicationRecord::getCreateTime)));
vo.setInvoices(invoiceApplicationInvoiceMapper.selectList(Wrappers.<InvoiceApplicationInvoice>lambdaQuery()
.eq(InvoiceApplicationInvoice::getInvoiceApplicationId, id)
.orderByAsc(InvoiceApplicationInvoice::getCreateTime)));
return vo;
}
@@ -1340,6 +1353,27 @@ public class InvoiceApplicationServiceImpl extends BaseServiceImpl<InvoiceApplic
.collect(Collectors.toMap(InvoiceApplicationInvoice::getInvoiceNo, Function.identity(), (left, right) -> left));
}
/**
* 汇总本张发票经 A303-5 回写的金蝶开票结果备注(发票号、开票日期、价税合计)
*
* @param sheetInvoices 本张发票的金蝶发票结果
* @return 结果备注
*/
private String kingdeeResultRemark(List<InvoiceApplicationInvoice> sheetInvoices) {
return sheetInvoices.stream()
.map(invoice -> {
StringBuilder remark = new StringBuilder("发票号").append(Func.toStr(invoice.getInvoiceNo()));
if (invoice.getInvoiceDate() != null) {
remark.append(",开票日期").append(invoice.getInvoiceDate().toLocalDate());
}
if (invoice.getInvoiceAmount() != null) {
remark.append(",价税合计").append(invoice.getInvoiceAmount());
}
return remark.toString();
})
.collect(Collectors.joining(";"));
}
/**
* 将 A303-5 返回的发票文件地址补齐到已落库记录(仅补空字段,不覆盖已有值)
*