个人模板导出

This commit is contained in:
cjw 2024-04-29 14:52:56 +08:00
parent bf70a2737a
commit 64b1ec420d
14 changed files with 166 additions and 15 deletions

View File

@ -85,6 +85,10 @@
<artifactId>ruoyi-common-websocket</artifactId> <artifactId>ruoyi-common-websocket</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,23 +1,28 @@
package org.dromara.scale.controller; package org.dromara.scale.controller;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.util.PoitlIOUtils;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.core.utils.file.FileUtils;
import org.dromara.common.log.annotation.Log; import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType; import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController; import org.dromara.common.web.core.BaseController;
import org.dromara.scale.domain.bo.BaseQueryBo;
import org.dromara.scale.domain.bo.SysEvaluationRecordBo; import org.dromara.scale.domain.bo.SysEvaluationRecordBo;
import org.dromara.scale.domain.vo.SysEvaluationRecordVo; import org.dromara.scale.domain.vo.SysEvaluationRecordVo;
import org.dromara.scale.service.ISysEvaluationRecordService; import org.dromara.scale.service.ISysEvaluationRecordService;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/** /**
* 量测记录 * 量测记录
@ -48,9 +53,17 @@ public class EvaluationRecordController extends BaseController {
@SaCheckPermission("evaluation:record:export") @SaCheckPermission("evaluation:record:export")
@Log(title = "量测记录", businessType = BusinessType.EXPORT) @Log(title = "量测记录", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PostMapping("/export")
public void export(SysEvaluationRecordBo bo, HttpServletResponse response) { public void export(BaseQueryBo bo, HttpServletResponse response) throws IOException {
List<SysEvaluationRecordVo> list = sysEvaluationRecordService.queryList(bo); XWPFTemplate template = sysEvaluationRecordService.getWordTemplate(bo);
ExcelUtil.exportExcel(list, "量测记录", SysEvaluationRecordVo.class, response); //ExcelUtil.exportExcel(list, "量测记录", SysEvaluationRecordVo.class, response);
FileUtils.setAttachmentResponseHeader(response, bo.getNickName() + "的报告" + "-" + bo.getScaleName());
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);
} }
/** /**
@ -65,5 +78,4 @@ public class EvaluationRecordController extends BaseController {
} }
} }

View File

@ -0,0 +1,24 @@
package org.dromara.scale.domain;
import com.deepoove.poi.data.TableRenderData;
import lombok.Data;
/**
* <p>TODO<p>
*
* @author cjw
* @version V1.0.0
* @date 2024/4/29 11:09
*/
@Data
public class EvaluationEecordWordData {
private String nickName;
private String deptName;
private String sex;
private String scaleName;
private String scaleDetails;
private TableRenderData factor;
private TableRenderData intervene;
}

View File

@ -15,9 +15,11 @@ public class BaseQueryBo {
private Long batchNo; private Long batchNo;
private String sessionName; private String sessionName;
private Long scaleId; private Long scaleId;
private String scaleName;
private Long deptId; private Long deptId;
private Long userId; private Long userId;
private String nickName; private String nickName;
private Long recordId;
private Integer status; private Integer status;
private Integer situation; private Integer situation;
} }

View File

@ -21,4 +21,6 @@ public class TimeAxisVo {
private String type; private String type;
private Integer situation; private Integer situation;
private String note;
} }

View File

@ -0,0 +1,21 @@
package org.dromara.scale.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
* <p>TODO<p>
*
* @author cjw
* @version V1.0.0
* @date 2024/4/29 13:41
*/
@Data
public class WordEvaluationAnswerVo {
private String factorName;
private String questionContent;
private String answerOption;
private BigDecimal score;
}

View File

@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.scale.domain.SysEvaluationRecord; import org.dromara.scale.domain.SysEvaluationRecord;
import org.dromara.scale.domain.vo.WordEvaluationAnswerVo;
import org.dromara.scale.domain.vo.SysEvaluationRecordVo; import org.dromara.scale.domain.vo.SysEvaluationRecordVo;
import org.dromara.scale.domain.vo.SysScalePublishVo; import org.dromara.scale.domain.vo.SysScalePublishVo;
@ -27,4 +28,6 @@ public interface SysEvaluationRecordMapper extends BaseMapperPlus<SysEvaluationR
Page<SysEvaluationRecordVo> selectRecordVoPage(@Param("page") Page<SysEvaluationRecord> page, @Param(Constants.WRAPPER) Wrapper<SysEvaluationRecord> queryWrapper); Page<SysEvaluationRecordVo> selectRecordVoPage(@Param("page") Page<SysEvaluationRecord> page, @Param(Constants.WRAPPER) Wrapper<SysEvaluationRecord> queryWrapper);
List<WordEvaluationAnswerVo> selectAnswer4Word(Long recordId);
} }

View File

@ -1,11 +1,14 @@
package org.dromara.scale.service; 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.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.scale.domain.SysScalePublish; import org.dromara.scale.domain.SysScalePublish;
import org.dromara.scale.domain.bo.BaseQueryBo;
import org.dromara.scale.domain.bo.SysEvaluationRecordBo; import org.dromara.scale.domain.bo.SysEvaluationRecordBo;
import org.dromara.scale.domain.vo.SysEvaluationRecordVo; import org.dromara.scale.domain.vo.SysEvaluationRecordVo;
import java.io.IOException;
import java.util.List; import java.util.List;
/** /**
@ -34,6 +37,8 @@ public interface ISysEvaluationRecordService {
void insertBathByPublish(SysScalePublish add); void insertBathByPublish(SysScalePublish add);
XWPFTemplate getWordTemplate(BaseQueryBo bo) throws IOException;

View File

@ -3,22 +3,39 @@ package org.dromara.scale.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.data.Rows;
import com.deepoove.poi.data.TableRenderData;
import com.deepoove.poi.data.Tables;
import com.deepoove.poi.data.style.BorderStyle;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.scale.constant.StatusEnum; import org.dromara.scale.constant.StatusEnum;
import org.dromara.scale.domain.EvaluationEecordWordData;
import org.dromara.scale.domain.SysEvaluationRecord; import org.dromara.scale.domain.SysEvaluationRecord;
import org.dromara.scale.domain.SysScalePublish; import org.dromara.scale.domain.SysScalePublish;
import org.dromara.scale.domain.bo.BaseQueryBo;
import org.dromara.scale.domain.bo.SysEvaluationRecordBo; import org.dromara.scale.domain.bo.SysEvaluationRecordBo;
import org.dromara.scale.domain.vo.SysEvaluationRecordVo; import org.dromara.scale.domain.vo.SysEvaluationRecordVo;
import org.dromara.scale.domain.vo.SysScaleVo;
import org.dromara.scale.domain.vo.TimeAxisVo;
import org.dromara.scale.domain.vo.WordEvaluationAnswerVo;
import org.dromara.scale.mapper.SysEvaluationRecordMapper; import org.dromara.scale.mapper.SysEvaluationRecordMapper;
import org.dromara.scale.mapper.SysInterveneRecordMapper;
import org.dromara.scale.mapper.SysScaleMapper;
import org.dromara.scale.service.ISysEvaluationRecordService; import org.dromara.scale.service.ISysEvaluationRecordService;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserMapper;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -36,6 +53,12 @@ public class SysEvaluationRecordServiceImpl implements ISysEvaluationRecordServi
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
private final SysScaleMapper scaleMapper;
private final SysInterveneRecordMapper interveneMapper;
private final String resource = "word/personalTemplate.docx";
/** /**
* 查询量测记录 * 查询量测记录
*/ */
@ -96,4 +119,45 @@ public class SysEvaluationRecordServiceImpl implements ISysEvaluationRecordServi
} }
baseMapper.insertBatch(recordList, 100); baseMapper.insertBatch(recordList, 100);
} }
@Override
public XWPFTemplate getWordTemplate(BaseQueryBo bo) throws IOException {
Long userId = bo.getUserId();
Long recordId = bo.getRecordId();
Long scaleId = bo.getScaleId();
EvaluationEecordWordData wordData = new EvaluationEecordWordData();
SysUserVo user = userMapper.selectUserById(userId);
wordData.setNickName(user.getNickName());
wordData.setDeptName(user.getDept().getDeptName());
wordData.setSex("1".equals(user.getSex()) ? "" : "");
SysScaleVo scale = scaleMapper.selectVoById(scaleId);
wordData.setScaleName(scale.getScaleName());
wordData.setScaleDetails(scale.getScaleDetails());
List<WordEvaluationAnswerVo> answerVos = baseMapper.selectAnswer4Word(recordId);
BorderStyle borderStyle = new BorderStyle();
borderStyle.setColor("A6A6A6");
borderStyle.setSize(4);
borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE);
RowRenderData factorHeader = Rows.of("因子项", "题目", "选项", "得分").bgColor("F2F2F2").center()
.textColor("7F7f7F").textFontFamily("Hei").textFontSize(9).create();
TableRenderData factorTable = Tables.ofA4MediumWidth().addRow(factorHeader).border(borderStyle).center().create();
for (WordEvaluationAnswerVo answerVo : answerVos) {
RowRenderData one = Rows.of(answerVo.getFactorName(), answerVo.getQuestionContent(),
answerVo.getAnswerOption(), answerVo.getScore().toString()).center().create();
factorTable.addRow(one);
}
wordData.setFactor(factorTable);
List<TimeAxisVo> timeAxisVos = interveneMapper.selectTimeList(userId);
RowRenderData interveneHeader = Rows.of("干预标题", "干预时间", "诊断详情").bgColor("F2F2F2").center()
.textColor("7F7f7F").textFontFamily("Hei").textFontSize(9).create();
TableRenderData interveneTable = Tables.ofA4MediumWidth().addRow(interveneHeader).border(borderStyle).center().create();
for (TimeAxisVo timeAxisVo : timeAxisVos) {
RowRenderData one = Rows.of(timeAxisVo.getName(), timeAxisVo.getTime(),
timeAxisVo.getNote()).center().create();
interveneTable.addRow(one);
}
wordData.setIntervene(interveneTable);
ClassPathResource classPathResource = new ClassPathResource(resource);
return XWPFTemplate.compile(classPathResource.getInputStream()).render(wordData);
}
} }

View File

@ -22,7 +22,7 @@
sp.session_name, sp.session_name,
s.scale_id, s.scale_id,
s.scale_name, s.scale_name,
MAX(sfr.situation), MAX(sfr.situation) as `situation`,
er.create_time er.create_time
from sys_evaluation_record er from sys_evaluation_record er
left join sys_scale s on s.scale_id = er.scale_id left join sys_scale s on s.scale_id = er.scale_id

View File

@ -23,4 +23,17 @@
left join sys_scale s on s.scale_id = er.scale_id left join sys_scale s on s.scale_id = er.scale_id
${ew.getCustomSqlSegment} ${ew.getCustomSqlSegment}
</select> </select>
<select id="selectAnswer4Word" resultType="org.dromara.scale.domain.vo.WordEvaluationAnswerVo">
select sf.factor_name,
sq.question_content,
sa.answer_option,
sa.score
from sys_evaluation_answer ea
left join sys_scale_question sq on sq.question_id = ea.question_id
left join sys_scale_answer sa on sa.answer_id = ea.answer_id
left join sys_scale_factor sf on find_in_set(ea.question_id, sf.question_ids)
where ea.record_id = #{recordId}
order by sf.factor_name
</select>
</mapper> </mapper>

View File

@ -5,9 +5,10 @@
<mapper namespace="org.dromara.scale.mapper.SysInterveneRecordMapper"> <mapper namespace="org.dromara.scale.mapper.SysInterveneRecordMapper">
<select id="selectTimeList" resultType="org.dromara.scale.domain.vo.TimeAxisVo"> <select id="selectTimeList" resultType="org.dromara.scale.domain.vo.TimeAxisVo">
select ir.intervene_id as `id`, select ir.intervene_id as `id`,
CONCAT(DATE_FORMAT(create_time, '%Y-%m-%d'), ' ', u.nick_name, '的干预') as `name`, CONCAT(DATE_FORMAT(ir.create_time, '%Y-%m-%d'), ' ', u.nick_name, '的干预') as `name`,
ir.create_time as `time`, ir.create_time as `time`,
'intervene' as `type` 'intervene' as `type`,
ir.diagnose as `note`
from sys_intervene_record ir from sys_intervene_record ir
left join sys_user u on u.user_id = ir.counselor_id left join sys_user u on u.user_id = ir.counselor_id
where ir.user_id = #{userId} where ir.user_id = #{userId}

View File

@ -93,10 +93,10 @@ public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
* @param userId 用户ID * @param userId 用户ID
* @return 用户对象信息 * @return 用户对象信息
*/ */
@DataPermission({ // @DataPermission({
@DataColumn(key = "deptName", value = "d.dept_id"), // @DataColumn(key = "deptName", value = "d.dept_id"),
@DataColumn(key = "userName", value = "u.user_id") // @DataColumn(key = "userName", value = "u.user_id")
}) // })
SysUserVo selectUserById(Long userId); SysUserVo selectUserById(Long userId);
@Override @Override