量表发布校验;根据分组查看发布优化;用户提交测评答案校验

This commit is contained in:
cjw 2024-04-15 14:02:20 +08:00
parent 0aef5e4362
commit a154caee2a
10 changed files with 160 additions and 93 deletions

View File

@ -1,6 +1,5 @@
package org.dromara.scale.controller.web;
import cn.hutool.core.util.ArrayUtil;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
@ -9,11 +8,11 @@ import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.web.core.BaseController;
import org.dromara.scale.domain.bo.SysEvaluationAnswerBo;
import org.dromara.scale.domain.bo.SubmitAnswerBo;
import org.dromara.scale.domain.bo.SysEvaluationRecordBo;
import org.dromara.scale.domain.vo.QuestionAnswerVo;
import org.dromara.scale.domain.vo.SysScalePublishVo;
import org.dromara.scale.service.*;
import org.dromara.scale.service.IWebService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -69,10 +68,7 @@ public class WebController extends BaseController {
@Log(title = "量测记录", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/record/answer")
public R<Map<String,Object>> add(@Validated(AddGroup.class) @RequestBody List<SysEvaluationAnswerBo> answerList) {
if (ArrayUtil.isEmpty(answerList)) {
R.fail("请先填写,再提交");
}
return R.ok(webService.submitAnswer(answerList));
public R<Map<String,Object>> add(@Validated(AddGroup.class) @RequestBody SubmitAnswerBo bo) {
return R.ok(webService.submitAnswer(bo));
}
}

View File

@ -38,6 +38,11 @@ public class SysEvaluationRecord {
*/
private Long userId;
/**
* 部门id
*/
private Long deptId;
/**
* td_scale_publish表主键
*/

View File

@ -0,0 +1,21 @@
package org.dromara.scale.domain.bo;
import lombok.Data;
import java.util.List;
/**
* <p>TODO<p>
*
* @author cjw
* @version V1.0.0
* @date 2024/4/15 11:09
*/
@Data
public class SubmitAnswerBo {
private Long scaleId;
private List<SysEvaluationAnswerBo> answerList;
}

View File

@ -43,6 +43,11 @@ public class SysEvaluationRecordVo implements Serializable {
@ExcelProperty(value = "测评人id")
private Long userId;
/**
* 部门id
*/
@ExcelProperty(value = "部门id")
private Long deptId;
/**
* td_scale_publish表主键
*/

View File

@ -7,8 +7,6 @@ import org.dromara.scale.domain.vo.SysScaleVo;
import java.util.List;
import java.util.List;
/**
* 心理测评量Mapper接口
*
@ -20,4 +18,7 @@ public interface SysScaleMapper extends BaseMapperPlus<SysScale, SysScaleVo> {
List<SysScaleVo> findSysScaleByIds(String scaleIds);
void updateEvalNums(Long scaleId);
void updatePublishNums(Long scaleId);
}

View File

@ -46,5 +46,5 @@ public interface ISysScalePublishService {
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
SysScalePublishVo queryPublishScale();
}

View File

@ -1,6 +1,6 @@
package org.dromara.scale.service;
import org.dromara.scale.domain.bo.SysEvaluationAnswerBo;
import org.dromara.scale.domain.bo.SubmitAnswerBo;
import org.dromara.scale.domain.bo.SysEvaluationRecordBo;
import org.dromara.scale.domain.vo.QuestionAnswerVo;
import org.dromara.scale.domain.vo.SysScalePublishVo;
@ -16,5 +16,5 @@ public interface IWebService {
Long newRecord(SysEvaluationRecordBo bo);
Map<String,Object> submitAnswer(List<SysEvaluationAnswerBo> answerList);
Map<String,Object> submitAnswer(SubmitAnswerBo bo);
}

View File

@ -1,31 +1,28 @@
package org.dromara.scale.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.scale.domain.SysScale;
import org.dromara.scale.constant.StatusEnum;
import org.dromara.scale.domain.SysScalePublish;
import org.dromara.scale.domain.bo.SysScalePublishBo;
import org.dromara.scale.domain.vo.SysEvaluationRecordVo;
import org.dromara.scale.domain.vo.SysScalePublishVo;
import org.dromara.scale.domain.vo.SysScaleVo;
import org.dromara.scale.mapper.SysEvaluationRecordMapper;
import org.dromara.scale.mapper.SysScaleMapper;
import org.dromara.scale.mapper.SysScalePublishMapper;
import org.dromara.scale.service.ISysScalePublishService;
import org.dromara.system.domain.SysOss;
import org.dromara.system.mapper.SysOssMapper;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
@ -47,10 +44,6 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService {
private final SysScaleMapper sysScaleMapper;
private final SysEvaluationRecordMapper recordMapper;
private final SysOssMapper sysOssMapper;
/**
* 查询量发布
*/
@ -82,7 +75,7 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService {
//Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<SysScalePublish> lqw = Wrappers.lambdaQuery();
// lqw.eq(StringUtils.isNotBlank(bo.getScaleIds()), SysScalePublish::getScaleIds, bo.getScaleIds());
lqw.eq(StringUtils.isNotBlank(bo.getScaleNames()), SysScalePublish::getScaleNames, bo.getScaleNames());
// lqw.eq(StringUtils.isNotBlank(bo.getScaleNames()), SysScalePublish::getScaleNames, bo.getScaleNames());
lqw.like(StringUtils.isNotBlank(bo.getSessionName()), SysScalePublish::getSessionName, bo.getSessionName());
lqw.eq(bo.getDeptId() != null, SysScalePublish::getDeptId, bo.getDeptId());
lqw.eq(bo.getPartNum() != null, SysScalePublish::getPartNum, bo.getPartNum());
@ -107,15 +100,15 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService {
List<SysScaleVo> list = sysScaleMapper.findSysScaleByIds(StrUtil.join(StrUtil.COMMA, bo.getScaleIds()));
add.setScaleNames(list.stream().map(SysScaleVo::getScaleName).collect(Collectors.joining(StrUtil.COMMA)));
List<SysScale> scaleList = new ArrayList<>(bo.getScaleIds().size());
//List<SysScale> scaleList = new ArrayList<>(bo.getScaleIds().size());
for (String scaleId : bo.getScaleIds()) {
SysScale sysScale = sysScaleMapper.selectById(scaleId);
sysScale.setPublishNums(sysScale.getPublishNums() + 1);
scaleList.add(sysScale);
sysScaleMapper.updatePublishNums(Long.parseLong(scaleId));
// SysScale sysScale = sysScaleMapper.selectById(scaleId);
// sysScale.setPublishNums(sysScale.getPublishNums() + 1);
// scaleList.add(sysScale);
}
sysScaleMapper.updateBatchById(scaleList, 100);
//sysScaleMapper.updateBatchById(scaleList, 100);
}
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setBatchNo(add.getBatchNo());
@ -139,6 +132,13 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService {
*/
private void validEntityBeforeSave(SysScalePublish entity) {
//TODO 做一些数据校验,如唯一约束
Long deptId = entity.getDeptId();
List<SysScalePublishVo> sysScalePublishVos = baseMapper.selectVoList(new LambdaQueryWrapper<SysScalePublish>()
.eq(SysScalePublish::getDeptId, deptId)
.eq(SysScalePublish::getStatus, StatusEnum.IN_USE.getValue()));
if(!ArrayUtil.isEmpty(sysScalePublishVos)){
throw new ServiceException("此年级下已有发布");
}
}
/**
@ -152,45 +152,4 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService {
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
public SysScalePublishVo queryPublishScale() {
LoginUser loginUser = getLoginUser();
Long userId = loginUser.getUserId();
Long deptId = loginUser.getDeptId();
SysScalePublishVo sysScalePublishVo = null;
//先查询有用户组的发布
if (deptId != null) {
LambdaQueryWrapper<SysScalePublish> lqw = Wrappers.lambdaQuery();
lqw.eq(SysScalePublish::getDeptId, deptId);
lqw.eq(SysScalePublish::getStatus, 1);
lqw.last("limit 1");
sysScalePublishVo = baseMapper.selectVoOne(lqw);
}
//如果没用户组或者有用户组的发布为空则查针对全部的发布
if (sysScalePublishVo == null) {
LambdaQueryWrapper<SysScalePublish> lqw = Wrappers.lambdaQuery();
lqw.eq(SysScalePublish::getDeptId, null);
lqw.eq(SysScalePublish::getStatus, 1);
sysScalePublishVo = baseMapper.selectVoOne(lqw);
}
if (sysScalePublishVo == null) {
return new SysScalePublishVo();
}
Long batchNo = sysScalePublishVo.getBatchNo();
String scaleIds = sysScalePublishVo.getScaleIds();
List<SysScaleVo> publishScaleVos = sysScaleMapper.findSysScaleByIds(StrUtil.join(StrUtil.COMMA, scaleIds));
List<SysEvaluationRecordVo> recordVos = recordMapper.selectSclaeRecordListByUserAndBatch(userId, batchNo);
for (SysScaleVo publishScaleVo : publishScaleVos) {
SysOss sysOss = sysOssMapper.selectById(publishScaleVo.getCover());
publishScaleVo.setCoverUrl(sysOss.getUrl());
//已做过量表
for (SysEvaluationRecordVo recordVo : recordVos) {
if( publishScaleVo.getScaleId().equals(recordVo.getScaleId())){
publishScaleVo.setUsed(true);
}
}
}
sysScalePublishVo.setScaleList(publishScaleVos);
return sysScalePublishVo;
}
}

View File

@ -1,26 +1,33 @@
package org.dromara.scale.service.impl;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.scale.constant.ScaleDimensionEnum;
import org.dromara.scale.constant.ScoreRuleTypeEnum;
import org.dromara.scale.constant.SituationEnum;
import org.dromara.scale.constant.StatusEnum;
import org.dromara.scale.domain.SysEvaluationAnswer;
import org.dromara.scale.domain.SysEvaluationConclusion;
import org.dromara.scale.domain.SysEvaluationRecord;
import org.dromara.scale.domain.SysScale;
import org.dromara.scale.domain.*;
import org.dromara.scale.domain.bo.SubmitAnswerBo;
import org.dromara.scale.domain.bo.SysEvaluationAnswerBo;
import org.dromara.scale.domain.bo.SysEvaluationRecordBo;
import org.dromara.scale.domain.vo.*;
import org.dromara.scale.mapper.SysEvaluationAnswerMapper;
import org.dromara.scale.mapper.SysEvaluationConclusionMapper;
import org.dromara.scale.mapper.SysEvaluationRecordMapper;
import org.dromara.scale.mapper.SysScaleMapper;
import org.dromara.scale.service.*;
import org.dromara.scale.mapper.*;
import org.dromara.scale.service.ISysScaleAnswerService;
import org.dromara.scale.service.ISysScaleFactorService;
import org.dromara.scale.service.ISysScaleQuestionService;
import org.dromara.scale.service.IWebService;
import org.dromara.system.domain.SysOss;
import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.mapper.SysDeptMapper;
import org.dromara.system.mapper.SysOssMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.MathContext;
@ -42,7 +49,6 @@ import static org.dromara.common.satoken.utils.LoginHelper.getLoginUser;
@Service
public class WebServiceImpl implements IWebService {
private final ISysScalePublishService scalePublishService;
private final ISysScaleFactorService scaleFactorService;
@ -52,17 +58,67 @@ public class WebServiceImpl implements IWebService {
private final SysScaleMapper scaleMapper;
private final SysScalePublishMapper publishMapper;
private final SysEvaluationRecordMapper recordMapper;
private final SysEvaluationConclusionMapper evaluationConclusionMapper;
private final SysEvaluationAnswerMapper evaluationAnswerMapper;
private final SysOssMapper ossMapper;
private final SysDeptMapper deptMapper;
private final MathContext mathContext = new MathContext(2);
@Override
public SysScalePublishVo queryPublishScale() {
return scalePublishService.queryPublishScale();
LoginUser loginUser = getLoginUser();
Long userId = loginUser.getUserId();
Long deptId = loginUser.getDeptId();
SysScalePublishVo sysScalePublishVo = null;
if (deptId != null) {
//先查询直接用户组的发布
LambdaQueryWrapper<SysScalePublish> lqw = Wrappers.lambdaQuery();
lqw.eq(SysScalePublish::getDeptId, deptId);
lqw.eq(SysScalePublish::getStatus, StatusEnum.IN_USE.getValue());
sysScalePublishVo = publishMapper.selectVoOne(lqw);
//没有则查询上级用户组的发布
if (sysScalePublishVo == null) {
SysDeptVo sysDept = deptMapper.selectDeptById(deptId);
LambdaQueryWrapper<SysScalePublish> parentLqw = Wrappers.lambdaQuery();
parentLqw.eq(SysScalePublish::getDeptId, sysDept.getParentId());
parentLqw.eq(SysScalePublish::getStatus, StatusEnum.IN_USE.getValue());
sysScalePublishVo = publishMapper.selectVoOne(lqw);
}
}
//都没有则查针对全部的发布
if (sysScalePublishVo == null) {
LambdaQueryWrapper<SysScalePublish> lqw = Wrappers.lambdaQuery();
lqw.eq(SysScalePublish::getDeptId, null);
lqw.eq(SysScalePublish::getStatus, StatusEnum.IN_USE.getValue());
sysScalePublishVo = publishMapper.selectVoOne(lqw);
}
if (sysScalePublishVo == null) {
return new SysScalePublishVo();
}
Long batchNo = sysScalePublishVo.getBatchNo();
String scaleIds = sysScalePublishVo.getScaleIds();
List<SysScaleVo> publishScaleVos = scaleMapper.findSysScaleByIds(StrUtil.join(StrUtil.COMMA, scaleIds));
List<SysEvaluationRecordVo> recordVos = recordMapper.selectSclaeRecordListByUserAndBatch(userId, batchNo);
for (SysScaleVo publishScaleVo : publishScaleVos) {
SysOss sysOss = ossMapper.selectById(publishScaleVo.getCover());
publishScaleVo.setCoverUrl(sysOss.getUrl());
//已做过量表
for (SysEvaluationRecordVo recordVo : recordVos) {
if (publishScaleVo.getScaleId().equals(recordVo.getScaleId())) {
publishScaleVo.setUsed(true);
}
}
}
sysScalePublishVo.setScaleList(publishScaleVos);
return sysScalePublishVo;
}
@Override
@ -75,6 +131,7 @@ public class WebServiceImpl implements IWebService {
LoginUser loginUser = getLoginUser();
SysEvaluationRecord add = MapstructUtils.convert(bo, SysEvaluationRecord.class);
add.setUserId(loginUser.getUserId());
add.setDeptId(loginUser.getDeptId());
add.setCreateTime(new Date());
//validEntityBeforeSave(add);
boolean flag = recordMapper.insert(add) > 0;
@ -84,9 +141,22 @@ public class WebServiceImpl implements IWebService {
return add.getRecordId();
}
@Transactional(rollbackFor = Exception.class)
@Override
public Map<String, Object> submitAnswer(List<SysEvaluationAnswerBo> answerList) {
public Map<String, Object> submitAnswer(SubmitAnswerBo bo) {
boolean allowQueryResult = true;
Long scaleId = bo.getScaleId();
Map<Long, List<SysScaleAnswerVo>> answerMapByQuestion = scaleAnswerService.getScaleAnswerMap(scaleId);
int keySize = answerMapByQuestion.keySet().size();
List<SysEvaluationAnswerBo> answerList = bo.getAnswerList();
if (ArrayUtil.isEmpty(answerList)) {
throw new ServiceException("请先填写,再提交");
}
int answerSize = answerList.size();
if (keySize != answerSize) {
throw new ServiceException("有题目未作选择,请检查后提交");
}
Long recordId = answerList.get(0).getRecordId();
SysScalePublishVo scalePublishVo = recordMapper.selectPublishByUseRecord(recordId);
//查询考核结果
@ -96,7 +166,7 @@ public class WebServiceImpl implements IWebService {
List<SysEvaluationAnswer> answerAdd = MapstructUtils.convert(answerList, SysEvaluationAnswer.class);
evaluationAnswerMapper.insertBatch(answerAdd);
List<SysEvaluationConclusionVo> list = calculateEvaluationResult(answerList);
List<SysEvaluationConclusionVo> list = calculateEvaluationResult(scaleId, answerList);
List<SysEvaluationConclusion> conclusionAdd = MapstructUtils.convert(list, SysEvaluationConclusion.class);
evaluationConclusionMapper.insertBatch(conclusionAdd);
@ -129,7 +199,7 @@ public class WebServiceImpl implements IWebService {
.map(SysEvaluationConclusionVo::getScore)
// 使用reduce()聚合函数,得到金额总和
.reduce(BigDecimal.ZERO, BigDecimal::add);
return new HashMap<String, Object>() {{
return new HashMap<>() {{
//put("evalRecordId",evalRecord.getId());
//put("scaleName",scaleInfo.getName());
put("totalScore", totalScore.doubleValue());
@ -138,11 +208,8 @@ public class WebServiceImpl implements IWebService {
}};
}
private List<SysEvaluationConclusionVo> calculateEvaluationResult(List<SysEvaluationAnswerBo> answerList) {
private List<SysEvaluationConclusionVo> calculateEvaluationResult(Long scaleId, List<SysEvaluationAnswerBo> answerList) {
Long recordId = answerList.get(0).getRecordId();
SysEvaluationRecordVo recordVo = recordMapper.selectVoById(recordId);
Long scaleId = recordVo.getScaleId();
Map<Long, List<SysScaleQuestionVo>> questionMapByFactor = scaleQuestionService.getScaleQuestionMap(scaleId);
Map<Long, List<SysScaleAnswerVo>> answerMapByQuestion = scaleAnswerService.getScaleAnswerMap(scaleId);
@ -181,10 +248,9 @@ public class WebServiceImpl implements IWebService {
});
scaleFactor.setQuestionIds(questionIds);
//计算得分率
if (totalSocre.get().compareTo(BigDecimal.ZERO) > 0) {
evalConclusion.setScoreRate(evalConclusion.getScore()
.multiply(new BigDecimal(100)).divide(totalSocre.get()).setScale(2, RoundingMode.HALF_UP));
.multiply(new BigDecimal(100)).divide(totalSocre.get(), 2, RoundingMode.HALF_UP));
}
//计算量表加强后得分
calcScoreByRuleType(evalConclusion, scaleFactor);

View File

@ -3,8 +3,22 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.scale.mapper.SysScaleMapper">
<select id="findSysScaleByIds" resultType="org.dromara.scale.domain.vo.SysScaleVo">
SELECT * FROM sys_scale t WHERE FIND_IN_SET(t.scale_id, #{scaleIds})
SELECT *
FROM sys_scale t
WHERE FIND_IN_SET(t.scale_id, #{scaleIds})
</select>
<update id="updateEvalNums">
update sys_scale
set eval_nums = eval_nums + 1
where scale_id = #{scaleId}
</update>
<update id="updatePublishNums">
update sys_scale
set publish_nums = publish_nums + 1
where scale_id = #{scaleId}
</update>
</mapper>