单价列表重复修改

This commit is contained in:
秦鸿展
2026-05-13 16:21:09 +08:00
parent 0514d223bb
commit 80d93f2d7b
@@ -288,39 +288,23 @@ public class ContractManageApplicationService {
.eq(ContractManageDetail::getContractManageId, contractManageId)
.eq(ContractManageDetail::getDelFlag, 1));
if (contractManageDetails != null && contractManageDetails.size() > 0) {
Set<String> expandedStrategyKeysThisSubject = new HashSet<>();
for (ContractManageDetail contractManageDetail : contractManageDetails) {
String lineSubjectCode = resolveSubjectCodeLine(contractManageDetail);
if (StringUtils.isEmpty(sunjectCode) || !sunjectCode.equals(lineSubjectCode)) {
continue;
}
Long accountingStrategyId = contractManageDetail.getAccountingStrategyId();
if (accountingStrategyId == null) {
continue;
}
BillingRulesPO billingRule = contractManageDetailMapper.getBillingRules(accountingStrategyId);
if (billingRule == null || billingRule.getBillingRulesId() == null) {
continue;
}
Long billingRulesId = billingRule.getBillingRulesId();
String strategyDedupeKey = billingStrategyDedupeKey(billingRulesId, contractManageDetail.getAccountingStrategyCode());
if (!expandedStrategyKeysThisSubject.add(strategyDedupeKey)) {
continue;
}
List<BillingParamsPO> billingParams = contractManageDetailMapper.getBillingParams(billingRulesId);
if (billingParams != null && billingParams.size() > 0) {
BillingParamsPO billingParam = billingParams.get(0);
String billingParamsJson = billingParam.getBillingParamsJson();
String preSetRules = billingParam.getPreSetRules();
Long billingParamsId = billingParam.getBillingParamsId();
List<Map<String, Object>> preSetRulesList = JSON.parseObject(preSetRules, new TypeReference<List<Map<String, Object>>>() {});
List<Map<String, Object>> billingParamsList = JSON.parseObject(billingParamsJson, new TypeReference<List<Map<String, Object>>>() {});
if (preSetRulesList == null || preSetRulesList.size() == 0 || billingParamsList == null) {
continue;
}
Map<String, Object> stringObjectMap1 = preSetRulesList.get(0);
Set<String> addedFeeSlotsForLine = new HashSet<>();
for (Map<String, Object> stringObjectMap : billingParamsList) {
String code = contractManageDetail.getFirstSubjectCode();
if (sunjectCode.equals(code)) {
Long accountingStrategyId = contractManageDetail.getAccountingStrategyId();
BillingRulesPO billingRule = contractManageDetailMapper.getBillingRules(accountingStrategyId);
if (billingRule != null) {
Long billingRulesId = billingRule.getBillingRulesId();
List<BillingParamsPO> billingParams = contractManageDetailMapper.getBillingParams(billingRulesId);
if (billingParams != null && billingParams.size() > 0) {
BillingParamsPO billingParam = billingParams.get(0);
String billingParamsJson = billingParam.getBillingParamsJson();
String preSetRules = billingParam.getPreSetRules();
Long billingParamsId = billingParam.getBillingParamsId();
List<Map<String, Object>> preSetRulesList = JSON.parseObject(preSetRules, new TypeReference<List<Map<String, Object>>>() {});
List<Map<String, Object>> billingParamsList = JSON.parseObject(billingParamsJson, new TypeReference<List<Map<String, Object>>>() {});
Map<String, Object> stringObjectMap1 = preSetRulesList.get(0);
for (Map<String, Object> stringObjectMap : billingParamsList) {
String fieldsName = (String) stringObjectMap.get("fieldsName");
String isShow = (String) stringObjectMap.get("isShow");
String isFee = (String) stringObjectMap.get("isFee");
@@ -329,15 +313,7 @@ public class ContractManageApplicationService {
Integer sort = (Integer) stringObjectMap.get("sort");
String chargingId = (String) stringObjectMap.get("chargingId");
String fields = (String) stringObjectMap.get("fields");
String feeSlotKey = billingRulesId + "|" + Objects.toString(sort, "") + "|" + Objects.toString(chargingId, "");
if (!addedFeeSlotsForLine.add(feeSlotKey)) {
continue;
}
Object rawPrice = stringObjectMap1.get("fields" + sort);
if (rawPrice == null) {
continue;
}
String price = String.valueOf(rawPrice);
String price = (String) stringObjectMap1.get("fields" + sort);
SubjectAndPriceReturn subjectAndPriceReturn = new SubjectAndPriceReturn();
subjectAndPriceReturn.setName(fieldsName);
subjectAndPriceReturn.setPrice(new BigDecimal(price));
@@ -350,6 +326,8 @@ public class ContractManageApplicationService {
subjectAndPriceReturn.setRulesId(billingParamsId);
result.add(subjectAndPriceReturn);
}
}
}
}
}
}
@@ -447,46 +425,12 @@ public class ContractManageApplicationService {
.anyMatch(code -> code.equalsIgnoreCase(documentTypeCode));
}
/**
* 与 {@link #resolveContractDetailExpenseSubjectCode} 一致:有二级编码则按二级匹配科目,否则按一级。
*/
private static String resolveSubjectCodeLine(ContractManageDetail detail) {
if (detail == null) {
return null;
}
return resolveExpenseSubjectCodeFromFirstSecond(detail.getSecondSubjectCode(), detail.getFirstSubjectCode());
}
private static String resolveExpenseSubjectCodeFromFirstSecond(String secondSubjectCode, String firstSubjectCode) {
if (!StringUtils.isEmpty(secondSubjectCode)) {
return secondSubjectCode.trim();
}
if (!StringUtils.isEmpty(firstSubjectCode)) {
return firstSubjectCode.trim();
}
return null;
}
/**
* 合同多行勾选「同一套」计费策略时,库中可能仍为不同的 accounting_strategy_id / billing_rules_id
* 优先用结算行上的 {@code accounting_strategy_code} 去重展开,避免出现「几条科目 × 每条后面重复多套同一策略单价」的全局列表。
*/
private static String billingStrategyDedupeKey(Long billingRulesId, String accountingStrategyCode) {
if (!StringUtils.isEmpty(accountingStrategyCode)) {
return "code:" + accountingStrategyCode.trim();
}
if (billingRulesId != null) {
return "ruleId:" + billingRulesId;
}
return null;
}
/**
* 按单据类型取合同结算行上的计费单价(计费策略展开的 isFee 项)。
* <p>多条结算明细指向「界面上的同一计费策略」时,库表中可能仍为不同的 {@code billing_rules_id}
* 仅以规则 id 去重会重复展开多次;因此对结算明细上非空的 {@link ContractManageDetailPO#getAccountingStrategyCode()}
* 优先做业务级去重(编码相同只展开一份),编码为空时再退回 {@code billing_rules_id}。</p>
* <p>同一策略参数 JSON 内重复的 isFee 槽位仍以 {@code billingRulesId|sort|chargingId} 去重。</p>
* <p>多条结算明细共用同一计费策略(与 {@link #getSubjectAndPrice} 一致:按计费策略 id 先解析 {@link BillingRulesPO}
* 再以 {@code billing_rules_id} 取计费参数)时只展开一次,避免前端重复单价列。</p>
* <p>同一策略的参数 JSON 中若存在重复的 isFee 槽位(相同 sort/chargingId),或历史数据多套规则 id 实际等价,
* 返回列表会再做一次槽位级去重,避免出现两条「进出仓操作费单价」等同名列。</p>
*/
public List<SubjectAndPriceReturn> getPrice(String documentTypeCode, String settlementCustomersCode,Long organizationId,Long topOrganizationId) {
List<SubjectAndPriceReturn> result = new ArrayList<>();
@@ -500,8 +444,7 @@ public class ContractManageApplicationService {
.filter(item -> contractDetailContainsDocumentType(item.getDocumentTypeCode(), documentTypeCode))
.collect(Collectors.toList());
if (contractManageDetailPOs != null && contractManageDetailPOs.size() > 0) {
/* 多行同一计费策略编码时只展开一次;无编码时再按计费规则 id 去重 */
Set<String> expandedStrategyKeys = new HashSet<>();
Set<Long> expandedBillingRulesIds = new HashSet<>();
/* 计费规则 + 公式槽位,避免参数 JSON 或多次展开重复同一单价列 */
Set<String> addedFeeSlots = new HashSet<>();
for (ContractManageDetailPO contractManageDetailPO : contractManageDetailPOs) {
@@ -514,8 +457,7 @@ public class ContractManageApplicationService {
continue;
}
Long billingRulesId = billingRulesPO.getBillingRulesId();
String strategyDedupeKey = billingStrategyDedupeKey(billingRulesId, contractManageDetailPO.getAccountingStrategyCode());
if (!expandedStrategyKeys.add(strategyDedupeKey)) {
if (!expandedBillingRulesIds.add(billingRulesId)) {
continue;
}
List<BillingParamsPO> billingParams = contractManageDetailMapper.getBillingParams(billingRulesId);
@@ -598,55 +540,40 @@ public class ContractManageApplicationService {
.eq(ContractManageDetail::getContractManageId, contractManageId)
.eq(ContractManageDetail::getDelFlag, 1));
if (contractManageDetails != null && contractManageDetails.size() > 0) {
Set<String> expandedStrategyKeysThisSubject = new HashSet<>();
Set<String> addedFieldSlots = new HashSet<>();
for (ContractManageDetail contractManageDetail : contractManageDetails) {
String lineSubjectCode = resolveSubjectCodeLine(contractManageDetail);
if (StringUtils.isEmpty(sunjectCode) || !sunjectCode.equals(lineSubjectCode)) {
continue;
}
Long accountingStrategyId = contractManageDetail.getAccountingStrategyId();
if (accountingStrategyId == null) {
continue;
}
BillingRulesPO billingRule = contractManageDetailMapper.getBillingRules(accountingStrategyId);
if (billingRule == null || billingRule.getBillingRulesId() == null) {
continue;
}
Long billingRulesId = billingRule.getBillingRulesId();
String strategyDedupeKey = billingStrategyDedupeKey(billingRulesId, contractManageDetail.getAccountingStrategyCode());
if (!expandedStrategyKeysThisSubject.add(strategyDedupeKey)) {
continue;
}
List<BillingParamsPO> billingParams = contractManageDetailMapper.getBillingParams(billingRulesId);
if (billingParams != null && billingParams.size() > 0) {
BillingParamsPO billingParam = billingParams.get(0);
String billingParamsJson = billingParam.getBillingParamsJson();
Long billingParamsId = billingParam.getBillingParamsId();
List<Map<String, Object>> billingParamsList = JSON.parseObject(billingParamsJson, new TypeReference<List<Map<String, Object>>>() {});
for (Map<String, Object> stringObjectMap : billingParamsList) {
String fieldsName = (String) stringObjectMap.get("fieldsName");
String isShow = (String) stringObjectMap.get("isShow");
String isFee = (String) stringObjectMap.get("isFee");
String isPush = (String) stringObjectMap.get("isPush");
if ("1".equals(isShow)) {
Integer sort = (Integer) stringObjectMap.get("sort");
String chargingId = (String) stringObjectMap.get("chargingId");
String fields = (String) stringObjectMap.get("fields");
String slotKey = billingRulesId + "|" + Objects.toString(sort, "") + "|" + Objects.toString(chargingId, "");
if (!addedFieldSlots.add(slotKey)) {
continue;
String code = contractManageDetail.getFirstSubjectCode();
if (sunjectCode.equals(code)) {
Long accountingStrategyId = contractManageDetail.getAccountingStrategyId();
BillingRulesPO billingRule = contractManageDetailMapper.getBillingRules(accountingStrategyId);
if (billingRule != null) {
Long billingRulesId = billingRule.getBillingRulesId();
List<BillingParamsPO> billingParams = contractManageDetailMapper.getBillingParams(billingRulesId);
if (billingParams != null && billingParams.size() > 0) {
BillingParamsPO billingParam = billingParams.get(0);
String billingParamsJson = billingParam.getBillingParamsJson();
String preSetRules = billingParam.getPreSetRules();
Long billingParamsId = billingParam.getBillingParamsId();
List<Map<String, Object>> billingParamsList = JSON.parseObject(billingParamsJson, new TypeReference<List<Map<String, Object>>>() {});
for (Map<String, Object> stringObjectMap : billingParamsList) {
String fieldsName = (String) stringObjectMap.get("fieldsName");
String isShow = (String) stringObjectMap.get("isShow");
String isFee = (String) stringObjectMap.get("isFee");
String isPush = (String) stringObjectMap.get("isPush");
if ("1".equals(isShow)) {
String chargingId = (String) stringObjectMap.get("chargingId");
String fields = (String) stringObjectMap.get("fields");
SubjectAndPriceReturn subjectAndPriceReturn = new SubjectAndPriceReturn();
subjectAndPriceReturn.setName(fieldsName);
subjectAndPriceReturn.setChargingId(chargingId);
subjectAndPriceReturn.setFields(fields);
subjectAndPriceReturn.setBillingRulesId(billingRulesId);
subjectAndPriceReturn.setIsShow(isShow);
subjectAndPriceReturn.setIsFee(isFee);
subjectAndPriceReturn.setIsPush(isPush);
subjectAndPriceReturn.setRulesId(billingParamsId);
result.add(subjectAndPriceReturn);
}
}
SubjectAndPriceReturn subjectAndPriceReturn = new SubjectAndPriceReturn();
subjectAndPriceReturn.setName(fieldsName);
subjectAndPriceReturn.setChargingId(chargingId);
subjectAndPriceReturn.setFields(fields);
subjectAndPriceReturn.setBillingRulesId(billingRulesId);
subjectAndPriceReturn.setIsShow(isShow);
subjectAndPriceReturn.setIsFee(isFee);
subjectAndPriceReturn.setIsPush(isPush);
subjectAndPriceReturn.setRulesId(billingParamsId);
result.add(subjectAndPriceReturn);
}
}
}