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<ActivityFee> 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<ActivityFee> 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<ActivityShopRecord> 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<ActivityShopRecord> 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<ActivityDistributeBudgetDto> budgetDtoList = activityDistributeRecordMapper.getActivityDistributeRecordDetailByAId(id,user.getOrgCode());
|
detailDto.setDistributeBudgets(budgetDtoList);
|
return detailDto;
|
}
|
|
}
|