docs: 收款流水同步方法增加详细日志和注释说明
This commit is contained in:
+45
-23
@@ -37,6 +37,14 @@ import org.springblade.core.tool.utils.Func;
|
||||
import org.springblade.system.cache.SysCache;
|
||||
import org.springblade.system.cache.UserCache;
|
||||
import org.springblade.system.pojo.entity.Dept;
|
||||
import org.springblade.thirdparty.bfi.pojo.dto.BfiClaimAnnounceQueryDTO;
|
||||
import org.springblade.thirdparty.bfi.pojo.dto.BfiClaimPushDTO;
|
||||
import org.springblade.thirdparty.bfi.pojo.dto.BfiClaimPushEntryDTO;
|
||||
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultItemVO;
|
||||
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultVO;
|
||||
import org.springblade.thirdparty.bfi.pojo.vo.BfiClaimAnnounceVO;
|
||||
import org.springblade.thirdparty.bfi.service.IBfiService;
|
||||
import org.springblade.thirdparty.bfi.util.BfiUtil;
|
||||
import org.springblade.transport.config.BfiProperties;
|
||||
import org.springblade.transport.constant.KingdeeBfiConstant;
|
||||
import org.springblade.transport.mapper.FormalSettlementMapper;
|
||||
@@ -51,18 +59,10 @@ import org.springblade.transport.pojo.entity.ReceiptClaim;
|
||||
import org.springblade.transport.pojo.entity.ReceiptClaimSettlement;
|
||||
import org.springblade.transport.pojo.entity.ReceiptFlowRecord;
|
||||
import org.springblade.transport.pojo.vo.ReceiptFlowVO;
|
||||
import org.springblade.transport.service.IReceiptFlowService;
|
||||
import org.springblade.transport.service.IFormalSettlementService;
|
||||
import org.springblade.transport.service.IReceiptFlowService;
|
||||
import org.springblade.transport.support.TransportBusinessSupport;
|
||||
import org.springblade.transport.wrapper.ReceiptFlowWrapper;
|
||||
import org.springblade.thirdparty.bfi.pojo.dto.BfiClaimAnnounceQueryDTO;
|
||||
import org.springblade.thirdparty.bfi.pojo.dto.BfiClaimPushDTO;
|
||||
import org.springblade.thirdparty.bfi.pojo.dto.BfiClaimPushEntryDTO;
|
||||
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultItemVO;
|
||||
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultVO;
|
||||
import org.springblade.thirdparty.bfi.pojo.vo.BfiClaimAnnounceVO;
|
||||
import org.springblade.thirdparty.bfi.service.IBfiService;
|
||||
import org.springblade.thirdparty.bfi.util.BfiUtil;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@@ -72,12 +72,10 @@ import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -346,13 +344,18 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl<KingdeeReceiptFlowMa
|
||||
// 同步口径:A301-2 按参与认领用户(当前登录用户真实姓名)拉取全量认领公告,
|
||||
// 以金蝶明细流水号为幂等键 upsert 收款流水表;本地已认领金额/状态(claimedAmount/claimStatus)
|
||||
// 由认领、作废驱动,不被公告顺带覆盖,公告侧状态单独存 kingdee_claim_status/unclaimed_amount。
|
||||
// 第一遍:收集有效的 detailSerialNo,跳过无效数据
|
||||
|
||||
// 第一遍:数据校验与过滤,收集有效的 detailSerialNo
|
||||
log.info("收款流水同步开始数据校验,共 {} 条认领公告", announces.size());
|
||||
Map<String, BfiClaimAnnounceVO> validAnnounces = new LinkedHashMap<>();
|
||||
int skippedCount = 0;
|
||||
for (BfiClaimAnnounceVO announce : announces) {
|
||||
// 明细流水号优先级:detailid > tradedetailno > bankdetailno
|
||||
String detailSerialNo = firstNonBlank(announce.getDetailid(),
|
||||
announce.getTradedetailno(), announce.getBankdetailno());
|
||||
if (Func.isEmpty(detailSerialNo)) {
|
||||
log.warn("收款流水同步跳过:认领公告[{}]缺少明细流水号", announce.getBillno());
|
||||
skippedCount++;
|
||||
continue;
|
||||
}
|
||||
detailSerialNo = detailSerialNo.trim();
|
||||
@@ -362,18 +365,22 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl<KingdeeReceiptFlowMa
|
||||
BigDecimal receiptAmount = money(announce.getReamount());
|
||||
if (receiptAmount.compareTo(BigDecimal.ZERO) <= 0) {
|
||||
log.warn("收款流水同步跳过:认领公告[{}]收款金额为空或小于0", announce.getBillno());
|
||||
skippedCount++;
|
||||
continue;
|
||||
}
|
||||
validAnnounces.put(detailSerialNo, announce);
|
||||
}
|
||||
|
||||
log.info("收款流水数据校验完成:有效 {} 条,跳过 {} 条", validAnnounces.size(), skippedCount);
|
||||
|
||||
if (validAnnounces.isEmpty()) {
|
||||
log.info("收款流水同步无有效数据,记录操作日志后返回");
|
||||
record(null, null, "sync", "手动同步流水", null, null, BigDecimal.ZERO,
|
||||
"金蝶认领公告无有效数据");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// 批量查询已存在的记录(FOR UPDATE 防并发)
|
||||
log.info("收款流水同步开始批量查询已存在记录,查询条件:detailSerialNo IN {} 条", validAnnounces.size());
|
||||
List<KingdeeReceiptFlow> existingEntities = baseMapper.selectList(
|
||||
Wrappers.<KingdeeReceiptFlow>lambdaQuery()
|
||||
.in(KingdeeReceiptFlow::getDetailSerialNo, validAnnounces.keySet())
|
||||
@@ -381,33 +388,41 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl<KingdeeReceiptFlowMa
|
||||
);
|
||||
Map<String, KingdeeReceiptFlow> existingMap = existingEntities.stream()
|
||||
.collect(Collectors.toMap(KingdeeReceiptFlow::getDetailSerialNo, e -> e));
|
||||
|
||||
log.info("收款流水批量查询完成:已存在 {} 条,待新增 {} 条",
|
||||
existingEntities.size(), validAnnounces.size() - existingEntities.size());
|
||||
|
||||
// 第二遍:构建新增和更新列表
|
||||
log.info("收款流水同步开始构建新增/更新列表");
|
||||
List<KingdeeReceiptFlow> toInsert = new ArrayList<>();
|
||||
List<KingdeeReceiptFlow> toUpdate = new ArrayList<>();
|
||||
int createdCount = 0;
|
||||
int updatedCount = 0;
|
||||
|
||||
|
||||
for (Map.Entry<String, BfiClaimAnnounceVO> entry : validAnnounces.entrySet()) {
|
||||
String detailSerialNo = entry.getKey();
|
||||
BfiClaimAnnounceVO announce = entry.getValue();
|
||||
BigDecimal receiptAmount = money(announce.getReamount());
|
||||
|
||||
|
||||
// 判断是新增还是更新
|
||||
KingdeeReceiptFlow existing = existingMap.get(detailSerialNo);
|
||||
boolean created = (existing == null);
|
||||
|
||||
|
||||
KingdeeReceiptFlow entity;
|
||||
if (created) {
|
||||
// 新增:初始化本地认领金额和状态
|
||||
entity = new KingdeeReceiptFlow();
|
||||
entity.setClaimedAmount(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP));
|
||||
entity.setClaimStatus(UNCLAIMED);
|
||||
} else {
|
||||
// 更新:保留本地已认领金额和状态
|
||||
entity = existing;
|
||||
}
|
||||
|
||||
|
||||
// 复制公告数据到实体(不覆盖本地认领字段)
|
||||
copyAnnounceRow(entity, announce, detailSerialNo, receiptAmount);
|
||||
// 根据本地已认领金额重新计算认领状态
|
||||
entity.setClaimStatus(amountClaimStatus(money(entity.getClaimedAmount()), receiptAmount));
|
||||
|
||||
|
||||
if (created) {
|
||||
toInsert.add(entity);
|
||||
createdCount++;
|
||||
@@ -416,16 +431,22 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl<KingdeeReceiptFlowMa
|
||||
updatedCount++;
|
||||
}
|
||||
}
|
||||
|
||||
log.info("收款流水列表构建完成:待新增 {} 条,待更新 {} 条", createdCount, updatedCount);
|
||||
|
||||
// 批量插入和更新
|
||||
if (!toInsert.isEmpty()) {
|
||||
log.info("收款流水同步开始批量插入 {} 条", toInsert.size());
|
||||
saveBatch(toInsert);
|
||||
log.info("收款流水批量插入完成");
|
||||
}
|
||||
if (!toUpdate.isEmpty()) {
|
||||
log.info("收款流水同步开始批量更新 {} 条", toUpdate.size());
|
||||
updateBatchById(toUpdate);
|
||||
log.info("收款流水批量更新完成");
|
||||
}
|
||||
|
||||
|
||||
// 记录操作日志
|
||||
log.info("收款流水同步开始记录操作日志,共 {} 条", toInsert.size() + toUpdate.size());
|
||||
for (KingdeeReceiptFlow entity : toInsert) {
|
||||
record(entity.getId(), null, "sync", "新增金蝶收款流水",
|
||||
entity.getClaimStatus(), entity.getClaimStatus(), BigDecimal.ZERO, entity.getDetailSerialNo());
|
||||
@@ -434,7 +455,8 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl<KingdeeReceiptFlowMa
|
||||
record(entity.getId(), null, "sync", "更新金蝶收款流水",
|
||||
entity.getClaimStatus(), entity.getClaimStatus(), BigDecimal.ZERO, entity.getDetailSerialNo());
|
||||
}
|
||||
|
||||
log.info("收款流水操作日志记录完成");
|
||||
|
||||
log.info("金蝶收款流水同步完成 claimusers:{},拉取 {} 条,新增 {} 条,更新 {} 条",
|
||||
claimusers, announces.size(), createdCount, updatedCount);
|
||||
return createdCount + updatedCount;
|
||||
|
||||
Reference in New Issue
Block a user