计费单据 计费流水 费用科目添加计费单位等信息;

This commit is contained in:
王奎兴
2026-05-11 17:41:35 +08:00
parent 62da999f94
commit acbc8bfe02
20 changed files with 348 additions and 15 deletions
@@ -92,6 +92,7 @@ public class CostCalculationApplicationService {
//第二步 根据计费策略公式进行替换,并根据配置的公式计算结果
BigDecimal computationalCost = computational(billingRulesPO,costCalculationDTO,taskFlowRecordsDO);
result.setComputationalCost(computationalCost);
result.setBillingRulesPO(billingRulesPO);
//第三步 产生计费任务记录
taskFlowRecordsDO.setBillingResults(computationalCost.toString());
@@ -7,11 +7,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.mhd.bms.application.server.billingRules.CostCalculationApplicationService;
import com.mhd.bms.application.server.settlementCustomers.SettlementCustomersApplicationService;
import com.mhd.bms.domain.billingRules.repository.po.BillingParamsPO;
import com.mhd.bms.domain.billingRules.repository.po.BillingRulesPO;
import com.mhd.bms.domain.billingStatement.service.BillingStatementDomainService;
import com.mhd.bms.domain.businessDocument.entity.BusinessDocument;
import com.mhd.bms.domain.businessDocument.repository.po.BusinessDocumentPO;
import com.mhd.bms.domain.businessDocument.repository.todo.BusinessDocumentDO;
import com.mhd.bms.domain.businessDocument.service.BusinessDocumentDomainService;
import com.mhd.bms.domain.costCalculation.entity.BillingParamsEntity;
import com.mhd.bms.domain.costCalculation.po.BillingCostPo;
import com.mhd.bms.domain.documentType.entity.DocumentFromEntity;
import com.mhd.bms.domain.documentType.entity.DocumentType;
@@ -173,10 +176,52 @@ public class BusinessDocumentApplicationService {
costCalculationDTO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
BillingCostPo billingCostPo = costCalculationApplicationService.costCalculation(costCalculationDTO);
businessDocumentDO.setEstimatedCost(billingCostPo.getComputationalCost());
BillingRulesPO billingRulesPO = billingCostPo.getBillingRulesPO();
List<BillingParamsPO> billingParamsPOList = billingRulesPO.getBillingParamsPOList();
if (ObjectUtil.isNotNull(billingParamsPOList)&&billingParamsPOList.size()>0) {
BillingParamsPO billingParamsPO = billingParamsPOList.get(0);
String billingParamsJson = billingParamsPO.getBillingParamsJson();
String preSetRules = billingParamsPO.getPreSetRules();
String documentFormJson = businessDocumentDO.getDocumentFormJson();
JSONObject paramObj = JSONObject.parseObject(documentFormJson);
List<BillingParamsEntity> billingParamsEntityList = JSON.parseArray(billingParamsJson, BillingParamsEntity.class);
for (BillingParamsEntity billingParamsEntity : billingParamsEntityList) {
String isFee = billingParamsEntity.getIsFee();
String fields = billingParamsEntity.getFields();
// 安全获取值并转 BigDecimal(不会报错)
BigDecimal value = getSafeBigDecimal(paramObj, fields);
if ("1".equals(isFee)) {
businessDocumentDO.setBillingUnitPrice(value.setScale(2, BigDecimal.ROUND_HALF_UP));
} else {
businessDocumentDO.setBillingNum(value.setScale(2, BigDecimal.ROUND_HALF_UP));
}
}
}
// businessDocumentDO.setEstimatedCost(new BigDecimal("100"));
return businessDocumentDomainService.insert(businessDocumentDO);
}
/**
* 从 JSONObject 安全获取 BigDecimal,支持:
* 数字、整数字符串、小数字符串、null、空字符串
*/
private BigDecimal getSafeBigDecimal(JSONObject paramObj, String fields) {
Object obj = paramObj.get(fields);
if (obj == null) {
return BigDecimal.ZERO; // 空值默认返回0,避免空指针
}
try {
// 统一转字符串再转 BigDecimal,最安全
return new BigDecimal(obj.toString().trim());
} catch (Exception e) {
// 无法解析的非法值,默认返回0
return BigDecimal.ZERO;
}
}
/**
* 新增业务单据
@@ -390,12 +435,39 @@ public class BusinessDocumentApplicationService {
businessDocumentDO.setFirstSubjectName(expenseAccountPO.getSubjectName());
businessDocumentDO.setFirstSubjectCode(expenseAccountPO.getSubjectCode());
businessDocumentDO.setSecondSubjectCode("");
String billingUnitDefaultCn = expenseAccountPO.getBillingUnitDefaultCn();
String billingUnitDefaultEn = expenseAccountPO.getBillingUnitDefaultEn();
if ("1".equals(billingUnitDefaultCn)) {
businessDocumentDO.setBillingUnit(expenseAccountPO.getBillingUnit());
businessDocumentDO.setBillingUnit2(expenseAccountPO.getBillingUnit2());
} else if ("1".equals(billingUnitDefaultEn)) {
businessDocumentDO.setBillingUnit(expenseAccountPO.getBillingUnitEn());
businessDocumentDO.setBillingUnit2(expenseAccountPO.getBillingUnitEn2());
} else {
businessDocumentDO.setBillingUnit(expenseAccountPO.getBillingUnit());
businessDocumentDO.setBillingUnit2(expenseAccountPO.getBillingUnit2());
}
businessDocumentDO.setNcSubjectCode(expenseAccountPO.getNcSubjectCode());
}else {
//不是一级科目
businessDocumentDO.setFirstSubjectName(expenseAccountPO.getUpperSubject());
businessDocumentDO.setFirstSubjectCode(expenseAccountPO.getUpperSubjectCode());
businessDocumentDO.setSecondSubjectCode(expenseAccountPO.getSubjectCode());
businessDocumentDO.setSecondSubjectName(expenseAccountPO.getSubjectName());
String billingUnitDefaultCn = expenseAccountPO.getBillingUnitDefaultCn();
String billingUnitDefaultEn = expenseAccountPO.getBillingUnitDefaultEn();
if ("1".equals(billingUnitDefaultCn)) {
businessDocumentDO.setBillingUnit(expenseAccountPO.getBillingUnit());
businessDocumentDO.setBillingUnit2(expenseAccountPO.getBillingUnit2());
} else if ("1".equals(billingUnitDefaultEn)) {
businessDocumentDO.setBillingUnit(expenseAccountPO.getBillingUnitEn());
businessDocumentDO.setBillingUnit2(expenseAccountPO.getBillingUnitEn2());
} else {
businessDocumentDO.setBillingUnit(expenseAccountPO.getBillingUnit());
businessDocumentDO.setBillingUnit2(expenseAccountPO.getBillingUnit2());
}
businessDocumentDO.setNcSubjectCode(expenseAccountPO.getNcSubjectCode());
}
//判断如果前端没有传费用类别,则此处根据费用科目获取关联费用类别
if(StringUtils.isEmpty(businessDocumentDO.getServiceItemsCode())){
@@ -1026,18 +1098,40 @@ public class BusinessDocumentApplicationService {
businessDocumentDO.setOrganizationName(businessDocumentDO.getOrganizationName());
businessDocumentDO.setOriginalBusinessNum(businessDocumentDO.getOriginalBusinessNum());
//调用费用计算,计算费用金额进行保存
// CostCalculationDTO costCalculationDTO = new CostCalculationDTO();
// costCalculationDTO.setOriginalBusinessNum(businessDocumentDO.getOriginalBusinessNum());
// costCalculationDTO.setContractNumber(businessDocumentDO.getContractNumber());
// costCalculationDTO.setFormJson(businessDocumentDO.getDocumentFormJson());
// costCalculationDTO.setSubjectCode(StringUtils.isEmpty(businessDocumentDO.getSecondSubjectCode()) ? businessDocumentDO.getFirstSubjectCode():businessDocumentDO.getSecondSubjectCode());
// costCalculationDTO.setDocumentTypeCode(businessDocumentDO.getDocumentTypeCode());
// costCalculationDTO.setTopOrganizationId(businessDocumentDO.getTopOrganizationId());
// costCalculationDTO.setOrganizationId(businessDocumentDO.getOrganizationId());
// costCalculationDTO.setOrganizationName(businessDocumentDO.getOrganizationName());
// BillingCostPo billingCostPo = costCalculationApplicationService.costCalculation(costCalculationDTO);
// businessDocumentDO.setEstimatedCost(billingCostPo.getComputationalCost());
// businessDocumentDO.setBillAmount(billingCostPo.getComputationalCost());//计费金额与计算金额一致
CostCalculationDTO costCalculationDTO = new CostCalculationDTO();
costCalculationDTO.setOriginalBusinessNum(businessDocumentDO.getOriginalBusinessNum());
costCalculationDTO.setContractNumber(businessDocumentDO.getContractNumber());
costCalculationDTO.setFormJson(businessDocumentDO.getDocumentFormJson());
costCalculationDTO.setSubjectCode(StringUtils.isEmpty(businessDocumentDO.getSecondSubjectCode()) ? businessDocumentDO.getFirstSubjectCode():businessDocumentDO.getSecondSubjectCode());
costCalculationDTO.setDocumentTypeCode(businessDocumentDO.getDocumentTypeCode());
costCalculationDTO.setTopOrganizationId(businessDocumentDO.getTopOrganizationId());
costCalculationDTO.setOrganizationId(businessDocumentDO.getOrganizationId());
costCalculationDTO.setOrganizationName(businessDocumentDO.getOrganizationName());
BillingCostPo billingCostPo = costCalculationApplicationService.costCalculation(costCalculationDTO);
BillingRulesPO billingRulesPO = billingCostPo.getBillingRulesPO();
List<BillingParamsPO> billingParamsPOList = billingRulesPO.getBillingParamsPOList();
if (ObjectUtil.isNotNull(billingParamsPOList)&&billingParamsPOList.size()>0) {
BillingParamsPO billingParamsPO = billingParamsPOList.get(0);
String billingParamsJson = billingParamsPO.getBillingParamsJson();
String preSetRules = billingParamsPO.getPreSetRules();
String documentFormJson = businessDocumentDO.getDocumentFormJson();
JSONObject paramObj = JSONObject.parseObject(documentFormJson);
List<BillingParamsEntity> billingParamsEntityList = JSON.parseArray(billingParamsJson, BillingParamsEntity.class);
for (BillingParamsEntity billingParamsEntity : billingParamsEntityList) {
String isFee = billingParamsEntity.getIsFee();
String fields = billingParamsEntity.getFields();
// 安全获取值并转 BigDecimal(不会报错)
BigDecimal value = getSafeBigDecimal(paramObj, fields);
if ("1".equals(isFee)) {
businessDocumentDO.setBillingUnitPrice(value.setScale(2, BigDecimal.ROUND_HALF_UP));
} else {
businessDocumentDO.setBillingNum(value.setScale(2, BigDecimal.ROUND_HALF_UP));
}
}
}
log.info("定时任务进入BMS业务单据保存--结束");
BusinessDocument businessDocument = businessDocumentDomainService.insertRetrun(businessDocumentDO);
BusinessDocumentDTO businessDocumentDTO = new BusinessDocumentDTO();
@@ -21,6 +21,8 @@ public interface BillManageMapper extends BaseMapper<BillManage>
String getInvoiceItemName(@Param("invoiceItemId") String invoiceItemId);
String getInvoiceItemNcCode(@Param("invoiceItemId") String invoiceItemId);
String getCustomerCodeNc(@Param("actualInvoiceCustomerId") String actualInvoiceCustomerId);
String getDocumentPreparerNcCode(@Param("salesmanId") String salesmanId);
@@ -240,11 +240,14 @@ public class BillManageImpl extends ServiceImpl<BillManageMapper, BillManage> im
item.setDirection("1");
String invoiceItem = item1.getInvoiceItem();
List<String> names = new ArrayList<>();
List<String> nccodes = new ArrayList<>();
if (invoiceItem != null && !invoiceItem.isEmpty()) {
String[] items = invoiceItem.split(",");
for (String s : items) {
String invoiceItemName1 = billManageMapper.getInvoiceItemName(s);
String invoiceItemNcCode1 = billManageMapper.getInvoiceItemNcCode(s);
names.add(invoiceItemName1);
nccodes.add(invoiceItemNcCode1);
}
}
String invoiceItemName = String.join(",", names);
@@ -282,6 +285,9 @@ public class BillManageImpl extends ServiceImpl<BillManageMapper, BillManage> im
item.setDef29(split[0]);
//item.setDef29(invoiceItem1);
}
if (nccodes != null && !nccodes.isEmpty()&&nccodes.size()>0) {
item.setDef29(nccodes.get(0));
}
item.setTaxcodeid("ZL01");
item.setInvoiceno(invoiceNumber);
ysitemList.add(item);
@@ -1,6 +1,7 @@
package com.mhd.bms.domain.billingStatement.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mhd.common.core.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
@@ -210,4 +211,15 @@ public class BillingStatement extends BaseVOEntity{
private String paymentAccountId;
@ApiModelProperty("收款帐户名称")
private String paymentAccountName;
@ApiModelProperty("计费单位")
private String billingUnit;
@ApiModelProperty("计费单位2")
private String billingUnit2;
@ApiModelProperty("预计费金额")
private BigDecimal billingNum;
@ApiModelProperty("预计费金额")
private BigDecimal billingUnitPrice;
@ApiModelProperty("nc科目编码")
private String ncSubjectCode;
}
@@ -221,4 +221,15 @@ public class BillingStatementPO extends BaseVOEntity{
private String paymentAccountId;
@ApiModelProperty("收款帐户名称")
private String paymentAccountName;
@ApiModelProperty("计费单位")
private String billingUnit;
@ApiModelProperty("计费单位2")
private String billingUnit2;
@ApiModelProperty("预计费金额")
private BigDecimal billingNum;
@ApiModelProperty("预计费金额")
private BigDecimal billingUnitPrice;
@ApiModelProperty("nc科目编码")
private String ncSubjectCode;
}
@@ -239,4 +239,15 @@ public class BillingStatementDO extends BaseVOEntity{
private String paymentAccountId;
@ApiModelProperty("收款帐户名称")
private String paymentAccountName;
@ApiModelProperty("计费单位")
private String billingUnit;
@ApiModelProperty("计费单位2")
private String billingUnit2;
@ApiModelProperty("预计费金额")
private BigDecimal billingNum;
@ApiModelProperty("预计费金额")
private BigDecimal billingUnitPrice;
@ApiModelProperty("nc科目编码")
private String ncSubjectCode;
}
@@ -1,6 +1,7 @@
package com.mhd.bms.domain.businessDocument.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mhd.common.core.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
@@ -182,4 +183,15 @@ public class BusinessDocument extends BaseVOEntity{
private String paymentAccountId;
@ApiModelProperty("收款帐户名称")
private String paymentAccountName;
@ApiModelProperty("计费单位")
private String billingUnit;
@ApiModelProperty("计费单位2")
private String billingUnit2;
@ApiModelProperty("计费数量")
private BigDecimal billingNum;
@ApiModelProperty("计费单价")
private BigDecimal billingUnitPrice;
@ApiModelProperty("nc科目编码")
private String ncSubjectCode;
}
@@ -187,4 +187,15 @@ public class BusinessDocumentPO extends BaseVOEntity{
private String paymentAccountId;
@ApiModelProperty("收款帐户名称")
private String paymentAccountName;
@ApiModelProperty("计费单位")
private String billingUnit;
@ApiModelProperty("计费单位2")
private String billingUnit2;
@ApiModelProperty("预计费金额")
private BigDecimal billingNum;
@ApiModelProperty("预计费金额")
private BigDecimal billingUnitPrice;
@ApiModelProperty("nc科目编码")
private String ncSubjectCode;
}
@@ -207,4 +207,15 @@ public class BusinessDocumentDO extends BaseVOEntity{
private String paymentAccountId;
@ApiModelProperty("收款帐户名称")
private String paymentAccountName;
@ApiModelProperty("计费单位")
private String billingUnit;
@ApiModelProperty("计费单位2")
private String billingUnit2;
@ApiModelProperty("预计费金额")
private BigDecimal billingNum;
@ApiModelProperty("预计费金额")
private BigDecimal billingUnitPrice;
@ApiModelProperty("nc科目编码")
private String ncSubjectCode;
}
@@ -35,4 +35,10 @@ public class BillingParamsEntity {
@ApiModelProperty("排序")
private Integer sort;
}
private String isPush;
private String isFee;
private String isShow;
}
@@ -1,5 +1,6 @@
package com.mhd.bms.domain.costCalculation.po;
import com.mhd.bms.domain.billingRules.repository.po.BillingRulesPO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -30,5 +31,7 @@ public class BillingCostPo {
@ApiModelProperty("预计金额")
private BigDecimal computationalCost;
private BillingRulesPO billingRulesPO;
}
}
@@ -102,4 +102,41 @@ public class ExpenseAccountPO extends BaseVOEntity{
@ApiModelProperty("服务项税率")
@Excel(name = "服务项税率")
private BigDecimal taxRate;
}
@ApiModelProperty("费率")
private BigDecimal rate;
@ApiModelProperty(name = "创建订单是否固定显示 0-否 1-是")
private Integer fixedOrderDisplay;
@ApiModelProperty(name = "入库单是否固定显示 0-否 1-是")
private Integer inOrderDisplay;
@ApiModelProperty(name = "出库单是否固定显示 0-否 1-是")
private Integer outOrderDisplay;
@ApiModelProperty("计费单位")
private String billingUnit;
@ApiModelProperty("计费单位英文")
private String billingUnitEn;
@ApiModelProperty("计费单位2")
private String billingUnit2;
@ApiModelProperty("计费单位2英文")
private String billingUnitEn2;
@ApiModelProperty("计费单位中文默认")
private String billingUnitDefaultCn;
@ApiModelProperty("计费单位英文默认")
private String billingUnitDefaultEn;
@ApiModelProperty("nc科目编码")
private String ncSubjectCode;
}
@@ -250,4 +250,15 @@ public class BillingStatementDTO extends BaseVOEntity{
private String paymentAccountName;
private List<BillingStatementADDVO> billingStatementList;
@ApiModelProperty("计费单位")
private String billingUnit;
@ApiModelProperty("计费单位2")
private String billingUnit2;
@ApiModelProperty("预计费金额")
private BigDecimal billingNum;
@ApiModelProperty("预计费金额")
private BigDecimal billingUnitPrice;
@ApiModelProperty("nc科目编码")
private String ncSubjectCode;
}
@@ -110,6 +110,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select SUBJECT_NAME from "NGWL_TEST_SYSTEM".EXPENSE_ACCOUNT where status = 1 and SUBJECT_CODE = #{invoiceItemId} limit 1
</select>
<select id="getInvoiceItemNcCode" parameterType="java.lang.String" resultType="java.lang.String">
select NC_SUBJECT_CODE from "NGWL_TEST_SYSTEM".EXPENSE_ACCOUNT where status = 1 and SUBJECT_CODE = #{invoiceItemId} limit 1
</select>
<select id="getCustomerCodeNc" parameterType="java.lang.String" resultType="java.lang.String">
SELECT CUSTOMER_NC_CODE FROM NGWL_TEST_USER."USER_SHIPPER" where del_flag = 1 and SHIPPER_ID = #{actualInvoiceCustomerId} limit 1
</select>