| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- package com.kym.service.admin.impl;
- import com.github.pagehelper.PageHelper;
- import com.github.yulichang.base.MPJBaseServiceImpl;
- import com.github.yulichang.toolkit.JoinWrappers;
- import com.github.yulichang.wrapper.MPJLambdaWrapper;
- import com.kym.common.exception.BusinessException;
- import com.kym.common.utils.CommUtil;
- import com.kym.entity.admin.*;
- import com.kym.entity.admin.queryParams.StatementsQueryParam;
- import com.kym.entity.admin.vo.StatementsVo;
- import com.kym.entity.common.PageBean;
- import com.kym.mapper.admin.StatementsMapper;
- import com.kym.service.admin.AdminUserRoleService;
- import com.kym.service.admin.InvestorInfoService;
- import com.kym.service.admin.StatementsService;
- import com.kym.service.admin.StationStatMonthService;
- import com.kym.service.cache.KymCache;
- import org.springframework.beans.BeanUtils;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- /**
- * <p>
- * 客户对账单 服务实现类
- * </p>
- *
- * @author skyline
- * @since 2023-12-27
- */
- @Service
- public class StatementsServiceImpl extends MPJBaseServiceImpl<StatementsMapper, Statements> implements StatementsService {
- private final InvestorInfoService investorInfoService;
- private final StationStatMonthService stationStatMonthService;
- private final AdminUserRoleService adminUserRoleService;
- public StatementsServiceImpl(InvestorInfoService investorInfoService, StationStatMonthService stationStatMonthService, AdminUserRoleService adminUserRoleService) {
- this.investorInfoService = investorInfoService;
- this.stationStatMonthService = stationStatMonthService;
- this.adminUserRoleService = adminUserRoleService;
- }
- @Override
- @Transactional
- public void createStatements(String statMonthId) {
- // 站点统计信息
- var statMonthInfo = stationStatMonthService.lambdaQuery()
- .eq(StationStatMonth::getId, statMonthId)
- .one();
- // 校验站点月统计信息已填写实际抄表电量和实际抄表电费金额
- if (statMonthInfo.getActualPower() == null || statMonthInfo.getActualElecMoney() == null) {
- throw new BusinessException("请先完善月统计实际抄表电量和实际抄表电费金额");
- }
- // 站点关联客户和物业信息
- var investorInfoList = investorInfoService.lambdaQuery()
- .eq(InvestorInfo::getStationId, statMonthInfo.getStationId())
- .eq(InvestorInfo::getStatus, InvestorInfo.STATUS_有效)
- .list();
- if (CommUtil.isEmptyOrNull(investorInfoList)) {
- throw new BusinessException("请先完善站点相关投资者/物业信息");
- }
- // 创建客户对账单
- var res = investorInfoList.stream().map(investorInfo -> {
- // 实际参与分成的服务费=总服务费-优惠金额-电损电费
- var actualServiceMoney = statMonthInfo.getServiceMoney() - statMonthInfo.getDiscountAmount();
- // 总电损电费
- var elecLossMoney = statMonthInfo.getActualElecMoney() - statMonthInfo.getElecMoney();
- var elecLossAmount = (int) (elecLossMoney * investorInfo.getElecLossProportion());
- // 分成金额 = 实际参与分成的服务费 * 分成比例 - 电损金额 * 电损承担比例
- var splittingAmount = (int) (actualServiceMoney * investorInfo.getSplittingProportion()) - elecLossAmount;
- return new Statements()
- .setAdminUserId(investorInfo.getAdminUserId())
- .setAdminUserName(investorInfo.getAdminUserName())
- .setStationId(investorInfo.getStationId())
- .setStationName(KymCache.INSTANCE.getStationNameById(investorInfo.getStationId()))
- .setStatMonth(statMonthInfo.getStatMonth())
- .setTotalPower(statMonthInfo.getTotalPower())
- .setActualPower(statMonthInfo.getActualPower()) // 实际抄表电量
- .setElecLossPower(statMonthInfo.getActualPower() - statMonthInfo.getTotalPower()) // 电损电量
- .setTotalMoney(statMonthInfo.getTotalMoney())
- .setElecMoney(statMonthInfo.getElecMoney())
- .setActualElecMoney(statMonthInfo.getActualElecMoney())// 实际抄表电费
- .setElecLossMoney(elecLossMoney) // 电损电费(分)
- .setServiceMoney(statMonthInfo.getServiceMoney())
- .setDiscountAmount(statMonthInfo.getDiscountAmount())
- .setServiceMoneyDiscount(statMonthInfo.getServiceMoneyDiscount())
- .setActualServiceMoney(actualServiceMoney) // 实际参与分成的服务费(分)
- .setSplittingProportion(investorInfo.getSplittingProportion()) // 分成比例 0.45表示45%
- .setSplittingAmount(splittingAmount) // 分成金额(分)
- .setElecLossProportion(investorInfo.getElecLossProportion()) // 电损承担比例
- .setElecLossAmount((int) (elecLossMoney * investorInfo.getElecLossProportion())) // 电损承担金额
- .setVatRate(investorInfo.getVatRate()) // 增值税率 0.06表示6%
- .setVatAmount((int) (splittingAmount / (1 + investorInfo.getVatRate()) * investorInfo.getVatRate() * 1.12)) // 增值税额(分)
- .setActualSplittingAmount(splittingAmount - (int) (splittingAmount / (1 + investorInfo.getVatRate()) * investorInfo.getVatRate() * 1.12)); // 实际分成金额(分)
- }).toList();
- // 删除之前生成的对账单(投资者/物业 - 站点 - 月份)
- var oldData = lambdaQuery()
- .eq(Statements::getStatMonth, statMonthInfo.getStatMonth())
- .eq(Statements::getStationId, statMonthInfo.getStationId())
- .in(Statements::getAdminUserId, investorInfoList.stream().map(InvestorInfo::getAdminUserId).toList())
- .list().stream().map(Statements::getId).toList();
- removeBatchByIds(oldData);
- saveBatch(res);
- }
- @Override
- public PageBean<Statements> listStatements(StatementsQueryParam params) {
- PageHelper.startPage(params.getPageNum(), params.getPageSize());
- var res = lambdaQuery()
- .eq(!CommUtil.isEmptyOrNull(params.getStationId()), Statements::getStationId, params.getStationId())
- .eq(!CommUtil.isEmptyOrNull(params.getStatMonth()), Statements::getStatMonth, params.getStatMonth())
- .like(!CommUtil.isEmptyOrNull(params.getAdminUserName()), Statements::getAdminUserName, params.getAdminUserName())
- .orderByDesc(Statements::getCreateTime)
- .list();
- return new PageBean<>(res);
- }
- @Override
- public StatementsVo preview(String statId) {
- var statements = getById(statId);
- var investorInfo = investorInfoService.lambdaQuery()
- .eq(InvestorInfo::getAdminUserId, statements.getAdminUserId())
- .eq(InvestorInfo::getStationId, statements.getStationId())
- .one();
- // 查询角色
- MPJLambdaWrapper<AdminUserRole> wrapper = JoinWrappers.lambda(AdminUserRole.class)
- .select(Role::getRoleName, Role::getRoleDesc)
- .leftJoin(Role.class, Role::getId, AdminUserRole::getRoleId)
- .eq(AdminUserRole::getAdminUserId, statements.getAdminUserId());
- var res = adminUserRoleService.selectJoinMap(wrapper);
- if (CommUtil.isEmptyOrNull(res)) {
- throw new BusinessException("请先完善站点相关投资者/物业客户账号信息关联之后重新生成账单");
- }
- var statementsVo = new StatementsVo();
- statementsVo.setRoleName(res.get("role_name").toString());
- statementsVo.setRoleDesc(res.get("role_desc").toString());
- BeanUtils.copyProperties(statements, statementsVo);
- BeanUtils.copyProperties(investorInfo, statementsVo);
- return statementsVo;
- }
- }
|