团队模板80%;新增发布没有填入names的bug修复;web获取发布没有recordId的bug修复

This commit is contained in:
cjw 2024-05-13 10:51:59 +08:00
parent d3b8086723
commit 81cb29e4ba
16 changed files with 259 additions and 23 deletions

View File

@ -51,7 +51,7 @@ public class EvaluationRecordController extends BaseController {
* 导出量测记录列表
*/
@SaCheckPermission("evaluation:record:export")
@Log(title = "量测记录", businessType = BusinessType.EXPORT)
@Log(title = "个人量测记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BaseQueryBo bo, HttpServletResponse response) throws IOException {
XWPFTemplate template = sysEvaluationRecordService.getWordTemplate(bo);

View File

@ -1,10 +1,13 @@
package org.dromara.scale.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.util.PoitlIOUtils;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.file.FileUtils;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.excel.utils.ExcelUtil;
@ -22,6 +25,9 @@ import org.dromara.scale.service.ISysScalePublishService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
/**
@ -62,7 +68,7 @@ public class ScalePublishController extends BaseController {
@SaCheckPermission("publish:evaluation:export")
@Log(title = "未测名单", businessType = BusinessType.EXPORT)
@PostMapping("/evaluation/undone/export")
public void export(BaseQueryBo query, HttpServletResponse response) {
public void undoneExport(BaseQueryBo query, HttpServletResponse response) {
List<EvaluationVo> list = sysScalePublishService.queryUndoneExportList(query);
ExcelUtil.exportExcel(list, query.getSessionName() + "的未测名单", EvaluationVo.class, response);
}
@ -124,4 +130,22 @@ public class ScalePublishController extends BaseController {
return toAjax(sysScalePublishService.deleteById(batchNo));
}
/**
* 导出量测记录列表
*/
@SaCheckPermission("scale:publish:export")
@Log(title = "场次量测记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BaseQueryBo bo, HttpServletResponse response) throws IOException {
XWPFTemplate template = sysScalePublishService.getWordTemplate(bo);
//ExcelUtil.exportExcel(list, "量测记录", SysEvaluationRecordVo.class, response);
FileUtils.setAttachmentResponseHeader(response, bo.getSessionName() + "的报告");
response.setContentType("application/octet-stream");
OutputStream out = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
template.write(bos);
bos.flush();
out.flush();
PoitlIOUtils.closeQuietlyMulti(template, bos, out);
}
}

View File

@ -35,6 +35,7 @@ public class SysWarnRecord {
* 测评人id
*/
private Long userId;
private Long deptId;
/**
* 补充说明

View File

@ -70,6 +70,8 @@ public class SysScalePublishVo implements Serializable {
private String createName;
private Date createTime;
private List<SysScaleVo> scaleList;

View File

@ -7,14 +7,14 @@ import lombok.Data;
import java.util.List;
/**
* <p>TODO<p>
* <p>个人测试报告<p>
*
* @author cjw
* @version V1.0.0
* @date 2024/4/29 11:09
*/
@Data
public class EvaluationEecordWordData {
public class EvaluationRecordWordData {
private String createTime;
private String useTime;

View File

@ -0,0 +1,53 @@
package org.dromara.scale.domain.word;
import com.deepoove.poi.data.ChartSingleSeriesRenderData;
import lombok.Data;
import java.util.List;
/**
* <p>团体测试报告<p>
*
* @author cjw
* @version V1.0.0
* @date 2024/4/29 11:09
*/
@Data
public class PublishRecordWordData {
private String sessionName;
private String publishTime;
private String dataTime;
private String classNum;
private String personNum;
private String maleNum;
private String malePercent;
private String femaleNum;
private String femalePercent;
private ChartSingleSeriesRenderData sexChart;
private String completeNum;
private String completePercent;
private String undoneNum;
private String undonePercent;
private ChartSingleSeriesRenderData completeChart;
private String warnNum;
private String warnPercent;
private String normalNum;
private String normalPercent;
private ChartSingleSeriesRenderData warnChart;
private String classWarnName;
private String classWarnNum;
private String classWarnPercent;
private ChartSingleSeriesRenderData classChart;
private List<WordWarn> warnCharts;
}

View File

@ -0,0 +1,19 @@
package org.dromara.scale.domain.word;
import com.deepoove.poi.data.ChartSingleSeriesRenderData;
import lombok.Data;
/**
* <p>TODO<p>
*
* @author cjw
* @version V1.0.0
* @date 2024/5/11 16:20
*/
@Data
public class WordWarn {
private String scaleName;
private ChartSingleSeriesRenderData warnChart;
}

View File

@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.scale.domain.SysEvaluationRecord;
import org.dromara.scale.domain.vo.StatisticNumVo;
import org.dromara.scale.domain.vo.SysScaleVo;
import org.dromara.scale.domain.word.WordEvaluationFactor;
import org.dromara.scale.domain.vo.SysEvaluationRecordVo;
@ -35,4 +36,10 @@ public interface SysEvaluationRecordMapper extends BaseMapperPlus<SysEvaluationR
int deleteByBatchNo(Long batchNo);
int selectCompleteNumByBatchNo(Long batchNo);
int selectWarnNumByBatchNo(Long batchNo);
List<StatisticNumVo> selectMaxWarnNumByBatchNo(Long batchNo);
}

View File

@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.scale.domain.SysScalePublish;
import org.dromara.scale.domain.vo.EvaluationVo;
import org.dromara.scale.domain.vo.StatisticNumVo;
import org.dromara.scale.domain.vo.SysScalePublishVo;
import java.util.List;
@ -32,4 +33,6 @@ public interface SysScalePublishMapper extends BaseMapperPlus<SysScalePublish, S
String selectUseBatchNoByUserId(Long userId);
StatisticNumVo selectSexNumByBatchNo(Long batchNo);
}

View File

@ -1,5 +1,6 @@
package org.dromara.scale.service;
import com.deepoove.poi.XWPFTemplate;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.scale.domain.bo.BaseQueryBo;
@ -7,6 +8,7 @@ import org.dromara.scale.domain.bo.SysScalePublishBo;
import org.dromara.scale.domain.vo.EvaluationVo;
import org.dromara.scale.domain.vo.SysScalePublishVo;
import java.io.IOException;
import java.util.List;
/**
@ -54,5 +56,7 @@ public interface ISysScalePublishService {
List<EvaluationVo> queryUndoneExportList(BaseQueryBo query);
XWPFTemplate getWordTemplate(BaseQueryBo bo) throws IOException;
}

View File

@ -17,7 +17,7 @@ import org.dromara.scale.domain.bo.BaseQueryBo;
import org.dromara.scale.domain.bo.SysEvaluationRecordBo;
import org.dromara.scale.domain.vo.SysEvaluationRecordVo;
import org.dromara.scale.domain.vo.SysScaleVo;
import org.dromara.scale.domain.word.EvaluationEecordWordData;
import org.dromara.scale.domain.word.EvaluationRecordWordData;
import org.dromara.scale.domain.word.WordEvaluationFactor;
import org.dromara.scale.domain.word.WordFactor;
import org.dromara.scale.mapper.SysEvaluationRecordMapper;
@ -103,7 +103,7 @@ public class SysEvaluationRecordServiceImpl implements ISysEvaluationRecordServi
if (scaleId == null) {
throw new ServerException("量表ID不能为空");
}
EvaluationEecordWordData wordData = new EvaluationEecordWordData();
EvaluationRecordWordData wordData = new EvaluationRecordWordData();
SysEvaluationRecord sysEvaluationRecord = baseMapper.selectById(recordId);
Date createTime = sysEvaluationRecord.getCreateTime();

View File

@ -5,6 +5,9 @@ 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 com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.ChartSingleSeriesRenderData;
import com.deepoove.poi.data.Charts;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
@ -19,10 +22,8 @@ import org.dromara.scale.domain.SysEvaluationRecord;
import org.dromara.scale.domain.SysScalePublish;
import org.dromara.scale.domain.bo.BaseQueryBo;
import org.dromara.scale.domain.bo.SysScalePublishBo;
import org.dromara.scale.domain.vo.EvaluationVo;
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.domain.vo.*;
import org.dromara.scale.domain.word.PublishRecordWordData;
import org.dromara.scale.mapper.SysEvaluationRecordMapper;
import org.dromara.scale.mapper.SysScaleMapper;
import org.dromara.scale.mapper.SysScalePublishMapper;
@ -33,9 +34,11 @@ import org.dromara.system.mapper.SysDeptMapper;
import org.dromara.system.mapper.SysUserMapper;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.rmi.ServerException;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@ -110,9 +113,7 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService {
add.setCreateBy(loginUser.getUserId());
add.setCreateTime(new Date());
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
Integer publishType = add.getPublishType();
Long batchNo = add.getBatchNo();
String scaleIds = add.getScaleIds();
String deptIds = add.getDeptIds();
String userIds = add.getUserIds();
@ -149,12 +150,13 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService {
add.setUserNames(userList.stream().map(SysUser::getNickName).collect(Collectors.joining(StrUtil.COMMA)));
}
add.setTotalNum(userList.size());
//预处理量测记录方便后续统计与查询
List<String> scaleList = bo.getScaleIds();
insertRecordBatch(batchNo, scaleList, userList);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setBatchNo(add.getBatchNo());
}
//预处理量测记录方便后续统计与查询
List<String> scaleList = bo.getScaleIds();
insertRecordBatch(add.getBatchNo(), scaleList, userList);
//加入延迟队列
QueueUtils.addDelayedQueueObject("scalePublish-delay-queue", add.getBatchNo(), l, TimeUnit.MILLISECONDS);
return flag;
@ -261,4 +263,94 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService {
public List<EvaluationVo> queryUndoneExportList(BaseQueryBo query) {
return baseMapper.selectUndoneEvaluationVoList(query.getBatchNo());
}
@Override
public XWPFTemplate getWordTemplate(BaseQueryBo bo) throws IOException {
Long batchNo = bo.getBatchNo();
if (batchNo == null) {
throw new ServerException("场次Id不能为空");
}
PublishRecordWordData wordData = new PublishRecordWordData();
SysScalePublishVo publishVo = baseMapper.selectVoById(batchNo);
wordData.setSessionName(publishVo.getSessionName());
Date createTime = publishVo.getCreateTime();
Date expireTime = publishVo.getExpireTime();
wordData.setPublishTime(DateUtils.dateTime(createTime) + "~" + DateUtils.dateTime(expireTime));
wordData.setDataTime(DateUtils.getTime());
int classNum = publishVo.getDeptIds().size();
wordData.setClassNum(String.valueOf(classNum));
StatisticNumVo numVo = baseMapper.selectSexNumByBatchNo(batchNo);
int maleNum = numVo.getValue();
int femaleNum = numVo.getSpareValue();
int personTotal = maleNum + femaleNum;
int malePercent = processHalfUpPercent(maleNum, personTotal);
int femalePercent = processHalfUpPercent(femaleNum, personTotal);
wordData.setMaleNum(String.valueOf(maleNum));
wordData.setMalePercent(malePercent + "%");
wordData.setFemaleNum(String.valueOf(femaleNum));
wordData.setFemalePercent(femalePercent + "%");
ChartSingleSeriesRenderData sexChart = Charts.ofSingleSeries("", new String[]{"男生(人)", "女生(人)"})
.series("", new Integer[]{maleNum, femaleNum}).create();
wordData.setSexChart(sexChart);
int completeNum = recordMapper.selectCompleteNumByBatchNo(batchNo);
int completePercent = processHalfUpPercent(completeNum, personTotal);
int undoneNum = personTotal - completeNum;
int undonePercent = processHalfUpPercent(undoneNum, personTotal);
wordData.setCompleteNum(String.valueOf(completeNum));
wordData.setCompletePercent(completePercent + "%");
wordData.setUndoneNum(String.valueOf(undoneNum));
wordData.setUndonePercent(undonePercent + "%");
ChartSingleSeriesRenderData completeChart = Charts.ofSingleSeries("", new String[]{"完成计划(人)", "未完成计划(人)"})
.series("", new Integer[]{completeNum, undoneNum}).create();
wordData.setCompleteChart(completeChart);
int warnNum = recordMapper.selectWarnNumByBatchNo(batchNo);
int warnPercent = processHalfUpPercent(warnNum, personTotal);
int normalNum = personTotal - completeNum;
int normalPercent = processHalfUpPercent(normalNum, personTotal);
wordData.setWarnNum(String.valueOf(warnNum));
wordData.setWarnPercent(warnPercent + "%");
wordData.setNormalNum(String.valueOf(normalNum));
wordData.setNormalPercent(normalPercent + "%");
ChartSingleSeriesRenderData warnChart = Charts.ofSingleSeries("", new String[]{"触发预警(人)", "未触发预警(人)"})
.series("", new Integer[]{warnNum, normalNum}).create();
wordData.setWarnChart(warnChart);
List<StatisticNumVo> maxList = recordMapper.selectMaxWarnNumByBatchNo(batchNo);
Optional<StatisticNumVo> max = maxList.stream().max(Comparator.comparingInt(StatisticNumVo::getValue));
if (max.isPresent()) {
StatisticNumVo classVo = max.get();
String classWarnName = classVo.getName();
int classWarnNum = classVo.getValue();
int classWarnPercent = processHalfUpPercent(classWarnNum, personTotal);
int otherNum = personTotal - classWarnNum;
wordData.setClassWarnName(classWarnName);
wordData.setClassWarnNum(String.valueOf(classWarnNum));
wordData.setClassWarnPercent(classWarnPercent + "%");
ChartSingleSeriesRenderData classChart = Charts.ofSingleSeries("", new String[]{classWarnName + "(人)", "其他(人)"})
.series("", new Integer[]{classWarnNum, otherNum}).create();
wordData.setClassChart(classChart);
}
return null;
}
private int processHalfUpPercent(int num, int total) {
return BigDecimal.valueOf(num)
.divide(BigDecimal.valueOf(total), 2, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100)).intValue();
}
public static void main(String[] args) {
int i = BigDecimal.valueOf(0)
.divide(BigDecimal.valueOf(10), 2, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100)).intValue();
System.out.println(i);
}
}

View File

@ -178,7 +178,8 @@ public class WebServiceImpl implements IWebService {
if (used.contains(riskLevel)) {
SysWarnRecord wre = new SysWarnRecord();
wre.setBatchNo(scalePublishVo.getBatchNo());
wre.setUserId(getLoginUser().getUserId());
wre.setUserId(loginUser.getUserId());
wre.setDeptId(loginUser.getDeptId());
wre.setWarnTime(new Date());
wre.setSituation(riskLevel);
warnRecordService.insertByBo(wre);

View File

@ -97,7 +97,7 @@
left join sys_scale_publish sp on FIND_IN_SET(d.dept_id, sp.dept_ids)
where parent.parent_id = 100
group by parent.dept_id
order by `name`
order by parent.order_num
</select>
<select id="selectEvaluationNumByGrade" resultType="org.dromara.scale.domain.vo.StatisticNumVo">
@ -107,7 +107,7 @@
left join sys_evaluation_record er on er.dept_id = d.dept_id
where parent.parent_id = 100
group by parent.dept_id
order by `name`
order by parent.order_num
</select>
<select id="selectConclusion" resultType="org.dromara.scale.domain.vo.StatisticWarnVo">
@ -124,7 +124,7 @@
left join sys_scale_factor_range sfr on sfr.range_id = ec.factor_range_id
where parent.parent_id = 100
group by parent.dept_id
order by `name`
order by parent.order_num
</select>
<select id="selectPublish" resultType="org.dromara.scale.domain.vo.StatisticPublishVo">

View File

@ -10,7 +10,8 @@
s.cover,
s.questions_num,
o.url as `coverUrl`,
if(er.status = 1, true, false) as `use`
if(er.status = 1, true, false) as `use`,
er.record_id
from sys_evaluation_record er
left join sys_scale s on s.scale_id = er.scale_id
left join sys_oss o on o.oss_id = s.cover
@ -58,4 +59,25 @@
from sys_evaluation_record
where batch_no = #{batchNo}
</delete>
<select id="selectCompleteNumByBatchNo" resultType="int">
select count(*)
from sys_evaluation_record
where batch_no = #{batchNo}
and status = 1
</select>
<select id="selectWarnNumByBatchNo" resultType="int">
select count(*)
from sys_warn_record
where batch_no = #{batchNo}
</select>
<select id="selectMaxWarnNumByBatchNo" resultType="org.dromara.scale.domain.vo.StatisticNumVo">
select d.dept_name as `name`, count(wr.warn_id) as `value`
from sys_warn_record wr
left join sys_dept d on d.dept_id = wr.dept_id
where wr.batch_no = #{batchNo}
group by wr.dept_id
</select>
</mapper>

View File

@ -75,4 +75,12 @@
where status = 1
and find_in_set(#{userId}, user_ids)
</select>
<select id="selectSexNumByBatchNo" resultType="org.dromara.scale.domain.vo.StatisticNumVo">
select count(if(u.sex = '0', 1, null)) as `value`,
count(if(u.sex = '1', 1, null)) as `spareValue`
from sys_evaluation_record er
left join sys_user u on u.user_id = er.user_id
where er.batch_no = #{batchNo};
</select>
</mapper>