springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/vos/community/ComActQuestnaireAnswerContentVO.java
@@ -34,6 +34,7 @@ @ApiModelProperty("题目id") private Long reserveSubId; @ApiModelProperty("填报时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date time; @ApiModelProperty("用户昵称") private String nickName; springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/HomeQuarantineUtil.java
New file @@ -0,0 +1,210 @@ package com.panzhihua.common.utlis; import cn.hutool.core.date.DateUtil; import com.panzhihua.common.model.vos.community.ComActQuestnaireAnswerContentVO; import lombok.extern.slf4j.Slf4j; import javax.xml.bind.DatatypeConverter; import java.net.URL; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; /** * @author zzj */ @Slf4j public class HomeQuarantineUtil { /** * 数据转换--登记明细用户填写答案导出数据格式转换 * * @param answerContentVOList 用户答题记录 * @return 用户填写答案数据 */ public static List<List<Object>> ReserveData(List<ComActQuestnaireAnswerContentVO> answerContentVOList) { //结果数据集合 List<List<Object>> resultList = new ArrayList<>(); //构建单个用户数据 List<Object> userData = new ArrayList<>(); String noExport = "以上信息仅用于"; //遍历答案列表 Long reserveRecordId = 0L; Long reserveSubId = 0L; Integer count=0; StringBuffer conditions=new StringBuffer(); Boolean isOldDuo = false; StringBuffer sb = new StringBuffer(); if (answerContentVOList != null && answerContentVOList.size() > 0) { for (ComActQuestnaireAnswerContentVO userAnswers : answerContentVOList) { if(count%16==0){ conditions.append(DateUtils.format(userAnswers.getTime(),new SimpleDateFormat("yyyy-MM-dd")) +" "+"上午体温"+userAnswers.getAnswerContent()+"℃"+"\n"); count++; continue; } if(count%16==1){ conditions.append(DateUtils.format(userAnswers.getTime(),new SimpleDateFormat("yyyy-MM-dd"))+" "+"下午体温"+userAnswers.getAnswerContent()+"℃"+"\n"); count++; continue; } if(count%16==2){ conditions.append(DateUtils.format(userAnswers.getTime(),new SimpleDateFormat("yyyy-MM-dd"))+" "+"当日隔离情况:"+userAnswers.getAnswerContent()+"℃"+"\n"); conditions.append("————————"+"\n"); count++; continue; } count++; //判断是文字描述直接跳过 if (userAnswers.getOptionType().equals(5) || userAnswers.getOptionType().equals(11) || (StringUtils.isNotEmpty(userAnswers.getAnswerContent()) && userAnswers.getAnswerContent().contains(noExport))) { continue; } //判断reserveRecordId为空则为第一条记录,默认加上昵称和灯谜是 if (reserveRecordId.equals(0L)) { reserveRecordId = userAnswers.getReserveRecordId(); userData.add(userAnswers.getNickName()); userData.add(DateUtils.format(userAnswers.getTime(), DateUtils.ymdhms_format)); } //根据reserveRecordId判断是否是第二条填报记录 if (!reserveRecordId.equals(userAnswers.getReserveRecordId())) { reserveSubId = 0L; if(isOldDuo){ String answer = sb.toString(); userData.add(answer.substring(0, answer.length() - 1)); sb = new StringBuffer(); isOldDuo = false; } for(List<Object> result:resultList){ if(result.get(4).equals(userData.get(4))){ String condition=result.get(result.size()-1)+userData.get(userData.size()-1).toString(); result.set(result.size()-1,condition); userData.set(userData.size()-1,null); break; } } if(userData.get(userData.size()-1)!=null){ resultList.add(userData); } userData = new ArrayList<>(); reserveRecordId = userAnswers.getReserveRecordId(); userData.add(userAnswers.getNickName()); userData.add(DateUtils.format(userAnswers.getTime(), DateUtils.ymdhms_format)); if(StringUtils.isNotEmpty(userAnswers.getAnswerContent())){ userData.add(userAnswers.getAnswerContent()); }else{ userData.add(" "); } }else{ if(reserveSubId.equals(0L)){ reserveSubId = userAnswers.getReserveSubId(); } if(!reserveSubId.equals(userAnswers.getReserveSubId())){ reserveSubId = userAnswers.getReserveSubId(); //如果是承诺字段则不导出 if(StringUtils.isNotEmpty(userAnswers.getAnswerContent()) && userAnswers.getAnswerContent().contains(noExport)){ continue; } //判断当前的组件类型是否是图片上传,导出时需要导出图片 if(userAnswers.getOptionType().equals(11)){ reserveSubId = userAnswers.getReserveSubId(); try { userData.add(new URL(userAnswers.getAnswerContent())); }catch (Exception e){ userData.add(" "); log.error("导出转换图片失败!"); } continue; } //判断当前组件类型是否签名 if(userAnswers.getOptionType().equals(12)){ reserveSubId = userAnswers.getReserveSubId(); try { userData.add(DatatypeConverter.parseBase64Binary(userAnswers.getAnswerContent().substring(userAnswers.getAnswerContent().indexOf(",") + 1))); }catch (Exception e){ userData.add(" "); log.error("导出转换图片失败!"); } continue; } if(userAnswers.getOptionType().equals(1)){ isOldDuo = true; sb.append(userAnswers.getAnswerContent()==null?"无":userAnswers.getAnswerContent() + ","); continue; }else{ if(isOldDuo){ String answer = sb.toString(); userData.add(answer.substring(0, answer.length() - 1)); sb = new StringBuffer(); } isOldDuo = false; } sb.append(userAnswers.getAnswerContent()==null?"无":userAnswers.getAnswerContent() + ","); String answer = sb.toString(); userData.add(answer.substring(0, answer.length() - 1)); sb = new StringBuffer(); }else{ //如果是承诺字段则不导出 if(StringUtils.isNotEmpty(userAnswers.getAnswerContent()) && userAnswers.getAnswerContent().contains(noExport)){ continue; } //判断当前的组件类型是否是图片上传,导出时需要导出图片 if(userAnswers.getOptionType().equals(11)){ reserveSubId = userAnswers.getReserveSubId(); try { userData.add(new URL(userAnswers.getAnswerContent())); }catch (Exception e){ userData.add(" "); log.error("导出转换图片失败!"); } continue; } //判断当前组件类型是否签名 if(userAnswers.getOptionType().equals(12)){ reserveSubId = userAnswers.getReserveSubId(); try { //userData.add(new URL("http://image.panzhihua.nhys.cdnhxx.com//idcard/967dbdef3ef3465a9169fbea204f9aa7.jpg")); userData.add(DatatypeConverter.parseBase64Binary(userAnswers.getAnswerContent().substring(userAnswers.getAnswerContent().indexOf(",") + 1))); }catch (Exception e){ userData.add(" "); log.error("导出转换图片失败!"); } continue; } if(userAnswers.getOptionType().equals(1)){ isOldDuo = true; sb.append(userAnswers.getAnswerContent()==null?"无":userAnswers.getAnswerContent() + ","); continue; }else{ if(isOldDuo){ String answer = sb.toString(); userData.add(answer.substring(0, answer.length() - 1)); sb = new StringBuffer(); } isOldDuo = false; } sb.append(userAnswers.getAnswerContent()==null?"无":userAnswers.getAnswerContent() + ","); String answer = sb.toString(); userData.add(answer.substring(0, answer.length() - 1)); sb = new StringBuffer(); } } if(count%16==0){ userData.add(conditions.toString()); conditions=new StringBuffer(); } } if(isOldDuo){ String answer = sb.toString(); userData.add(answer.substring(0, answer.length() - 1)); } resultList.add(userData); } return resultList; } } springcloud_k8s_panzhihuazhihuishequ/community_backstage/src/main/java/com/panzhihua/community_backstage/api/ComActReserveApi.java
@@ -23,10 +23,7 @@ import com.panzhihua.common.model.vos.community.reserve.*; import com.panzhihua.common.service.community.CommunityService; import com.panzhihua.common.service.user.UserService; import com.panzhihua.common.utlis.AssemblyUtils; import com.panzhihua.common.utlis.DateUtils; import com.panzhihua.common.utlis.SFTPUtil; import com.panzhihua.common.utlis.StringUtils; import com.panzhihua.common.utlis.*; import com.panzhihua.community_backstage.config.SFTPConfig; import com.panzhihua.community_backstage.excel.Custemhandler; import com.panzhihua.community_backstage.excel.CustomSheetWriteHandler; @@ -45,6 +42,7 @@ import java.net.URL; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @description: 预约登记接口 @@ -468,10 +466,18 @@ @ApiOperation(value = "导出登记明细") @PostMapping("/register/list/export") public R exportRegister(@RequestBody PageReserveRegisterDetailedAdminDTO pageReserveRegisterDetailedAdminDTO) { String name=""; R r=communityService.detailReserveAdmin(pageReserveRegisterDetailedAdminDTO.getReserveId()); ComActReserveDetailAdminVO comActReserveDetailAdminVO=JSON.parseObject(JSON.toJSONString(r.getData()),ComActReserveDetailAdminVO.class); if(comActReserveDetailAdminVO.getTitle().contains("居家隔离")){ name = "居家隔离导出数据.xlsx"; } else { name = "登记明细导出数据.xlsx"; } String ftpUrl = "/mnt/data/web/excel/"; String name = "登记明细导出数据.xlsx"; String noHaed = "承诺"; List<List<Object>> datalist=new ArrayList<>(); try { SFTPUtil sftp = new SFTPUtil(sftpConfig.getUserName(), sftpConfig.getPassword(), sftpConfig.getHost(), sftpConfig.getPort()); sftp.login(); @@ -488,10 +494,41 @@ */ R QuestnaireAnswersDTOR = communityService.exportRegisterAdmin(pageReserveRegisterDetailedAdminDTO); QuestnaireAnswersDTO questnaireAnswersDTOS = JSON.parseObject(JSON.toJSONString(QuestnaireAnswersDTOR.getData()), QuestnaireAnswersDTO.class); List<ComActQuestnaireSubVO> subVOList = questnaireAnswersDTOS.getSubs(); //构造表头 List<List<String>> headList = new ArrayList<List<String>>(); if(comActReserveDetailAdminVO.getTitle().contains("居家隔离")){ String firstRowContent = "重点地区或高风险地区来攀返攀人员信息统计表(居家隔离表)"; List<String> head0 = new ArrayList<>(); head0.add(firstRowContent); head0.add("登记人昵称"); headList.add(head0); List<String> head1 = new ArrayList<>(); head1.add(firstRowContent); head1.add("登记时间"); headList.add(head1); subVOList.forEach(sub -> { if (sub.getType() != 5 && sub.getType() != 11&&!sub.getContent().contains("今日上午")&&!sub.getContent().contains("今日下午")&&!sub.getContent().contains("今日隔离情况")) { List<String> headn = new ArrayList<>(); headn.add(firstRowContent); if(!sub.getContent().equals(noHaed)){ if(sub.getType() == 11){ headn.add(sub.getContent().substring(0, sub.getContent().indexOf("("))); }else{ headn.add(sub.getContent()); } headList.add(headn); } } }); List<String> head2 = new ArrayList<>(); head2.add(firstRowContent); head2.add("隔离体温情况"); headList.add(head2); //数据转换 datalist = HomeQuarantineUtil.ReserveData(questnaireAnswersDTOS.getAnswers()); } else { String firstRowContent = "登记明细"; List<String> head0 = new ArrayList<>(); head0.add(firstRowContent); @@ -516,7 +553,9 @@ } }); //数据转换 List<List<Object>> datalist = AssemblyUtils.ReserveData(questnaireAnswersDTOS.getAnswers()); datalist = AssemblyUtils.ReserveData(questnaireAnswersDTOS.getAnswers()); } WriteCellStyle headWriteCellStyle = new WriteCellStyle(); //设置头居中 @@ -575,6 +614,120 @@ } } @ApiOperation(value = "导出登记明细") @PostMapping("/register/list/export/homeQuarantine") public R exportRegisterHomeQuarantine(@RequestBody PageReserveRegisterDetailedAdminDTO pageReserveRegisterDetailedAdminDTO) { String ftpUrl = "/mnt/data/web/excel/"; String name = "登记明细导出数据.xlsx"; String noHaed = "承诺"; try { SFTPUtil sftp = new SFTPUtil(sftpConfig.getUserName(), sftpConfig.getPassword(), sftpConfig.getHost(), sftpConfig.getPort()); sftp.login(); boolean existDir = sftp.isExistDir(ftpUrl + name); if (!existDir) { String property = System.getProperty("user.dir"); String fileName = property + File.separator + name; ExcelWriter excelWriter = null; InputStream inputStream = null; try { /** * 组合导出数据 * 用户问卷答案 */ R QuestnaireAnswersDTOR = communityService.exportRegisterAdmin(pageReserveRegisterDetailedAdminDTO); QuestnaireAnswersDTO questnaireAnswersDTOS = JSON.parseObject(JSON.toJSONString(QuestnaireAnswersDTOR.getData()), QuestnaireAnswersDTO.class); List<ComActQuestnaireSubVO> subVOList = questnaireAnswersDTOS.getSubs(); //构造表头 List<List<String>> headList = new ArrayList<List<String>>(); String firstRowContent = "重点地区或高风险地区来攀返攀人员信息统计表(居家隔离表)"; List<String> head0 = new ArrayList<>(); head0.add(firstRowContent); head0.add("登记人昵称"); headList.add(head0); List<String> head1 = new ArrayList<>(); head1.add(firstRowContent); head1.add("登记时间"); headList.add(head1); subVOList.forEach(sub -> { if (sub.getType() != 5 && sub.getType() != 11&&!sub.getContent().contains("今日上午")&&!sub.getContent().contains("今日下午")&&!sub.getContent().contains("今日隔离情况")) { List<String> headn = new ArrayList<>(); headn.add(firstRowContent); if(!sub.getContent().equals(noHaed)){ if(sub.getType() == 11){ headn.add(sub.getContent().substring(0, sub.getContent().indexOf("("))); }else{ headn.add(sub.getContent()); } headList.add(headn); } } }); List<String> head2 = new ArrayList<>(); head2.add(firstRowContent); head2.add("隔离体温情况"); headList.add(head2); //数据转换 List<List<Object>> datalist = HomeQuarantineUtil.ReserveData(questnaireAnswersDTOS.getAnswers()); WriteCellStyle headWriteCellStyle = new WriteCellStyle(); //设置头居中 headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); //设置头字体 WriteFont headWriteFont = new WriteFont(); headWriteFont.setFontHeightInPoints((short)6); headWriteFont.setBold(true); headWriteCellStyle.setWriteFont(headWriteFont); WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); //设置表格内容字体 WriteFont writeFont = new WriteFont(); writeFont.setFontHeightInPoints((short)6); //设置 水平居中 contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); //设置 垂直居中 contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); contentWriteCellStyle.setWriteFont(writeFont); contentWriteCellStyle.setWrapped(true); HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); excelWriter = EasyExcel.write(fileName) .registerWriteHandler(horizontalCellStyleStrategy).registerWriteHandler(new Custemhandler()) .build(); WriteSheet writeSheet = EasyExcel.writerSheet("登记明细导出数据").head(headList).build(); excelWriter.write(datalist, writeSheet); excelWriter.finish(); File file = new File(fileName); inputStream = new FileInputStream(file); sftp.uploadMore(ftpUrl, name, inputStream); sftp.logout(); inputStream.close(); String absolutePath = file.getAbsolutePath(); boolean delete = file.delete(); log.info("删除excel【{}】结果【{}】", absolutePath, delete); } finally { // 千万别忘记finish 会帮忙关闭流 if (inputStream != null) { inputStream.close(); } if (excelWriter != null) { excelWriter.finish(); } } } return R.ok(sftpConfig.getExcelUrl() + name); } catch (Exception e) { e.printStackTrace(); log.error("文件传输失败【{}】", e.getMessage()); return R.fail(); } } @ApiOperation(value = "查询题目列表", response = ComActReserveSubListVO.class) @GetMapping("/subject/list") public R subjectList(@RequestParam("reserveId") Long reserveId) { springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/resources/mapper/ComActReserveAnswerContentMapper.xml
@@ -136,6 +136,6 @@ </if> ) GROUP BY ac.id ) ac left join sys_user t on ac.user_id = t.user_id order by ac.reserve_record_id asc,ac.id asc order by ac.reserve_record_id desc,ac.id asc </select> </mapper>