费用计算;
This commit is contained in:
@@ -104,7 +104,12 @@
|
|||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- JEP 动态计算 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>jep</groupId>
|
||||||
|
<artifactId>jep</artifactId>
|
||||||
|
<version>2.24</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- JPush推送 -->
|
<!-- JPush推送 -->
|
||||||
<!-- jpush极光推送导入start -->
|
<!-- jpush极光推送导入start -->
|
||||||
@@ -163,4 +168,4 @@
|
|||||||
</profile>
|
</profile>
|
||||||
</profiles>
|
</profiles>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
+57
-6
@@ -19,8 +19,7 @@ import com.mhd.basic.domain.contractManageDetail.repository.todo.ContractManageD
|
|||||||
import com.mhd.basic.domain.contractManageDetail.service.ContractManageDetailDomainService;
|
import com.mhd.basic.domain.contractManageDetail.service.ContractManageDetailDomainService;
|
||||||
import com.mhd.basic.domain.expenseAccount.repository.po.ExpenseAccountPO;
|
import com.mhd.basic.domain.expenseAccount.repository.po.ExpenseAccountPO;
|
||||||
import com.mhd.basic.domain.expenseAccount.service.ExpenseAccountDomainService;
|
import com.mhd.basic.domain.expenseAccount.service.ExpenseAccountDomainService;
|
||||||
import com.mhd.basic.interfaces.dto.contractManage.ContractManageDTO;
|
import com.mhd.basic.interfaces.dto.contractManage.*;
|
||||||
import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceDTO;
|
|
||||||
import com.mhd.basic.interfaces.dto.contractManageDetail.ContractManageDetailDTO;
|
import com.mhd.basic.interfaces.dto.contractManageDetail.ContractManageDetailDTO;
|
||||||
import com.mhd.common.core.domain.po.*;
|
import com.mhd.common.core.domain.po.*;
|
||||||
import com.mhd.common.core.enums.DictCode;
|
import com.mhd.common.core.enums.DictCode;
|
||||||
@@ -44,6 +43,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@@ -129,6 +129,54 @@ public class ContractManageApplicationService {
|
|||||||
return contractManageDomainService.queryList(contractManageDO);
|
return contractManageDomainService.queryList(contractManageDO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BigDecimal getAmount(List<SubjectAndPriceReturn> subjectAndPriceReturnList) {
|
||||||
|
if (subjectAndPriceReturnList == null || subjectAndPriceReturnList.size() == 1) {
|
||||||
|
SubjectAndPriceReturn subjectAndPriceReturn = subjectAndPriceReturnList.get(0);
|
||||||
|
Long billingRulesId = subjectAndPriceReturn.getBillingRulesId();
|
||||||
|
String name = subjectAndPriceReturn.getName();
|
||||||
|
BillingRulesPO billingRule = contractManageDetailMapper.getBillingRules(billingRulesId);
|
||||||
|
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();
|
||||||
|
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 (billingParamsList != null && billingParamsList.size() ==2) {
|
||||||
|
Map<String, Object> targetMap = billingParamsList.stream()
|
||||||
|
.filter(map -> name.equals(map.get("fieldsName"))) // 关键匹配条件
|
||||||
|
.findFirst() // 取第一个
|
||||||
|
.orElse(null); // 没找到返回null
|
||||||
|
String chargingId = (String) targetMap.get("chargingId");
|
||||||
|
Integer sort = (Integer) targetMap.get("sort");
|
||||||
|
Map<String, Object> reles = preSetRulesList.get(0);
|
||||||
|
String price = (String) reles.get("fields"+sort);
|
||||||
|
String billingFormula = billingRule.getBillingFormula();
|
||||||
|
billingFormula.replace(chargingId, price);
|
||||||
|
//需要判断阶梯类型进行获取各计费标志的取值,拼接公式
|
||||||
|
List<BillingParamsDetailDTO> billingParamsEntityList = JSON.parseArray(billingParamsJson, BillingParamsDetailDTO.class);
|
||||||
|
//将计费参数实体分成两组,即:固定参数和条件参数
|
||||||
|
List<BillingParamsDetailDTO> fixedParamsEntityList = billingParamsEntityList.stream().filter(item -> ObjectUtil.equal(item.getLadderType(),1)).collect(Collectors.toList());
|
||||||
|
List<BillingParamsDetailDTO> ladderParamsEntityList = billingParamsEntityList.stream().filter(item -> !ObjectUtil.equal(item.getLadderType(),1)).collect(Collectors.toList());
|
||||||
|
if (ladderParamsEntityList != null && ladderParamsEntityList.size() > 0) {
|
||||||
|
if (subjectAndPriceReturn.getNum() != null) {
|
||||||
|
for (BillingParamsDetailDTO ladderParamsEntity : ladderParamsEntityList) {
|
||||||
|
Integer sort1 = ladderParamsEntity.getSort();
|
||||||
|
billingFormula.replace("fields"+sort1, subjectAndPriceReturn.getNum().toEngineeringString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DynamicCalculationUtil.calculate(billingFormula);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public List<Map<String, Object>> getSubjectAndPrice(SubjectAndPriceDTO contractManageDTO) {
|
public List<Map<String, Object>> getSubjectAndPrice(SubjectAndPriceDTO contractManageDTO) {
|
||||||
List<Map<String, Object>> result = new ArrayList<>();
|
List<Map<String, Object>> result = new ArrayList<>();
|
||||||
Long settlementCustomersId = contractManageDTO.getSettlementCustomersId();
|
Long settlementCustomersId = contractManageDTO.getSettlementCustomersId();
|
||||||
@@ -178,11 +226,14 @@ public class ContractManageApplicationService {
|
|||||||
Map<String, Object> subjectAndPrice = new HashMap<>();
|
Map<String, Object> subjectAndPrice = new HashMap<>();
|
||||||
Integer sort = (Integer) stringObjectMap.get("sort");
|
Integer sort = (Integer) stringObjectMap.get("sort");
|
||||||
String chargingId = (String) stringObjectMap.get("chargingId");
|
String chargingId = (String) stringObjectMap.get("chargingId");
|
||||||
|
String fields = (String) stringObjectMap.get("fields");
|
||||||
String price = (String) stringObjectMap1.get("fields" + sort);
|
String price = (String) stringObjectMap1.get("fields" + sort);
|
||||||
subjectAndPrice.put("name", fieldsName);
|
SubjectAndPriceReturn subjectAndPriceReturn = new SubjectAndPriceReturn();
|
||||||
subjectAndPrice.put("price", price);
|
subjectAndPriceReturn.setName(fieldsName);
|
||||||
subjectAndPrice.put("chargingId", chargingId);
|
subjectAndPriceReturn.setPrice(new BigDecimal(price));
|
||||||
subjectAndPrice.put("billingRulesId", billingRulesId);
|
subjectAndPriceReturn.setChargingId(chargingId);
|
||||||
|
subjectAndPriceReturn.setFields(fields);
|
||||||
|
subjectAndPriceReturn.setBillingRulesId(billingRulesId);
|
||||||
result.add(subjectAndPrice);
|
result.add(subjectAndPrice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
package com.mhd.basic.interfaces.dto.contractManage;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计费参数json实体
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class BillingParamsDetailDTO {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ApiModelProperty("字段名称")
|
||||||
|
private String fields;
|
||||||
|
|
||||||
|
@ApiModelProperty("计费标识P1、P2")
|
||||||
|
private String chargingId;
|
||||||
|
|
||||||
|
@ApiModelProperty("阶梯类型(1-固定参数,2-无阶梯,3-到达阶梯,4-累进阶梯)")
|
||||||
|
private Integer ladderType;
|
||||||
|
|
||||||
|
@ApiModelProperty("1-左开右闭,2-左闭右开")
|
||||||
|
private Integer ladderRule;
|
||||||
|
|
||||||
|
@ApiModelProperty("阶梯值")
|
||||||
|
private String ladderNum;
|
||||||
|
|
||||||
|
@ApiModelProperty("标志值")
|
||||||
|
private String flagValue;
|
||||||
|
|
||||||
|
@ApiModelProperty("排序")
|
||||||
|
private Integer sort;
|
||||||
|
|
||||||
|
}
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
package com.mhd.basic.interfaces.dto.contractManage;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.nfunk.jep.JEP;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JEP动态计算
|
||||||
|
**/
|
||||||
|
@Slf4j
|
||||||
|
public class DynamicCalculationUtil {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 动态计算
|
||||||
|
* @param formula 计算公式
|
||||||
|
* @return 计算结果
|
||||||
|
*/
|
||||||
|
public static BigDecimal calculate(String formula) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
// 创建 JEP 实例
|
||||||
|
JEP jep = new JEP();
|
||||||
|
// 设置要计算的表达式
|
||||||
|
jep.parseExpression(formula);
|
||||||
|
// 计算表达式的结果
|
||||||
|
double result = jep.getValue();
|
||||||
|
// 将结果转换为 BigDecimal
|
||||||
|
return new BigDecimal(result);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 处理可能的异常
|
||||||
|
log.error("动态计算失败:"+e.getMessage());
|
||||||
|
}
|
||||||
|
return BigDecimal.ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
package com.mhd.basic.interfaces.dto.contractManage;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
@Data
|
||||||
|
public class SubjectAndPriceReturn {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private BigDecimal price;
|
||||||
|
private String chargingId;
|
||||||
|
private Long billingRulesId;
|
||||||
|
private String fields;
|
||||||
|
private BigDecimal num;
|
||||||
|
}
|
||||||
+12
@@ -4,6 +4,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import com.mhd.basic.interfaces.assember.contractManage.ContractManageAssembler;
|
import com.mhd.basic.interfaces.assember.contractManage.ContractManageAssembler;
|
||||||
import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceDTO;
|
import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceDTO;
|
||||||
|
import com.mhd.basic.interfaces.dto.contractManage.SubjectAndPriceReturn;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -58,6 +59,17 @@ public class ContractManageApi extends BaseController{
|
|||||||
return AjaxResult.success(contractManageApplicationService.getSubjectAndPrice(subjectAndPriceDTO));
|
return AjaxResult.success(contractManageApplicationService.getSubjectAndPrice(subjectAndPriceDTO));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取科目和单价
|
||||||
|
*/
|
||||||
|
@ApiOperation("获取科目和单价")
|
||||||
|
@PostMapping("/getAmount")
|
||||||
|
public AjaxResult getAmount(@RequestBody List<SubjectAndPriceReturn> subjectAndPriceReturnList)
|
||||||
|
{
|
||||||
|
//转换实体
|
||||||
|
return AjaxResult.success(contractManageApplicationService.getAmount(subjectAndPriceReturnList));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 保存合同管理
|
* 保存合同管理
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user