feat: 金蝶保存失败异常信息展示金蝶单据号

- BfiBillSaveResultItemVO 新增 getFailMark 定位信息(金蝶单据号,@JsonIgnore 不影响序列化)
- commonCall 失败分支按失败分录拼入金蝶单据号,「已提交状态下的单据不允许修改」等场景可直接定位星瀚侧单据
- requireBfiSaveSuccess 单据级失败提示同步拼入
This commit is contained in:
刘泉佳
2026-10-18 21:31:10 +08:00
parent d1be16755f
commit 675533b87e
3 changed files with 37 additions and 2 deletions
@@ -887,7 +887,7 @@ public class KingdeeApBillSyncSupport {
BfiBillSaveResultItemVO item = saveResult.getResult().get(0);
if (!Boolean.TRUE.equals(item.getBillStatus())) {
String errorText = Func.isBlank(item.getErrorText()) ? "未知错误" : item.getErrorText();
throw new ServiceException(action + "失败:" + errorText);
throw new ServiceException(action + "失败:" + errorText + item.getFailMark());
}
}
@@ -25,6 +25,7 @@
*/
package org.springblade.thirdparty.bfi.pojo.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
@@ -91,4 +92,16 @@ public class BfiBillSaveResultItemVO implements Serializable {
.filter(text -> !text.isEmpty())
.collect(Collectors.joining(";"));
}
/**
* 失败定位信息:金蝶单据号,供异常提示展示,
* 「已提交状态下的单据不允许修改」等场景可凭金蝶单据号直接定位星瀚侧单据
*
* @return 定位信息文本,形如(金蝶单据:xxx),无可用信息返回空串
*/
@JsonIgnore
public String getFailMark() {
String billNo = keys == null ? null : keys.get("billno");
return billNo == null || billNo.isBlank() ? "" : "(金蝶单据:" + billNo + ")";
}
}
@@ -79,6 +79,7 @@ import org.springblade.thirdparty.bfi.pojo.vo.BfiApBillVO;
import org.springblade.thirdparty.bfi.pojo.vo.BfiArBillVO;
import org.springblade.thirdparty.bfi.pojo.vo.BfiAttachmentUploadVO;
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillLockResultVO;
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultItemVO;
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultVO;
import org.springblade.thirdparty.bfi.pojo.vo.BfiBlacklistVO;
import org.springblade.thirdparty.bfi.pojo.vo.BfiClaimAnnounceVO;
@@ -112,6 +113,7 @@ import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.function.Supplier;
import java.util.stream.Collectors;
/**
* 业财融合(BFI)服务实现
@@ -655,7 +657,7 @@ public class BfiServiceImpl implements IBfiService {
String message = Optional.ofNullable(result).map(BfiResultVO::getMessage).filter(StringUtil::isNotBlank)
.orElseGet(() -> Optional.ofNullable(result).map(BfiResultVO::getErrorCode)
.map(errorCode -> "错误码 " + errorCode).orElse("响应为空或解析失败"));
throw new BfiException("调用BFI接口" + type + "异常 " + message);
throw new BfiException("调用BFI接口" + type + "异常 " + message + billSaveFailDetail(result));
} catch (BfiException e) {
log.error("调用BFI接口 {},BfiException异常", type, e);
throw e;
@@ -665,6 +667,26 @@ public class BfiServiceImpl implements IBfiService {
}
}
/**
* 单据保存失败定位后缀:取失败分录的金蝶单据号,非单据保存类调用返回空串
*
* @param result BFI 响应
* @param <T> 响应数据类型
* @return 定位后缀,形如 (金蝶单据:xxx)
*/
private <T> String billSaveFailDetail(BfiResultVO<T> result) {
if (result == null || !(result.getData() instanceof BfiBillSaveResultVO billSave)
|| billSave.getResult() == null || billSave.getResult().isEmpty()) {
return "";
}
String detail = billSave.getResult().stream()
.filter(item -> !Boolean.TRUE.equals(item.getBillStatus()))
.map(BfiBillSaveResultItemVO::getFailMark)
.filter(mark -> !mark.isEmpty())
.collect(Collectors.joining(";"));
return detail.isEmpty() ? "" : " " + detail;
}
/**
* 收票 rim/message 契约公共调用方法,成功错误码兼容 0 与 0000
*