EvaluateManageServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. package com.xjrsoft.module.evaluate.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.util.IdUtil;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  7. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  8. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  9. import com.github.yulichang.base.MPJBaseServiceImpl;
  10. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  11. import com.xjrsoft.common.enums.DeleteMark;
  12. import com.xjrsoft.common.enums.EvaluateTypeEnum;
  13. import com.xjrsoft.common.exception.MyException;
  14. import com.xjrsoft.module.evaluate.dto.DrillEvaluateClassListDto;
  15. import com.xjrsoft.module.evaluate.dto.EvaluateManagePageDto;
  16. import com.xjrsoft.module.evaluate.dto.EvaluateManageScoreDto;
  17. import com.xjrsoft.module.evaluate.dto.EvaluateWritePageDto;
  18. import com.xjrsoft.module.evaluate.dto.MobileIndexPageDto;
  19. import com.xjrsoft.module.evaluate.dto.MobileResultPageDto;
  20. import com.xjrsoft.module.evaluate.dto.ResultListDto;
  21. import com.xjrsoft.module.evaluate.entity.EvaluateExecuter;
  22. import com.xjrsoft.module.evaluate.entity.EvaluateItem;
  23. import com.xjrsoft.module.evaluate.entity.EvaluateManage;
  24. import com.xjrsoft.module.evaluate.entity.EvaluateManageItem;
  25. import com.xjrsoft.module.evaluate.entity.EvaluateObject;
  26. import com.xjrsoft.module.evaluate.mapper.EvaluateExecuterMapper;
  27. import com.xjrsoft.module.evaluate.mapper.EvaluateItemMapper;
  28. import com.xjrsoft.module.evaluate.mapper.EvaluateManageItemMapper;
  29. import com.xjrsoft.module.evaluate.mapper.EvaluateManageMapper;
  30. import com.xjrsoft.module.evaluate.mapper.EvaluateObjectMapper;
  31. import com.xjrsoft.module.evaluate.service.IEvaluateManageService;
  32. import com.xjrsoft.module.evaluate.vo.DrillEvaluateClassListVo;
  33. import com.xjrsoft.module.evaluate.vo.EvaluateManageItemVo;
  34. import com.xjrsoft.module.evaluate.vo.EvaluateManagePageVo;
  35. import com.xjrsoft.module.evaluate.vo.EvaluateManageScoreVo;
  36. import com.xjrsoft.module.evaluate.vo.EvaluateWriteVo;
  37. import com.xjrsoft.module.evaluate.vo.MobileIndexPageVo;
  38. import com.xjrsoft.module.evaluate.vo.MobileResultPageVo;
  39. import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
  40. import com.xjrsoft.module.organization.entity.User;
  41. import com.xjrsoft.module.organization.service.IUserService;
  42. import com.xjrsoft.module.organization.service.IWeChatService;
  43. import lombok.AllArgsConstructor;
  44. import org.springframework.stereotype.Service;
  45. import org.springframework.transaction.annotation.Transactional;
  46. import javax.script.ScriptEngine;
  47. import javax.script.ScriptEngineManager;
  48. import javax.script.ScriptException;
  49. import java.text.DecimalFormat;
  50. import java.time.LocalDate;
  51. import java.time.LocalDateTime;
  52. import java.time.format.DateTimeFormatter;
  53. import java.util.ArrayList;
  54. import java.util.Date;
  55. import java.util.List;
  56. import java.util.Map;
  57. import java.util.function.Function;
  58. import java.util.stream.Collectors;
  59. /**
  60. * @title: 评价管理
  61. * @Author dzx
  62. * @Date: 2024-01-16
  63. * @Version 1.0
  64. */
  65. @Service
  66. @AllArgsConstructor
  67. public class EvaluateManageServiceImpl extends MPJBaseServiceImpl<EvaluateManageMapper, EvaluateManage> implements IEvaluateManageService {
  68. private final EvaluateManageMapper evaluateManageMapper;
  69. private final EvaluateObjectMapper evaluateObjectMapper;
  70. private final EvaluateExecuterMapper evaluateExecuterMapper;
  71. private final EvaluateItemMapper evaluateItemMapper;
  72. private final EvaluateManageItemMapper evaluateManageItemMapper;
  73. private final IUserService userService;
  74. private final IWeChatService weChatService;
  75. @Override
  76. @Transactional(rollbackFor = Exception.class)
  77. public Boolean add(EvaluateManage evaluateManage) {
  78. evaluateManage.setStatus(-1);
  79. evaluateManageMapper.insert(evaluateManage);
  80. return true;
  81. }
  82. @Override
  83. @Transactional(rollbackFor = Exception.class)
  84. public Boolean update(EvaluateManage evaluateManage) {
  85. //TODO 修改分两种情况,一种是还没有发布的修改,一种是已经发布的修改,已发布的修改只能修改结束时间。
  86. evaluateManageMapper.updateById(evaluateManage);
  87. return true;
  88. }
  89. @Override
  90. @Transactional(rollbackFor = Exception.class)
  91. public Boolean delete(List<Long> ids) {
  92. evaluateManageMapper.deleteBatchIds(ids);
  93. evaluateObjectMapper.delete(Wrappers.lambdaQuery(EvaluateObject.class).in(EvaluateObject::getEvaluateManageId, ids));
  94. evaluateExecuterMapper.delete(Wrappers.lambdaQuery(EvaluateExecuter.class).in(EvaluateExecuter::getEvaluateManageId, ids));
  95. return true;
  96. }
  97. @Override
  98. public Page<EvaluateManagePageVo> getPage(Page<EvaluateManagePageDto> page, EvaluateManagePageDto dto) {
  99. return evaluateManageMapper.getPage(page, dto);
  100. }
  101. @Override
  102. @Transactional
  103. public Boolean release(Long id) {
  104. EvaluateManage evaluateManage = evaluateManageMapper.selectById(id);
  105. if(evaluateManage == null){
  106. throw new MyException("未查询到数据,请检查传入的id是否正确");
  107. }
  108. // evaluateManageItemMapper.cloneItems(evaluateManage.getEvaluateTemplateId(), evaluateManage.getId(), StpUtil.getLoginIdAsLong());
  109. Long count = evaluateManageItemMapper.selectCount(
  110. new QueryWrapper<EvaluateManageItem>().lambda()
  111. .eq(EvaluateManageItem::getEvaluateManageId, id)
  112. );
  113. if(count <= 0){
  114. //查询模板中的评价项
  115. List<EvaluateItem> evaluateItemList = evaluateItemMapper.selectList(
  116. new QueryWrapper<EvaluateItem>().lambda()
  117. .eq(EvaluateItem::getEvaluateTemplateId, evaluateManage.getEvaluateTemplateId())
  118. );
  119. //克隆一份,存到评价管理下面,可以采用sql语句
  120. for (EvaluateItem evaluateItem : evaluateItemList) {
  121. EvaluateManageItem manageItem = BeanUtil.toBean(evaluateItem, EvaluateManageItem.class);
  122. manageItem.setId(null);
  123. manageItem.setEvaluateManageId(evaluateManage.getId());
  124. manageItem.setEvaluateItemId(evaluateItem.getId());
  125. manageItem.setCreateDate(new Date());
  126. manageItem.setCreateUserId(StpUtil.getLoginIdAsLong());
  127. evaluateManageItemMapper.insert(manageItem);
  128. }
  129. }
  130. //添加评价提交记录
  131. evaluateManageMapper.insertEvaluateSubmitRecord(id);
  132. //将评价管理状态改为进行中
  133. evaluateManage.setStatus(1);
  134. evaluateManage.setModifyDate(new Date());
  135. evaluateManage.setModifyUserId(StpUtil.getLoginIdAsLong());
  136. evaluateManageMapper.updateById(evaluateManage);
  137. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  138. String time17 = LocalDateTime.now().format(formatter);
  139. // 查询参加答题的用户进行微信消息通知
  140. List<User> list = userService.list(
  141. new MPJLambdaWrapper<User>()
  142. .innerJoin(EvaluateExecuter.class, EvaluateExecuter::getEvaluateObjectId, User::getId)
  143. .eq(EvaluateExecuter::getEvaluateManageId, evaluateManage.getId())
  144. .eq(EvaluateExecuter::getDeleteMark, DeleteMark.NODELETE.getCode())
  145. .ne(User::getOpenId, "")
  146. .isNotNull(User::getOpenId)
  147. );
  148. User releaseUser = userService.getById(StpUtil.getLoginIdAsLong());
  149. for (User user : list) {
  150. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  151. weChatSendMessageDto.setUserId(user.getOpenId());
  152. weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo");
  153. weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
  154. JSONObject paramJson = new JSONObject();
  155. JSONObject thing23 = new JSONObject();
  156. thing23.put("value", evaluateManage.getName());
  157. paramJson.put("thing23", thing23);
  158. JSONObject thing29 = new JSONObject();
  159. thing29.put("value", releaseUser.getName());
  160. paramJson.put("thing29", thing29);
  161. JSONObject time17Json = new JSONObject();
  162. time17Json.put("value", time17);
  163. paramJson.put("time17", time17Json);
  164. weChatSendMessageDto.setContent(paramJson);
  165. weChatService.sendTemplateMessage(weChatSendMessageDto);
  166. }
  167. return true;
  168. }
  169. public Page<MobileIndexPageVo> getMobileIndexPage(Page<EvaluateWritePageDto> page, MobileIndexPageDto dto) {
  170. Page<MobileIndexPageVo> mobileIndexPage = evaluateManageMapper.getMobileIndexPage(page, dto);
  171. return mobileIndexPage;
  172. }
  173. @Override
  174. public Page<MobileResultPageVo> getMobileResultPage(Page<EvaluateWritePageDto> page, MobileResultPageDto dto){
  175. Page<MobileResultPageVo> mobileResultPage = evaluateManageMapper.getMobileResultPage(page, dto);
  176. if(mobileResultPage.getRecords() != null){
  177. //获取已经评价记录的评价总分
  178. //评价提交记录的id集合
  179. List<String> submitRecordIdList = new ArrayList<>();
  180. for (MobileResultPageVo mobileResultPageVo : mobileResultPage.getRecords()) {
  181. if(mobileResultPageVo.getEvaluateStatus() == 2){
  182. submitRecordIdList.add(mobileResultPageVo.getEvaluateSubmitRecordId());
  183. }
  184. }
  185. if(submitRecordIdList.size() > 0){
  186. //获取当前用户,当前评价管理下的所有已评对象的总分(学生评价班主任)或者是综合指数(教官评价班级)
  187. List<EvaluateManageScoreVo> evaluateManageScoreVoList = evaluateManageMapper.getScoreList(new EvaluateManageScoreDto(){{
  188. setSubmitRecordIdList(submitRecordIdList);
  189. }});
  190. if(evaluateManageScoreVoList.size() > 0){
  191. Map<String, EvaluateManageScoreVo> scoreBySubmitRecordId = evaluateManageScoreVoList.stream()
  192. .collect(Collectors.toMap(EvaluateManageScoreVo::getSubmitRecordId, Function.identity()));
  193. //将对应的分数给到对应的记录
  194. for (MobileResultPageVo mobileResultPageVo : mobileResultPage.getRecords()) {
  195. //评价类型是学生评价班主任
  196. if(mobileResultPageVo.getEvaluateType().equals(EvaluateTypeEnum.STUDENT_EVALUATE_HEAD_TEACHER.getCode()) && scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()) != null){
  197. mobileResultPageVo.setTotalScore((double)scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()).getTotalScore());
  198. mobileResultPageVo.setItemCount(scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()).getItemCount());
  199. }
  200. //评价类型是教官评级班级
  201. if(mobileResultPageVo.getEvaluateType().equals(EvaluateTypeEnum.DRILLMASTER_EVALUATE_CLASS.getCode()) && scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()) != null){
  202. ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
  203. String zonghezhishu = "totalScore/itemCount";
  204. int totalScore = scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()).getTotalScore();
  205. int itemCount = scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()).getItemCount();
  206. double res = 0;
  207. String newStr1 = zonghezhishu.replace("totalScore", ""+totalScore);
  208. String newStr2 = newStr1.replace("itemCount", ""+itemCount);
  209. try{
  210. res = Double.parseDouble(engine.eval(newStr2).toString());
  211. }catch (ScriptException s){
  212. }
  213. // 创建一个DecimalFormat对象,指定小数位数为两位
  214. DecimalFormat decimalFormat = new DecimalFormat("#.00");
  215. // 格式化double值为字符串
  216. String formattedNumber = decimalFormat.format(res);
  217. mobileResultPageVo.setTotalScore(Double.valueOf(formattedNumber));
  218. mobileResultPageVo.setItemCount(scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()).getItemCount());
  219. }
  220. }
  221. }
  222. }
  223. }
  224. return mobileResultPage;
  225. }
  226. @Override
  227. public List<DrillEvaluateClassListVo> getDrillEvaluateClassList(DrillEvaluateClassListDto dto) {
  228. dto.setLoginUserId(StpUtil.getLoginIdAsLong());
  229. dto.setTodayDate(LocalDate.now().toString());
  230. return evaluateManageMapper.getDrillEvaluateClassList(dto);
  231. }
  232. @Override
  233. public EvaluateWriteVo getWriteInfo(Long id) {
  234. return evaluateManageMapper.getWriteInfo(id);
  235. }
  236. @Override
  237. public List<EvaluateManageItemVo> getItemList(Long id) {
  238. return evaluateManageMapper.getItemList(id);
  239. }
  240. @Override
  241. public List<EvaluateManageItemVo> getResultList(ResultListDto dto) {
  242. return evaluateManageMapper.getResultList(dto);
  243. }
  244. }