完善首付款管理模块

This commit is contained in:
2026-08-28 02:10:44 +08:00
parent 1be1a18ea8
commit 15dc0791f1
7 changed files with 88 additions and 23 deletions
@@ -0,0 +1,23 @@
package org.springblade.transport.pojo.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/** 正式结算批量付款申请请求。 @author Chill */
@Data
public class FormalSettlementBatchPaymentRequest implements Serializable {
@Serial private static final long serialVersionUID = 1L;
private List<Item> items;
private String remark;
@Data
public static class Item implements Serializable {
@Serial private static final long serialVersionUID = 1L;
private Long id;
private BigDecimal appliedAmount;
}
}
@@ -20,6 +20,7 @@ import org.springblade.core.secure.annotation.PreAuth;
import org.springblade.core.tool.api.R; import org.springblade.core.tool.api.R;
import org.springblade.transport.pojo.dto.FormalSettlementSaveRequest; import org.springblade.transport.pojo.dto.FormalSettlementSaveRequest;
import org.springblade.transport.pojo.dto.FormalSettlementPaymentRequest; import org.springblade.transport.pojo.dto.FormalSettlementPaymentRequest;
import org.springblade.transport.pojo.dto.FormalSettlementBatchPaymentRequest;
import org.springblade.transport.pojo.dto.FormalSettlementStatusRequest; import org.springblade.transport.pojo.dto.FormalSettlementStatusRequest;
import org.springblade.transport.pojo.dto.PreSettlementDetailAdjustRequest; import org.springblade.transport.pojo.dto.PreSettlementDetailAdjustRequest;
import org.springblade.transport.pojo.entity.FormalSettlementDetailFee; import org.springblade.transport.pojo.entity.FormalSettlementDetailFee;
@@ -158,4 +159,11 @@ public class FormalSettlementController extends BladeController {
public R<String> applyPayment(@RequestBody FormalSettlementPaymentRequest request) { public R<String> applyPayment(@RequestBody FormalSettlementPaymentRequest request) {
return R.data(formalSettlementService.applyPayment(request)); return R.data(formalSettlementService.applyPayment(request));
} }
@PostMapping("/apply-payments")
@ApiOperationSupport(order = 18)
@Operation(summary = "批量发起尾款付款申请")
public R<List<String>> applyPayments(@RequestBody FormalSettlementBatchPaymentRequest request) {
return R.data(formalSettlementService.applyPayments(request));
}
} }
@@ -20,6 +20,7 @@ import org.springblade.transport.pojo.dto.PreSettlementDetailAdjustRequest;
import org.springblade.transport.pojo.entity.FormalSettlementDetailFee; import org.springblade.transport.pojo.entity.FormalSettlementDetailFee;
import java.util.List; import java.util.List;
import org.springblade.transport.pojo.dto.FormalSettlementPaymentRequest; import org.springblade.transport.pojo.dto.FormalSettlementPaymentRequest;
import org.springblade.transport.pojo.dto.FormalSettlementBatchPaymentRequest;
/** /**
* 正式结算单服务 * 正式结算单服务
@@ -41,4 +42,5 @@ public interface IFormalSettlementService extends BaseService<FormalSettlement>
List<FormalSettlementDetailFee> detailFees(Long detailId); List<FormalSettlementDetailFee> detailFees(Long detailId);
void adjustDetail(PreSettlementDetailAdjustRequest request); void adjustDetail(PreSettlementDetailAdjustRequest request);
String applyPayment(FormalSettlementPaymentRequest request); String applyPayment(FormalSettlementPaymentRequest request);
List<String> applyPayments(FormalSettlementBatchPaymentRequest request);
} }
@@ -86,14 +86,12 @@ public class BillLedgerServiceImpl extends BaseServiceImpl<BillLedgerMapper, Bil
@Override @Override
public List<BillLedgerVO> availableOptions(String keyword, Long deptId, Long selectedId) { public List<BillLedgerVO> availableOptions(String keyword, Long deptId, Long selectedId) {
LocalDate today = LocalDate.now();
return list(Wrappers.<BillLedger>lambdaQuery() return list(Wrappers.<BillLedger>lambdaQuery()
.and(Func.isNotEmpty(keyword), wrapper -> wrapper.like(BillLedger::getBillNo, keyword) .and(Func.isNotEmpty(keyword), wrapper -> wrapper.like(BillLedger::getBillNo, keyword)
.or().like(BillLedger::getIssuerName, keyword) .or().like(BillLedger::getIssuerName, keyword)
.or().like(BillLedger::getReceiverName, keyword)) .or().like(BillLedger::getReceiverName, keyword))
.and(wrapper -> wrapper .and(wrapper -> wrapper
.gt(BillLedger::getAvailableBalance, BigDecimal.ZERO) .gt(BillLedger::getAvailableBalance, BigDecimal.ZERO)
.ge(BillLedger::getMaturityDate, today)
.or(selectedId != null, child -> child.eq(BillLedger::getId, selectedId))) .or(selectedId != null, child -> child.eq(BillLedger::getId, selectedId)))
.orderByAsc(BillLedger::getMaturityDate) .orderByAsc(BillLedger::getMaturityDate)
.orderByDesc(BillLedger::getCreateTime) .orderByDesc(BillLedger::getCreateTime)
@@ -255,9 +255,6 @@ public class BillPaymentServiceImpl extends BaseServiceImpl<BillPaymentMapper, B
} }
private void validateLedgerAmount(BillLedger ledger, BigDecimal usedAmount, Long deptId) { private void validateLedgerAmount(BillLedger ledger, BigDecimal usedAmount, Long deptId) {
if (ledger.getMaturityDate() != null && ledger.getMaturityDate().isBefore(LocalDate.now())) {
throw new ServiceException("所选汇票已到期");
}
if (usedAmount == null || usedAmount.compareTo(BigDecimal.ZERO) <= 0) { if (usedAmount == null || usedAmount.compareTo(BigDecimal.ZERO) <= 0) {
throw new ServiceException("本次使用必须大于0"); throw new ServiceException("本次使用必须大于0");
} }
@@ -35,6 +35,7 @@ import org.springblade.transport.mapper.ReceivablePayableCargoFeeMapper;
import org.springblade.transport.mapper.SettlementAdjustmentMapper; import org.springblade.transport.mapper.SettlementAdjustmentMapper;
import org.springblade.transport.pojo.dto.FormalSettlementSaveRequest; import org.springblade.transport.pojo.dto.FormalSettlementSaveRequest;
import org.springblade.transport.pojo.dto.FormalSettlementPaymentRequest; import org.springblade.transport.pojo.dto.FormalSettlementPaymentRequest;
import org.springblade.transport.pojo.dto.FormalSettlementBatchPaymentRequest;
import org.springblade.transport.pojo.dto.FormalSettlementStatusRequest; import org.springblade.transport.pojo.dto.FormalSettlementStatusRequest;
import org.springblade.transport.pojo.dto.PreSettlementDetailAdjustRequest; import org.springblade.transport.pojo.dto.PreSettlementDetailAdjustRequest;
import org.springblade.transport.pojo.entity.FormalSettlement; import org.springblade.transport.pojo.entity.FormalSettlement;
@@ -348,9 +349,40 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public String applyPayment(FormalSettlementPaymentRequest request) { public String applyPayment(FormalSettlementPaymentRequest request) {
FormalSettlement settlement = existing(request.getId()); FormalSettlement settlement = existing(request.getId());
return createPayment(settlement, request.getAppliedAmount(), request.getRemark());
}
@Override
@Transactional(rollbackFor = Exception.class)
public List<String> applyPayments(FormalSettlementBatchPaymentRequest request) {
if (request == null || request.getItems() == null || request.getItems().isEmpty()) {
throw new ServiceException("请至少选择一条正式结算单");
}
List<FormalSettlementBatchPaymentRequest.Item> items = request.getItems();
if (items.stream().anyMatch(item -> item == null || item.getId() == null)) {
throw new ServiceException("付款申请单据不能为空");
}
if (items.stream().map(FormalSettlementBatchPaymentRequest.Item::getId).distinct().count() != items.size()) {
throw new ServiceException("付款申请单据不能重复");
}
List<FormalSettlement> settlements = items.stream().map(item -> existing(item.getId())).toList();
Long contractId = settlements.get(0).getContractId();
if (items.size() > 1 && (contractId == null
|| settlements.stream().anyMatch(item -> !Objects.equals(contractId, item.getContractId())))) {
throw new ServiceException("批量付款申请必须选择同一合同的正式结算单");
}
List<String> paymentNos = new java.util.ArrayList<>();
for (int index = 0; index < settlements.size(); index++) {
FormalSettlementBatchPaymentRequest.Item item = items.get(index);
paymentNos.add(createPayment(settlements.get(index), item.getAppliedAmount(), request.getRemark()));
}
return paymentNos;
}
private String createPayment(FormalSettlement settlement, BigDecimal appliedAmount, String remark) {
if (!APPROVED.equals(settlement.getApprovalStatus())) throw new ServiceException("仅审批通过的正式结算单允许发起付款申请"); if (!APPROVED.equals(settlement.getApprovalStatus())) throw new ServiceException("仅审批通过的正式结算单允许发起付款申请");
if (!"payable".equals(settlement.getSettlementType())) throw new ServiceException("仅应付正式结算单允许发起付款申请"); if (!"payable".equals(settlement.getSettlementType())) throw new ServiceException("仅应付正式结算单允许发起付款申请");
BigDecimal amount = positive(request.getAppliedAmount(), "申请付款金额"); BigDecimal amount = positive(appliedAmount, "申请付款金额");
BigDecimal available = money(settlement.getSettlementAmount()).subtract(money(settlement.getAppliedPaymentAmount())); BigDecimal available = money(settlement.getSettlementAmount()).subtract(money(settlement.getAppliedPaymentAmount()));
if (amount.compareTo(available) > 0) throw new ServiceException("申请付款金额不能超过剩余可申请金额" + available); if (amount.compareTo(available) > 0) throw new ServiceException("申请付款金额不能超过剩余可申请金额" + available);
FormalSettlementPayment payment = new FormalSettlementPayment(); FormalSettlementPayment payment = new FormalSettlementPayment();
@@ -360,7 +392,7 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
payment.setAppliedAmount(amount); payment.setAppliedAmount(amount);
payment.setPaidAmount(BigDecimal.ZERO); payment.setPaidAmount(BigDecimal.ZERO);
payment.setBillStatus(REVIEWING); payment.setBillStatus(REVIEWING);
payment.setRemark(limit(request.getRemark(), 200)); payment.setRemark(limit(remark, 200));
paymentMapper.insert(payment); paymentMapper.insert(payment);
settlement.setAppliedPaymentAmount(money(settlement.getAppliedPaymentAmount()).add(amount)); settlement.setAppliedPaymentAmount(money(settlement.getAppliedPaymentAmount()).add(amount));
updateById(settlement); updateById(settlement);
@@ -392,7 +424,7 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
FormalSettlementDetailFee fee = existing.get(row.getId()); FormalSettlementDetailFee fee = existing.get(row.getId());
if (fee == null) throw new ServiceException("存在无效的货物费用行"); if (fee == null) throw new ServiceException("存在无效的货物费用行");
BigDecimal beforeAmount = money(fee.getSettlementAmountTax()); BigDecimal beforeAmount = money(fee.getSettlementAmountTax());
fee.setTransportQuantity(nonNegative(row.getTransportQuantity(), "运输总量")); fee.setTransportQuantity(money(nonNegative(row.getTransportQuantity(), "运输总量")));
fee.setMileage(nonNegative(row.getMileage(), "里程")); fee.setMileage(nonNegative(row.getMileage(), "里程"));
fee.setUnitPrice(nonNegative(row.getUnitPrice(), "运输单价")); fee.setUnitPrice(nonNegative(row.getUnitPrice(), "运输单价"));
fee.setFreightAmount(nonNegative(row.getFreightAmount(), "运费")); fee.setFreightAmount(nonNegative(row.getFreightAmount(), "运费"));
@@ -727,7 +759,7 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
detail.setFormalSettlementId(settlement.getId()); detail.setSourceDetailId(source.getId()); detail.setLineNo(lineNo++); detail.setFormalSettlementId(settlement.getId()); detail.setSourceDetailId(source.getId()); detail.setLineNo(lineNo++);
detail.setDocumentNo(source.getDocumentNo()); detail.setWaybillId(source.getWaybillId()); detail.setWaybillNo(source.getWaybillNo()); detail.setDocumentNo(source.getDocumentNo()); detail.setWaybillId(source.getWaybillId()); detail.setWaybillNo(source.getWaybillNo());
detail.setVehicleNo(source.getVehicleNo()); detail.setTransportType(source.getTransportType()); detail.setCargoName(source.getCargoName()); detail.setVehicleNo(source.getVehicleNo()); detail.setTransportType(source.getTransportType()); detail.setCargoName(source.getCargoName());
detail.setCargoType(source.getCargoType()); detail.setTransportQuantity(source.getTransportQuantity()); detail.setQuantityUnit(source.getQuantityUnit()); detail.setCargoType(source.getCargoType()); detail.setTransportQuantity(money(source.getTransportQuantity())); detail.setQuantityUnit(source.getQuantityUnit());
detail.setMileage(source.getMileage()); detail.setBatchNo(source.getBatchNo()); detail.setUnitPrice(source.getUnitPrice()); detail.setMileage(source.getMileage()); detail.setBatchNo(source.getBatchNo()); detail.setUnitPrice(source.getUnitPrice());
detail.setFreightAmount(money(source.getFreightAmount())); detail.setFeeItemsJson(source.getFeeItemsJson()); detail.setFreightAmount(money(source.getFreightAmount())); detail.setFeeItemsJson(source.getFeeItemsJson());
detail.setOriginalAmount(money(source.getTotalAmount())); detail.setAdjustAmount(BigDecimal.ZERO); detail.setOriginalAmount(money(source.getTotalAmount())); detail.setAdjustAmount(BigDecimal.ZERO);
@@ -757,6 +789,7 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
.eq(PreSettlementDetailFee::getPreSettlementDetailId, source.getId()).orderByAsc(PreSettlementDetailFee::getLineNo)); .eq(PreSettlementDetailFee::getPreSettlementDetailId, source.getId()).orderByAsc(PreSettlementDetailFee::getLineNo));
for (PreSettlementDetailFee item : fees) { for (PreSettlementDetailFee item : fees) {
FormalSettlementDetailFee fee = Objects.requireNonNull(BeanUtil.copyProperties(item, FormalSettlementDetailFee.class)); FormalSettlementDetailFee fee = Objects.requireNonNull(BeanUtil.copyProperties(item, FormalSettlementDetailFee.class));
fee.setTransportQuantity(money(fee.getTransportQuantity()));
fee.setId(null); fee.setFormalSettlementDetailId(target.getId()); fee.setSourceFeeId(item.getId()); detailFeeMapper.insert(fee); fee.setId(null); fee.setFormalSettlementDetailId(target.getId()); fee.setSourceFeeId(item.getId()); detailFeeMapper.insert(fee);
} }
if (fees.isEmpty()) createSingleFee(target); if (fees.isEmpty()) createSingleFee(target);
@@ -767,6 +800,7 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
.eq(ReceivablePayableCargoFee::getDetailId, source.getId()).orderByAsc(ReceivablePayableCargoFee::getLineNo)); .eq(ReceivablePayableCargoFee::getDetailId, source.getId()).orderByAsc(ReceivablePayableCargoFee::getLineNo));
for (ReceivablePayableCargoFee item : fees) { for (ReceivablePayableCargoFee item : fees) {
FormalSettlementDetailFee fee = Objects.requireNonNull(BeanUtil.copyProperties(item, FormalSettlementDetailFee.class)); FormalSettlementDetailFee fee = Objects.requireNonNull(BeanUtil.copyProperties(item, FormalSettlementDetailFee.class));
fee.setTransportQuantity(money(fee.getTransportQuantity()));
fee.setId(null); fee.setFormalSettlementDetailId(target.getId()); fee.setSourceFeeId(item.getId()); fee.setId(null); fee.setFormalSettlementDetailId(target.getId()); fee.setSourceFeeId(item.getId());
fee.setSettlementAmountTax(item.getAfterAmount() == null ? money(item.getOriginalAmount()) : item.getAfterAmount()); fee.setSettlementAmountTax(item.getAfterAmount() == null ? money(item.getOriginalAmount()) : item.getAfterAmount());
fee.setSettlementAmountNoTax(null); detailFeeMapper.insert(fee); fee.setSettlementAmountNoTax(null); detailFeeMapper.insert(fee);
@@ -581,10 +581,10 @@ public class PreSettlementServiceImpl extends BaseServiceImpl<PreSettlementMappe
fee.setFreightAmount(nonNegative(requestRow.getFreightAmount(), "运费")); fee.setFreightAmount(nonNegative(requestRow.getFreightAmount(), "运费"));
fee.setFeeItemsJson(JsonUtil.toJson(normalizeFeeItems(requestRow.getFeeItems()))); fee.setFeeItemsJson(JsonUtil.toJson(normalizeFeeItems(requestRow.getFeeItems())));
BigDecimal afterAmount = requestRow.getSettlementAmountTax() == null BigDecimal afterAmount = requestRow.getSettlementAmountTax() == null
? calculateFeeAmount(fee) : nonNegative(requestRow.getSettlementAmountTax(), "结算金额(含税)"); ? calculateFeeAmount(fee) : money(requestRow.getSettlementAmountTax());
fee.setSettlementAmountTax(afterAmount); fee.setSettlementAmountTax(afterAmount);
fee.setSettlementAmountNoTax(requestRow.getSettlementAmountNoTax() == null ? null fee.setSettlementAmountNoTax(requestRow.getSettlementAmountNoTax() == null ? null
: nonNegative(requestRow.getSettlementAmountNoTax(), "结算金额(不含税)")); : money(requestRow.getSettlementAmountNoTax()));
fee.setAdjustAmount(afterAmount.subtract(money(fee.getOriginalAmount()))); fee.setAdjustAmount(afterAmount.subtract(money(fee.getOriginalAmount())));
fee.setRemark(limitRemark(requestRow.getRemark(), 200)); fee.setRemark(limitRemark(requestRow.getRemark(), 200));
detailFeeMapper.updateById(fee); detailFeeMapper.updateById(fee);
@@ -858,16 +858,28 @@ public class PreSettlementServiceImpl extends BaseServiceImpl<PreSettlementMappe
for (PreSettlementDetailFee feeRow : feeRows) { for (PreSettlementDetailFee feeRow : feeRows) {
Map<String, BigDecimal> feeItems = parseFeeItems(feeRow.getFeeItemsJson()); Map<String, BigDecimal> feeItems = parseFeeItems(feeRow.getFeeItemsJson());
boolean containsFreight = feeItems.keySet().stream().anyMatch(this::isFreightFeeItem); boolean containsFreight = feeItems.keySet().stream().anyMatch(this::isFreightFeeItem);
BigDecimal componentAmount = feeItems.values().stream().map(this::money)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (!containsFreight) { if (!containsFreight) {
BigDecimal freightAmount = money(feeRow.getFreightAmount());
aggregates.merge( aggregates.merge(
summaryKey(feeTypeMap.getOrDefault("运输费", ""), "运输费"), summaryKey(feeTypeMap.getOrDefault("运输费", ""), "运输费"),
money(feeRow.getFreightAmount()), freightAmount,
BigDecimal::add); BigDecimal::add);
componentAmount = componentAmount.add(freightAmount);
} }
feeItems.forEach((feeItem, amount) -> aggregates.merge( feeItems.forEach((feeItem, amount) -> aggregates.merge(
summaryKey(feeTypeMap.getOrDefault(feeItem, summaryKey(feeTypeMap.getOrDefault(feeItem,
""), feeItem), ""), feeItem),
money(amount), BigDecimal::add)); money(amount), BigDecimal::add));
BigDecimal residualAmount = money(money(feeRow.getSettlementAmountTax())
.subtract(componentAmount));
if (residualAmount.signum() != 0) {
aggregates.merge(
summaryKey(feeTypeMap.getOrDefault("其他费用", ""), "其他费用"),
residualAmount,
BigDecimal::add);
}
} }
summaryFeeMapper.delete(Wrappers.<PreSettlementSummaryFee>lambdaQuery() summaryFeeMapper.delete(Wrappers.<PreSettlementSummaryFee>lambdaQuery()
.eq(PreSettlementSummaryFee::getPreSettlementId, settlementId) .eq(PreSettlementSummaryFee::getPreSettlementId, settlementId)
@@ -885,9 +897,6 @@ public class PreSettlementServiceImpl extends BaseServiceImpl<PreSettlementMappe
row.setAdjustAmount(preserveAdjustments && old != null ? money(old.getAdjustAmount()) row.setAdjustAmount(preserveAdjustments && old != null ? money(old.getAdjustAmount())
: BigDecimal.ZERO.setScale(2)); : BigDecimal.ZERO.setScale(2));
row.setSettlementAmount(row.getOriginalAmount().add(row.getAdjustAmount())); row.setSettlementAmount(row.getOriginalAmount().add(row.getAdjustAmount()));
if (row.getSettlementAmount().compareTo(BigDecimal.ZERO) < 0) {
throw new ServiceException("结算合计金额不能小于0");
}
row.setRemark(old == null ? "" : old.getRemark()); row.setRemark(old == null ? "" : old.getRemark());
row.setManualFlag(0); row.setManualFlag(0);
summaryFeeMapper.insert(row); summaryFeeMapper.insert(row);
@@ -940,9 +949,6 @@ public class PreSettlementServiceImpl extends BaseServiceImpl<PreSettlementMappe
row.setFeeItem(feeItem); row.setFeeItem(feeItem);
row.setOriginalAmount(BigDecimal.ZERO.setScale(2)); row.setOriginalAmount(BigDecimal.ZERO.setScale(2));
row.setAdjustAmount(money(requestRow.getAdjustAmount())); row.setAdjustAmount(money(requestRow.getAdjustAmount()));
if (row.getAdjustAmount().compareTo(BigDecimal.ZERO) < 0) {
throw new ServiceException("手工新增费用金额不能小于0");
}
row.setSettlementAmount(row.getAdjustAmount()); row.setSettlementAmount(row.getAdjustAmount());
row.setRemark(limitRemark(requestRow.getRemark(), 50)); row.setRemark(limitRemark(requestRow.getRemark(), 50));
row.setManualFlag(1); row.setManualFlag(1);
@@ -976,9 +982,6 @@ public class PreSettlementServiceImpl extends BaseServiceImpl<PreSettlementMappe
BigDecimal before = money(row.getAdjustAmount()); BigDecimal before = money(row.getAdjustAmount());
row.setAdjustAmount(money(requestRow.getAdjustAmount())); row.setAdjustAmount(money(requestRow.getAdjustAmount()));
row.setSettlementAmount(money(row.getOriginalAmount()).add(row.getAdjustAmount())); row.setSettlementAmount(money(row.getOriginalAmount()).add(row.getAdjustAmount()));
if (row.getSettlementAmount().compareTo(BigDecimal.ZERO) < 0) {
throw new ServiceException("结算金额不能小于0");
}
row.setRemark(limitRemark(requestRow.getRemark(), 50)); row.setRemark(limitRemark(requestRow.getRemark(), 50));
if (row.getId() == null) summaryFeeMapper.insert(row); else summaryFeeMapper.updateById(row); if (row.getId() == null) summaryFeeMapper.insert(row); else summaryFeeMapper.updateById(row);
retainedGeneratedIds.add(row.getId()); retainedGeneratedIds.add(row.getId());
@@ -1048,8 +1051,8 @@ public class PreSettlementServiceImpl extends BaseServiceImpl<PreSettlementMappe
if (listDetails(settlement.getId()).isEmpty()) { if (listDetails(settlement.getId()).isEmpty()) {
throw new ServiceException("请至少选择一条结算明细"); throw new ServiceException("请至少选择一条结算明细");
} }
if (money(settlement.getSettlementAmount()).compareTo(BigDecimal.ZERO) <= 0) { if (money(settlement.getSettlementAmount()).compareTo(BigDecimal.ZERO) == 0) {
throw new ServiceException("结算金额必须大于0"); throw new ServiceException("结算金额不能为0");
} }
if (!LOCAL_CURRENCY.equalsIgnoreCase(settlement.getCurrency())) { if (!LOCAL_CURRENCY.equalsIgnoreCase(settlement.getCurrency())) {
if (settlement.getExchangeRateDate() == null) { if (settlement.getExchangeRateDate() == null) {