package com.nuvole.four.service.impl; import com.nuvole.base.domain.SysUser; import com.nuvole.four.contants.Contants; import com.nuvole.four.domain.ActivityDistributeRecord; import com.nuvole.four.domain.ActivityFee; import com.nuvole.four.domain.SysOrg; import com.nuvole.four.domain.dto.ActivityDistributeBudgetDto; import com.nuvole.four.domain.query.ActivityDistributeRecordQuery; import com.nuvole.four.mapper.ActivityDistributeRecordMapper; import com.nuvole.four.mapper.ActivityFeeMapper; import com.nuvole.four.mapper.SysOrgMapper; import com.nuvole.four.service.ActivityDistributeRecordService; import com.nuvole.four.util.SystemUtil; import com.nuvole.util.IdGenerator; import com.walker.infrastructure.utils.CollectionUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @Description 活动预算分配Service实现类 * @Author dqh * @Date 2024-04-13 21:36:24 */ @Service @RequiredArgsConstructor public class ActivityDistributeRecordServiceImpl implements ActivityDistributeRecordService { private final ActivityDistributeRecordMapper activityDistributeRecordMapper; private final ActivityFeeMapper activityFeeMapper; private final SysOrgMapper sysOrgMapper; @Override public int addSelective(ActivityDistributeRecord entity){ return activityDistributeRecordMapper.insertSelective(entity); } @Override public int editSelective(ActivityDistributeRecord entity){ return activityDistributeRecordMapper.updateByPrimaryKeySelective(entity); } @Override public ActivityDistributeRecord get(Long id){ return activityDistributeRecordMapper.selectByPrimaryKey(id); } @Override public ActivityDistributeRecord getFeeByCondition(Long activityId,Long orgId){ ActivityDistributeRecord record = activityDistributeRecordMapper.getFeeByCondition(activityId,orgId); if(record != null){ return record; } return null; } @Override public ActivityFee getActivityFeeByIdAndOrgId(Long activityId,Long orgId){ ActivityFee fee = activityFeeMapper.getActivityFeeByIdAndOrgId(activityId,orgId); return fee; } @Override public int del(Long id){ return activityDistributeRecordMapper.deleteByPrimaryKey(id); } @Override public List getList(ActivityDistributeRecordQuery query) { return activityDistributeRecordMapper.selectList(query); } /** * 方法描述: 分配预算查询 * 默认仅查询当前登录人的机构下级。不包含下下级 * @date 2024-04-14 11:31 **/ @Override public List getActivityDistributeRecordDetail(Long activityId) { SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC); Long orgId = user.getOrgId(); if(!user.getLoginName().equalsIgnoreCase("super") && orgId == null){ throw new IllegalArgumentException("当前登录人无权限分配"); } SysOrg sysOrg = sysOrgMapper.selectByPrimaryKey(orgId); if(sysOrg != null && sysOrg.getLv() == null){ throw new IllegalArgumentException("当前选择的机构层级为空"); } List dtoList = new ArrayList<>(); dtoList = activityDistributeRecordMapper.getActivityDistributeRecordDetail(orgId,activityId); return dtoList; } /** * 方法描述:分配预算保存 * 有id则进行更新;无则新增 * * @date 2024-04-14 13:41 **/ @Override @Transactional(rollbackFor = Exception.class) public Integer batchInsertOrUpdate(List recordList) { if(CollectionUtils.isEmpty(recordList)){ return 0; } SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC); //校验额度分配 checkBudget(recordList); recordList.forEach( r -> { if (r.getId() == null) { //新增自动生成id r.setId(IdGenerator.getId()); r.setCreateBy(user.getId()); r.setCreateTime(new Date()); r.setTotalFee(r.getTotalFee()); r.setUseFee(0L); r.setSurplusFee(r.getTotalFee()); //默认状态均=0(未开始) r.setStatus(0); r.setDeleted(0); SysOrg sysOrg = sysOrgMapper.selectByPrimaryKey(r.getOrgId()); r.setOrgCode(sysOrg.getOrgCode()); generateOrgLv(r, user.getOrgLv()); }else{ //todo surplusFee最好是从表里重新查询,使用total_fee - useFee = surplusFee;以预防活动开始后追加预算场景。 //校验活动是否=0(未开始);否则无法修改 checkActivityStatus(r.getActivityId(),recordList.indexOf(r)); r.setDeleted(0); r.setTotalFee(r.getTotalFee()); r.setSurplusFee(r.getTotalFee()); r.setUpdateBy(user.getId()); r.setUpdateTime(new Date()); } }); activityDistributeRecordMapper.batchInsertOrUpdate(recordList); //inputTotalFeeSum = 分配的下级额度(useFee)之和 Long inputTotalFeeSum = recordList.stream().mapToLong(ActivityDistributeRecord::getTotalFee).sum(); updateParentFee(inputTotalFeeSum, user.getOrgId(), recordList.get(0).getActivityId()); return 1; } /** * 分配后处理父级(若有)、无父级则处理活动本身的userFee、surplusFee字段 * @param inputTotalFeeSum 使用的额度 * @param orgId 机构id * @param activityId 活动id */ private void updateParentFee(Long inputTotalFeeSum,Long orgId,Long activityId){ if(inputTotalFeeSum == 0L){ return; } ActivityDistributeRecord record = activityDistributeRecordMapper.getFeeByCondition(activityId,orgId); if(record != null){ record.setUseFee(inputTotalFeeSum); record.setSurplusFee(record.getTotalFee() - inputTotalFeeSum); activityDistributeRecordMapper.updateByPrimaryKeySelective(record); }else{ //更新活动本身 ActivityFee activityFee = activityFeeMapper.getActivityFeeByIdAndOrgId(activityId,orgId); if(activityFee != null){ activityFee.setUseFee(inputTotalFeeSum); activityFee.setSurplusFee(activityFee.getTotalFee() - inputTotalFeeSum); activityFeeMapper.updateByPrimaryKeySelective(activityFee); } } } /** * 预算分配额度校验 * useFee(当前请求集合中所有分配额度累加) + surplusFee ≤ totalFee(活动的总额度) * @param recordList 待保存的 预算分配集合 */ private void checkBudget(List recordList){ Long activityId = recordList.get(0).getActivityId(); Long totalFee = 0L; SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC); Long orgId = user.getOrgId(); ActivityDistributeRecord record = activityDistributeRecordMapper.getFeeByCondition(activityId,orgId); if (record == null) { ActivityFee activityFee = activityFeeMapper.getActivityFeeByIdAndOrgId(activityId,orgId); totalFee = activityFee.getTotalFee(); }else{ totalFee = record.getTotalFee(); } Long inputTotalFeeSum = recordList.stream().mapToLong(ActivityDistributeRecord::getTotalFee).sum(); long surplusFee = totalFee - inputTotalFeeSum; if(surplusFee < 0 ){ throw new IllegalArgumentException("预算分配超出总额度,分配失败"); } } /** * 生成机orglv对应的枚举值 * @param loginUserOrgLv 当前登录人的orgLv */ private void generateOrgLv(ActivityDistributeRecord entity,Integer loginUserOrgLv){ if(loginUserOrgLv == null){ return; } switch (loginUserOrgLv){ case 0: entity.setLv1Id(1L); break; case 1: entity.setLv2Id(2L); break; case 2: entity.setLv3Id(3L); case 3: entity.setLv4Id(4L); default: } } /** * 校验活动是否=0(未开始);否则无法修改 * @param activityId 活动ID * @param index 当前第几条 */ private void checkActivityStatus(Long activityId,int index){ ActivityFee activityFee = activityFeeMapper.selectByPrimaryKey(activityId); if(activityFee.getStatus() != 0){ String errMsg = String.format("第 {%s} 条活动已开始,无法分配", index + 1); throw new IllegalArgumentException(errMsg); } } }