package com.xjrsoft.module.evaluate.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.xjrsoft.common.enums.DeleteMark; import com.xjrsoft.common.enums.EvaluateTypeEnum; import com.xjrsoft.common.exception.MyException; import com.xjrsoft.module.evaluate.dto.DrillEvaluateClassListDto; import com.xjrsoft.module.evaluate.dto.EvaluateManagePageDto; import com.xjrsoft.module.evaluate.dto.EvaluateManageScoreDto; import com.xjrsoft.module.evaluate.dto.EvaluateWritePageDto; import com.xjrsoft.module.evaluate.dto.MobileIndexPageDto; import com.xjrsoft.module.evaluate.dto.MobileResultPageDto; import com.xjrsoft.module.evaluate.dto.ResultListDto; import com.xjrsoft.module.evaluate.entity.EvaluateExecuter; import com.xjrsoft.module.evaluate.entity.EvaluateItem; import com.xjrsoft.module.evaluate.entity.EvaluateManage; import com.xjrsoft.module.evaluate.entity.EvaluateManageItem; import com.xjrsoft.module.evaluate.entity.EvaluateObject; import com.xjrsoft.module.evaluate.mapper.EvaluateExecuterMapper; import com.xjrsoft.module.evaluate.mapper.EvaluateItemMapper; import com.xjrsoft.module.evaluate.mapper.EvaluateManageItemMapper; import com.xjrsoft.module.evaluate.mapper.EvaluateManageMapper; import com.xjrsoft.module.evaluate.mapper.EvaluateObjectMapper; import com.xjrsoft.module.evaluate.service.IEvaluateManageService; import com.xjrsoft.module.evaluate.vo.DrillEvaluateClassListVo; import com.xjrsoft.module.evaluate.vo.EvaluateManageItemVo; import com.xjrsoft.module.evaluate.vo.EvaluateManagePageVo; import com.xjrsoft.module.evaluate.vo.EvaluateManageScoreVo; import com.xjrsoft.module.evaluate.vo.EvaluateWriteVo; import com.xjrsoft.module.evaluate.vo.MobileIndexPageVo; import com.xjrsoft.module.evaluate.vo.MobileResultPageVo; import com.xjrsoft.module.organization.dto.WeChatSendMessageDto; import com.xjrsoft.module.organization.entity.User; import com.xjrsoft.module.organization.service.IUserService; import com.xjrsoft.module.organization.service.IWeChatService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; /** * @title: 评价管理 * @Author dzx * @Date: 2024-01-16 * @Version 1.0 */ @Service @AllArgsConstructor public class EvaluateManageServiceImpl extends MPJBaseServiceImpl implements IEvaluateManageService { private final EvaluateManageMapper evaluateManageMapper; private final EvaluateObjectMapper evaluateObjectMapper; private final EvaluateExecuterMapper evaluateExecuterMapper; private final EvaluateItemMapper evaluateItemMapper; private final EvaluateManageItemMapper evaluateManageItemMapper; private final IUserService userService; private final IWeChatService weChatService; @Override @Transactional(rollbackFor = Exception.class) public Boolean add(EvaluateManage evaluateManage) { evaluateManage.setStatus(-1); evaluateManageMapper.insert(evaluateManage); return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean update(EvaluateManage evaluateManage) { //TODO 修改分两种情况,一种是还没有发布的修改,一种是已经发布的修改,已发布的修改只能修改结束时间。 evaluateManageMapper.updateById(evaluateManage); return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean delete(List ids) { evaluateManageMapper.deleteBatchIds(ids); evaluateObjectMapper.delete(Wrappers.lambdaQuery(EvaluateObject.class).in(EvaluateObject::getEvaluateManageId, ids)); evaluateExecuterMapper.delete(Wrappers.lambdaQuery(EvaluateExecuter.class).in(EvaluateExecuter::getEvaluateManageId, ids)); return true; } @Override public Page getPage(Page page, EvaluateManagePageDto dto) { return evaluateManageMapper.getPage(page, dto); } @Override @Transactional public Boolean release(Long id) { EvaluateManage evaluateManage = evaluateManageMapper.selectById(id); if(evaluateManage == null){ throw new MyException("未查询到数据,请检查传入的id是否正确"); } // evaluateManageItemMapper.cloneItems(evaluateManage.getEvaluateTemplateId(), evaluateManage.getId(), StpUtil.getLoginIdAsLong()); Long count = evaluateManageItemMapper.selectCount( new QueryWrapper().lambda() .eq(EvaluateManageItem::getEvaluateManageId, id) ); if(count <= 0){ //查询模板中的评价项 List evaluateItemList = evaluateItemMapper.selectList( new QueryWrapper().lambda() .eq(EvaluateItem::getEvaluateTemplateId, evaluateManage.getEvaluateTemplateId()) ); //克隆一份,存到评价管理下面,可以采用sql语句 for (EvaluateItem evaluateItem : evaluateItemList) { EvaluateManageItem manageItem = BeanUtil.toBean(evaluateItem, EvaluateManageItem.class); manageItem.setId(null); manageItem.setEvaluateManageId(evaluateManage.getId()); manageItem.setEvaluateItemId(evaluateItem.getId()); manageItem.setCreateDate(new Date()); manageItem.setCreateUserId(StpUtil.getLoginIdAsLong()); evaluateManageItemMapper.insert(manageItem); } } //添加评价提交记录 evaluateManageMapper.insertEvaluateSubmitRecord(id); //将评价管理状态改为进行中 evaluateManage.setStatus(1); evaluateManage.setModifyDate(new Date()); evaluateManage.setModifyUserId(StpUtil.getLoginIdAsLong()); evaluateManageMapper.updateById(evaluateManage); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String time17 = LocalDateTime.now().format(formatter); // 查询参加答题的用户进行微信消息通知 List list = userService.list( new MPJLambdaWrapper() .innerJoin(EvaluateExecuter.class, EvaluateExecuter::getEvaluateObjectId, User::getId) .eq(EvaluateExecuter::getEvaluateManageId, evaluateManage.getId()) .eq(EvaluateExecuter::getDeleteMark, DeleteMark.NODELETE.getCode()) .ne(User::getOpenId, "") .isNotNull(User::getOpenId) ); User releaseUser = userService.getById(StpUtil.getLoginIdAsLong()); for (User user : list) { WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto(); weChatSendMessageDto.setUserId(user.getOpenId()); weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo"); weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + ""); JSONObject paramJson = new JSONObject(); JSONObject thing23 = new JSONObject(); thing23.put("value", evaluateManage.getName()); paramJson.put("thing23", thing23); JSONObject thing29 = new JSONObject(); thing29.put("value", releaseUser.getName()); paramJson.put("thing29", thing29); JSONObject time17Json = new JSONObject(); time17Json.put("value", time17); paramJson.put("time17", time17Json); weChatSendMessageDto.setContent(paramJson); weChatService.sendTemplateMessage(weChatSendMessageDto); } return true; } public Page getMobileIndexPage(Page page, MobileIndexPageDto dto) { Page mobileIndexPage = evaluateManageMapper.getMobileIndexPage(page, dto); return mobileIndexPage; } @Override public Page getMobileResultPage(Page page, MobileResultPageDto dto){ Page mobileResultPage = evaluateManageMapper.getMobileResultPage(page, dto); if(mobileResultPage.getRecords() != null){ //获取已经评价记录的评价总分 //评价提交记录的id集合 List submitRecordIdList = new ArrayList<>(); for (MobileResultPageVo mobileResultPageVo : mobileResultPage.getRecords()) { if(mobileResultPageVo.getEvaluateStatus() == 2){ submitRecordIdList.add(mobileResultPageVo.getEvaluateSubmitRecordId()); } } if(submitRecordIdList.size() > 0){ //获取当前用户,当前评价管理下的所有已评对象的总分(学生评价班主任)或者是综合指数(教官评价班级) List evaluateManageScoreVoList = evaluateManageMapper.getScoreList(new EvaluateManageScoreDto(){{ setSubmitRecordIdList(submitRecordIdList); }}); if(evaluateManageScoreVoList.size() > 0){ Map scoreBySubmitRecordId = evaluateManageScoreVoList.stream() .collect(Collectors.toMap(EvaluateManageScoreVo::getSubmitRecordId, Function.identity())); //将对应的分数给到对应的记录 for (MobileResultPageVo mobileResultPageVo : mobileResultPage.getRecords()) { //评价类型是学生评价班主任 if(mobileResultPageVo.getEvaluateType().equals(EvaluateTypeEnum.STUDENT_EVALUATE_HEAD_TEACHER.getCode()) && scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()) != null){ mobileResultPageVo.setTotalScore((double)scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()).getTotalScore()); mobileResultPageVo.setItemCount(scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()).getItemCount()); } //评价类型是教官评级班级 if(mobileResultPageVo.getEvaluateType().equals(EvaluateTypeEnum.DRILLMASTER_EVALUATE_CLASS.getCode()) && scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()) != null){ ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); String zonghezhishu = "totalScore/itemCount"; int totalScore = scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()).getTotalScore(); int itemCount = scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()).getItemCount(); double res = 0; String newStr1 = zonghezhishu.replace("totalScore", ""+totalScore); String newStr2 = newStr1.replace("itemCount", ""+itemCount); try{ res = Double.parseDouble(engine.eval(newStr2).toString()); }catch (ScriptException s){ } // 创建一个DecimalFormat对象,指定小数位数为两位 DecimalFormat decimalFormat = new DecimalFormat("#.00"); // 格式化double值为字符串 String formattedNumber = decimalFormat.format(res); mobileResultPageVo.setTotalScore(Double.valueOf(formattedNumber)); mobileResultPageVo.setItemCount(scoreBySubmitRecordId.get(mobileResultPageVo.getEvaluateSubmitRecordId()).getItemCount()); } } } } } return mobileResultPage; } @Override public List getDrillEvaluateClassList(DrillEvaluateClassListDto dto) { dto.setLoginUserId(StpUtil.getLoginIdAsLong()); dto.setTodayDate(LocalDate.now().toString()); return evaluateManageMapper.getDrillEvaluateClassList(dto); } @Override public EvaluateWriteVo getWriteInfo(Long id) { return evaluateManageMapper.getWriteInfo(id); } @Override public List getItemList(Long id) { return evaluateManageMapper.getItemList(id); } @Override public List getResultList(ResultListDto dto) { return evaluateManageMapper.getResultList(dto); } }