diff --git a/mhd_bms/src/main/java/com/mhd/bms/application/server/businessDocument/BusinessDocumentApplicationService.java b/mhd_bms/src/main/java/com/mhd/bms/application/server/businessDocument/BusinessDocumentApplicationService.java index 63feec9a1..34fb291ab 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/application/server/businessDocument/BusinessDocumentApplicationService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/application/server/businessDocument/BusinessDocumentApplicationService.java @@ -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 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 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 billingStatements = billingStatementMapper.selectList(new LambdaQueryWrapper() + .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、空字符串 diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/businessDocument/repository/todo/BusinessDocumentDO.java b/mhd_bms/src/main/java/com/mhd/bms/domain/businessDocument/repository/todo/BusinessDocumentDO.java index 899da7af5..8b2e0e056 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/businessDocument/repository/todo/BusinessDocumentDO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/businessDocument/repository/todo/BusinessDocumentDO.java @@ -218,4 +218,6 @@ public class BusinessDocumentDO extends BaseVOEntity{ private BigDecimal billingUnitPrice; @ApiModelProperty("nc科目编码") private String ncSubjectCode; + + private Long billManageId; } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BusinessDocumentApi.java b/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BusinessDocumentApi.java index 8301bc5d9..ad94d9f94 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BusinessDocumentApi.java +++ b/mhd_bms/src/main/java/com/mhd/bms/interfaces/facadeApi/BusinessDocumentApi.java @@ -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()); + } + + } + /** * 保存业务单据