fix bug
This commit is contained in:
+41
@@ -46,6 +46,7 @@ import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -224,6 +225,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
|
||||
BeanUtil.copyProperties(source, candidate);
|
||||
candidate.setPartyB(TransportBusinessSupport.trimToNull(request.getPartyB()));
|
||||
validateContractPartyCombinationUnique(candidate);
|
||||
validateBillingPlans(request.getBillingPlanJson());
|
||||
validatePaymentRatios(request.getPaymentRatioJson());
|
||||
source.setContractName(request.getContractName()); source.setPartyB(request.getPartyB());
|
||||
source.setStartDate(request.getStartDate()); source.setEndDate(request.getEndDate()); source.setContractFormat(request.getContractFormat());
|
||||
@@ -464,9 +466,48 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
|
||||
TransportBusinessSupport.validateRequired(contractManage.getContractCategory(), "请选择合同类别");
|
||||
validateContractNameUnique(contractManage);
|
||||
TransportBusinessSupport.validateLength(contractManage.getRemark(), 2000, "备注不能超过2000字");
|
||||
validateBillingPlans(contractManage.getBillingPlanJson());
|
||||
validatePaymentRatios(contractManage.getPaymentRatioJson());
|
||||
}
|
||||
|
||||
private void validateBillingPlans(String billingPlanJson) {
|
||||
if (Func.isEmpty(billingPlanJson)) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
Object parsed = JsonUtil.parse(billingPlanJson, List.class);
|
||||
if (!(parsed instanceof List<?> plans)) {
|
||||
throw new ServiceException("计费方案设置格式不正确");
|
||||
}
|
||||
Map<String, Integer> defaultPlanCount = new HashMap<>();
|
||||
for (Object value : plans) {
|
||||
if (!(value instanceof Map<?, ?> plan)) {
|
||||
throw new ServiceException("计费方案设置格式不正确");
|
||||
}
|
||||
String transportMode = trimValue(plan.get("transportMode"));
|
||||
if (isDefaultBillingPlan(plan)) {
|
||||
int count = defaultPlanCount.merge(transportMode, 1, Integer::sum);
|
||||
if (count > 1) {
|
||||
throw new ServiceException("同一运输方式仅支持配置一个默认计费方案");
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (ServiceException exception) {
|
||||
throw exception;
|
||||
} catch (Exception exception) {
|
||||
throw new ServiceException("计费方案设置格式不正确");
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isDefaultBillingPlan(Map<?, ?> plan) {
|
||||
Object value = plan.get("defaultPlan");
|
||||
return Boolean.TRUE.equals(value) || "true".equalsIgnoreCase(String.valueOf(value)) || "1".equals(String.valueOf(value));
|
||||
}
|
||||
|
||||
private String trimValue(Object value) {
|
||||
return value == null ? null : TransportBusinessSupport.trimToNull(String.valueOf(value));
|
||||
}
|
||||
|
||||
private void validatePaymentRatios(String paymentRatioJson) {
|
||||
if (Func.isEmpty(paymentRatioJson)) return;
|
||||
try {
|
||||
|
||||
+6
-2
@@ -173,8 +173,8 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl<CustomerArchiveM
|
||||
if (created && result) {
|
||||
grantNewCustomerToIncludedUsers(entity);
|
||||
}
|
||||
if (result) {
|
||||
addChangeRecord(entity.getId(), created ? "新增客商档案" : "修改客商档案", before, entity, beforeDetail, customer);
|
||||
if (result && !created) {
|
||||
addChangeRecord(entity.getId(), "修改客商档案", before, entity, beforeDetail, customer);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -297,6 +297,8 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl<CustomerArchiveM
|
||||
customer.setBusinessScope(trimToNull(customer.getBusinessScope()));
|
||||
customer.setInvoiceTaxRate(normalizeSentinelAmount(customer.getInvoiceTaxRate()));
|
||||
customer.setRegisteredCapital(normalizeSentinelAmount(customer.getRegisteredCapital()));
|
||||
customer.setMaxCreditLimit(normalizeSentinelAmount(customer.getMaxCreditLimit()));
|
||||
customer.setApplyCreditLimit(normalizeSentinelAmount(customer.getApplyCreditLimit()));
|
||||
customer.setRegisteredRegionName(trimToNull(customer.getRegisteredRegionName()));
|
||||
customer.setRegisteredDetailAddress(trimToNull(customer.getRegisteredDetailAddress()));
|
||||
customer.setRegisteredAddress(buildRegisteredAddress(customer));
|
||||
@@ -486,6 +488,8 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl<CustomerArchiveM
|
||||
continue;
|
||||
}
|
||||
Long scoreId = IdWorker.getId();
|
||||
scoreVO.setMaxCreditLimit(normalizeSentinelAmount(scoreVO.getMaxCreditLimit()));
|
||||
scoreVO.setApplyCreditLimit(normalizeSentinelAmount(scoreVO.getApplyCreditLimit()));
|
||||
scoreVO.setTempApplyCreditLimit(normalizeOptionalScoreAmount(scoreVO.getTempApplyCreditLimit()));
|
||||
scoreVO.setProofAttachments(normalizeScoreProofAttachments(scoreVO));
|
||||
CustomerCreditScore score = Objects.requireNonNull(BeanUtil.copyProperties(scoreVO, CustomerCreditScore.class));
|
||||
|
||||
+4
@@ -202,6 +202,10 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
|
||||
PreSettlement first = sources.isEmpty() ? null : sources.get(0);
|
||||
ContractManage contract = contractManageService.getById(contractId);
|
||||
if (contract == null || Objects.equals(contract.getIsDeleted(), 1)) throw new ServiceException("合同不存在");
|
||||
if (!List.of("approved", "change_approved").contains(contract.getApprovalStatus())
|
||||
|| "terminated".equals(contract.getContractStage())) {
|
||||
throw new ServiceException("合同未审核完成,不可转正式结算单");
|
||||
}
|
||||
if (settlement.getId() == null) {
|
||||
settlement.setFormalSettlementNo(nextNo());
|
||||
settlement.setApprovalStatus(DRAFT);
|
||||
|
||||
+39
-4
@@ -431,6 +431,7 @@ public class ReceivablePayableDetailServiceImpl
|
||||
throw new ServiceException("存在无效的费用明细");
|
||||
}
|
||||
validateTransferDetails(details);
|
||||
validateSettlementContract(details.get(0).getContractId());
|
||||
List<Long> detailIds = details.stream().map(ReceivablePayableDetail::getId).toList();
|
||||
ReceivablePayableDetail first = details.get(0);
|
||||
if ("pre".equals(request.getSettlementBillType())) {
|
||||
@@ -475,7 +476,12 @@ public class ReceivablePayableDetailServiceImpl
|
||||
query.setSettlementType(Func.isEmpty(settlementType) ? null : settlementType(settlementType));
|
||||
query.setGenerateStartDate(parseDate(generateStartDate));
|
||||
query.setGenerateEndDate(parseDate(generateEndDate));
|
||||
List<Long> availableContractIds = settlementContractIds();
|
||||
if (availableContractIds.isEmpty()) {
|
||||
return new Page<>(page.getCurrent(), page.getSize(), 0);
|
||||
}
|
||||
LambdaQueryWrapper<ReceivablePayableDetail> wrapper = buildQuery(query)
|
||||
.in(ReceivablePayableDetail::getContractId, availableContractIds)
|
||||
.and(item -> item.isNull(ReceivablePayableDetail::getPreSettlementNo)
|
||||
.or().eq(ReceivablePayableDetail::getPreSettlementNo, ""))
|
||||
.and(item -> item.isNull(ReceivablePayableDetail::getFormalSettlementNo)
|
||||
@@ -488,6 +494,24 @@ public class ReceivablePayableDetailServiceImpl
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<Long> settlementContractIds() {
|
||||
return contractManageService.list(Wrappers.<ContractManage>lambdaQuery()
|
||||
.select(ContractManage::getId)
|
||||
.eq(ContractManage::getIsDeleted, 0)
|
||||
.in(ContractManage::getApprovalStatus, "approved", "change_approved")
|
||||
.ne(ContractManage::getContractStage, "terminated"))
|
||||
.stream().map(ContractManage::getId).toList();
|
||||
}
|
||||
|
||||
private void validateSettlementContract(Long contractId) {
|
||||
ContractManage contract = contractId == null ? null : contractManageService.getById(contractId);
|
||||
if (contract == null || Objects.equals(contract.getIsDeleted(), 1)
|
||||
|| !List.of("approved", "change_approved").contains(contract.getApprovalStatus())
|
||||
|| "terminated".equals(contract.getContractStage())) {
|
||||
throw new ServiceException("合同未审核完成,不可转预结算单或正式结算单");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<Map<String, Object>> generateWaybills(IPage<?> page, ReceivablePayableGenerateRequest request) {
|
||||
validateGenerateRequest(request, false);
|
||||
@@ -640,7 +664,6 @@ public class ReceivablePayableDetailServiceImpl
|
||||
.eq(ContractManage::getPartyA, customerContract.getPartyA())
|
||||
.eq(ContractManage::getPartyB, waybill.getCarrierName())
|
||||
.eq(ContractManage::getContractCategory, "承运商合同")
|
||||
.in(ContractManage::getApprovalStatus, "approved", "change_approved")
|
||||
.and(wrapper -> wrapper.isNull(ContractManage::getContractStage)
|
||||
.or().ne(ContractManage::getContractStage, "terminated"))
|
||||
.orderByDesc(ContractManage::getCreateTime), false);
|
||||
@@ -767,7 +790,7 @@ public class ReceivablePayableDetailServiceImpl
|
||||
private String matchedPlanId(Waybill waybill, ContractManage contract) {
|
||||
List<Map<String, Object>> plans = parseList(contract.getBillingPlanJson());
|
||||
if (plans.isEmpty()) return null;
|
||||
Map<String, Object> plan = plans.stream().filter(this::isDefaultPlan).findFirst().orElse(null);
|
||||
Map<String, Object> plan = resolveDefaultBillingPlan(plans, waybill.getTransportType());
|
||||
if (plan == null) return null;
|
||||
if (!(plan.get("rules") instanceof List<?> rules)) return null;
|
||||
boolean matched = rules.stream().anyMatch(value -> value instanceof Map<?, ?> raw && matchesRule(raw, waybill));
|
||||
@@ -1149,7 +1172,9 @@ public class ReceivablePayableDetailServiceImpl
|
||||
|
||||
private List<ReceivablePayableCargoFee> calculatedFees(Waybill waybill, ContractManage contract, String planId, boolean matchOnly) {
|
||||
List<Map<String, Object>> plans = parseList(contract == null ? null : contract.getBillingPlanJson());
|
||||
Map<String, Object> plan = resolveBillingPlan(plans, planId);
|
||||
Map<String, Object> plan = "__matched__".equals(planId)
|
||||
? resolveDefaultBillingPlan(plans, waybill.getTransportType())
|
||||
: resolveBillingPlan(plans, planId);
|
||||
return calculatedFees(waybill, plan, matchOnly);
|
||||
}
|
||||
|
||||
@@ -1298,7 +1323,17 @@ public class ReceivablePayableDetailServiceImpl
|
||||
|
||||
private boolean isDefaultPlan(Map<String, Object> plan) {
|
||||
Object value = plan.get("defaultPlan");
|
||||
return Boolean.TRUE.equals(value) || "true".equalsIgnoreCase(String.valueOf(value));
|
||||
return Boolean.TRUE.equals(value) || "true".equalsIgnoreCase(String.valueOf(value)) || "1".equals(String.valueOf(value));
|
||||
}
|
||||
|
||||
private Map<String, Object> resolveDefaultBillingPlan(List<Map<String, Object>> plans, String transportType) {
|
||||
return plans.stream().filter(this::isDefaultPlan)
|
||||
.filter(plan -> !isBlank(plan.get("transportMode")))
|
||||
.filter(plan -> matchesCondition(plan.get("transportMode"), transportType))
|
||||
.findFirst()
|
||||
.orElseGet(() -> plans.stream().filter(this::isDefaultPlan)
|
||||
.filter(plan -> isBlank(plan.get("transportMode")))
|
||||
.findFirst().orElse(null));
|
||||
}
|
||||
|
||||
private BigDecimal calculateRule(Map<String, Object> rule, Waybill waybill) {
|
||||
|
||||
Reference in New Issue
Block a user