|
|
|
|
@ -8,16 +8,14 @@ import java.util.stream.Collectors;
|
|
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
|
|
import com.ruoyi.common.core.domain.AjaxResult;
|
|
|
|
|
import com.ruoyi.common.utils.DateUtils;
|
|
|
|
|
import com.ruoyi.kaohe.domain.KhVoteItems;
|
|
|
|
|
import com.ruoyi.kaohe.domain.KhVoteRecard;
|
|
|
|
|
import com.ruoyi.kaohe.domain.KhVoteRecardParam;
|
|
|
|
|
import com.ruoyi.kaohe.domain.*;
|
|
|
|
|
import com.ruoyi.kaohe.mapper.KhVoteItemsMapper;
|
|
|
|
|
import com.ruoyi.kaohe.mapper.KhVoteMapper;
|
|
|
|
|
import com.ruoyi.kaohe.mapper.KhVoteRecardMapper;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import com.ruoyi.kaohe.mapper.KhVoteEmpMapper;
|
|
|
|
|
import com.ruoyi.kaohe.domain.KhVoteEmp;
|
|
|
|
|
import com.ruoyi.kaohe.service.IKhVoteEmpService;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
|
|
@ -37,6 +35,9 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
|
private KhVoteRecardMapper khVoteRecardMapper;
|
|
|
|
|
@Autowired
|
|
|
|
|
private KhVoteItemsMapper khVoteItemsMapper;
|
|
|
|
|
@Autowired
|
|
|
|
|
private KhVoteMapper khVoteMapper;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询投票选项
|
|
|
|
|
@ -114,15 +115,72 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional
|
|
|
|
|
// @Async("threadPoolTaskExecutor")
|
|
|
|
|
public AjaxResult statisticalResults(Long id) {
|
|
|
|
|
//修改未已统计计算
|
|
|
|
|
KhVote vote = new KhVote();
|
|
|
|
|
vote.setId(id);
|
|
|
|
|
vote.setStatistical("1");
|
|
|
|
|
khVoteMapper.updateKhVote(vote);
|
|
|
|
|
|
|
|
|
|
//统计计算平均值、最终值
|
|
|
|
|
KhVoteEmp vEmp = new KhVoteEmp();
|
|
|
|
|
vEmp.setVoteId(id);
|
|
|
|
|
List<KhVoteEmp> khVoteEmps = khVoteEmpMapper.selectKhVoteEmpList(vEmp);
|
|
|
|
|
for (KhVoteEmp voteEmp : khVoteEmps) {
|
|
|
|
|
if(!(voteEmp.getVoteNum().compareTo(BigDecimal.ZERO) == 1)){
|
|
|
|
|
return AjaxResult.error("投票人数需大于0才能统计");
|
|
|
|
|
}
|
|
|
|
|
if (voteEmp.getKhitemTypeid().equals(1L)) { //选项评分
|
|
|
|
|
List<KhVoteItems> voteItems = khVoteItemsMapper.selectKhVoteItemsList(null);//从数据库获取分值
|
|
|
|
|
BigDecimal a = new BigDecimal("100");
|
|
|
|
|
BigDecimal b = new BigDecimal("80");
|
|
|
|
|
BigDecimal c = new BigDecimal("60");
|
|
|
|
|
BigDecimal d = new BigDecimal("40");
|
|
|
|
|
|
|
|
|
|
if (voteItems != null && voteItems.size() > 0) {
|
|
|
|
|
for (KhVoteItems voteItem : voteItems) {
|
|
|
|
|
if (voteItem.getId() == 1) {
|
|
|
|
|
a = voteItem.getScore();
|
|
|
|
|
} else if (voteItem.getId() == 2) {
|
|
|
|
|
b = voteItem.getScore();
|
|
|
|
|
} else if (voteItem.getId() == 3) {
|
|
|
|
|
c = voteItem.getScore();
|
|
|
|
|
} else {
|
|
|
|
|
d = voteItem.getScore();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//修改投票情况
|
|
|
|
|
BigDecimal avgScore = (voteEmp.getOptionA().multiply(a).add(voteEmp.getOptionB().multiply(b).add(voteEmp.getOptionC().multiply(c).add(voteEmp.getOptionD().multiply(d)))
|
|
|
|
|
)).divide(voteEmp.getVoteNum(), 4, RoundingMode.HALF_UP);
|
|
|
|
|
|
|
|
|
|
voteEmp.setAvgScore(avgScore);//投票后计算平均分
|
|
|
|
|
if (voteEmp.getPercentage() != null) {
|
|
|
|
|
voteEmp.setEndScore(avgScore.multiply(voteEmp.getPercentage()));//计算最后得分
|
|
|
|
|
} else {
|
|
|
|
|
voteEmp.setEndScore(avgScore);
|
|
|
|
|
}
|
|
|
|
|
} else if (voteEmp.getKhitemTypeid().equals(2L)) {
|
|
|
|
|
voteEmp.setAvgScore(voteEmp.getVoteScore().divide(voteEmp.getVoteNum(), 4, RoundingMode.HALF_UP));//计算平均分
|
|
|
|
|
voteEmp.setEndScore(voteEmp.getOptionA().multiply(voteEmp.getPercentage())); //计算最终分
|
|
|
|
|
} else if (voteEmp.getKhitemTypeid().equals(3L)) {
|
|
|
|
|
voteEmp.setAvgScore(voteEmp.getVoteScore().divide(voteEmp.getVoteNum(), 4, RoundingMode.HALF_UP));
|
|
|
|
|
voteEmp.setEndScore(voteEmp.getAvgScore());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return khVoteEmpMapper.updateKhVoteEmp1(khVoteEmps)> 0 ? AjaxResult.success() : AjaxResult.error();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
// @Async("threadPoolTaskExecutor") 异步添加需要同时开启主类的注解,另外会导致事务注解失效
|
|
|
|
|
public AjaxResult voteSubmit(KhVoteRecardParam param) {
|
|
|
|
|
System.out.println("------------------------开始异步批量处理用户数据,线程:" + Thread.currentThread().getName());
|
|
|
|
|
System.out.println("------------------------开始批量处理评分数据,线程:" + Thread.currentThread().getName());
|
|
|
|
|
Map<String, String> xuanxiangDetails = new LinkedHashMap<>();
|
|
|
|
|
Map<String, BigDecimal> pingFenDetails = new LinkedHashMap<>();
|
|
|
|
|
BigDecimal num = new BigDecimal("1");//投票人数+1
|
|
|
|
|
List<KhVoteEmp> voteEmpList = param.getVoteEmpList();
|
|
|
|
|
Date nowDate = DateUtils.getNowDate();
|
|
|
|
|
Long typeid = param.getKhitemTypeid();
|
|
|
|
|
Date nowDate = DateUtils.getNowDate();
|
|
|
|
|
|
|
|
|
|
//存储投票记录
|
|
|
|
|
KhVoteRecard recard = new KhVoteRecard();
|
|
|
|
|
@ -131,15 +189,10 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
|
recard.setVoteId(param.getVoteId());
|
|
|
|
|
recard.setUserId(param.getUserId());
|
|
|
|
|
recard.setUserName(param.getUserName());
|
|
|
|
|
// recard.setUid(param.getUid());
|
|
|
|
|
|
|
|
|
|
//选项评分
|
|
|
|
|
if (typeid.equals(1L)) {
|
|
|
|
|
List<KhVoteItems> voteItems = khVoteItemsMapper.selectKhVoteItemsList(null);//从数据库获取分值
|
|
|
|
|
BigDecimal a = new BigDecimal("100");
|
|
|
|
|
BigDecimal b = new BigDecimal("80");
|
|
|
|
|
BigDecimal c = new BigDecimal("60");
|
|
|
|
|
BigDecimal d = new BigDecimal("40");
|
|
|
|
|
String aName = "优秀";
|
|
|
|
|
String bName = "合格";
|
|
|
|
|
String cName = "基本合格";
|
|
|
|
|
@ -147,170 +200,42 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
|
if (voteItems != null && voteItems.size() > 0) {
|
|
|
|
|
for (KhVoteItems voteItem : voteItems) {
|
|
|
|
|
if (voteItem.getId() == 1) {
|
|
|
|
|
a = voteItem.getScore();
|
|
|
|
|
aName = voteItem.getVitemName();
|
|
|
|
|
} else if (voteItem.getId() == 2) {
|
|
|
|
|
b = voteItem.getScore();
|
|
|
|
|
bName = voteItem.getVitemName();
|
|
|
|
|
} else if (voteItem.getId() == 3) {
|
|
|
|
|
c = voteItem.getScore();
|
|
|
|
|
cName = voteItem.getVitemName();
|
|
|
|
|
} else {
|
|
|
|
|
d = voteItem.getScore();
|
|
|
|
|
dName = voteItem.getVitemName();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
|
// 最大重试次数
|
|
|
|
|
// final int MAX_RETRY_COUNT = 3;
|
|
|
|
|
int retryCount = 0;
|
|
|
|
|
/* while (true) {*/
|
|
|
|
|
voteEmp.setUpdateTime(nowDate);
|
|
|
|
|
//根据id查询数据得到原值及版本号
|
|
|
|
|
KhVoteEmp oldvoteEmp = khVoteEmpMapper.selectKhVoteEmpById(voteEmp.getId());
|
|
|
|
|
//存储投票详情到map
|
|
|
|
|
if (voteEmp.getOptionA().compareTo(BigDecimal.ZERO) == 1) {
|
|
|
|
|
// xuanxiangDetails.put(voteEmp.getBkhdxId().toString(), voteEmp.getBkhdxName()+":优秀");
|
|
|
|
|
xuanxiangDetails.put(voteEmp.getBkhdxName(), aName);
|
|
|
|
|
}
|
|
|
|
|
if (voteEmp.getOptionB().compareTo(BigDecimal.ZERO) == 1) {
|
|
|
|
|
//xuanxiangDetails.put(voteEmp.getBkhdxId().toString(), voteEmp.getBkhdxName()+":合格");
|
|
|
|
|
xuanxiangDetails.put(voteEmp.getBkhdxName(), bName);
|
|
|
|
|
}
|
|
|
|
|
if (voteEmp.getOptionC().compareTo(BigDecimal.ZERO) == 1) {
|
|
|
|
|
//xuanxiangDetails.put(voteEmp.getBkhdxId().toString(), voteEmp.getBkhdxName()+":基本合格");
|
|
|
|
|
xuanxiangDetails.put(voteEmp.getBkhdxName(), cName);
|
|
|
|
|
}
|
|
|
|
|
if (voteEmp.getOptionD().compareTo(BigDecimal.ZERO) == 1) {
|
|
|
|
|
//xuanxiangDetails.put(voteEmp.getBkhdxId().toString(), voteEmp.getBkhdxName()+":不合格");
|
|
|
|
|
xuanxiangDetails.put(voteEmp.getBkhdxName(), dName);
|
|
|
|
|
}
|
|
|
|
|
//修改投票情况
|
|
|
|
|
BigDecimal optionA = voteEmp.getOptionA().add(oldvoteEmp.getOptionA());
|
|
|
|
|
BigDecimal optionB = voteEmp.getOptionB().add(oldvoteEmp.getOptionB());
|
|
|
|
|
BigDecimal optionC = voteEmp.getOptionC().add(oldvoteEmp.getOptionC());
|
|
|
|
|
BigDecimal optionD = voteEmp.getOptionD().add(oldvoteEmp.getOptionD());
|
|
|
|
|
voteEmp.setVoteNum(oldvoteEmp.getVoteNum().add(num));
|
|
|
|
|
BigDecimal avgScore = (optionA.multiply(a).add(optionB.multiply(b).add(optionC.multiply(c).add(optionD.multiply(d)))
|
|
|
|
|
)).divide(voteEmp.getVoteNum(), 4, RoundingMode.HALF_UP);
|
|
|
|
|
voteEmp.setAvgScore(avgScore);//投票后计算平均分
|
|
|
|
|
voteEmp.setOptionA(optionA);
|
|
|
|
|
voteEmp.setOptionB(optionB);
|
|
|
|
|
voteEmp.setOptionC(optionC);
|
|
|
|
|
voteEmp.setOptionD(optionD);
|
|
|
|
|
if (oldvoteEmp.getPercentage() != null) { //计算最后得分
|
|
|
|
|
voteEmp.setEndScore(avgScore.multiply(oldvoteEmp.getPercentage()));
|
|
|
|
|
} else {
|
|
|
|
|
voteEmp.setEndScore(avgScore);
|
|
|
|
|
}
|
|
|
|
|
voteEmp.setVersion(oldvoteEmp.getVersion());
|
|
|
|
|
int result = khVoteEmpMapper.updateKhVoteEmp(voteEmp);
|
|
|
|
|
/*if (result > 0) {
|
|
|
|
|
break;
|
|
|
|
|
} else {
|
|
|
|
|
// 更新失败,版本冲突,增加重试计数
|
|
|
|
|
retryCount++;
|
|
|
|
|
if (retryCount > 3) {
|
|
|
|
|
throw new RuntimeException("重试次数过多被中断-------------");
|
|
|
|
|
}
|
|
|
|
|
System.out.println("-----------版本冲突," + voteEmp.getBkhdxName() + "第" + retryCount + "次重试");
|
|
|
|
|
// 等待一段时间后重试,避免立即重试导致的持续冲突
|
|
|
|
|
try {
|
|
|
|
|
Thread.sleep(1000 * retryCount); // 重试间隔递增
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
Thread.currentThread().interrupt();
|
|
|
|
|
throw new RuntimeException("重试过程异常中断-------------", e);
|
|
|
|
|
for (int i = 0; i < voteEmpList.size(); i++) {
|
|
|
|
|
voteEmpList.get(i).setKhitemTypeid(typeid);
|
|
|
|
|
voteEmpList.get(i).setUpdateTime(nowDate);
|
|
|
|
|
if (voteEmpList.get(i).getOptionA().compareTo(BigDecimal.ZERO) == 1) {
|
|
|
|
|
xuanxiangDetails.put(voteEmpList.get(i).getBkhdxName(), aName);
|
|
|
|
|
} else if (voteEmpList.get(i).getOptionB().compareTo(BigDecimal.ZERO) == 1) {
|
|
|
|
|
xuanxiangDetails.put(voteEmpList.get(i).getBkhdxName(), bName);
|
|
|
|
|
} else if (voteEmpList.get(i).getOptionC().compareTo(BigDecimal.ZERO) == 1) {
|
|
|
|
|
xuanxiangDetails.put(voteEmpList.get(i).getBkhdxName(), cName);
|
|
|
|
|
} else if (voteEmpList.get(i).getOptionD().compareTo(BigDecimal.ZERO) == 1) {
|
|
|
|
|
xuanxiangDetails.put(voteEmpList.get(i).getBkhdxName(), dName);
|
|
|
|
|
}
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
}*/
|
|
|
|
|
}
|
|
|
|
|
} else if (typeid.equals(2L)) {//占比评分
|
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
|
int retryCount = 0;
|
|
|
|
|
/* while (true) {*/
|
|
|
|
|
voteEmp.setUpdateTime(nowDate);
|
|
|
|
|
//根据id查询数据得到之前的值
|
|
|
|
|
KhVoteEmp oldvoteEmp = khVoteEmpMapper.selectKhVoteEmpById(voteEmp.getId());
|
|
|
|
|
BigDecimal sumScore = voteEmp.getScore().add(oldvoteEmp.getVoteScore());
|
|
|
|
|
voteEmp.setVoteScore(sumScore);
|
|
|
|
|
//修改投票人数 平均分*占比=最后得分
|
|
|
|
|
voteEmp.setVoteNum(oldvoteEmp.getVoteNum().add(num));
|
|
|
|
|
voteEmp.setAvgScore(sumScore.divide(voteEmp.getVoteNum(), 4, RoundingMode.HALF_UP));
|
|
|
|
|
voteEmp.setEndScore(voteEmp.getAvgScore().multiply(oldvoteEmp.getPercentage()));
|
|
|
|
|
voteEmp.setVersion(oldvoteEmp.getVersion());
|
|
|
|
|
int result = khVoteEmpMapper.updateKhVoteEmp(voteEmp);
|
|
|
|
|
/*if (result > 0) {
|
|
|
|
|
break;
|
|
|
|
|
} else {
|
|
|
|
|
// 更新失败,版本冲突,增加重试计数
|
|
|
|
|
retryCount++;
|
|
|
|
|
if (retryCount > 3) {
|
|
|
|
|
throw new RuntimeException("重试次数过多被中断-------------");
|
|
|
|
|
}
|
|
|
|
|
System.out.println("-----------版本冲突," + voteEmp.getBkhdxName() + "第" + retryCount + "次重试");
|
|
|
|
|
// 等待一段时间后重试,避免立即重试导致的持续冲突
|
|
|
|
|
try {
|
|
|
|
|
Thread.sleep(1000 * retryCount); // 重试间隔递增
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
Thread.currentThread().interrupt();
|
|
|
|
|
throw new RuntimeException("重试过程异常中断-------------", e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}*/
|
|
|
|
|
}
|
|
|
|
|
} else {//单独评分 不占比 以平均分为最后得分
|
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
|
int retryCount = 0;
|
|
|
|
|
/* while (true) {*/
|
|
|
|
|
voteEmp.setUpdateTime(nowDate);
|
|
|
|
|
//根据id查询数据得到之前的值
|
|
|
|
|
KhVoteEmp oldvoteEmp = khVoteEmpMapper.selectKhVoteEmpById(voteEmp.getId());
|
|
|
|
|
BigDecimal sumScore = voteEmp.getScore().add(oldvoteEmp.getVoteScore());
|
|
|
|
|
voteEmp.setVoteNum(oldvoteEmp.getVoteNum()
|
|
|
|
|
.add(num));
|
|
|
|
|
voteEmp.setVoteScore(sumScore);
|
|
|
|
|
voteEmp.setAvgScore(sumScore.divide(voteEmp.getVoteNum(), 4, RoundingMode.HALF_UP));
|
|
|
|
|
voteEmp.setEndScore(voteEmp.getAvgScore());
|
|
|
|
|
voteEmp.setVersion(oldvoteEmp.getVersion());
|
|
|
|
|
int result = khVoteEmpMapper.updateKhVoteEmp(voteEmp);
|
|
|
|
|
/*if (result > 0) {
|
|
|
|
|
break;
|
|
|
|
|
} else {
|
|
|
|
|
// 更新失败,版本冲突,增加重试计数
|
|
|
|
|
retryCount++;
|
|
|
|
|
if (retryCount > 3) {
|
|
|
|
|
throw new RuntimeException("重试次数过多被中断-------------");
|
|
|
|
|
}
|
|
|
|
|
System.out.println("-----------版本冲突," + voteEmp.getBkhdxName() + "第" + retryCount + "次重试");
|
|
|
|
|
// 等待一段时间后重试,避免立即重试导致的持续冲突
|
|
|
|
|
try {
|
|
|
|
|
Thread.sleep(1000 * retryCount); // 重试间隔递增
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
Thread.currentThread().interrupt();
|
|
|
|
|
throw new RuntimeException("重试过程异常中断-------------", e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}*/
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//存储投票记录
|
|
|
|
|
recard.setVoteTime(nowDate);
|
|
|
|
|
if (typeid.equals(1L)) {//选项评分
|
|
|
|
|
recard.setVoteDetails(JSON.toJSONString(xuanxiangDetails));
|
|
|
|
|
} else {
|
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
|
//xuanxiangDetails.put(voteEmp.getBkhdxId().toString(), voteEmp.getBkhdxName()+":"+voteEmp.getScore());
|
|
|
|
|
pingFenDetails.put(voteEmp.getBkhdxName()/*+voteEmp.getBkhdxId()*/, voteEmp.getScore());
|
|
|
|
|
recard.setVoteDetails(JSON.toJSONString(pingFenDetails));
|
|
|
|
|
} else {//占比评分 或 单独评分
|
|
|
|
|
for (int i = 0; i < voteEmpList.size(); i++) {
|
|
|
|
|
voteEmpList.get(i).setKhitemTypeid(typeid);
|
|
|
|
|
voteEmpList.get(i).setUpdateTime(nowDate);
|
|
|
|
|
pingFenDetails.put(voteEmpList.get(i).getBkhdxName(), voteEmpList.get(i).getScore());
|
|
|
|
|
}
|
|
|
|
|
/*List<String> details = voteEmpList.stream()
|
|
|
|
|
.map(emp -> emp.getBkhdxName() + " : " + emp.getScore())
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
recard.setVoteDetails(JSON.toJSONString(details));*/
|
|
|
|
|
//存储投票记录
|
|
|
|
|
recard.setVoteDetails(JSON.toJSONString(pingFenDetails));
|
|
|
|
|
}
|
|
|
|
|
//批量修改评分数据
|
|
|
|
|
khVoteEmpMapper.batchUpdateVoteScore(voteEmpList);
|
|
|
|
|
khVoteRecardMapper.insertKhVoteRecard(recard);
|
|
|
|
|
return AjaxResult.success();
|
|
|
|
|
}
|
|
|
|
|
|