2023年11月14日 修改导出

This commit is contained in:
bai 2023-11-14 02:16:39 +08:00
parent a2484cfedf
commit 3e69f49ab6
3 changed files with 286 additions and 51 deletions

View File

@ -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<DictModel> 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<String> ycHhList = Lists.newArrayList();//异常节次
private List<String> ycKcmcList = Lists.newArrayList();//异常课程名称
private List<Integer> jccsList = Lists.newArrayList();//监测次数
private List<Integer> yccsList = Lists.newArrayList();//异常次数
private List<Integer> yclList = Lists.newArrayList();//异常率
private Map<String,TwoYcListClass> ycMap = Maps.newLinkedHashMap();
// private List<String> ycHhList = Lists.newArrayList();//异常节次
// private List<String> ycKcmcList = Lists.newArrayList();//异常课程名称
//
// private List<Integer> jccsList = Lists.newArrayList();//监测次数
// private List<Integer> yccsList = Lists.newArrayList();//异常次数
// private List<Integer> 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<KcZhihuijiaoshiMonitorLog> 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<KcZhihuijiaoshiMonitorLog> 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<String, KcZhihuijiaoshiMonitorLog> 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<String,OneListClass> oneListMap = Maps.newHashMap();
Map<String,TwoListClass> 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<String, TwoYcListClass> 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<String, TwoYcListClass> 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<BigDecimal> 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<String,OneListClass> 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<String> 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<String, TwoYcListClass> twoYcListClassMap = o.getYcMap();
int i = 1;
List<TwoYcListClass> 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);
}

View File

@ -904,6 +904,9 @@ public class WordOperator {
// 取出这一行对应的数据数据与单元格角标位置是一致的一一替换文本
List<String> 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<String> colList, int j) {
// cell.setColor("FF0000");
// 无论一个单元格被切割成多少个run只需要修改第一个即可改完就return掉了
List<XWPFParagraph> paragraphs = cell.getParagraphs();
for (XWPFParagraph p : paragraphs) {
List<XWPFRun> 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