Browse Source

问卷导出

master
zhizhi wu 4 years ago
parent
commit
3a4e8bbfdb
  1. 19
      src/main/java/com/ccsens/carbasics/api/QuestionnaireController.java
  2. 10
      src/main/java/com/ccsens/carbasics/bean/dto/QuestionnaireDto.java
  3. 22
      src/main/java/com/ccsens/carbasics/bean/vo/CodeVo.java
  4. 8
      src/main/java/com/ccsens/carbasics/bean/vo/QuestionnaireVo.java
  5. 9
      src/main/java/com/ccsens/carbasics/persist/dao/AreaDao.java
  6. 21
      src/main/java/com/ccsens/carbasics/persist/dao/CodeDictionariesDao.java
  7. 11
      src/main/java/com/ccsens/carbasics/persist/dao/QuestionnaireRecordDao.java
  8. 10
      src/main/java/com/ccsens/carbasics/service/DictionariesService.java
  9. 9
      src/main/java/com/ccsens/carbasics/service/IQuestionnaireService.java
  10. 77
      src/main/java/com/ccsens/carbasics/service/QuestionnaireService.java
  11. 4
      src/main/resources/application-dev.yml
  12. 4
      src/main/resources/application-prod.yml
  13. 4
      src/main/resources/application-test.yml
  14. 3
      src/main/resources/druid-dev.yml
  15. 7
      src/main/resources/mapper_dao/AreaDao.xml
  16. 21
      src/main/resources/mapper_dao/CodeDictionariesDao.xml
  17. 16
      src/main/resources/mapper_dao/QuestionnaireRecordDao.xml

19
src/main/java/com/ccsens/carbasics/api/QuestionnaireController.java

@ -1,5 +1,7 @@
package com.ccsens.carbasics.api;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.CharsetUtil;
import com.ccsens.carbasics.bean.dto.QuestionnaireDto;
import com.ccsens.carbasics.bean.po.Questionnaire;
import com.ccsens.carbasics.bean.vo.QuestionnaireVo;
@ -12,6 +14,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@ -19,6 +22,10 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -111,4 +118,16 @@ public class QuestionnaireController {
log.info("用户是否提交了当前类型的问卷结束");
return JsonResponse.newInstance().ok(submit);
}
@ApiOperation(value = "用户是否提交了当前类型的问卷", notes = "")
@RequestMapping(value = "/export", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
public void export(@ApiParam @Validated QuestionnaireDto.Export export, HttpServletResponse response) throws Exception{
log.info("用户是否提交了当前类型的问卷{}", export);
// 未添加时间条件
Workbook workbook = questionnaireService.export(export);
log.info("用户是否提交了当前类型的问卷结束");
String fileName = "山西省缺血性脑卒中数据汇总表"+ DateUtil.format(new Date(), "yyyyMMddHHmmss") +".xlsx";
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, CharsetUtil.UTF_8));
workbook.write(response.getOutputStream());
}
}

10
src/main/java/com/ccsens/carbasics/bean/dto/QuestionnaireDto.java

@ -73,4 +73,14 @@ public class QuestionnaireDto {
@ApiModelProperty("问卷类型(0-卒中)")
private Byte type;
}
@Data
@ApiModel("判断是否提交了问卷-请求")
public static class Export {
@ApiModelProperty("开始时间 年-月-日 时:分:秒")
private String startTime;
@ApiModelProperty("结束时间 年-月-日 时:分:秒")
private String endTime;
}
}

22
src/main/java/com/ccsens/carbasics/bean/vo/CodeVo.java

@ -0,0 +1,22 @@
package com.ccsens.carbasics.bean.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @description:
* @author: whj
* @time: 2021/10/1 11:13
*/
public class CodeVo {
@ApiModel("试题Code")
@Data
public static class Basic{
@ApiModelProperty("code")
private String questionCode;
@ApiModelProperty("题目")
private String question;
}
}

8
src/main/java/com/ccsens/carbasics/bean/vo/QuestionnaireVo.java

@ -19,6 +19,14 @@ public class QuestionnaireVo {
@ApiModelProperty("子地区")
private List<AreaInfo> child;
}
@Data
@ApiModel("地区信息")
public static class AreaBasic{
@ApiModelProperty("地区id")
private Long id;
@ApiModelProperty("地区名称")
private String name;
}
@Data
@ApiModel("问卷信息")

9
src/main/java/com/ccsens/carbasics/persist/dao/AreaDao.java

@ -1,12 +1,12 @@
package com.ccsens.carbasics.persist.dao;
import com.ccsens.carbasics.bean.dto.QuestionnaireDto;
import com.ccsens.carbasics.bean.vo.QuestionnaireVo;
import com.ccsens.carbasics.persist.mapper.AreaMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
public interface AreaDao extends AreaMapper {
@ -17,4 +17,11 @@ public interface AreaDao extends AreaMapper {
* @return 地区列表
*/
List<QuestionnaireVo.AreaInfo> queryByParentId(@Param("id") Long id);
/**
* 查询指定的地区
* @param areaIds 地区ID
* @return 地区
*/
List<QuestionnaireVo.AreaBasic> queryByIdArr(@Param("areaIds") List<Long> areaIds);
}

21
src/main/java/com/ccsens/carbasics/persist/dao/CodeDictionariesDao.java

@ -0,0 +1,21 @@
package com.ccsens.carbasics.persist.dao;
import com.ccsens.carbasics.bean.vo.CodeVo;
import com.ccsens.carbasics.persist.mapper.CodeDictionariesMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @description:
* @author: whj
* @time: 2021/10/1 11:10
*/
public interface CodeDictionariesDao extends CodeDictionariesMapper {
/**
* 查询指定的下级code
* @param parentCodes 上级code
* @return 直接下级
*/
List<CodeVo.Basic> query(@Param("codes") List<String> parentCodes);
}

11
src/main/java/com/ccsens/carbasics/persist/dao/QuestionnaireRecordDao.java

@ -1,10 +1,13 @@
package com.ccsens.carbasics.persist.dao;
import com.ccsens.carbasics.bean.dto.QuestionnaireDto;
import com.ccsens.carbasics.bean.vo.CodeVo;
import com.ccsens.carbasics.bean.vo.QuestionnaireVo;
import com.ccsens.carbasics.persist.mapper.QuestionnaireRecordMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface QuestionnaireRecordDao extends QuestionnaireRecordMapper {
@ -22,4 +25,12 @@ public interface QuestionnaireRecordDao extends QuestionnaireRecordMapper {
* @return code与答案
*/
List<QuestionnaireVo.QuestionnaireInfo> queryInfo(@Param("userId") Long userId);
/**
* 查询记录
* @param export 查询条件
* @param codes 查询试题
* @return 记录
*/
List<Map<String, String>> queryRecord(@Param("export") QuestionnaireDto.Export export, @Param("codes") List<CodeVo.Basic> codes);
}

10
src/main/java/com/ccsens/carbasics/service/DictionariesService.java

@ -5,7 +5,7 @@ import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.ccsens.carbasics.bean.po.*;
import com.ccsens.carbasics.persist.mapper.CodeDictionariesMapper;
import com.ccsens.carbasics.persist.dao.CodeDictionariesDao;
import com.ccsens.carbasics.persist.mapper.CodeParentMapper;
import com.ccsens.carbasics.persist.mapper.StepMapper;
import com.ccsens.carbasics.util.Constant;
@ -39,7 +39,7 @@ public class DictionariesService implements IDictionariesService{
@Resource
private Snowflake snowflake;
@Resource
private CodeDictionariesMapper dictionariesMapper;
private CodeDictionariesDao dictionariesDao;
@Resource
private StepMapper stepMapper;
@Resource
@ -93,7 +93,7 @@ public class DictionariesService implements IDictionariesService{
//添加数据库
CodeDictionariesExample dictionariesExample = new CodeDictionariesExample();
dictionariesExample.createCriteria().andQuestionCodeEqualTo(questionCode);
List<CodeDictionaries> dictionariesList = dictionariesMapper.selectByExample(dictionariesExample);
List<CodeDictionaries> dictionariesList = dictionariesDao.selectByExample(dictionariesExample);
if(CollectionUtil.isNotEmpty(dictionariesList)){
CodeDictionaries dictionaries = dictionariesList.get(0);
log.info("医院id和题目code相同,修改旧数据-{}",dictionaries);
@ -103,7 +103,7 @@ public class DictionariesService implements IDictionariesService{
codeDictionaries.setQuestionCode(questionCode);
codeDictionaries.setTaskName(taskName);
codeDictionaries.setOperator(userId);
dictionariesMapper.updateByPrimaryKeySelective(codeDictionaries);
dictionariesDao.updateByPrimaryKeySelective(codeDictionaries);
}else {
CodeDictionaries codeDictionaries = new CodeDictionaries();
codeDictionaries.setId(snowflake.nextId());
@ -111,7 +111,7 @@ public class DictionariesService implements IDictionariesService{
codeDictionaries.setQuestionCode(questionCode);
codeDictionaries.setTaskName(taskName);
codeDictionaries.setOperator(userId);
dictionariesMapper.insertSelective(codeDictionaries);
dictionariesDao.insertSelective(codeDictionaries);
log.info("添加一个code-{}",codeDictionaries);
}
// 设置上级code

9
src/main/java/com/ccsens/carbasics/service/IQuestionnaireService.java

@ -3,7 +3,9 @@ package com.ccsens.carbasics.service;
import com.ccsens.carbasics.bean.dto.QuestionnaireDto;
import com.ccsens.carbasics.bean.vo.QuestionnaireVo;
import org.apache.poi.ss.usermodel.Workbook;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
@ -70,4 +72,11 @@ public interface IQuestionnaireService {
* @return 是否提交
*/
QuestionnaireVo.Submit isSubmit(QuestionnaireDto.Submit param, Long userId);
/**
* 导出问卷调查数据
* @param export 导出条件
* @return 问卷
*/
Workbook export(QuestionnaireDto.Export export) throws IOException;
}

77
src/main/java/com/ccsens/carbasics/service/QuestionnaireService.java

@ -4,9 +4,11 @@ package com.ccsens.carbasics.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.ccsens.carbasics.bean.dto.PatientDto;
import com.ccsens.carbasics.bean.dto.QuestionnaireDto;
import com.ccsens.carbasics.bean.po.*;
import com.ccsens.carbasics.bean.vo.CodeVo;
import com.ccsens.carbasics.bean.vo.OrganizationMemberVo;
import com.ccsens.carbasics.bean.vo.QuestionnaireVo;
import com.ccsens.carbasics.persist.dao.*;
@ -19,15 +21,23 @@ import com.ccsens.common.bean.dto.CProjectDto;
import com.ccsens.common.bean.vo.CProjectVo;
import com.ccsens.common.service.IMemberService;
import com.ccsens.common.service.IProjectService;
import com.ccsens.util.PoiUtil;
import com.ccsens.util.PropUtil;
import com.ccsens.util.RedisUtil;
import com.ccsens.util.exception.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.*;
@ -36,6 +46,8 @@ import java.util.*;
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class QuestionnaireService implements IQuestionnaireService{
@Value("${question.template}")
private String template;
@Resource
private QuestionnaireDao questionnaireDao;
@Resource
@ -69,6 +81,8 @@ public class QuestionnaireService implements IQuestionnaireService{
@Resource
private IFirstAidService firstAidService;
@Resource
private CodeDictionariesDao codeDictionariesDao;
@Resource
private RedisUtil redisUtil;
@Resource
private Tall3FeignClient tall3FeignClient;
@ -236,6 +250,69 @@ public class QuestionnaireService implements IQuestionnaireService{
return submit;
}
@Override
public Workbook export(QuestionnaireDto.Export export) throws IOException {
String areaCode = "CITY-COUNTY";
String submitStatus = "submitStatus";
String updateTime = "updateTime";
List<String> parentCodes = new ArrayList<>();
parentCodes.add("QXXWJ");
parentCodes.add("XGZL");
List<CodeVo.Basic> codes = codeDictionariesDao.query(parentCodes);
log.info("code数量:{}", codes.size());
List<Map<String, String>> records = questionnaireRecordDao.queryRecord(export, codes);
log.info("记录结束");
List<Long> areaIds = new ArrayList<>();
records.forEach(record ->{
String s = record.get(areaCode);
if (StrUtil.isNotBlank(s)) {
String[] split = s.split(Constant.STRING_REGEX);
for(String id: split) {
areaIds.add(Long.parseLong(id));
}
}
});
// 地区
List<QuestionnaireVo.AreaBasic> areas = areaDao.queryByIdArr(areaIds);
Map<String, String> areaMap = new HashMap<>();
areas.forEach(area -> {
areaMap.put(area.getId()+"", area.getName());
});
// 表格内容
List<List<PoiUtil.PoiUtilCell>> rows = new ArrayList<>();
// 内容
for (int i = 0; i < records.size(); i++) {
Map<String, String> record = records.get(i);
List<PoiUtil.PoiUtilCell> content = new ArrayList<>();
content.add(new PoiUtil.PoiUtilCell( i + 1 + ""));
content.add(new PoiUtil.PoiUtilCell(record.get(submitStatus)));
codes.forEach(code -> {
if (areaCode.equals(code.getQuestionCode())) {
String areaAnswer = record.get(code.getQuestionCode());
if(StrUtil.isEmpty(areaAnswer)) {
content.add(new PoiUtil.PoiUtilCell(""));
return;
}
String[] split = areaAnswer.split(Constant.STRING_REGEX);
StringBuilder builder = new StringBuilder();
for (String id: split) {
builder.append(areaMap.get(id)).append("/");
}
String areaName = builder.length() <= 0 ? "" : builder.substring(0, builder.length() - 1);
content.add(new PoiUtil.PoiUtilCell(areaName));
} else {
content.add(new PoiUtil.PoiUtilCell(record.get(code.getQuestionCode())));
}
});
content.add(new PoiUtil.PoiUtilCell(record.getOrDefault(updateTime,"")));
rows.add(content);
}
Workbook workbook = new XSSFWorkbook(template);
PoiUtil.exportWB("sheet1", 5, rows, workbook);
return workbook;
}
/**
* 提交问卷后的后续操作

4
src/main/resources/application-dev.yml

@ -50,4 +50,6 @@ file:
imgDomain: https://test.tall.wiki/gateway/carbasics/v4.0/uploads/
wisdom:
weight: 10000
time: 600000
time: 600000
question:
template: D:\wechat\WeChat Files\wxid_km0nxjweubc522\FileStorage\File\2021-10\暴风眼问卷导出表格模板.xlsx

4
src/main/resources/application-prod.yml

@ -39,4 +39,6 @@ file:
imgDomain: https://www.tall.wiki/gateway/carbasics/v4.0/uploads/
wisdom:
weight: 10000
time: 600000
time: 600000
question:
template: /home/cloud/carbasics/uploads/template/暴风眼问卷导出表格模板.xlsx

4
src/main/resources/application-test.yml

@ -48,4 +48,6 @@ file:
imgDomain: https://test.tall.wiki/gateway/carbasics/v4.0/uploads/
wisdom:
weight: 10000
time: 600000
time: 600000
question:
template: /home/cloud/carbasics/uploads/template/暴风眼问卷导出表格模板.xlsx

3
src/main/resources/druid-dev.yml

@ -28,7 +28,8 @@ spring:
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
url: jdbc:mysql://49.233.89.188:3306/carbasics?useUnicode=true&characterEncoding=UTF-8
# url: jdbc:mysql://49.233.89.188:3306/carbasics?useUnicode=true&characterEncoding=UTF-8
url: jdbc:mysql://www.tall.wiki:3306/carbasics?useUnicode=true&characterEncoding=UTF-8
username: root
validationQuery: SELECT 1 FROM DUAL
# env: CCSENS_GAME

7
src/main/resources/mapper_dao/AreaDao.xml

@ -35,5 +35,12 @@
AND a1.area_type = 0
AND a2.area_type = 0
</select>
<select id="queryByIdArr" resultType="com.ccsens.carbasics.bean.vo.QuestionnaireVo$AreaBasic">
select id, area_name as name from t_area
where rec_status = 0
<foreach collection="areaIds" item="id" open="and id in (" close=")" separator=",">
${id}
</foreach>
</select>
</mapper>

21
src/main/resources/mapper_dao/CodeDictionariesDao.xml

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ccsens.carbasics.persist.dao.CodeDictionariesDao">
<select id="query" resultType="com.ccsens.carbasics.bean.vo.CodeVo$Basic">
SELECT
d.question_code as questionCode,
d.question
FROM
t_qcp_code_dictionaries d,
t_qcp_code_parent p
WHERE
d.question_code = p.question_code
<foreach collection="codes" item="code" separator="," open="AND p.parent_code IN (" close=")">
#{code}
</foreach>
AND p.rec_status = 0
AND d.rec_status = 0
ORDER BY
d.id
</select>
</mapper>

16
src/main/resources/mapper_dao/QuestionnaireRecordDao.xml

@ -33,5 +33,21 @@
'HOS-TEL'
)
</select>
<select id="queryRecord" resultType="java.util.Map">
select t1.id,
if(t1.submit_status=0,'保存','提交') as submitStatus,
DATE_FORMAT(t1.updated_at, '%Y-%m-%d %H:%i:%s') as updateTime,
<foreach collection="codes" item="code" separator="," close=",">
<if test="code.questionCode != 'HOS-TEL'">
(select t2.answer from
(select d.id, r.answer from t_qcp_questionnaire_detail d, t_qcp_questionnaire_record r where d.id = r.questionnaire_detail_id and r.question_code = #{code.questionCode} and d.rec_status = 0 and r.rec_status = 0 group by d.id) t2 where t2.id = t1.id) as #{code.questionCode}
</if>
</foreach>
(select t2.identifier from
(select d.id, a.identifier from t_qcp_questionnaire_detail d, tall3.t_sys_auth a where d.user_id = a.user_id and a.identify_type = 1 and d.rec_status = 0 and a.rec_status = 0 group by d.id) t2 where t1.id = t2.id) as 'HOS-TEL'
from
(select d.id, d.submit_status, d.updated_at from t_qcp_questionnaire_detail d, t_qcp_questionnaire_record r where d.id = r.questionnaire_detail_id and d.rec_status = 0 and r.rec_status = 0 ) t1
group by t1.id
</select>
</mapper>
Loading…
Cancel
Save