xieb
2023-12-26 41b2f09be327c72a52e41f80dd3b56e7cac19681
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
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.evaluate.service.impl;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.AllArgsConstructor;
import org.springblade.common.cache.SysCache;
import org.springblade.common.cache.UserCache;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.modules.assessment.wrapper.CandidateJsonObj;
import org.springblade.modules.assessment.wrapper.UserJsonObj;
import org.springblade.modules.evaluate.entity.EvaluateCandidateEntity;
import org.springblade.modules.evaluate.entity.EvaluateResultEntity;
import org.springblade.modules.evaluate.entity.EvaluateTaskEntity;
import org.springblade.modules.evaluate.entity.EvaluateTaskSetEntity;
import org.springblade.modules.evaluate.service.IEvaluateCandidateService;
import org.springblade.modules.evaluate.service.IEvaluateTaskService;
import org.springblade.modules.evaluate.service.IEvaluateTaskSetService;
import org.springblade.modules.evaluate.vo.EvaluateResultVO;
import org.springblade.modules.evaluate.excel.EvaluateResultExcel;
import org.springblade.modules.evaluate.mapper.EvaluateResultMapper;
import org.springblade.modules.evaluate.service.IEvaluateResultService;
import org.springblade.modules.evaluate.wrapper.EvaluateResultWrapper;
import org.springblade.modules.system.entity.User;
import org.springblade.modules.system.service.IUserService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.ArrayList;
import java.util.List;
 
import static org.springblade.common.cache.CacheNames.EVALUATE_CANDIDATE_DEPT_KEY;
 
/**
 * 评优结果 服务实现类
 *
 * @author aix
 * @since 2023-12-18
 */
@Service
@AllArgsConstructor
public class EvaluateResultServiceImpl extends BaseServiceImpl<EvaluateResultMapper, EvaluateResultEntity> implements IEvaluateResultService {
 
    private final IEvaluateTaskService evaluateTaskService;
 
    private final IUserService userService;
 
    private final IEvaluateCandidateService evaluateCandidateService;
 
    private final BladeRedis bladeRedis;
 
    @Override
    public IPage<EvaluateResultVO> selectEvaluateResultPage(IPage<EvaluateResultVO> page, EvaluateResultVO evaluateResult) {
        return page.setRecords(baseMapper.selectEvaluateResultPage(page, evaluateResult));
    }
 
    @Override
    public IPage<EvaluateResultVO> selectEvaluateResultGroupBeId(IPage<EvaluateResultVO> page, EvaluateResultVO evaluateResult,List<Long> userIds) {
        return page.setRecords(EvaluateResultWrapper.build().listVO(baseMapper.selectEvaluateResultGroupBeId(page, evaluateResult, userIds)));
    }
 
    @Override
    public IPage<EvaluateResultVO> selectEvaluateResultByScoreIdsGroupBeId(IPage<EvaluateResultVO> page, EvaluateResultVO evaluateResult, List<Long> scoreUserIds) {
        return page.setRecords(EvaluateResultWrapper.build().listVO(baseMapper.selectEvaluateResultGroupBeId(page, evaluateResult, scoreUserIds)));
    }
 
    @Override
    public List<EvaluateResultExcel> exportEvaluateResult(Wrapper<EvaluateResultEntity> queryWrapper) {
        List<EvaluateResultExcel> evaluateResultList = baseMapper.exportEvaluateResult(queryWrapper);
        //evaluateResultList.forEach(evaluateResult -> {
        //    evaluateResult.setTypeName(DictCache.getValue(DictEnum.YES_NO, EvaluateResult.getType()));
        //});
        return evaluateResultList;
    }
 
    @Override
    @Transactional
    public boolean saveOrUpdate(EvaluateResultEntity evaluateResult) {
 
        boolean ret = super.saveOrUpdate(evaluateResult);
 
        // 是否评分完成判断此操作
        if (ret) {
 
            EvaluateTaskEntity taskPO = evaluateTaskService.getById(evaluateResult.getEvaluateTaskId());
 
            //判断评分是否完成   0:type 判断设置的部门员工是否完成评分    1:type 判断设置的部门是否完成评分
            if (evaluateResult.getType() == 0) {
 
                List<CandidateJsonObj> candidateJsonObjs = JSONArray.parseArray(JSON.toJSONString(taskPO.getCandidateNum()),CandidateJsonObj.class);
 
                List<Long> deptIds = new ArrayList<>();
                for (CandidateJsonObj obj:candidateJsonObjs) {
 
                    // 用户判断是否所有部门所有用户投票完成,改变任务状态使用
                    deptIds.add(obj.getDeptId());
 
                    //该部门是否投票完成,投票完成增加候选人信息
                    Boolean isAddCandidate = Func.toBoolean(bladeRedis.get(EVALUATE_CANDIDATE_DEPT_KEY + evaluateResult.getEvaluateTaskId() + obj.getDeptId()));
                    if (null == isAddCandidate || !isAddCandidate) {
                        //根据部门获取所有用户数量
                        QueryWrapper<User> queryWrapper = new QueryWrapper();
                        queryWrapper.eq("dept_id", obj.getDeptId());
                        List<User> deptUsers = userService.list(queryWrapper);
                        // 拿到设置部门所有用户数量
                        int userByDeptIdCount = deptUsers.size();
 
                        // 拿到该部门的所有投票结果
                        List<Long> userIds = new ArrayList<>();
                        for (User deptUser:deptUsers) {
                            userIds.add(deptUser.getId());
                        }
 
                        //部门所有用户数量和部门的所有投票结果
                        QueryWrapper<EvaluateResultEntity> resultEntityQueryWrapper = new QueryWrapper<>();
                        resultEntityQueryWrapper.eq("evaluate_task_id", evaluateResult.getEvaluateTaskId());
                        resultEntityQueryWrapper.in("score_user_id", userIds); //评分人
                        Long evaluateResultCount = count(resultEntityQueryWrapper);
 
                        if (userByDeptIdCount == evaluateResultCount) { //如果相等表示该部门所有人都投票完成 开始增加候选人
                            // 是否已经增加了候选人
 
                            //开始增加候选人
                            Integer val = obj.getVal();
 
                            Page<EvaluateResultVO> page = new Page<>();
                            page.setCurrent(1);
                            page.setSize(val);
                            EvaluateResultVO vo = new EvaluateResultVO();
                            vo.setType(0);
                            vo.setEvaluateTaskId(evaluateResult.getEvaluateTaskId());
 
                            IPage<EvaluateResultVO> evaluateResultVOIPage = selectEvaluateResultByScoreIdsGroupBeId(page,vo,userIds);
                            for (EvaluateResultVO resultVO:evaluateResultVOIPage.getRecords()) {
                                EvaluateCandidateEntity evaluateCandidate = new EvaluateCandidateEntity();
                                evaluateCandidate.setEvaluateTaskId(evaluateResult.getEvaluateTaskId());
                                evaluateCandidate.setEvaluateTaskName(taskPO.getTaskName());
                                User user = UserCache.getUser(resultVO.getBeId());
                                evaluateCandidate.setUserId(user.getId());
                                evaluateCandidate.setUserName(user.getName());
                                evaluateCandidate.setDeptName(SysCache.getDeptName(Long.valueOf(user.getDeptId())));
                                evaluateCandidate.setPostName(SysCache.getPostName(Long.valueOf(user.getPostId())));
                                evaluateCandidateService.save(evaluateCandidate);
                                bladeRedis.set(EVALUATE_CANDIDATE_DEPT_KEY + evaluateResult.getEvaluateTaskId() + obj.getDeptId(), true);
                            }
                        }
                    }
 
                }
 
                //根据部门获取所有用户数量
                QueryWrapper<User> queryWrapper = new QueryWrapper();
                queryWrapper.in("dept_id", deptIds);
                // 拿到设置部门所有用户数量
                Long userByDeptIdsCount = userService.count(queryWrapper);
 
                //用户数量和评优数据进行匹配 相同需要设置任务状态为已完成
                QueryWrapper<EvaluateResultEntity> resultEntityQueryWrapper = new QueryWrapper<>();
                resultEntityQueryWrapper.eq("evaluate_task_id", evaluateResult.getEvaluateTaskId());
                Long evaluateResultCount = count(resultEntityQueryWrapper);
 
                // 相同需要设置任务状态为已完成 不同不处理    修改为一个部门投票结束就增加候选人
                if (userByDeptIdsCount == evaluateResultCount) {
                    taskPO.setCandidateState(2);//结束
                    evaluateTaskService.updateById(taskPO);
                }
 
            } else if (evaluateResult.getType() == 1) {
                QueryWrapper<EvaluateResultEntity> resultEntityQueryWrapper = new QueryWrapper<>();
                resultEntityQueryWrapper.eq("evaluate_task_id", evaluateResult.getEvaluateTaskId());
                Long evaluateResultCount = count(resultEntityQueryWrapper);
 
                //部门评优数量和所有用户匹配 修改为选定的评定人
                List<CandidateJsonObj> candidateJsonObjs = JSONArray.parseArray(JSON.toJSONString(taskPO.getCandidateNum()),CandidateJsonObj.class);
                int setUserCount = 0;
                for (CandidateJsonObj obj:candidateJsonObjs) {
                    List<UserJsonObj> userJsonObjs = obj.getUsers();
                    setUserCount += userJsonObjs.size();
                }
 
                // 相同需要设置任务状态为已完成 不同不处理
                if (setUserCount == evaluateResultCount) {
                    taskPO.setEvaluateState(2);//结束
                    evaluateTaskService.updateById(taskPO);
                }
            }
        }
 
        return ret;
    }
 
}