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 caa11ce..b282c74 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 @@ -30,12 +30,15 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import org.springblade.transport.pojo.entity.KingdeeReceiptFlow; +import org.springblade.transport.pojo.entity.ReceiptFlowRecord; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; /** * 收款流水视图实体类 @@ -70,4 +73,6 @@ public class ReceiptFlowVO extends KingdeeReceiptFlow { @TableField(exist = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime transactionEndTime; + @TableField(exist = false) + private List claimRecords = new ArrayList<>(); } 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 f8195ac..d67defb 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 @@ -73,7 +73,6 @@ import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Stream; /** 付款申请服务实现。 @author Chill */ @Service @@ -114,6 +113,7 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl { PaymentApplicationVO vo = PaymentApplicationWrapper.build().entityVO(item); + if (!APPROVED.equals(item.getApprovalStatus())) vo.setPaidAmount(BigDecimal.ZERO); return vo; }); } @@ -471,15 +471,14 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpllambdaQuery().eq(ProjectApply::getId, entity.getProjectId()).last("FOR UPDATE")); if (project != null && project.getFundLimit() != null) { BigDecimal projectLimit = projectFundLimit(project); - BigDecimal projectOccupiedAmount = quotaOccupiedAmount(Wrappers.lambdaQuery() - .eq(PaymentApplication::getProjectId, entity.getProjectId()) - .ne(entity.getId() != null, PaymentApplication::getId, entity.getId()), entity); - if (projectOccupiedAmount.compareTo(projectLimit) > 0) { - throw new ServiceException("申请付款金额超过项目剩余资金使用额度(已扣减收票金额并包含在途申请)"); + if (appliedAmount.compareTo(projectLimit) > 0) { + throw new ServiceException("申请付款金额不能超过项目额度"); } } if (Func.isNotEmpty(entity.getPayeeName())) { @@ -488,13 +487,8 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl customerNames = Stream.of(customer.getFullName(), customer.getShortName()) - .filter(Func::isNotEmpty).map(String::trim).distinct().toList(); - BigDecimal customerOccupiedAmount = quotaOccupiedAmount(Wrappers.lambdaQuery() - .in(PaymentApplication::getPayeeName, customerNames) - .ne(entity.getId() != null, PaymentApplication::getId, entity.getId()), entity); - if (customerOccupiedAmount.compareTo(customerLimit) > 0) { - throw new ServiceException("申请付款金额超过客户剩余资金使用额度(已扣减收票金额并包含在途申请)"); + if (appliedAmount.compareTo(customerLimit) > 0) { + throw new ServiceException("申请付款金额不能超过客户额度"); } } } @@ -512,19 +506,6 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl wrapper, - PaymentApplication currentApplication) { - List applications = list(wrapper.ne(PaymentApplication::getApprovalStatus, VOIDED) - .last("FOR UPDATE")); - BigDecimal appliedAmount = applications.stream().map(PaymentApplication::getAppliedAmount) - .map(this::money).reduce(BigDecimal.ZERO, BigDecimal::add) - .add(money(currentApplication.getAppliedAmount())); - BigDecimal receivedInvoiceAmount = applications.stream().map(PaymentApplication::getMatchedInvoiceAmount) - .map(this::money).reduce(BigDecimal.ZERO, BigDecimal::add) - .add(money(currentApplication.getMatchedInvoiceAmount())); - return appliedAmount.subtract(receivedInvoiceAmount).max(BigDecimal.ZERO); - } - private BigDecimal sumApplied(LambdaQueryWrapper wrapper) { return list(wrapper.ne(PaymentApplication::getApprovalStatus, VOIDED)).stream() .map(PaymentApplication::getAppliedAmount).map(this::money).reduce(BigDecimal.ZERO, BigDecimal::add); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java index 06fafe7..360ad1f 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java @@ -42,6 +42,7 @@ import org.springblade.transport.mapper.PreSettlementDetailFeeMapper; import org.springblade.transport.mapper.PreSettlementDetailMapper; import org.springblade.transport.mapper.PreSettlementMapper; import org.springblade.transport.mapper.PreSettlementSummaryFeeMapper; +import org.springblade.transport.mapper.PaymentApplicationMapper; import org.springblade.transport.mapper.ReceivablePayableCargoFeeMapper; import org.springblade.transport.mapper.ReceivablePayableDetailMapper; import org.springblade.transport.pojo.dto.PreSettlementAdvanceRequest; @@ -56,6 +57,7 @@ import org.springblade.transport.pojo.entity.PreSettlementChangeRecord; import org.springblade.transport.pojo.entity.PreSettlementDetail; import org.springblade.transport.pojo.entity.PreSettlementDetailFee; import org.springblade.transport.pojo.entity.PreSettlementSummaryFee; +import org.springblade.transport.pojo.entity.PaymentApplication; import org.springblade.transport.pojo.entity.ProjectApply; import org.springblade.transport.pojo.entity.ReceivablePayableCargoFee; import org.springblade.transport.pojo.entity.ReceivablePayableDetail; @@ -113,6 +115,7 @@ public class PreSettlementServiceImpl extends BaseServiceImpl selectPage(IPage page, PreSettlementVO query) { - return PreSettlementWrapper.build().pageVO(page(page, buildQuery(query))); + IPage result = PreSettlementWrapper.build().pageVO(page(page, buildQuery(query))); + fillPaymentApplicationAmounts(result.getRecords()); + return result; + } + + private void fillPaymentApplicationAmounts(List records) { + if (Func.isEmpty(records)) return; + Set preSettlementIds = records.stream().map(PreSettlementVO::getId) + .filter(Objects::nonNull).collect(Collectors.toSet()); + if (preSettlementIds.isEmpty()) return; + List applications = paymentApplicationMapper.selectList( + Wrappers.lambdaQuery() + .select(PaymentApplication::getPreSettlementId, PaymentApplication::getAppliedAmount, + PaymentApplication::getPaidAmount, PaymentApplication::getApprovalStatus) + .eq(PaymentApplication::getPaymentType, "progress_advance") + .in(PaymentApplication::getPreSettlementId, preSettlementIds) + .in(PaymentApplication::getApprovalStatus, STATUS_REVIEWING, STATUS_APPROVED) + .eq(PaymentApplication::getIsDeleted, 0)); + Map reviewingAmounts = new HashMap<>(); + Map approvedAmounts = new HashMap<>(); + applications.forEach(application -> { + boolean reviewing = STATUS_REVIEWING.equals(application.getApprovalStatus()); + Map amounts = reviewing ? reviewingAmounts : approvedAmounts; + BigDecimal amount = reviewing ? application.getAppliedAmount() : application.getPaidAmount(); + amounts.merge(application.getPreSettlementId(), money(amount), BigDecimal::add); + }); + records.forEach(record -> { + record.setAdvanceAppliedAmount(money(reviewingAmounts.get(record.getId()))); + record.setAdvancePaidAmount(money(approvedAmounts.get(record.getId()))); + }); } @Override 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 bcf456a..3affe44 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 @@ -54,7 +54,9 @@ import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; /** @@ -94,14 +96,35 @@ public class ReceiptClaimRecordServiceImpl extends BaseServiceImpl settlements = claimSettlementMapper.selectList( Wrappers.lambdaQuery() .eq(ReceiptClaimSettlement::getReceiptClaimId, id) - .orderByAsc(ReceiptClaimSettlement::getCreateTime))); + .orderByAsc(ReceiptClaimSettlement::getCreateTime)); + fillSettlementClaimedAmounts(settlements); + record.setSettlements(settlements); fillStatusNames(record); return record; } + private void fillSettlementClaimedAmounts(List settlements) { + List settlementIds = settlements.stream() + .map(ReceiptClaimSettlement::getFormalSettlementId) + .filter(Objects::nonNull) + .distinct() + .toList(); + if (settlementIds.isEmpty()) { + return; + } + Map claimedAmountMap = new HashMap<>(); + claimSettlementMapper.selectList(Wrappers.lambdaQuery() + .in(ReceiptClaimSettlement::getFormalSettlementId, settlementIds) + .eq(ReceiptClaimSettlement::getStatus, 1)) + .forEach(relation -> claimedAmountMap.merge(relation.getFormalSettlementId(), + money(relation.getAllocatedReceiptAmount()), BigDecimal::add)); + settlements.forEach(settlement -> settlement.setClaimedReceiptAmount( + money(claimedAmountMap.get(settlement.getFormalSettlementId())))); + } + @Override @Transactional(rollbackFor = Exception.class) public void updateAttachments(ReceiptClaimAttachmentsRequest request) { 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 e36bc06..8834724 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 @@ -111,6 +111,7 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpllambdaQuery() + .eq(ReceiptFlowRecord::getReceiptFlowId, id) + .eq(ReceiptFlowRecord::getActionType, "claim") + .orderByDesc(ReceiptFlowRecord::getCreateTime))); return vo; }