package com.nuvole.four.service.impl; import cn.hutool.core.util.StrUtil; 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.ActivityShopRecord; import com.nuvole.four.domain.dto.ActivityDistributeBudgetDto; import com.nuvole.four.domain.dto.ActivityFeeDetailDto; import com.nuvole.four.domain.query.ActivityFeeQuery; import com.nuvole.four.domain.query.ActivityShopRecordQuery; import com.nuvole.four.mapper.ActivityDistributeRecordMapper; import com.nuvole.four.mapper.ActivityFeeMapper; import com.nuvole.four.mapper.ActivityShopRecordMapper; import com.nuvole.four.mapper.SysUserMapper; import com.nuvole.four.service.ActivityFeeService; import com.nuvole.four.util.SystemUtil; import com.nuvole.util.CodeUtil; import com.nuvole.util.IdGenerator; import com.walker.infrastructure.utils.CollectionUtils; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; 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:33:08 */ @Service @RequiredArgsConstructor public class ActivityFeeServiceImpl implements ActivityFeeService { private final ActivityFeeMapper activityFeeMapper; private final ActivityDistributeRecordMapper activityDistributeRecordMapper; private final ActivityShopRecordMapper activityShopRecordMapper; private final SysUserMapper sysUserMapper; /** * 方法描述:新建费率补贴活动 * * @date 2024-04-13 22:00 **/ @Override public int addSelective(ActivityFee entity){ checkParam(entity); entity.setId(IdGenerator.getId()); SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC); entity.setStatus(0); entity.setDeleted(0); //有总额度后,默认同步设置剩余额度,使用额度 if(entity.getTotalFee() != null){ entity.setSurplusFee(entity.getTotalFee()); entity.setUseFee(0L); } entity.setOrgCode(user.getOrgCode()); entity.setCode(CodeUtil.getTimeCode()); entity.setOrgId(user.getOrgId()); entity.setCreateBy(user.getId()); entity.setCreateTime(new Date()); return activityFeeMapper.insertSelective(entity); } private void checkParam(ActivityFee entity){ if(entity.getBeginTime().after(entity.getEndTime()) && entity.getBeginTime().equals(entity.getEndTime())){ throw new IllegalArgumentException("活动开始时间必须小于活动结束时间"); } if(entity.getExpireTime().after(entity.getBeginTime()) && entity.getBeginTime().equals(entity.getEndTime())){ throw new IllegalArgumentException("截止时间必须小于活动开始时间"); } } /** * 方法描述: 编辑费率补贴活动 * * @date 2024-04-13 22:01 **/ @Override public int editSelective(ActivityFee entity){ checkParam(entity); SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC); entity.setUpdateBy(user.getId()); entity.setUpdateTime(new Date()); //有总额度后,默认同步设置剩余额度,使用额度 if(entity.getTotalFee() != null){ entity.setSurplusFee(entity.getTotalFee()); entity.setUseFee(0L); } return activityFeeMapper.updateByPrimaryKeySelective(entity); } /** * 方法描述:查询费率补贴活动详情 * * @date 2024-04-13 22:01 **/ @Override public ActivityFee get(Long id){ return activityFeeMapper.selectByPrimaryKey(id); } @Override public int del(Long id){ return activityFeeMapper.deleteByPrimaryKey(id); } /** * 方法描述:查询当前登录人的本级+下级机构的活动数据 * * @date 2024-04-20 17:06 **/ @Override public List getList(ActivityFeeQuery query) { SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC); if(!user.getLoginName().equalsIgnoreCase("super") && StrUtil.isBlank(user.getOrgCode())){ throw new IllegalArgumentException("当前登录人的机构code为空"); } List feeList = new ArrayList<>(); if(user.getLoginName().equalsIgnoreCase("super") || user.getOrgLv().equals(0)){ //查询匹配当前登录人orgCode的所有活动 query.setOrgCode(user.getOrgCode()); feeList = activityFeeMapper.selectList(query); } else { //查询分配出去的活动信息,根据orgId做权限过滤 query.setOrgId(user.getOrgId()); query.setCreateBy(user.getId()); feeList = activityFeeMapper.selectActivityWithDistribute(query); } return feeList; } /** * 方法描述: 开始/停止 * 同步停止活动表、商户活动表、机构预算分配表 **/ @Override @Transactional(rollbackFor = Exception.class) public int startOrStop(Long id, Integer status) { //活动数据校验 ActivityFee fee = activityFeeMapper.selectByPrimaryKey(id); if(fee == null){ throw new IllegalArgumentException("活动不存在"); } if(fee.getStatus().equals(status)){ throw new IllegalArgumentException(status == 1 ? "当前活动正在进行中" : "当前活动已经结束了"); } // 更改活动表状态 updateActivityStatus(fee, status); // 更改机构预算分配表状态 updateDistributeRecordStatus(id, status); // 更改商户活动表状态 updateShopRecordStatus(id, status); // 状态=开始时,进行商户活动额度平均分配 if (status == 1) { distributeFeeToShop(id, fee.getTotalFee()); } return 1; } /** * 更改活动表状态 **/ private void updateActivityStatus(ActivityFee fee, Integer status) { SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC); Long userId = user.getId(); Date date = new Date(); fee.setStatus(status); fee.setUpdateBy(userId); fee.setUpdateTime(date); activityFeeMapper.updateByPrimaryKeySelective(fee); } /** * 更改机构预算分配表状态 */ private void updateDistributeRecordStatus(Long id, Integer status) { SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC); Long userId = user.getId(); Date date = new Date(); ActivityDistributeRecord distributeRecord = new ActivityDistributeRecord(); distributeRecord.setActivityId(id); distributeRecord.setStatus(status); distributeRecord.setUpdateBy(userId); distributeRecord.setUpdateTime(date); activityDistributeRecordMapper.updateByActivityId(distributeRecord); } /** * 更改商户活动表状态 */ private void updateShopRecordStatus(Long id, Integer status) { SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC); Long userId = user.getId(); Date date = new Date(); ActivityShopRecord shopRecord = new ActivityShopRecord(); shopRecord.setActivityId(id); shopRecord.setStatus(status); shopRecord.setUpdateBy(userId); shopRecord.setUpdateTime(date); activityShopRecordMapper.updateByActivityId(shopRecord); } /** * 状态=开始时,进行商户活动额度平均分配 * @param id 活动id * @param totalFee 活动总额度 */ private void distributeFeeToShop(Long id, Long totalFee) { if(totalFee < 100L){ throw new IllegalArgumentException("当前活动总额度不足1元,无法开始"); } ActivityShopRecordQuery query = new ActivityShopRecordQuery(); query.setActivityId(id); List shopRecordList = activityShopRecordMapper.selectList(query); if (!CollectionUtils.isEmpty(shopRecordList)) { Integer[] surplusFee = distributeFeeToShop(shopRecordList.size(), totalFee); shopRecordList.forEach(r -> { Long userId = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC).getId(); Date currentDate = new Date(); Long totalFeePerShop = surplusFee[shopRecordList.indexOf(r)].longValue(); r.setTotalFee(totalFeePerShop); r.setSurplusFee(totalFeePerShop); r.setUseFee(0L); r.setUpdateBy(userId); r.setUpdateTime(currentDate); }); activityShopRecordMapper.batchUpdate(shopRecordList); } } /** * 额度平均分配 * @param number 分配数量 * @param total 分配总额 * @return */ private Integer[] distributeFeeToShop(int number,Long total){ int totalFee = total.intValue(); Integer[] result = new Integer[number]; int value = totalFee / number; int index = totalFee - (value * number); for (int i = 0; i < number; i++) { if (i < index) { result[i] = value + 1; } else { result[i] = value; } } return result; } /** * 方法描述: 查询活动详情-活动数据 **/ @Override public ActivityFeeDetailDto getActivityFeeDetail(Long id) { ActivityFeeDetailDto detailDto = new ActivityFeeDetailDto(); //活动基本信息查询 ActivityFee activityFee = activityFeeMapper.selectByPrimaryKey(id); BeanUtils.copyProperties(activityFee,detailDto); //shopUseFees 已消耗额度 = 统计活动商户的sum(usefee) ActivityShopRecordQuery query = new ActivityShopRecordQuery(); query.setActivityId(id); List recordList = activityShopRecordMapper.selectList(query); if(!CollectionUtils.isEmpty(recordList)){ Long shopUseFees = recordList.stream().mapToLong(ActivityShopRecord::getUseFee).sum(); //已消耗 = useFee detailDto.setUseFee(shopUseFees); } //查询活动分配出去的预算信息(分配出去的预算展示会替换当前的活动预算) SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC); ActivityDistributeRecord record = activityDistributeRecordMapper.getFeeByCondition(id,user.getOrgId()); if(record != null) { detailDto.setTotalFee(record.getTotalFee()); detailDto.setSurplusFee(record.getSurplusFee()); } //assigned = 已分配额度 detailDto.setAssigned(detailDto.getTotalFee() - detailDto.getSurplusFee()); //匹配查询创建人 SysUser sysUser = sysUserMapper.getUserById(activityFee.getCreateBy()); detailDto.setCreateUserName(sysUser.getUserName()); //当前活动的预算分配列表查询 List budgetDtoList = activityDistributeRecordMapper.getActivityDistributeRecordDetailByAId(id,user.getOrgCode()); detailDto.setDistributeBudgets(budgetDtoList); return detailDto; } }