diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhVoteEmpController.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhVoteEmpController.java index e44b062..0ba323b 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhVoteEmpController.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/controller/KhVoteEmpController.java @@ -48,6 +48,18 @@ public class KhVoteEmpController extends BaseController return getDataTable(list); } + /** + * 查询投票选项列表 + */ + @PreAuthorize("@ss.hasPermi('kaohe:vote_emp:list')") + @GetMapping("/getVoteEmps") + public TableDataInfo getVoteEmps(KhVoteEmp khVoteEmp) + { + startPage(); + List list = khVoteEmpService.selectVoteEmpsByVoteId(khVoteEmp); + return getDataTable(list); + } + /** * 导出投票选项列表 */ diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/domain/KhVoteEmp.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/domain/KhVoteEmp.java index 011734e..165e6b5 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/domain/KhVoteEmp.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/domain/KhVoteEmp.java @@ -79,9 +79,21 @@ public class KhVoteEmp extends BaseEntity @Excel(name = "最终分数") private BigDecimal endScore; + /** 乐观锁版本号 */ + @Excel(name = "乐观锁版本号") + private Long version; + //仅做参数 传递本次评分分数 private BigDecimal score; + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + public BigDecimal getScore() { return score; } @@ -262,6 +274,7 @@ public class KhVoteEmp extends BaseEntity .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) + .append("version", getVersion()) .toString(); } } diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/domain/KhVoteRecard.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/domain/KhVoteRecard.java index 89da6e2..92f3637 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/domain/KhVoteRecard.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/domain/KhVoteRecard.java @@ -21,9 +21,13 @@ public class KhVoteRecard extends BaseEntity private Long id; /** 评测id */ - @Excel(name = "评测id") + // @Excel(name = "评测id") private Long pcId; + /** 评测id */ + @Excel(name = "考核任务名称") + private String pcName; + /** 考核项id */ @Excel(name = "考核项id") private Long khitemId; @@ -32,6 +36,11 @@ public class KhVoteRecard extends BaseEntity @Excel(name = "投票活动id") private Long voteId; + /** 评测id */ + @Excel(name = "评分主题") + private String votTitle; + + /** 用户id */ @Excel(name = "用户id") private Long userId; @@ -41,11 +50,11 @@ public class KhVoteRecard extends BaseEntity private String userName; /** 投票人uid */ - @Excel(name = "投票人uid") + // @Excel(name = "投票人uid") private String uid; /** 投票人 */ - @Excel(name = "投票人") + // @Excel(name = "投票人") private String tprName; /** 评分详情 */ @@ -58,9 +67,25 @@ public class KhVoteRecard extends BaseEntity private Date voteTime; /** IP */ - @Excel(name = "IP") + // @Excel(name = "IP") private String ipAddress; + public String getPcName() { + return pcName; + } + + public void setPcName(String pcName) { + this.pcName = pcName; + } + + public String getVoteTitle() { + return votTitle; + } + + public void setVoteTitle(String voteTitle) { + this.votTitle = voteTitle; + } + public void setId(Long id) { this.id = id; diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/mapper/KhVoteEmpMapper.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/mapper/KhVoteEmpMapper.java index 0c3ee42..b1cef70 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/mapper/KhVoteEmpMapper.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/mapper/KhVoteEmpMapper.java @@ -58,4 +58,6 @@ public interface KhVoteEmpMapper * @return 结果 */ public int deleteKhVoteEmpByIds(Long[] ids); + + List selectVoteEmpsByVoteId(KhVoteEmp khVoteEmp); } diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/IKhVoteEmpService.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/IKhVoteEmpService.java index 09ff4e3..0272f72 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/IKhVoteEmpService.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/IKhVoteEmpService.java @@ -63,4 +63,6 @@ public interface IKhVoteEmpService public int deleteKhVoteEmpById(Long id); AjaxResult voteSubmit(KhVoteRecardParam param); + + List selectVoteEmpsByVoteId(KhVoteEmp khVoteEmp); } diff --git a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java index d0537d7..fbf662f 100644 --- a/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java +++ b/ruoyi-kaohe/src/main/java/com/ruoyi/kaohe/service/impl/KhVoteEmpServiceImpl.java @@ -59,6 +59,11 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService { return khVoteEmpMapper.selectKhVoteEmpList(khVoteEmp); } + @Override + public List selectVoteEmpsByVoteId(KhVoteEmp khVoteEmp) { + return khVoteEmpMapper.selectVoteEmpsByVoteId(khVoteEmp); + } + /** * 新增投票选项 * @@ -96,6 +101,7 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService { /** * 删除投票选项信息 + * 手动实现乐观锁重试机制 * * @param id 投票选项主键 * @return 结果 @@ -109,6 +115,7 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService { @Transactional public AjaxResult voteSubmit(KhVoteRecardParam param) { Map xuanxiangDetails = new LinkedHashMap<>(); + Map pingFenDetails = new LinkedHashMap<>(); BigDecimal num = new BigDecimal("1");//投票人数+1 List voteEmpList = param.getVoteEmpList(); Date nowDate = DateUtils.getNowDate(); @@ -142,71 +149,134 @@ public class KhVoteEmpServiceImpl implements IKhVoteEmpService { } } for (KhVoteEmp voteEmp : voteEmpList) { - 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); + // 最大重试次数 + // 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++; + 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); + } + // } + } } - khVoteEmpMapper.updateKhVoteEmp(voteEmp); } } else if (typeid.equals(2L)) {//占比评分 for (KhVoteEmp voteEmp : voteEmpList) { - 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())); - khVoteEmpMapper.updateKhVoteEmp(voteEmp); + 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++; + 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 {//单独评分 不占比 以平均分为最后得分 for (KhVoteEmp voteEmp : voteEmpList) { - 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()); - khVoteEmpMapper.updateKhVoteEmp(voteEmp); + 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++; + 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 { for (KhVoteEmp voteEmp : voteEmpList) { //xuanxiangDetails.put(voteEmp.getBkhdxId().toString(), voteEmp.getBkhdxName()+":"+voteEmp.getScore()); - xuanxiangDetails.put(voteEmp.getBkhdxName(), voteEmp.getScore().toString()); - recard.setVoteDetails(JSON.toJSONString(xuanxiangDetails)); + pingFenDetails.put(voteEmp.getBkhdxName()/*+voteEmp.getBkhdxId()*/, voteEmp.getScore()); + recard.setVoteDetails(JSON.toJSONString(pingFenDetails)); } /*List details = voteEmpList.stream() .map(emp -> emp.getBkhdxName() + " : " + emp.getScore()) .collect(Collectors.toList()); recard.setVoteDetails(JSON.toJSONString(details));*/ } + recard.setRemark(JSON.toJSONString(voteEmpList)); khVoteRecardMapper.insertKhVoteRecard(recard); return AjaxResult.success(); } diff --git a/ruoyi-kaohe/src/main/resources/mapper/kaohe/KhVoteEmpMapper.xml b/ruoyi-kaohe/src/main/resources/mapper/kaohe/KhVoteEmpMapper.xml index 47becc9..a47139f 100644 --- a/ruoyi-kaohe/src/main/resources/mapper/kaohe/KhVoteEmpMapper.xml +++ b/ruoyi-kaohe/src/main/resources/mapper/kaohe/KhVoteEmpMapper.xml @@ -26,10 +26,11 @@ + - select id, khitem_typeId, vote_id, vote_title, bkhdx_id, bkhdx_name, content, vote_num,option_a, option_b, option_c, option_d, vote_score, avg_score, percentage, end_score, create_by, create_time, update_by, update_time, remark from kh_vote_emp + select id, khitem_typeId, vote_id, vote_title, bkhdx_id, bkhdx_name, content, vote_num,option_a, option_b, option_c, option_d, vote_score, avg_score, percentage, end_score, create_by, create_time, update_by, update_time, remark, version from kh_vote_emp + + @@ -81,6 +90,7 @@ update_by, update_time, remark, + #{khitemTypeid}, @@ -103,6 +113,7 @@ #{updateBy}, #{updateTime}, #{remark}, + @@ -129,8 +140,10 @@ update_by = #{updateBy}, update_time = #{updateTime}, remark = #{remark}, + version = version + 1 - where id = #{id} + + WHERE id = #{id} AND version = #{version} diff --git a/ruoyi-kaohe/src/main/resources/mapper/kaohe/KhVoteMapper.xml b/ruoyi-kaohe/src/main/resources/mapper/kaohe/KhVoteMapper.xml index 0c842ed..df41979 100644 --- a/ruoyi-kaohe/src/main/resources/mapper/kaohe/KhVoteMapper.xml +++ b/ruoyi-kaohe/src/main/resources/mapper/kaohe/KhVoteMapper.xml @@ -56,11 +56,11 @@ - + --> - + select r.id,v.pingce_id,r.vote_id,r.user_name,r.vote_details,r.vote_time,v.pingce_name,v.vote_title + from kh_vote_recard r join kh_vote v on r.vote_id=v.id - and pc_id = #{pcId} - and khitem_id = #{khitemId} - and vote_id = #{voteId} - and user_id = #{userId} - and user_name like concat('%', #{userName}, '%') - and uid = #{uid} - and tpr_name like concat('%', #{tprName}, '%') - and vote_details = #{voteDetails} - and vote_time = #{voteTime} - and ip_address = #{ipAddress} + and v.pingce_id = #{pcId} + and v.pingce_name like concat('%', #{pcName}, '%') + and r.khitem_id = #{khitemId} + and r.vote_id = #{voteId} + and v.vote_title like concat('%', #{voteTitle}, '%') + and r.user_id = #{userId} + and r.user_name like concat('%', #{userName}, '%') + and r.uid = #{uid} + and r.tpr_name like concat('%', #{tprName}, '%') + + and r.vote_time = #{voteTime} + and r.ip_address = #{ipAddress}