refactor: 收票管理下线金蝶同步功能,金蝶状态改按推送结果二值展示
This commit is contained in:
-2
@@ -53,8 +53,6 @@ public class InvoiceReceiptSaveRequest implements Serializable {
|
||||
private String bankName;
|
||||
private String bankAccount;
|
||||
private String issuingBank;
|
||||
private String kingdeeBillNo;
|
||||
private String kingdeeStatus;
|
||||
private String phone;
|
||||
private String customerEmails;
|
||||
private String departmentEmails;
|
||||
|
||||
-8
@@ -148,18 +148,10 @@ public class InvoiceReceipt extends TenantEntity {
|
||||
* 当前处理人
|
||||
*/
|
||||
private String currentProcessor;
|
||||
/**
|
||||
* 金蝶单据号(绑定票池后取发票流水号 serialNo)
|
||||
*/
|
||||
private String kingdeeBillNo;
|
||||
/**
|
||||
* 金蝶收票单单据编号(A303-2 批量保存生成/幂等预检命中回填)
|
||||
*/
|
||||
private String kingdeeReceivedInvoiceNo;
|
||||
/**
|
||||
* 金蝶同步状态(unsynced 未同步 / synced 已同步 / failed 同步失败)
|
||||
*/
|
||||
private String kingdeeStatus;
|
||||
/**
|
||||
* 收票单推送状态(unsynced 未推送 / pushed 已保存收票单 / assigned 已指定应付 / failed 推送失败)
|
||||
*/
|
||||
|
||||
-1
@@ -48,7 +48,6 @@ public class InvoiceReceiptVO extends InvoiceReceipt {
|
||||
@Serial private static final long serialVersionUID = 1L;
|
||||
@TableField(exist = false) private String settlementNos;
|
||||
@TableField(exist = false) private String approvalStatusName;
|
||||
@TableField(exist = false) private String kingdeeStatusName;
|
||||
@TableField(exist = false) private String kingdeePushStatusName;
|
||||
@TableField(exist = false) private String createUserName;
|
||||
@TableField(exist = false) private String updateUserName;
|
||||
|
||||
-7
@@ -149,13 +149,6 @@ public class InvoiceReceiptController extends BladeController {
|
||||
return R.success("作废成功");
|
||||
}
|
||||
|
||||
@PostMapping("/sync-kingdee")
|
||||
@ApiOperationSupport(order = 12)
|
||||
@Operation(summary = "同步金蝶发票状态")
|
||||
public R<String> syncKingdee(@RequestParam Long id) {
|
||||
return R.data(invoiceReceiptService.syncKingdee(id));
|
||||
}
|
||||
|
||||
@PostMapping("/push-kingdee")
|
||||
@ApiOperationSupport(order = 15)
|
||||
@Operation(summary = "批量推送金蝶收票单(A303-2 收票单保存 + A302-6 收票指定应付)")
|
||||
|
||||
-15
@@ -31,7 +31,6 @@ import org.springblade.transport.pojo.dto.InvoiceReceiptSaveRequest;
|
||||
import org.springblade.transport.pojo.dto.InvoiceReceiptStatusRequest;
|
||||
import org.springblade.transport.pojo.dto.KingdeeInvoicePoolQueryDTO;
|
||||
import org.springblade.transport.pojo.entity.InvoiceReceipt;
|
||||
import org.springblade.transport.pojo.entity.KingdeeInvoicePool;
|
||||
import org.springblade.transport.pojo.vo.InvoiceReceiptVO;
|
||||
import org.springblade.transport.pojo.vo.KingdeeInvoicePoolPageVO;
|
||||
|
||||
@@ -75,8 +74,6 @@ public interface IInvoiceReceiptService extends BaseService<InvoiceReceipt> {
|
||||
|
||||
void voidBill(InvoiceReceiptStatusRequest request);
|
||||
|
||||
String syncKingdee(Long id);
|
||||
|
||||
/**
|
||||
* 批量推送金蝶收票单(图05 环节②③:A303-2 收票单批量保存 + A302-6 收票指定应付)。
|
||||
* <p>逐单独立成败:前置校验(审批通过、已绑定镜像、查验通过、恰好分摊一张应付结算单)→
|
||||
@@ -95,16 +92,4 @@ public interface IInvoiceReceiptService extends BaseService<InvoiceReceipt> {
|
||||
* @return 执行摘要
|
||||
*/
|
||||
String syncKingdeeReceivedInvoiceResult();
|
||||
|
||||
/**
|
||||
* 应用金蝶票池同步结果:回填收票登记绑定关系与同步状态(独立事务,仅手动单条同步使用)
|
||||
*
|
||||
* @param receipt 收票登记实体
|
||||
* @param invoice upsert 后的票据池镜像记录,null 表示金蝶票池未查询到
|
||||
* @param missReason 未命中原因,命中时可为空
|
||||
* @param rebind 是否强制重新绑定镜像(定时绑定链路退役后唯一调用方手动同步恒传 true,形参保守保留)
|
||||
* @return 金蝶流水号(serialNo),未命中返回 null
|
||||
*/
|
||||
String applyInvoicePoolSyncResult(InvoiceReceipt receipt, KingdeeInvoicePool invoice, String missReason,
|
||||
boolean rebind);
|
||||
}
|
||||
|
||||
+4
-90
@@ -35,7 +35,6 @@ import org.springblade.core.mp.base.BaseServiceImpl;
|
||||
import org.springblade.core.secure.utils.AuthUtil;
|
||||
import org.springblade.core.tool.jackson.JsonUtil;
|
||||
import org.springblade.core.tool.utils.Func;
|
||||
import org.springblade.core.tool.utils.SpringUtil;
|
||||
import org.springblade.core.tool.utils.StringUtil;
|
||||
import org.springblade.thirdparty.bfi.constant.BfiConstant;
|
||||
import org.springblade.thirdparty.bfi.pojo.dto.BfiInvoicePoolQueryDTO;
|
||||
@@ -144,8 +143,6 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
|
||||
.like(Func.isNotEmpty(query.getDeptName()), InvoiceReceipt::getDeptName, query.getDeptName())
|
||||
.eq(Func.isNotEmpty(query.getApprovalStatus()), InvoiceReceipt::getApprovalStatus,
|
||||
query.getApprovalStatus())
|
||||
.eq(Func.isNotEmpty(query.getKingdeeStatus()), InvoiceReceipt::getKingdeeStatus,
|
||||
query.getKingdeeStatus())
|
||||
.eq(Func.isNotEmpty(query.getKingdeePushStatus()), InvoiceReceipt::getKingdeePushStatus,
|
||||
query.getKingdeePushStatus())
|
||||
.orderByDesc(InvoiceReceipt::getCreateTime);
|
||||
@@ -419,7 +416,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
|
||||
refreshIds.addAll(settlementMap.keySet());
|
||||
refreshIds.forEach(this::refreshSettlementInvoiceStatus);
|
||||
record(entity.getId(), creating ? "create" : "save", creating ? "创建草稿" : "保存草稿",
|
||||
entity.getApprovalStatus(), entity.getApprovalStatus(), null, entity.getKingdeeBillNo());
|
||||
entity.getApprovalStatus(), entity.getApprovalStatus(), null, entity.getKingdeeReceivedInvoiceNo());
|
||||
return entity.getId();
|
||||
}
|
||||
|
||||
@@ -449,7 +446,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
|
||||
entity.setCurrentNode("收票审核");
|
||||
entity.setCurrentProcessor(null);
|
||||
updateById(entity);
|
||||
record(entity.getId(), "submit", "提交审批", fromStatus, TransportBusiConstant.REVIEWING, null, entity.getKingdeeBillNo());
|
||||
record(entity.getId(), "submit", "提交审批", fromStatus, TransportBusiConstant.REVIEWING, null, entity.getKingdeeReceivedInvoiceNo());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -492,38 +489,6 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
|
||||
changeStatus(entity, TransportBusiConstant.VOIDED, "void", "已作废", reason);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String syncKingdee(Long id) {
|
||||
InvoiceReceipt entity = existing(id);
|
||||
log.info("收票登记[{}]同步金蝶开始:id={},审批状态={},当前绑定镜像={}", entity.getInvoiceNo(), id,
|
||||
entity.getApprovalStatus(), entity.getKingdeeInvoicePoolId());
|
||||
if (!TransportBusiConstant.APPROVED.equals(entity.getApprovalStatus())) {
|
||||
log.warn("收票登记[{}]同步金蝶拦截:审批状态={}不允许同步", entity.getInvoiceNo(), entity.getApprovalStatus());
|
||||
throw new ServiceException("仅审批通过的收票登记允许同步金蝶状态");
|
||||
}
|
||||
// A801-1 按发票号码精确查询(rim 契约单页,命中 0/1 条)
|
||||
List<BfiInvoicePoolVO> poolInvoices = queryPoolByInvoiceNo(entity.getInvoiceNo());
|
||||
log.info("收票登记[{}]同步金蝶票池查询完成:命中 {} 条", entity.getInvoiceNo(), poolInvoices.size());
|
||||
if (poolInvoices.size() > 1) {
|
||||
log.warn("收票登记[{}]同步金蝶票池命中 {} 条,取第一条", entity.getInvoiceNo(), poolInvoices.size());
|
||||
}
|
||||
String missReason = null;
|
||||
KingdeeInvoicePool mirror = null;
|
||||
if (poolInvoices.isEmpty()) {
|
||||
missReason = "金蝶票池未查询到发票";
|
||||
log.warn("收票登记[{}]同步金蝶未命中票池:{}", entity.getInvoiceNo(), missReason);
|
||||
} else {
|
||||
mirror = upsertInvoicePool(mirrorByInvoiceNo(poolInvoices.get(0).getInvoiceNo().trim()),
|
||||
poolInvoices.get(0));
|
||||
log.info("收票登记[{}]同步金蝶镜像 upsert 完成:镜像id={},kingdeeBillNo={},镜像状态={}", entity.getInvoiceNo(),
|
||||
mirror.getId(), mirror.getKingdeeBillNo(), mirror.getKingdeeStatus());
|
||||
}
|
||||
// 经自代理独立事务:绑定回填 + 同步流水
|
||||
String billNo = self().applyInvoicePoolSyncResult(entity, mirror, missReason, true);
|
||||
log.info("收票登记[{}]同步金蝶结束:回填kingdeeBillNo={}", entity.getInvoiceNo(), billNo);
|
||||
return billNo;
|
||||
}
|
||||
|
||||
// ==================== 图05 环节②③:A303-2 收票单批量保存 + A302-6 收票指定应付 ====================
|
||||
|
||||
@Override
|
||||
@@ -752,7 +717,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
|
||||
if (writeRecord) {
|
||||
record(receipt.getId(), "sync", "推送金蝶收票单", receipt.getApprovalStatus(), receipt.getApprovalStatus(),
|
||||
Func.isNotBlank(pushMsg) ? pushMsg : "金蝶收票单[" + Func.toStr(receivedInvoiceNo) + "]已生成并指定应付",
|
||||
receipt.getKingdeeBillNo());
|
||||
receipt.getKingdeeReceivedInvoiceNo());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -925,34 +890,6 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public String applyInvoicePoolSyncResult(InvoiceReceipt receipt, KingdeeInvoicePool invoice, String missReason,
|
||||
boolean rebind) {
|
||||
if (receipt == null) {
|
||||
return null;
|
||||
}
|
||||
if (invoice == null) {
|
||||
// 未命中票池:登记置未同步并记录原因(实时查询模式下无定时绑定链路,由用户修复票面后手动重试同步)
|
||||
String fromStatus = receipt.getApprovalStatus();
|
||||
receipt.setKingdeeStatus(KingdeeBfiConstant.KINGDEE_STATUS_UNSYNCED);
|
||||
updateById(receipt);
|
||||
record(receipt.getId(), "sync", "同步金蝶状态", fromStatus, fromStatus, missReason,
|
||||
receipt.getKingdeeBillNo(), currentOperator());
|
||||
return null;
|
||||
}
|
||||
// 绑定回填:绑定关系对齐当前发票号码对应的镜像(同租户同发票号镜像唯一),票面字段不覆盖人工登记信息
|
||||
receipt.setKingdeeInvoicePoolId(invoice.getId());
|
||||
receipt.setKingdeeBillNo(invoice.getKingdeeBillNo());
|
||||
receipt.setKingdeeStatus(invoice.getKingdeeStatus());
|
||||
updateById(receipt);
|
||||
// 定时绑定链路已退役,唯一调用方(手动同步)恒传 rebind=true:命中即强制重绑且不写绑定流水原因;
|
||||
// 为接口稳定保守保留 rebind 形参(不再参与分支)
|
||||
record(receipt.getId(), "sync", "同步金蝶状态", receipt.getApprovalStatus(), receipt.getApprovalStatus(),
|
||||
null, receipt.getKingdeeBillNo(), currentOperator());
|
||||
return receipt.getKingdeeBillNo();
|
||||
}
|
||||
|
||||
/**
|
||||
* A801-1 按发票号码精确单查(rim 单页契约,命中 0/1 条)
|
||||
*/
|
||||
@@ -1057,13 +994,6 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
|
||||
return JsonUtil.toJson(row.getItems());
|
||||
}
|
||||
|
||||
/**
|
||||
* 票池发票同步状态映射:命中即 synced
|
||||
*/
|
||||
private String poolKingdeeStatus(BfiInvoicePoolVO row) {
|
||||
return KingdeeBfiConstant.KINGDEE_STATUS_SYNCED;
|
||||
}
|
||||
|
||||
private KingdeeInvoicePool mirrorByInvoiceNo(String invoiceNo) {
|
||||
return invoicePoolMapper.selectOne(Wrappers.<KingdeeInvoicePool>lambdaQuery()
|
||||
.eq(KingdeeInvoicePool::getInvoiceNo, invoiceNo)
|
||||
@@ -1160,11 +1090,6 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
|
||||
return Func.isEmpty(userName) ? "定时任务" : userName;
|
||||
}
|
||||
|
||||
/** 自代理:跨方法调用确保事务注解生效(定时绑定逐单独立事务) */
|
||||
private IInvoiceReceiptService self() {
|
||||
return SpringUtil.getBean(IInvoiceReceiptService.class);
|
||||
}
|
||||
|
||||
private InvoiceReceiptVO toListVO(InvoiceReceipt entity) {
|
||||
InvoiceReceiptVO vo = InvoiceReceiptWrapper.build().entityVO(entity);
|
||||
vo.setSettlementNos(settlementRelationMapper.selectList(
|
||||
@@ -1250,8 +1175,6 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
|
||||
invoice.setBankName(receipt.getBankName());
|
||||
invoice.setBankAccount(receipt.getBankAccount());
|
||||
invoice.setIssuingBank(receipt.getIssuingBank());
|
||||
invoice.setKingdeeBillNo(receipt.getKingdeeBillNo());
|
||||
invoice.setKingdeeStatus(receipt.getKingdeeStatus());
|
||||
return invoice;
|
||||
}
|
||||
|
||||
@@ -1381,15 +1304,6 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
|
||||
target.setBankName(source.getBankName());
|
||||
target.setBankAccount(source.getBankAccount());
|
||||
target.setIssuingBank(source.getIssuingBank());
|
||||
target.setKingdeeBillNo(source.getKingdeeBillNo());
|
||||
target.setKingdeeStatus(normalizeKingdeeStatus(source.getKingdeeStatus()));
|
||||
}
|
||||
|
||||
private String normalizeKingdeeStatus(String status) {
|
||||
if ("synced".equals(status) || "failed".equals(status)) {
|
||||
return status;
|
||||
}
|
||||
return "unsynced";
|
||||
}
|
||||
|
||||
private void changeStatus(InvoiceReceipt entity, String toStatus, String actionType,
|
||||
@@ -1400,7 +1314,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
|
||||
entity.setCurrentProcessor(AuthUtil.getUserName());
|
||||
updateById(entity);
|
||||
relationSettlementIds(entity.getId()).forEach(this::refreshSettlementInvoiceStatus);
|
||||
record(entity.getId(), actionType, actionName, fromStatus, toStatus, reason, entity.getKingdeeBillNo());
|
||||
record(entity.getId(), actionType, actionName, fromStatus, toStatus, reason, entity.getKingdeeReceivedInvoiceNo());
|
||||
}
|
||||
|
||||
private void record(Long receiptId, String actionType, String actionName, String fromStatus,
|
||||
|
||||
-5
@@ -57,11 +57,6 @@ public class InvoiceReceiptWrapper extends BaseEntityWrapper<InvoiceReceipt, Inv
|
||||
case "voided" -> "已作废";
|
||||
default -> entity.getApprovalStatus();
|
||||
});
|
||||
vo.setKingdeeStatusName(switch (entity.getKingdeeStatus() == null ? "" : entity.getKingdeeStatus()) {
|
||||
case "synced" -> "已同步";
|
||||
case "failed" -> "同步失败";
|
||||
default -> "未同步";
|
||||
});
|
||||
vo.setKingdeePushStatusName(switch (entity.getKingdeePushStatus() == null ? "" : entity.getKingdeePushStatus()) {
|
||||
case "pushed" -> "收票单已保存";
|
||||
case "assigned" -> "已指定应付";
|
||||
|
||||
Reference in New Issue
Block a user