|
|
|
@ -59,6 +59,11 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
return khVoteEmpMapper.selectKhVoteEmpList(khVoteEmp);
|
|
|
|
return khVoteEmpMapper.selectKhVoteEmpList(khVoteEmp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public List<KhVoteEmp> selectVoteEmpsByVoteId(KhVoteEmp khVoteEmp) {
|
|
|
|
|
|
|
|
return khVoteEmpMapper.selectVoteEmpsByVoteId(khVoteEmp);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 新增投票选项
|
|
|
|
* 新增投票选项
|
|
|
|
*
|
|
|
|
*
|
|
|
|
@ -96,6 +101,7 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 删除投票选项信息
|
|
|
|
* 删除投票选项信息
|
|
|
|
|
|
|
|
* 手动实现乐观锁重试机制
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @param id 投票选项主键
|
|
|
|
* @param id 投票选项主键
|
|
|
|
* @return 结果
|
|
|
|
* @return 结果
|
|
|
|
@ -109,6 +115,7 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
@Transactional
|
|
|
|
@Transactional
|
|
|
|
public AjaxResult voteSubmit(KhVoteRecardParam param) {
|
|
|
|
public AjaxResult voteSubmit(KhVoteRecardParam param) {
|
|
|
|
Map<String, String> xuanxiangDetails = new LinkedHashMap<>();
|
|
|
|
Map<String, String> xuanxiangDetails = new LinkedHashMap<>();
|
|
|
|
|
|
|
|
Map<String, BigDecimal> pingFenDetails = new LinkedHashMap<>();
|
|
|
|
BigDecimal num = new BigDecimal("1");//投票人数+1
|
|
|
|
BigDecimal num = new BigDecimal("1");//投票人数+1
|
|
|
|
List<KhVoteEmp> voteEmpList = param.getVoteEmpList();
|
|
|
|
List<KhVoteEmp> voteEmpList = param.getVoteEmpList();
|
|
|
|
Date nowDate = DateUtils.getNowDate();
|
|
|
|
Date nowDate = DateUtils.getNowDate();
|
|
|
|
@ -142,8 +149,12 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
|
|
|
|
// 最大重试次数
|
|
|
|
|
|
|
|
// final int MAX_RETRY_COUNT = 3;
|
|
|
|
|
|
|
|
int retryCount = 0;
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
voteEmp.setUpdateTime(nowDate);
|
|
|
|
voteEmp.setUpdateTime(nowDate);
|
|
|
|
//根据id查询数据得到之前的值
|
|
|
|
//根据id查询数据得到原值及版本号
|
|
|
|
KhVoteEmp oldvoteEmp = khVoteEmpMapper.selectKhVoteEmpById(voteEmp.getId());
|
|
|
|
KhVoteEmp oldvoteEmp = khVoteEmpMapper.selectKhVoteEmpById(voteEmp.getId());
|
|
|
|
//存储投票详情到map
|
|
|
|
//存储投票详情到map
|
|
|
|
if (voteEmp.getOptionA().compareTo(BigDecimal.ZERO) == 1) {
|
|
|
|
if (voteEmp.getOptionA().compareTo(BigDecimal.ZERO) == 1) {
|
|
|
|
@ -180,10 +191,31 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
voteEmp.setEndScore(avgScore);
|
|
|
|
voteEmp.setEndScore(avgScore);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
khVoteEmpMapper.updateKhVoteEmp(voteEmp);
|
|
|
|
voteEmp.setVersion(oldvoteEmp.getVersion());
|
|
|
|
|
|
|
|
int result = khVoteEmpMapper.updateKhVoteEmp(voteEmp);
|
|
|
|
|
|
|
|
if (result > 0) {
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 更新失败,版本冲突,增加重试计数
|
|
|
|
|
|
|
|
retryCount++;
|
|
|
|
|
|
|
|
System.out.println("-----------版本冲突," + voteEmp.getId() + "第" + retryCount + "次重试");
|
|
|
|
|
|
|
|
// if (retryCount < MAX_RETRY_COUNT) {
|
|
|
|
|
|
|
|
// 等待一段时间后重试,避免立即重试导致的持续冲突
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
Thread.sleep(100); // 重试间隔递增
|
|
|
|
|
|
|
|
//Thread.sleep(200 * retryCount); // 重试间隔递增
|
|
|
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
|
|
|
Thread.currentThread().interrupt();
|
|
|
|
|
|
|
|
throw new RuntimeException("重试过程被中断-------------", e);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (typeid.equals(2L)) {//占比评分
|
|
|
|
} else if (typeid.equals(2L)) {//占比评分
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
|
|
|
|
int retryCount = 0;
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
voteEmp.setUpdateTime(nowDate);
|
|
|
|
voteEmp.setUpdateTime(nowDate);
|
|
|
|
//根据id查询数据得到之前的值
|
|
|
|
//根据id查询数据得到之前的值
|
|
|
|
KhVoteEmp oldvoteEmp = khVoteEmpMapper.selectKhVoteEmpById(voteEmp.getId());
|
|
|
|
KhVoteEmp oldvoteEmp = khVoteEmpMapper.selectKhVoteEmpById(voteEmp.getId());
|
|
|
|
@ -193,10 +225,30 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
voteEmp.setVoteNum(oldvoteEmp.getVoteNum().add(num));
|
|
|
|
voteEmp.setVoteNum(oldvoteEmp.getVoteNum().add(num));
|
|
|
|
voteEmp.setAvgScore(sumScore.divide(voteEmp.getVoteNum(), 4, RoundingMode.HALF_UP));
|
|
|
|
voteEmp.setAvgScore(sumScore.divide(voteEmp.getVoteNum(), 4, RoundingMode.HALF_UP));
|
|
|
|
voteEmp.setEndScore(voteEmp.getAvgScore().multiply(oldvoteEmp.getPercentage()));
|
|
|
|
voteEmp.setEndScore(voteEmp.getAvgScore().multiply(oldvoteEmp.getPercentage()));
|
|
|
|
khVoteEmpMapper.updateKhVoteEmp(voteEmp);
|
|
|
|
voteEmp.setVersion(oldvoteEmp.getVersion());
|
|
|
|
|
|
|
|
int result = khVoteEmpMapper.updateKhVoteEmp(voteEmp);
|
|
|
|
|
|
|
|
if (result > 0) {
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 更新失败,版本冲突,增加重试计数
|
|
|
|
|
|
|
|
retryCount++;
|
|
|
|
|
|
|
|
System.out.println("-----------版本冲突," + voteEmp.getId() + "第" + retryCount + "次重试");
|
|
|
|
|
|
|
|
// if (retryCount < MAX_RETRY_COUNT) {
|
|
|
|
|
|
|
|
// 等待一段时间后重试,避免立即重试导致的持续冲突
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
Thread.sleep(100); // 重试间隔递增
|
|
|
|
|
|
|
|
//Thread.sleep(200 * retryCount); // 重试间隔递增
|
|
|
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
|
|
|
Thread.currentThread().interrupt();
|
|
|
|
|
|
|
|
throw new RuntimeException("重试过程被中断-------------", e);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {//单独评分 不占比 以平均分为最后得分
|
|
|
|
} else {//单独评分 不占比 以平均分为最后得分
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
|
|
|
|
int retryCount = 0;
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
voteEmp.setUpdateTime(nowDate);
|
|
|
|
voteEmp.setUpdateTime(nowDate);
|
|
|
|
//根据id查询数据得到之前的值
|
|
|
|
//根据id查询数据得到之前的值
|
|
|
|
KhVoteEmp oldvoteEmp = khVoteEmpMapper.selectKhVoteEmpById(voteEmp.getId());
|
|
|
|
KhVoteEmp oldvoteEmp = khVoteEmpMapper.selectKhVoteEmpById(voteEmp.getId());
|
|
|
|
@ -206,7 +258,25 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
voteEmp.setVoteScore(sumScore);
|
|
|
|
voteEmp.setVoteScore(sumScore);
|
|
|
|
voteEmp.setAvgScore(sumScore.divide(voteEmp.getVoteNum(), 4, RoundingMode.HALF_UP));
|
|
|
|
voteEmp.setAvgScore(sumScore.divide(voteEmp.getVoteNum(), 4, RoundingMode.HALF_UP));
|
|
|
|
voteEmp.setEndScore(voteEmp.getAvgScore());
|
|
|
|
voteEmp.setEndScore(voteEmp.getAvgScore());
|
|
|
|
khVoteEmpMapper.updateKhVoteEmp(voteEmp);
|
|
|
|
voteEmp.setVersion(oldvoteEmp.getVersion());
|
|
|
|
|
|
|
|
int result = khVoteEmpMapper.updateKhVoteEmp(voteEmp);
|
|
|
|
|
|
|
|
if (result > 0) {
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 更新失败,版本冲突,增加重试计数
|
|
|
|
|
|
|
|
retryCount++;
|
|
|
|
|
|
|
|
System.out.println("-----------版本冲突," + voteEmp.getId() + "第" + retryCount + "次重试");
|
|
|
|
|
|
|
|
// if (retryCount < MAX_RETRY_COUNT) {
|
|
|
|
|
|
|
|
// 等待一段时间后重试,避免立即重试导致的持续冲突
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
Thread.sleep(100); // 重试间隔递增
|
|
|
|
|
|
|
|
//Thread.sleep(200 * retryCount); // 重试间隔递增
|
|
|
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
|
|
|
Thread.currentThread().interrupt();
|
|
|
|
|
|
|
|
throw new RuntimeException("重试过程被中断-------------", e);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -222,14 +292,15 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService {
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
for (KhVoteEmp voteEmp : voteEmpList) {
|
|
|
|
//xuanxiangDetails.put(voteEmp.getBkhdxId().toString(), voteEmp.getBkhdxName()+":"+voteEmp.getScore());
|
|
|
|
//xuanxiangDetails.put(voteEmp.getBkhdxId().toString(), voteEmp.getBkhdxName()+":"+voteEmp.getScore());
|
|
|
|
xuanxiangDetails.put(voteEmp.getBkhdxName(), voteEmp.getScore().toString());
|
|
|
|
pingFenDetails.put(voteEmp.getBkhdxName()/*+voteEmp.getBkhdxId()*/, voteEmp.getScore());
|
|
|
|
recard.setVoteDetails(JSON.toJSONString(xuanxiangDetails));
|
|
|
|
recard.setVoteDetails(JSON.toJSONString(pingFenDetails));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*List<String> details = voteEmpList.stream()
|
|
|
|
/*List<String> details = voteEmpList.stream()
|
|
|
|
.map(emp -> emp.getBkhdxName() + " : " + emp.getScore())
|
|
|
|
.map(emp -> emp.getBkhdxName() + " : " + emp.getScore())
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
recard.setVoteDetails(JSON.toJSONString(details));*/
|
|
|
|
recard.setVoteDetails(JSON.toJSONString(details));*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
recard.setRemark(JSON.toJSONString(voteEmpList));
|
|
|
|
khVoteRecardMapper.insertKhVoteRecard(recard);
|
|
|
|
khVoteRecardMapper.insertKhVoteRecard(recard);
|
|
|
|
return AjaxResult.success();
|
|
|
|
return AjaxResult.success();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|