xuekang
2024-05-13 15a0280ae9e7db96fdf0744c722d214d2cb5a0e5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
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;
    }
 
}