From fce582e80b2055893a484ebc8c23529e534f113d Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Mon, 19 Oct 2026 17:12:22 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E6=94=B6=E6=AC=BE?= =?UTF-8?q?=E6=B5=81=E6=B0=B4=E7=BB=A7=E7=BB=AD=E8=AE=A4=E9=A2=86=E4=B8=8E?= =?UTF-8?q?=E4=BB=98=E6=AC=BE=E5=8F=AF=E4=BB=98=E5=8F=A3=E5=BE=84=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=94=B9=E7=94=A8OA=E7=99=BB=E5=BD=95=E5=90=8D?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 收款流水部分认领预填关联结算单并修正认领完成判定;正式结算尾款扣减预付占用;预付驳回重提纠正结算引用;临时额度取消强制项目额度校验;用户增加OA登录名供MK流程使用。 Co-authored-by: Cursor --- .../transport/pojo/vo/ReceiptFlowVO.java | 6 + .../springblade/system/pojo/entity/User.java | 4 + .../controller/BusinessProcessController.java | 2 - .../service/IBusinessProcessService.java | 4 +- .../impl/BusinessProcessServiceImpl.java | 48 +++--- .../system/convert/UserConvert.java | 1 + .../springblade/system/mapper/UserMapper.xml | 1 + .../system/service/impl/UserServiceImpl.java | 1 + .../impl/FormalSettlementServiceImpl.java | 6 +- .../impl/PaymentApplicationServiceImpl.java | 144 ++++++++++++++--- .../impl/ReceiptClaimRecordServiceImpl.java | 25 ++- .../service/impl/ReceiptFlowServiceImpl.java | 146 +++++++++++++++--- .../impl/TemporaryCreditLimitServiceImpl.java | 6 +- .../transport/wrapper/ReceiptFlowWrapper.java | 9 +- .../blade_user_oa_login_id_20261019.sql | 18 +++ 15 files changed, 337 insertions(+), 84 deletions(-) create mode 100644 doc/sql/transport/blade_user_oa_login_id_20261019.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ReceiptFlowVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ReceiptFlowVO.java index f32a9491..3f105412 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ReceiptFlowVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ReceiptFlowVO.java @@ -39,6 +39,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * 收款流水视图实体类 @@ -91,4 +92,9 @@ public class ReceiptFlowVO extends KingdeeReceiptFlow { private BigDecimal receiptAmountEnd; @TableField(exist = false) private List claimRecords = new ArrayList<>(); + /** + * 本流水历史关联且仍有剩余可认领金额的应收正式结算单(继续认领时预填) + */ + @TableField(exist = false) + private List> relatedSettlements = new ArrayList<>(); } diff --git a/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/entity/User.java b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/entity/User.java index 398ba356..d20b5bb8 100644 --- a/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/entity/User.java +++ b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/entity/User.java @@ -132,6 +132,10 @@ public class User extends TenantEntity implements IPhone { * 是否是oa的账号 */ private Integer isOa; + /** + * OA登录名 + */ + private String oaLoginId; /** * OA上次更新时间(OA 的 modified 字段),仅同步比对使用 */ diff --git a/blade-service/blade-system/src/main/java/org/springblade/process/controller/BusinessProcessController.java b/blade-service/blade-system/src/main/java/org/springblade/process/controller/BusinessProcessController.java index f65cc45e..2cf6ad79 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/process/controller/BusinessProcessController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/process/controller/BusinessProcessController.java @@ -11,7 +11,6 @@ import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; -import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springblade.process.pojo.dto.ApprovalDTO; @@ -49,7 +48,6 @@ public class BusinessProcessController extends BladeController { if (param == null) { param = new ApprovalDTO(); } - param.setLoginName(AuthUtil.getUserAccount()); IPage pages = businessProcessService.queryMkApprovalList(Condition.getPage(query), param); return R.data(pages); } diff --git a/blade-service/blade-system/src/main/java/org/springblade/process/service/IBusinessProcessService.java b/blade-service/blade-system/src/main/java/org/springblade/process/service/IBusinessProcessService.java index 36b15ce0..ae11c22d 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/process/service/IBusinessProcessService.java +++ b/blade-service/blade-system/src/main/java/org/springblade/process/service/IBusinessProcessService.java @@ -71,7 +71,7 @@ public interface IBusinessProcessService extends IService { * 获取流程当前节点详情 * * @param processInstanceId 流程实例id - * @param loginName MK登录名(手机号),可为空,为空时按流程发起人解析 + * @param loginName MK登录名(OA登录名),可为空,为空时按流程发起人解析 * @return 当前节点列表 */ List getCurrentNodes(String processInstanceId, String loginName); @@ -80,7 +80,7 @@ public interface IBusinessProcessService extends IService { * 获取流程实例详情 * * @param processInstanceId 流程实例id - * @param loginName MK登录名(手机号),可为空,为空时按流程发起人解析 + * @param loginName MK登录名(OA登录名),可为空,为空时按流程发起人解析 * @return 流程实例详情 */ Object getProcessInfo(String processInstanceId, String loginName); diff --git a/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java index fed83a70..42326194 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java @@ -132,9 +132,9 @@ public class BusinessProcessServiceImpl extends ServiceImpl queryMkApprovalList(IPage page, ApprovalDTO param) { + String loginName = resolveCurrentUserOaLoginId(); + AssertUtils.notBlank(loginName, "当前用户OA登录名为空,无法查询审核列表"); + param.setLoginName(loginName); if (MKDoc.RELATED.getCode().equals(param.getDocType())) { // 我参与的,调用流程列表接口 MKProcessDTO processParam = approvalConvert.dto2mk(param); diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/convert/UserConvert.java b/blade-service/blade-system/src/main/java/org/springblade/system/convert/UserConvert.java index 00b2e576..abf59acf 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/convert/UserConvert.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/convert/UserConvert.java @@ -70,6 +70,7 @@ public interface UserConvert { @Mapping(source = "lastname", target = "realName") @Mapping(source = "mobile", target = "phone") @Mapping(source = "email", target = "email") + @Mapping(source = "loginid", target = "oaLoginId") @Mapping(source = "modified", target = "oaModified") User baseConvert(OAPersonResponse person); diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserMapper.xml b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserMapper.xml index 1cdec59f..6921159c 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserMapper.xml +++ b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/UserMapper.xml @@ -26,6 +26,7 @@ + diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserServiceImpl.java index 648bedb7..499575eb 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserServiceImpl.java @@ -366,6 +366,7 @@ public class UserServiceImpl extends BaseServiceImpl implement user.setPostId(null); user.setAccount(null); user.setIsLeader(null); + user.setOaLoginId(null); CacheUtil.clear(USER_CACHE); return submitUserInfo(user); } 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 91268648..62e6a744 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 @@ -1729,7 +1729,8 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl receiptClaimPaidBySettlement = hasReceivable ? receiptClaimSettlementMapper.selectList(Wrappers.lambdaQuery() .in(ReceiptClaimSettlement::getFormalSettlementId, settledIds) - .eq(ReceiptClaimSettlement::getStatus, 1)).stream() + .eq(ReceiptClaimSettlement::getStatus, 1) + .eq(ReceiptClaimSettlement::getIsDeleted, 0)).stream() .collect(Collectors.groupingBy(ReceiptClaimSettlement::getFormalSettlementId, Collectors.reducing(BigDecimal.ZERO, item -> money(item.getAllocatedReceiptAmount()), BigDecimal::add))) @@ -2161,7 +2162,8 @@ public class FormalSettlementServiceImpl extends BaseServiceImpllambdaQuery() .eq(ReceiptClaimSettlement::getFormalSettlementId, settlement.getId()) - .eq(ReceiptClaimSettlement::getStatus, 1)) + .eq(ReceiptClaimSettlement::getStatus, 1) + .eq(ReceiptClaimSettlement::getIsDeleted, 0)) .stream().map(ReceiptClaimSettlement::getAllocatedReceiptAmount).map(this::money) .reduce(BigDecimal.ZERO, BigDecimal::add); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java index 2836e87d..0f70c1a2 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java @@ -321,11 +321,15 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpllambdaUpdate() .eq(PaymentApplication::getId, entity.getId()) .setSql("settlement_id = null, settlement_no = null")); + entity.setSettlementId(null); + entity.setSettlementNo(null); } private void fillReference(PaymentApplication entity, PaymentApplicationSaveRequest request) { @@ -1938,15 +1971,26 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl 0) throw new ServiceException("申请付款金额不能超过可付款金额"); } + private PreSettlement requireApprovedPreSettlement(Long preSettlementId) { + PreSettlement source = preSettlementMapper.selectById(preSettlementId); + if (source == null || Objects.equals(source.getIsDeleted(), 1)) { + throw new ServiceException("预结算单不存在"); + } + if (!TransportBusiConstant.APPROVED.equals(source.getApprovalStatus())) { + throw new ServiceException("只能选择审批通过、未作废的预结算单"); + } + return source; + } + + private void fillPreSettlementReference(PaymentApplication entity, PreSettlement source) { + entity.setPreSettlementId(source.getId()); + entity.setPreSettlementNo(source.getPreSettlementNo()); + entity.setSettlementId(null); + entity.setSettlementNo(null); + entity.setProjectId(source.getProjectId()); + entity.setProjectName(source.getProjectName()); + entity.setDeptId(source.getDeptId()); + entity.setDeptName(source.getDeptName()); + entity.setContractId(source.getContractId()); + entity.setContractNo(source.getContractNo()); + entity.setContractName(source.getContractName()); + entity.setPayerName(source.getPayerName()); + entity.setPayeeName(source.getPayeeName()); + entity.setSettlementAmount(source.getSettlementAmount()); + entity.setPayableAmount(payableOfPreSettlement(source.getId(), source.getSettlementAmount(), entity.getId())); + entity.setBillType("预结算单"); + } + private List resolveFormalSettlements(PaymentApplicationSaveRequest request, PaymentApplication entity) { if (!TransportBusiConstant.PAYMENT_TYPE_SETTLEMENT.equals(request.getPaymentType())) return List.of(); List ids = request.getSettlementIds() == null ? List.of() : request.getSettlementIds(); @@ -2358,15 +2432,45 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl sources = formalSettlementSourceMapper.selectList( + Wrappers.lambdaQuery() + .eq(FormalSettlementSource::getFormalSettlementId, settlementId) + .eq(FormalSettlementSource::getIsDeleted, 0)); + if (sources.isEmpty()) { + return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); + } + BigDecimal total = BigDecimal.ZERO; + for (FormalSettlementSource source : sources) { + BigDecimal occupied = money(source.getAdvanceAppliedAmount()).max(money(source.getAdvancePaidAmount())); + if (occupied.compareTo(BigDecimal.ZERO) <= 0 && source.getPreSettlementId() != null) { + occupied = findPreSettlementApplied(source.getPreSettlementId()) + .max(findPreSettlementPaid(source.getPreSettlementId())); + } + total = total.add(occupied); + } + return total; + } + /** 预结算可付款 = 结算金额 − 已申请付款 − 项目预付核销 */ private BigDecimal payableOfPreSettlement(Long preSettlementId, BigDecimal settlementAmount, Long excludeId) { return money(settlementAmount) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptClaimRecordServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptClaimRecordServiceImpl.java index 8d0116e6..dc68308c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptClaimRecordServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptClaimRecordServiceImpl.java @@ -252,8 +252,8 @@ public class ReceiptClaimRecordServiceImpl extends BaseServiceImpl= 0 ? "claimed" : "partial"; + return claimedAmount.compareTo(money(claimCeiling)) >= 0 ? "claimed" : "partial"; + } + + /** + * 可认领上限:公告未认领金额与收款金额取较小正值(与收款流水侧口径一致) + */ + private BigDecimal claimCeiling(KingdeeReceiptFlow flow) { + BigDecimal unclaimed = money(flow.getUnclaimedAmount()); + BigDecimal receipt = money(flow.getReceiptAmount()); + if (receipt.compareTo(BigDecimal.ZERO) <= 0) { + return unclaimed; + } + if (unclaimed.compareTo(BigDecimal.ZERO) <= 0) { + return unclaimed; + } + return unclaimed.min(receipt); } private String amountStatus(BigDecimal paidAmount, BigDecimal settlementAmount) { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java index fe427db1..e6c6aecd 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java @@ -194,12 +194,16 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl> settlementCandidates(String keyword, Long flowId) { existing(flowId); + // 本流水历史关联结算单优先保留(避免仅按创建时间 limit 截断后选不到) + Set relatedIds = relatedSettlementIds(flowId); List settlements = formalSettlementMapper.selectList( Wrappers.lambdaQuery() .eq(FormalSettlement::getSettlementType, RECEIVABLE) @@ -210,7 +214,24 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl loadedIds = settlements.stream().map(FormalSettlement::getId) + .filter(Objects::nonNull).collect(Collectors.toSet()); + List missingIds = relatedIds.stream().filter(id -> !loadedIds.contains(id)).toList(); + if (!missingIds.isEmpty()) { + List relatedSettlements = formalSettlementMapper.selectList( + Wrappers.lambdaQuery() + .in(FormalSettlement::getId, missingIds) + .eq(FormalSettlement::getSettlementType, RECEIVABLE) + .eq(FormalSettlement::getApprovalStatus, APPROVED) + .eq(FormalSettlement::getStatus, 1)); + List merged = new ArrayList<>(relatedSettlements.size() + settlements.size()); + merged.addAll(relatedSettlements); + merged.addAll(settlements); + settlements = merged; + } + } // 候选结算单的累计认领金额一次聚合查询(避免逐单 N+1) Map claimedMap = receiptClaimedAmounts(settlements.stream() .map(FormalSettlement::getId).toList()); @@ -218,6 +239,14 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl candidateRow(settlement, claimedMap.getOrDefault(settlement.getId(), BigDecimal.ZERO))) .filter(row -> ((BigDecimal) row.get("remainingReceiptAmount")).compareTo(BigDecimal.ZERO) > 0) + .sorted((left, right) -> { + boolean leftRelated = relatedIds.contains(toLong(left.get("id"))); + boolean rightRelated = relatedIds.contains(toLong(right.get("id"))); + if (leftRelated == rightRelated) { + return 0; + } + return leftRelated ? -1 : 1; + }) .toList(); } @@ -234,6 +263,7 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpllambdaQuery() .eq(ReceiptClaimSettlement::getFormalSettlementId, formalSettlementId) .eq(ReceiptClaimSettlement::getStatus, 1) + .eq(ReceiptClaimSettlement::getIsDeleted, 0) .orderByDesc(ReceiptClaimSettlement::getCreateTime)); if (relations.isEmpty()) { return List.of(); @@ -315,19 +345,19 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl 0) { - throw new ServiceException("累计认领金额不能超过公告未认领金额,剩余可认领 " - + unclaimedAmount.subtract(previousFlowClaimed).max(BigDecimal.ZERO)); + if (previousFlowClaimed.add(allocatedTotal).compareTo(claimCeiling) > 0) { + throw new ServiceException("累计认领金额不能超过可认领上限,剩余可认领 " + + claimCeiling.subtract(previousFlowClaimed).max(BigDecimal.ZERO)); } // 当前用户部门 @@ -380,6 +410,9 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl relatedSettlementIds(Long flowId) { + if (flowId == null) { + return Set.of(); + } + return claimSettlementMapper.selectList(Wrappers.lambdaQuery() + .select(ReceiptClaimSettlement::getFormalSettlementId) + .eq(ReceiptClaimSettlement::getReceiptFlowId, flowId) + .eq(ReceiptClaimSettlement::getStatus, 1) + .eq(ReceiptClaimSettlement::getIsDeleted, 0)).stream() + .map(ReceiptClaimSettlement::getFormalSettlementId) + .filter(Objects::nonNull) + .collect(Collectors.toCollection(HashSet::new)); + } + + /** + * 继续认领预填:本流水历史关联且仍有剩余可认领金额的结算单 + */ + private List> relatedSettlementCandidates(Long flowId) { + Set relatedIds = relatedSettlementIds(flowId); + if (relatedIds.isEmpty()) { + return List.of(); + } + List settlements = formalSettlementMapper.selectList( + Wrappers.lambdaQuery() + .in(FormalSettlement::getId, relatedIds) + .eq(FormalSettlement::getSettlementType, RECEIVABLE) + .eq(FormalSettlement::getApprovalStatus, APPROVED) + .eq(FormalSettlement::getStatus, 1)); + Map claimedMap = receiptClaimedAmounts(settlements.stream() + .map(FormalSettlement::getId).toList()); + return settlements.stream() + .map(settlement -> candidateRow(settlement, + claimedMap.getOrDefault(settlement.getId(), BigDecimal.ZERO))) + .filter(row -> ((BigDecimal) row.get("remainingReceiptAmount")).compareTo(BigDecimal.ZERO) > 0) + .toList(); + } + /** * 批量聚合结算单的累计有效认领金额:一次 IN 查询按结算单分组求和,避免逐单 N+1 */ @@ -631,7 +704,8 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpllambdaQuery() .in(ReceiptClaimSettlement::getFormalSettlementId, ids) - .eq(ReceiptClaimSettlement::getStatus, 1)).stream() + .eq(ReceiptClaimSettlement::getStatus, 1) + .eq(ReceiptClaimSettlement::getIsDeleted, 0)).stream() .collect(Collectors.groupingBy(ReceiptClaimSettlement::getFormalSettlementId, Collectors.reducing(BigDecimal.ZERO, item -> money(item.getAllocatedReceiptAmount()), BigDecimal::add))); @@ -640,12 +714,42 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpllambdaQuery() .eq(ReceiptClaimSettlement::getReceiptFlowId, flowId) - .eq(ReceiptClaimSettlement::getStatus, 1)).stream() + .eq(ReceiptClaimSettlement::getStatus, 1) + .eq(ReceiptClaimSettlement::getIsDeleted, 0)).stream() .map(ReceiptClaimSettlement::getAllocatedReceiptAmount) .map(this::money) .reduce(BigDecimal.ZERO, BigDecimal::add); } + /** + * 可认领上限:公告未认领金额与收款金额取较小正值。 + * 主口径仍为 A301-2 公告未认领金额;与收款金额取 min,避免未认领金额异常偏大导致无法进入「认领完成」。 + */ + private BigDecimal claimCeiling(KingdeeReceiptFlow flow) { + BigDecimal unclaimed = money(flow.getUnclaimedAmount()); + BigDecimal receipt = money(flow.getReceiptAmount()); + if (receipt.compareTo(BigDecimal.ZERO) <= 0) { + return unclaimed; + } + if (unclaimed.compareTo(BigDecimal.ZERO) <= 0) { + return unclaimed; + } + return unclaimed.min(receipt); + } + + private Long toLong(Object value) { + if (value == null) { + return null; + } + if (value instanceof Long longValue) { + return longValue; + } + if (value instanceof Number number) { + return number.longValue(); + } + return Func.toLong(String.valueOf(value)); + } + private KingdeeReceiptFlow lockedFlow(Long flowId) { KingdeeReceiptFlow flow = baseMapper.selectOne(Wrappers.lambdaQuery() .eq(KingdeeReceiptFlow::getId, flowId) @@ -824,18 +928,20 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl allocations = claimSettlementMapper.selectList( Wrappers.lambdaQuery() .eq(ReceiptClaimSettlement::getReceiptFlowId, flow.getId()) .eq(ReceiptClaimSettlement::getStatus, 1) + .eq(ReceiptClaimSettlement::getIsDeleted, 0) .orderByAsc(ReceiptClaimSettlement::getFormalSettlementId)); if (allocations.isEmpty()) { return ReceiptClaimPushResult.fail("该流水无有效认领分摊,无法推送"); @@ -1075,13 +1181,13 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl= 0 ? CLAIMED : PARTIAL; + return claimedAmount.compareTo(money(claimCeiling)) >= 0 ? CLAIMED : PARTIAL; } private String amountStatus(BigDecimal claimedAmount, BigDecimal settlementAmount) { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TemporaryCreditLimitServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TemporaryCreditLimitServiceImpl.java index b75e757a..46e7e20e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TemporaryCreditLimitServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/TemporaryCreditLimitServiceImpl.java @@ -246,10 +246,8 @@ public class TemporaryCreditLimitServiceImpl extends BaseServiceImpl "处理失败"; default -> "未推送"; }); - // 剩余可认领金额 = 公告未认领金额 − 累计认领金额(认领上限为公告口径) + // 剩余可认领金额 = 可认领上限 − 累计认领金额(上限取公告未认领与收款金额较小值) BigDecimal unclaimedAmount = money(entity.getUnclaimedAmount()); + BigDecimal receiptAmount = money(entity.getReceiptAmount()); + BigDecimal claimCeiling = unclaimedAmount; + if (receiptAmount.compareTo(BigDecimal.ZERO) > 0 && unclaimedAmount.compareTo(BigDecimal.ZERO) > 0) { + claimCeiling = unclaimedAmount.min(receiptAmount); + } BigDecimal claimedAmount = money(entity.getClaimedAmount()); - vo.setRemainingAmount(unclaimedAmount.subtract(claimedAmount).max(BigDecimal.ZERO)); + vo.setRemainingAmount(claimCeiling.subtract(claimedAmount).max(BigDecimal.ZERO)); vo.setCreateUserName(UserCache.getUserRealName(entity.getCreateUser())); vo.setUpdateUserName(UserCache.getUserRealName(entity.getUpdateUser())); return vo; diff --git a/doc/sql/transport/blade_user_oa_login_id_20261019.sql b/doc/sql/transport/blade_user_oa_login_id_20261019.sql new file mode 100644 index 00000000..21636521 --- /dev/null +++ b/doc/sql/transport/blade_user_oa_login_id_20261019.sql @@ -0,0 +1,18 @@ +-- 用户表:新增 OA 登录名,支持用户管理后台维护 +-- 排序规则 utf8mb4_general_ci + +ALTER TABLE `blade_user` + ADD COLUMN `oa_login_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'OA登录名' AFTER `is_oa`; + +-- 从用户部门关联表回填已有 OA 登录账号 +UPDATE `blade_user` bu +INNER JOIN ( + SELECT `user_id`, MAX(`oa_login_id`) AS `oa_login_id` + FROM `blade_user_dept` + WHERE `is_deleted` = 0 + AND `oa_login_id` IS NOT NULL + AND `oa_login_id` <> '' + GROUP BY `user_id` +) bud ON bud.`user_id` = bu.`id` +SET bu.`oa_login_id` = bud.`oa_login_id` +WHERE bu.`oa_login_id` IS NULL OR bu.`oa_login_id` = '';