diff --git a/jeecg-module-main/src/main/java/org/jeecg/modules/kc/jiaoshi/export/Export.java b/jeecg-module-main/src/main/java/org/jeecg/modules/kc/jiaoshi/export/Export.java index 75339384..664f0ae3 100644 --- a/jeecg-module-main/src/main/java/org/jeecg/modules/kc/jiaoshi/export/Export.java +++ b/jeecg-module-main/src/main/java/org/jeecg/modules/kc/jiaoshi/export/Export.java @@ -1,6 +1,5 @@ package org.jeecg.modules.kc.jiaoshi.export; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ArrayUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.beust.jcommander.internal.Sets; @@ -8,30 +7,22 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import lombok.Data; import org.apache.commons.lang3.StringUtils; -import org.jeecg.common.system.query.QueryGenerator; -import org.jeecg.common.system.vo.DictModel; import org.jeecg.common.util.SpringContextHolder; -import org.jeecg.modules.kc.config.entity.KcExportConfigTpkwcqkjzglx; -import org.jeecg.modules.kc.config.service.IKcExportConfigTpkwcqkjzglxService; -import org.jeecg.modules.kc.grab.SynchronizationService.tools.ChangeTingKeTongJi; -import org.jeecg.modules.kc.grab.imports.entity.Xxhbuser; -import org.jeecg.modules.kc.grab.imports.service.IXxhbuserService; import org.jeecg.modules.kc.jiaoshi.entity.KcZhihuijiaoshiMonitorLog; import org.jeecg.modules.kc.jiaoshi.service.IKcZhihuijiaoshiMonitorLogService; -import org.jeecg.modules.kc.kcXqxnHistory.entity.KcXqxnHistory; -import org.jeecg.modules.kc.tksf.kctkcstj.entity.KcTkcstj; -import org.jeecg.modules.kc.tksf.kctkcstj.service.IKcTkcstjService; -import org.jeecg.modules.system.service.ISysDictService; import org.jeecg.modules.tools.word.BaseExport; import org.jeecg.modules.tools.word.ExportWord; import org.jeecg.modules.tools.word.WordOperator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.*; +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; @@ -78,9 +69,56 @@ public class Export extends BaseExport { // public List getDictList(String dictCode){ // return sysDictService.queryDictItemsByCode(dictCode); // } + //不保留小数 + DecimalFormat dfz = new DecimalFormat("0"); + + /** + * 转换为 *** + * @param num 数字 + * @return 字符型的***数字 + */ + public String dfzf(String num){ + return dfzf(new BigDecimal(num)); + } + + /** + * 转换为 *** + * @param num 数字 + * @return 字符型的***数字 + */ + public String dfzf(BigDecimal num){ + return dfz.format(num); + } + + //保留两位小数 + public static DecimalFormat dfzdzz = new DecimalFormat("0.00"); + + /** + * 转换为 ***.** + * @param num 数字 + * @return 字符型的***.**数字 + */ + public String dfzdzzf(String num){ + return dfzdzz.format(new BigDecimal(num)); + } + + /** + * 转换为 ***.** + * @param num 数字 + * @return 字符型的***.**数字 + */ + public String dfzdzzf(BigDecimal num){ + return dfzdzz.format(num); + } //数量÷总数×100 public BigDecimal getPercentage(BigDecimal zc, BigDecimal yc){ + if(zc.compareTo(new BigDecimal(0)) == 0){ + return new BigDecimal("0"); + } + if(yc.compareTo(new BigDecimal(0)) == 0){ + return new BigDecimal("0"); + } BigDecimal all = zc.add(yc); return zc.divide(all, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")); } @@ -100,6 +138,27 @@ public class Export extends BaseExport { if(num == null) return 0; return num; } + @Data + public class TwoYcListClass { + private String ycHh;//异常节次 + private String ycKcmc;//异常课程名称 + private String ycDate;//异常时间 + + private Integer jccs;//监测次数 + private Integer yccs;//异常次数 + + public void addJccs(Integer num){ + if(this.jccs == null) this.jccs = 0; + if(num == null) return; + this.jccs += num; + } + public void addYccs(Integer num){ + if(this.yccs == null) this.yccs = 0; + if(num == null) return; + this.yccs += num; + } + + } @Data @@ -112,13 +171,14 @@ public class Export extends BaseExport { private Integer yckts = 0;//异常课堂数 private String ycqksm;//异常情况说明 - private List ycHhList = Lists.newArrayList();//异常节次 - private List ycKcmcList = Lists.newArrayList();//异常课程名称 - - private List jccsList = Lists.newArrayList();//监测次数 - private List yccsList = Lists.newArrayList();//异常次数 - private List yclList = Lists.newArrayList();//异常率 + private Map ycMap = Maps.newLinkedHashMap(); +// private List ycHhList = Lists.newArrayList();//异常节次 +// private List ycKcmcList = Lists.newArrayList();//异常课程名称 +// +// private List jccsList = Lists.newArrayList();//监测次数 +// private List yccsList = Lists.newArrayList();//异常次数 +// private List yclList = Lists.newArrayList();//异常率 public void addKfkts(Integer num){ if(this.kfkts == null) this.kfkts = 0; if(num == null) return; @@ -204,7 +264,7 @@ public class Export extends BaseExport { //查询日志 QueryWrapper mainQw = new QueryWrapper<>(); mainQw.isNotNull("kt_id"); - mainQw.ge(StringUtils.isNotBlank(kcZhihuijiaoshiMonitorLog.getStartTime()),"create_time",kcZhihuijiaoshiMonitorLog.getStartTime()); + mainQw.ge(StringUtils.isNotBlank(kcZhihuijiaoshiMonitorLog.getStartTime()),"create_time",kcZhihuijiaoshiMonitorLog.getStartTime() + " 07:02:00"); mainQw.le(StringUtils.isNotBlank(kcZhihuijiaoshiMonitorLog.getEndTime()),"create_time",kcZhihuijiaoshiMonitorLog.getEndTime() + " 23:59:59"); if(StringUtils.isNotBlank(kcZhihuijiaoshiMonitorLog.getJxlName())){ mainQw.in("jxl_name", Arrays.asList(StringUtils.split(kcZhihuijiaoshiMonitorLog.getJxlName(),","))); @@ -212,7 +272,7 @@ public class Export extends BaseExport { List mainLogList = kcZhihuijiaoshiMonitorLogService.list(mainQw); if(mainLogList.isEmpty()){ // String today= DateUtil.today(); - result.put("监测时间", kcZhihuijiaoshiMonitorLog.getStartTime() + "-" + kcZhihuijiaoshiMonitorLog.getEndTime()); + result.put("监测时间", kcZhihuijiaoshiMonitorLog.getStartTime() + " - " + kcZhihuijiaoshiMonitorLog.getEndTime()); result.put("监测教学楼", kcZhihuijiaoshiMonitorLog.getJxlName()); result.put("教学楼数", "0"); result.put("教室数", "0"); @@ -224,6 +284,22 @@ public class Export extends BaseExport { wo.insert2Table(0, 2, true, Lists.newArrayList()); wo.insert2Table(1, 1, true, Lists.newArrayList()); } + //01 聚合数据, + Map mainLogMap = Maps.newHashMap(); + for(KcZhihuijiaoshiMonitorLog mainLog: mainLogList){ + String day = formatDate(mainLog.getCreateTime(), "yyyy-MM-dd"); + String key = day + "-" + mainLog.getHh() + "-" + mainLog.getKtId(); + if(mainLogMap.containsKey(key)){ + //KcZhihuijiaoshiMonitorLog mmainLog = mainLogMap.get(key); + if(mainLog.getLogType() == null || mainLog.getLogType() != 1){ + //失败的,瞬间污染全局 + mainLogMap.put(key,mainLog); + } + }else{ + mainLogMap.put(key,mainLog); + } + } + //折腾数据 int jxls = 0; int jss = 0; @@ -242,7 +318,7 @@ public class Export extends BaseExport { Map oneListMap = Maps.newHashMap(); Map twoListMap = Maps.newHashMap(); - for(KcZhihuijiaoshiMonitorLog monitorLog: mainLogList){ + for(KcZhihuijiaoshiMonitorLog monitorLog: mainLogMap.values()){ //基础数据 jxlsSet.add(monitorLog.getJxlName()); jssSet.add(monitorLog.getJsmc()); @@ -275,27 +351,46 @@ public class Export extends BaseExport { } oneListMap.put(monitorLog.getJxlName() + "-" + monitorLog.getHh(),o); } + } + + for(KcZhihuijiaoshiMonitorLog monitorLog: mainLogList){ //教学楼 教室名称 开放课堂数 正常课堂率 正常课堂数 异常课堂数 异常情况说明 //第二集 if(twoListMap.containsKey(monitorLog.getJxlName() + monitorLog.getJsmc())){ //存在,累计数 TwoListClass o = twoListMap.get(monitorLog.getJxlName() + monitorLog.getJsmc()); - o.addKfkts(1); - if(monitorLog.getLogType() != null && monitorLog.getLogType() == 1){ - o.addZckts(1); - }else{ - o.addYckts(1); - -// String sm = "1.异常节次:"+getHhName(monitorLog.getHh())+" 异常课程:"+monitorLog.getKtName()+" 监测次数:"+" 异常次数:"+" 异常率:"+"";//1.异常节次: 异常课程: 监测次数: 异常次数: 异常率: -// o.setYcqksm(sm); - o.getYcHhList().add(getHhName(monitorLog.getHh())); - o.getYcKcmcList().add(monitorLog.getKtName());//异常课程名称 - o.getJccsList().add(1);//监测次数 - o.getYccsList().add(1);//异常次数 + String key = monitorLog.getJxlName() + monitorLog.getJsmc() + monitorLog.getHh() + monitorLog.getKtId(); + Map twoYcListClassMap = o.getYcMap(); + if(twoYcListClassMap.containsKey(key)){ + TwoYcListClass twoYcListClass = twoYcListClassMap.get(key); + //累计次数 + twoYcListClass.addJccs(1); + if(monitorLog.getLogType() == null || monitorLog.getLogType() != 1){ + //累加失败次数 + twoYcListClass.addYccs(1); + } + }else { + TwoYcListClass twoYcListClass = new TwoYcListClass(); + twoYcListClass.setYcHh(getHhName(monitorLog.getHh()));//异常节次 + twoYcListClass.setYcKcmc(monitorLog.getKtName());//异常课程名称 + twoYcListClass.setYcDate(formatDate(monitorLog.getCreateTime(), "yyyy-MM-dd")); + twoYcListClass.setJccs(1);//累计次数 + if(monitorLog.getLogType() != null && monitorLog.getLogType() == 1){ + twoYcListClass.setYccs(0);//异常次数 + }else{ + twoYcListClass.setYccs(1);//异常次数 + } // o.getYclList().add();//异常率 - + twoYcListClassMap.put(key,twoYcListClass); } + if(monitorLog.getLogType() != null && monitorLog.getLogType() == 1){ + o.addZckts(1);//正常课堂数 + }else{ + o.addYckts(1);//异常课堂数 + //ycqksm;//异常情况说明 + } + o.addKfkts(1); }else{ TwoListClass o = new TwoListClass(); o.setJxl(monitorLog.getJxlName()); @@ -304,6 +399,31 @@ public class Export extends BaseExport { // o.setZcktl(0); o.setZckts(0); o.setYckts(0); + + + String key = monitorLog.getJxlName() + monitorLog.getJsmc() + monitorLog.getHh() + monitorLog.getKtId(); + Map twoYcListClassMap = o.getYcMap(); + if(twoYcListClassMap.containsKey(key)){ + TwoYcListClass twoYcListClass = twoYcListClassMap.get(key); + //累计次数 + twoYcListClass.addJccs(1); + if(monitorLog.getLogType() == null || monitorLog.getLogType() != 1){ + //累加失败次数 + twoYcListClass.addYccs(1); + } + }else { + TwoYcListClass twoYcListClass = new TwoYcListClass(); + twoYcListClass.setYcHh(getHhName(monitorLog.getHh()));//异常节次 + twoYcListClass.setYcKcmc(monitorLog.getKtName());//异常课程名称 + twoYcListClass.setYcDate(formatDate(monitorLog.getCreateTime(), "yyyy-MM-dd")); + twoYcListClass.setJccs(1);//累计次数 + if(monitorLog.getLogType() != null && monitorLog.getLogType() == 1){ + twoYcListClass.setYccs(0);//异常次数 + }else{ + twoYcListClass.setYccs(1);//异常次数 + } + twoYcListClassMap.put(key,twoYcListClass); + } //zcktl;//正常课堂率 if(monitorLog.getLogType() != null && monitorLog.getLogType() == 1){ o.setZckts(1);//正常课堂数 @@ -327,7 +447,7 @@ public class Export extends BaseExport { //********************************取数据END*********************************************************/ //********************************通用*************************************************************/ // String today= DateUtil.today(); - result.put("监测时间", kcZhihuijiaoshiMonitorLog.getStartTime() + "-" + kcZhihuijiaoshiMonitorLog.getEndTime()); + result.put("监测时间", kcZhihuijiaoshiMonitorLog.getStartTime() + " - " + kcZhihuijiaoshiMonitorLog.getEndTime()); result.put("监测教学楼", kcZhihuijiaoshiMonitorLog.getJxlName()); result.put("教学楼数", String.valueOf(jxls)); result.put("教室数", String.valueOf(jss)); @@ -355,6 +475,29 @@ public class Export extends BaseExport { oneListMapMap.put(o.getJxlName(),m); } } + List sumList = Lists.newArrayList(); + sumList.add(new BigDecimal("0")); + sumList.add(new BigDecimal("0")); + sumList.add(new BigDecimal("0")); + + sumList.add(new BigDecimal("0")); + sumList.add(new BigDecimal("0")); + + sumList.add(new BigDecimal("0")); + sumList.add(new BigDecimal("0")); + + sumList.add(new BigDecimal("0")); + sumList.add(new BigDecimal("0")); + + sumList.add(new BigDecimal("0")); + sumList.add(new BigDecimal("0")); + + sumList.add(new BigDecimal("0")); + sumList.add(new BigDecimal("0")); + + sumList.add(new BigDecimal("0")); + sumList.add(new BigDecimal("0")); + for (String key: oneListMapMap.keySet()){ Map m = oneListMapMap.get(key); OneListClass all = new OneListClass(); @@ -441,27 +584,53 @@ public class Export extends BaseExport { list.add(String.valueOf(all.getKfnum())); list.add(String.valueOf(all.getZcnum())); list.add(String.valueOf(all.getYcnum())); + sumList.set(0,sumList.get(0).add(new BigDecimal(all.getKfnum()))); + sumList.set(1,sumList.get(1).add(new BigDecimal(all.getZcnum()))); + sumList.set(2,sumList.get(2).add(new BigDecimal(all.getYcnum()))); list.add(String.valueOf(one.getZcnum())); list.add(String.valueOf(one.getYcnum())); + sumList.set(3,sumList.get(3).add(new BigDecimal(one.getZcnum()))); + sumList.set(4,sumList.get(4).add(new BigDecimal(one.getYcnum()))); list.add(String.valueOf(two.getZcnum())); list.add(String.valueOf(two.getYcnum())); + sumList.set(5,sumList.get(5).add(new BigDecimal(two.getZcnum()))); + sumList.set(6,sumList.get(6).add(new BigDecimal(two.getYcnum()))); list.add(String.valueOf(three.getZcnum())); list.add(String.valueOf(three.getYcnum())); + sumList.set(7,sumList.get(7).add(new BigDecimal(three.getZcnum()))); + sumList.set(8,sumList.get(8).add(new BigDecimal(three.getYcnum()))); list.add(String.valueOf(four.getZcnum())); list.add(String.valueOf(four.getYcnum())); + sumList.set(9,sumList.get(9).add(new BigDecimal(four.getZcnum()))); + sumList.set(10,sumList.get(10).add(new BigDecimal(four.getYcnum()))); list.add(String.valueOf(five.getZcnum())); list.add(String.valueOf(five.getYcnum())); + sumList.set(11,sumList.get(11).add(new BigDecimal(five.getZcnum()))); + sumList.set(12,sumList.get(12).add(new BigDecimal(five.getYcnum()))); list.add(String.valueOf(six.getZcnum())); list.add(String.valueOf(six.getYcnum())); + sumList.set(13,sumList.get(13).add(new BigDecimal(six.getZcnum()))); + sumList.set(14,sumList.get(14).add(new BigDecimal(six.getYcnum()))); + mainList.add(list); } - + if(!oneListMapMap.keySet().isEmpty()){ + List sumRowlist = Lists.newArrayList(); + sumRowlist.add("合计"); + sumRowlist.add("0");//正常率 + for (BigDecimal sumNum: sumList){ + sumRowlist.add(dfzf(sumNum)); + } + //计算百分比 + sumRowlist.set(1,dfzdzzf(getPercentage(sumList.get(1), sumList.get(2)))); + mainList.add(sumRowlist); + } wo.insert2Table(0, 2, true, mainList); // index[0] += mainList.size() + 2; @@ -479,23 +648,53 @@ public class Export extends BaseExport { list.add(StringUtils.defaultString(String.valueOf(o.getZckts()),"0")); list.add(StringUtils.defaultString(String.valueOf(o.getYckts()),"0")); //1.异常节次: 异常课程: 监测次数: 异常次数: 异常率: - Integer jccs = 0; - - for (Integer x: o.getJccsList()){ - if(x == null) x = 0; - jccs += x; - } - Integer yccs = 0; -// for (Integer x: o.getYccsList()){ +// Integer jccs = 0; +// +// for (Integer x: o.getJccsList()){ // if(x == null) x = 0; -// yccs += x; +// jccs += x; // } - yccs = o.getYckts(); - String ycl = getPercentageByAll(new BigDecimal(yccs),new BigDecimal(o.getKfkts())).toString(); +// Integer yccs = 0; +//// for (Integer x: o.getYccsList()){ +//// if(x == null) x = 0; +//// yccs += x; +//// } +// yccs = o.getYckts(); +// String ycl = getPercentageByAll(new BigDecimal(yccs),new BigDecimal(o.getKfkts())).toString(); - String sm = "1.异常节次:"+ArrayUtil.join(o.getYcHhList().toArray(new String[]{}),",")+" 异常课程:"+ArrayUtil.join(o.getYcKcmcList().toArray(new String[]{}),",")+" 监测次数:"+jccs+" 异常次数:"+yccs+" 异常率:"+ycl; +// String sm = "1.异常节次:"+ArrayUtil.join(o.getYcHhList().toArray(new String[]{}),",")+" 异常课程:"+ArrayUtil.join(o.getYcKcmcList().toArray(new String[]{}),",")+" 监测次数:"+jccs+" 异常次数:"+yccs+" 异常率:"+ycl; + StringBuffer sm = new StringBuffer(); + Map twoYcListClassMap = o.getYcMap(); + int i = 1; + List nextBlockList = twoYcListClassMap.values().stream().filter(x -> x.getYccs() !=0).collect(Collectors.toList()); + for(TwoYcListClass twoYcListClass: nextBlockList){ + sm.append(String.valueOf(i)); + sm.append(".异常节次:"); + sm.append(twoYcListClass.getYcHh()); + sm.append("("); + sm.append(twoYcListClass.getYcDate()); + sm.append(")"); + sm.append(" 异常课程:"); + sm.append(twoYcListClass.getYcKcmc()); + sm.append(" 监测次数:"); + sm.append(twoYcListClass.getJccs()); + sm.append(" 异常次数:"); + sm.append(twoYcListClass.getYccs()); + sm.append(" 异常率:"); + //计算! + sm.append(getPercentageByAll(new BigDecimal(twoYcListClass.getYccs()),new BigDecimal(twoYcListClass.getJccs()))); + sm.append("\n"); + i++; + + } + + if(nextBlockList.isEmpty()){ + sm.append(" \n "); + } + +// String sm = "1.异常节次:"+ArrayUtil.join(o.getYcHhList().toArray(new String[]{}),",")+" 异常课程:"+ArrayUtil.join(o.getYcKcmcList().toArray(new String[]{}),",")+" 监测次数:"+jccs+" 异常次数:"+yccs+" 异常率:"+ycl; //list.add(o.getYcqksm()); - list.add(sm); + list.add(sm.toString()); mainList.add(list); } diff --git a/jeecg-module-main/src/main/java/org/jeecg/modules/tools/word/WordOperator.java b/jeecg-module-main/src/main/java/org/jeecg/modules/tools/word/WordOperator.java index c51a74f3..420dad08 100644 --- a/jeecg-module-main/src/main/java/org/jeecg/modules/tools/word/WordOperator.java +++ b/jeecg-module-main/src/main/java/org/jeecg/modules/tools/word/WordOperator.java @@ -904,6 +904,9 @@ public class WordOperator { // 取出这一行对应的数据,数据与单元格角标位置是一致的,一一替换文本 List colList = dataList.get(i); for (int j = 0; j < cellList.size(); j++) { + if(StringUtils.contains(colList.get(j),"\n")){ + setCellMultiLineText(cellList.get(j), colList, j); + } setCellText(cellList.get(j), colList, j); } } @@ -942,6 +945,39 @@ public class WordOperator { } } + + /** + * 替换单元格文本 + * @param cell 单元格 + * @param colList 替换文本的集合(角标越位了,就置空) + * @param j 单元格角标,也就是文本集合的角标 + */ + private void setCellMultiLineText(XWPFTableCell cell, List colList, int j) { +// cell.setColor("FF0000"); + // 无论一个单元格被切割成多少个run,只需要修改第一个即可,改完就return掉了 + List paragraphs = cell.getParagraphs(); + for (XWPFParagraph p : paragraphs) { + List runs = p.getRuns(); + //删除旧数据 + for (int i = 0; i< runs.size(); i++){ + p.removeRun(i); + } + XWPFRun r = p.createRun(); + try { + String allText = colList.get(j); + String[] texts = StringUtils.split(allText, "\n"); + for(String text: texts){ + r.setText(text); + r.addCarriageReturn(); + } + //染上背景色 +// r.getCTR().addNewRPr().addNewHighlight().setVal(STHighlightColor.YELLOW); + } catch (Exception e) { + r.setText("", 0); + } + } + } + /** * 填充颜色 * @param tableIndex 第几个表格,第一个表格为0