This commit is contained in:
王奎兴
2026-07-02 17:25:09 +08:00
parent b5914940df
commit afc26a798f
3 changed files with 141 additions and 0 deletions
@@ -7,10 +7,18 @@ 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.billManage.entity.BillDetail;
import com.mhd.bms.domain.billManage.entity.BillManage;
import com.mhd.bms.domain.billManage.repository.facade.IBillDetailService;
import com.mhd.bms.domain.billManage.repository.facade.IBillManageService;
import com.mhd.bms.domain.billingRules.repository.po.BillingParamsPO;
import com.mhd.bms.domain.billingRules.repository.po.BillingRulesPO;
import com.mhd.bms.domain.billingStatement.entity.BillingStatement;
import com.mhd.bms.domain.billingStatement.repository.mapper.BillingStatementMapper;
import com.mhd.bms.domain.billingStatement.repository.todo.BillingStatementDO;
import com.mhd.bms.domain.billingStatement.service.BillingStatementDomainService;
import com.mhd.bms.domain.businessDocument.entity.BusinessDocument;
import com.mhd.bms.domain.businessDocument.repository.mapper.BusinessDocumentMapper;
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;
@@ -30,6 +38,7 @@ import com.mhd.bms.infrastructure.feign.vo.ContractManagePO;
import com.mhd.bms.infrastructure.feign.vo.ExpenseAccountPO;
import com.mhd.bms.interfaces.assembler.businessDocument.BusinessDocumentAssembler;
import com.mhd.bms.interfaces.dto.billingRules.CostCalculationDTO;
import com.mhd.bms.interfaces.dto.billingStatement.BillingStatementDTO;
import com.mhd.bms.interfaces.dto.businessDocument.BusinessDocumentDTO;
import com.mhd.common.core.domain.dto.BusinessDataPushDTO;
import com.mhd.common.core.domain.po.OrganizationPo;
@@ -86,6 +95,14 @@ public class BusinessDocumentApplicationService {
private CostCalculationApplicationService costCalculationApplicationService;
@Autowired
private ISettlementCustomersService settlementCustomersService;
@Autowired
private BusinessDocumentMapper businessDocumentMapper;
@Autowired
private BillingStatementMapper billingStatementMapper;
@Autowired
private IBillManageService billManageService;
@Autowired
private IBillDetailService billDetailService;
/**
@@ -202,6 +219,109 @@ public class BusinessDocumentApplicationService {
return businessDocumentDomainService.insert(businessDocumentDO);
}
@Transactional(rollbackFor = Exception.class)
public Boolean manageAddFee(BusinessDocumentDO businessDocumentDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (ObjectUtil.isNull(loginUser)) {
throw new DigitalLogisticsException(UserError.TIMEOUT);
}
//先设置组织信息,因为handleDate方法中需要使用topOrganizationId
businessDocumentDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
businessDocumentDO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
businessDocumentDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
UserPo userPo = loginUser.getUserPo();
businessDocumentDO.setCreateBy(userPo.getUserId());
businessDocumentDO.setCreateByName(userPo.getUserName());
//校验使用的表单是否必填校验
checkDoucumentType(businessDocumentDO);
//处理数据
handleDate(businessDocumentDO);
businessDocumentDO.setDataSources(2);
businessDocumentDO.setBusinessFlow(OrderSequence.getOrderCode("LS"));
//调用费用计算,计算费用金额进行保存
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(loginUser.getUserPo().getTopOrganizationId());
costCalculationDTO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
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));
}
}
}
BusinessDocument businessDocument = businessDocumentDomainService.insertRetrun(businessDocumentDO);
BusinessDocumentDTO businessDocumentDTO = new BusinessDocumentDTO();
businessDocumentDTO.setBusinessDocumentIds(businessDocument.getBusinessDocumentId().toString());
businessDocumentDTO.setAuditOperation(1);
takeEffectByIds(businessDocumentDTO);
auditByIds(businessDocumentDTO);
List<BillingStatement> billingStatements = billingStatementMapper.selectList(new LambdaQueryWrapper<BillingStatement>()
.eq(BillingStatement::getBusinessDocumentId, businessDocument.getBusinessDocumentId())
.eq(BillingStatement::getDelFlag, 1));
BillingStatement billingStatement = null;
if (ObjectUtil.isNotNull(billingStatements)&&billingStatements.size()>0) {
billingStatement = billingStatements.get(0);
BillingStatementDTO billingStatementDTO = new BillingStatementDTO();
billingStatementDTO.setBillingStatementIds(billingStatement.getBillingStatementId().toString());
billingStatementDTO.setAuditOperation(1);
billingStatementDomainService.reviewBilling(billingStatementDTO);
}
BillManage billManage = billManageService.getById(businessDocumentDO.getBillManageId());
BillDetail billDetail = new BillDetail();
billDetail.setBillManageId(businessDocumentDO.getBillManageId());
billDetail.setBillNumber(billManage.getBillNumber());
billDetail.setBillingStatementId(billingStatement.getBillingStatementId());
billDetail.setBillingFlow(billingStatement.getBillingFlow());
billDetail.setOrganizationId(billManage.getOrganizationId());
billDetail.setOrganizationName(billManage.getOrganizationName());
billDetail.setTopOrganizationId(billManage.getTopOrganizationId());
billDetail.setCreateBy(userPo.getUserId());
billDetail.setCreateByName(userPo.getUserName());
billDetail.setCreateTime(new Date());
billDetail.setDelFlag(1);
billDetail.setBillingTotalAmount(billingStatement.getBillingAmount());
billDetail.setBillingDiscountAmount(BigDecimal.ZERO);
billDetail.setBillingAmount(billingStatement.getBillingAmount());
billDetail.setBillType(1);
billDetail.setBillingExpectedAmount(BigDecimal.ZERO);
billDetail.setFeeType(billingStatement.getServiceItemsName());
billDetail.setInvoiceItem(billingStatement.getFirstSubjectCode());
billDetail.setInvoiceItemName(billingStatement.getFirstSubjectName());
billDetail.setSettlementCurrency(billingStatement.getSettlementCurrency());
billDetailService.save(billDetail);
BigDecimal billAmount = billManage.getBillAmount();
BigDecimal amount = billAmount.add(billDetail.getBillingAmount());
billManage.setBillAmount(amount);
billManage.setBillTotalAmount(amount);
billManageService.updateById(billManage);
return true;
}
/**
* 从 JSONObject 安全获取 BigDecimal,支持:
* 数字、整数字符串、小数字符串、null、空字符串
@@ -218,4 +218,6 @@ public class BusinessDocumentDO extends BaseVOEntity{
private BigDecimal billingUnitPrice;
@ApiModelProperty("nc科目编码")
private String ncSubjectCode;
private Long billManageId;
}
@@ -79,6 +79,25 @@ public class BusinessDocumentApi extends BaseController{
}
/**
* 保存业务单据
*/
@ApiOperation("账单添加费用")
@PostMapping("/manageAddFee")
public AjaxResult manageAddFee(@RequestBody BusinessDocumentDTO businessDocumentDTO)
{
try {
//转换实体
BusinessDocumentDO businessDocumentDO = businessDocumentAssembler.toDO(businessDocumentDTO);
return toAjax(businessDocumentApplicationService.manageAddFee(businessDocumentDO));
} catch (ServiceException e) {
return AjaxResult.error(e.getMessage());
} catch (Exception e){
return AjaxResult.error("保存业务单据失败:" + e.getMessage());
}
}
/**
* 保存业务单据