Commit 1e318aa3 authored by ZWT's avatar ZWT

feat(吉林演示): 松原

1.天气数据接收定时任务,解决代码扫描问题,修改文件读取相关代码,解决资源未关流问题;
2.修改登录验证码生成工具类,解决代码扫描问题,修复随机数不安全问题;
3.删除除主程序启动类外其他启动类模块,解决代码扫描问题;
4.删除自定义httputlis类,解决代码扫描问题,替换部分代码远程调用方法;
5.重构光伏预测模块下载电站实际发电数据导入模板接口,解决代码扫描问题;
6.重构光伏预测模块导入电站实际发电数据接口,解决代码扫描问题;
7.删除公用excel导入导出工具类及poi相关pom依赖,解决代码扫描问题;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 30224d8e
......@@ -23,30 +23,6 @@
<artifactId>guava</artifactId>
<version>32.0.0-android</version>
</dependency>
<!--POI start-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.4.6</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>1.0.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
<scope>compile</scope>
</dependency>
<!--POI end-->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
......
package pps.core.common.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import xstartup.base.util.XDateUtils;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.*;
import java.util.logging.Logger;
/**
* Author: lixueyan
* Date: 2021-01-01
* Time: 11:09
* Description: 生成Excel并写入数据
*/
public class ExcelUtils {
private static final String XLS = "xls";
private static final String XLSX = "xlsx";
private static Logger logger = Logger.getLogger(ExcelUtils.class.getName()); // 日志打印类
/**
* 生成Excel并写入数据信息
*
* @param dataList 数据列表
* @return 写入数据后的工作簿对象
*/
public static Workbook exportData(List<Map<String, Object>> dataList, List<String> headerList) {
// 生成xlsx的Excel
Workbook workbook = new SXSSFWorkbook();
CellStyle cs = workbook.createCellStyle();
cs.setWrapText(true); //内容自动换行
cs.setAlignment(HorizontalAlignment.CENTER); //水平居中
cs.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
// 生成Sheet表,写入第一行的列头
Sheet sheet = buildDataSheet(workbook, headerList);
//构建每行的数据内容
int rowNum = 1;
for (Map<String, Object> data : dataList) {
if (CollUtil.isEmpty(data)) {
continue;
}
//输出行数据
Row row = sheet.createRow(rowNum++);
convertDataToRow(data, row, headerList, cs);
}
return workbook;
}
/**
* 生成sheet表,并写入第一行数据(列头)
*
* @param workbook 工作簿对象
* @param headerList
* @return 已经写入列头的Sheet
*/
private static Sheet buildDataSheet(Workbook workbook, List<String> headerList) {
Sheet sheet = workbook.createSheet();
// 设置列头宽度
for (int i = 0; i < headerList.size(); i++) {
sheet.setColumnWidth(i, 4000);
}
// 设置默认行高
sheet.setDefaultRowHeight((short) 400);
// 构建头单元格样式
CellStyle cellStyle = buildHeadCellStyle(sheet.getWorkbook());
// 写入第一行各列的数据
Row head = sheet.createRow(0);
for (int i = 0; i < headerList.size(); i++) {
Cell cell = head.createCell(i);
cell.setCellValue(headerList.get(i));
cell.setCellStyle(cellStyle);
}
return sheet;
}
/**
* 设置第一行列头的样式
*
* @param workbook 工作簿对象
* @return 单元格样式对象
*/
private static CellStyle buildHeadCellStyle(Workbook workbook) {
CellStyle style = workbook.createCellStyle();
//对齐方式设置
style.setAlignment(HorizontalAlignment.CENTER);
//边框颜色和宽度设置
style.setBorderBottom(BorderStyle.THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下边框
style.setBorderLeft(BorderStyle.THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左边框
style.setBorderRight(BorderStyle.THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右边框
style.setBorderTop(BorderStyle.THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上边框
//设置背景颜色
style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//粗体字设置
Font font = workbook.createFont();
font.setBold(true);
style.setFont(font);
return style;
}
/**
* 将数据转换成行
*
* @param data 源数据
* @param row 行对象
* @param headerList
* @return
*/
private static void convertDataToRow(Map<String, Object> data, Row row, List<String> headerList, CellStyle cs) {
int cellNum = 0;
Cell cell;
for (int i = 0; i < headerList.size(); i++) {
Object val = data.get(headerList.get(i));
cell = row.createCell(cellNum++);
cell.setCellValue(null == val ? "" : val + "");
cell.setCellStyle(cs);
}
}
/**
* 读取Excel文件内容
*
* @param fileName 要读取的Excel文件所在路径
* @param sheetIndex 要读取的指定sheet页,为空时读取全部
* @return 读取结果列表,读取失败时返回null
*/
public static List<Map<String, Object>> readExcel(InputStream inputStream, String fileName, List<String> headerList, Integer sheetIndex) {
Workbook workbook = null;
try {
// 获取Excel后缀名
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
// 获取Excel工作簿
if (CharSequenceUtil.equalsIgnoreCase(fileType, XLS)) {
workbook = new HSSFWorkbook(inputStream);
} else if (CharSequenceUtil.equalsIgnoreCase(fileType, XLSX)) {
workbook = new XSSFWorkbook(inputStream);
}
if (ObjectUtil.isNull(workbook)) {
return Collections.emptyList();
}
// 读取excel中的数据
return parseExcel(workbook, headerList, sheetIndex);
} catch (Exception e) {
logger.warning("解析Excel失败,文件名:" + fileName + " 错误信息:" + e.getMessage());
} finally {
IoUtil.close(inputStream);
}
return Collections.emptyList();
}
/**
* 解析Excel数据
*
* @param workbook Excel工作簿对象
* @param headerList
* @param sheetIndex
* @return 解析结果
*/
public static List<Map<String, Object>> parseExcel(Workbook workbook, List<String> headerList, Integer sheetIndex) {
List<Map<String, Object>> resultDataList = new ArrayList<>();
// 解析sheet
for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
if (ObjectUtil.isNotNull(sheetIndex) && !sheetIndex.equals(sheetNum)) {
continue;
}
Sheet sheet = workbook.getSheetAt(sheetNum);
// 校验sheet是否合法
if (ObjectUtil.isNull(sheet)) {
continue;
}
// 获取第一行数据
int firstRowNum = sheet.getFirstRowNum();
Row firstRow = sheet.getRow(firstRowNum);
if (ObjectUtil.isNull(firstRow)) {
logger.warning("解析Excel失败,在第一行没有读取到任何数据!");
}
// 解析每一行的数据,构造数据对象
int rowStart = firstRowNum + 1;
int rowEnd = sheet.getPhysicalNumberOfRows();
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
Row row = sheet.getRow(rowNum);
if (ObjectUtil.isNull(row)) {
continue;
}
Map<String, Object> resultData = convertRowToData(row, headerList);
if (CollUtil.isEmpty(resultData)) {
logger.warning("第 " + row.getRowNum() + "行数据不合法,已忽略!");
continue;
}
resultDataList.add(resultData);
}
}
return resultDataList;
}
/**
* 将单元格内容转换为字符串
*
* @param cell
* @return
*/
private static String convertCellValueToString(Cell cell) {
if (ObjectUtil.isNull(cell)) {
return null;
}
String returnValue = null;
switch (cell.getCellType()) {
case NUMERIC: //数字
if (DateUtil.isCellDateFormatted(cell)) {
Date d = cell.getDateCellValue();
returnValue = XDateUtils.getDateTimeString(d);
} else {
Double doubleValue = cell.getNumericCellValue();
// 格式化科学计数法,取一位整数
DecimalFormat df = new DecimalFormat("0.00000");
returnValue = df.format(doubleValue);
}
break;
case STRING: //字符串
returnValue = cell.getStringCellValue();
break;
case BOOLEAN: //布尔
boolean booleanValue = cell.getBooleanCellValue();
returnValue = Boolean.toString(booleanValue);
break;
case BLANK: // 空值
break;
case FORMULA: // 公式
returnValue = cell.getCellFormula();
break;
case ERROR: // 故障
break;
default:
break;
}
return returnValue;
}
/**
* 提取每一行中需要的数据,构造成为一个结果数据对象
* <p>
* 当该行中有单元格的数据为空或不合法时,忽略该行的数据
*
* @param row 行数据
* @param headerList
* @return 解析后的行数据对象,行数据错误时返回null
*/
private static Map<String, Object> convertRowToData(Row row, List<String> headerList) {
Map<String, Object> resultData = new HashMap<>();
Cell cell;
int cellNum = 0;
for (String s : headerList) {
cell = row.getCell(cellNum++);
String name = convertCellValueToString(cell);
resultData.put(s, name);
}
return resultData;
}
}
\ No newline at end of file
package pps.core.common.utils;
import cn.hutool.core.collection.CollUtil;
import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.util.JxlsHelper;
import java.io.*;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
/**
* Description:模板导出工具类
* date: 2020/8/20 18:56
*
* @author zjw
*/
public class ExportExcelUtils {
public static void outputFileData(byte[] fileBuff, String filePath) {
File file = new File(filePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try (OutputStream out = Files.newOutputStream(file.toPath())) {
out.write(fileBuff);
out.flush();
} catch (IOException ignored) {
}
}
/**
* 根据参数生成excel文件的二进制数据
*
* @param inputStream excel模板路径
* @param params 模板中相关参数的Map
* @return 生成文件的byte数组
*/
public static byte[] genSingleExcelFileData(InputStream inputStream, Map<String, Object> params) {
Context context = new Context();
if (CollUtil.isNotEmpty(params)) {
for (String key : params.keySet()) {
context.putVar(key, params.get(key));
}
}
ByteArrayOutputStream buff = new ByteArrayOutputStream();
try {
JxlsHelper jxlsHelper = JxlsHelper.getInstance();
Transformer transformer = jxlsHelper.createTransformer(inputStream, buff);
JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
Map<String, Object> funcs = new HashMap<>();
funcs.put("utils", new JxlsUtils()); //添加自定义功能
evaluator.getJexlEngine().setFunctions(funcs);
jxlsHelper.processTemplate(context, transformer);
} catch (IOException ignored) {
}
return buff.toByteArray();
}
}
\ No newline at end of file
package pps.core.common.utils;
import cn.hutool.core.util.ObjectUtil;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Description:
* date: 2021/3/31 16:15
*
* @author zhujiangwei
*/
public class JxlsUtils {
public String dateFormat(Date date) {
return this.dateFormat(date, "yyyy-MM-dd");
}
public String dateFormat(Date date, String pattern) {
if (ObjectUtil.isNull(date)) {
return "";
}
try {
SimpleDateFormat dateFmt = new SimpleDateFormat(pattern);
return dateFmt.format(date);
} catch (Exception ignored) {
}
return "";
}
}
\ No newline at end of file
package pps.core.base.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
......@@ -10,34 +9,29 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import pps.core.base.entity.BaseDataEnt;
import pps.core.base.entity.BaseDataImportLogEnt;
import pps.core.base.entity.BaseDataView;
import pps.core.base.entity.BaseModelValEnt;
import pps.core.base.enums.ImportFieldDic;
import pps.core.base.mapper.BaseDataImportLogMapper;
import pps.core.base.mapper.BaseDataMapper;
import pps.core.base.mapper.BaseDataViewMapper;
import pps.core.base.mapper.BaseModelValMapper;
import pps.core.base.service.data.base_data.*;
import pps.core.base.service.data.base_line.ImportFileInput;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.utils.ExcelUtils;
import pps.core.common.utils.ExportExcelUtils;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.base.data.CustomQueryInput;
import xstartup.base.tool.XStorageTool;
import xstartup.base.util.XCopyUtils;
import xstartup.base.util.XHttpUtils;
import xstartup.base.util.XJsonUtils;
import xstartup.data.*;
import xstartup.data.XListResult;
import xstartup.data.XPageResult;
import xstartup.data.XServiceResult;
import xstartup.data.XSingleResult;
import xstartup.error.XError;
import xstartup.feature.api.annotation.XApiGet;
import xstartup.feature.api.annotation.XApiPost;
import xstartup.feature.api.annotation.XApiUpload;
import xstartup.feature.mybatis.helper.XMapperHelper;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
......@@ -195,70 +189,70 @@ public class BaseDataService {
return XMapperHelper.query(mapper, input, BaseDataEnt.class, QueryBaseDataOutput.class);
}
@XText("下载导入模板")
@XApiGet
public XFileResult downloadImportTemplate(XContext context) {
String fileSavePath = XStorageTool.getAbsolutePath("/temp/excel/导入模板_" + DateUtil.formatDate(new Date()) + ".xlsx");
String templateFilePath = "template/import_template.xlsx";
InputStream templateInputStream = this.getClass().getClassLoader().getResourceAsStream(templateFilePath);
byte[] excelContent = ExportExcelUtils.genSingleExcelFileData(templateInputStream, null);
try {
ExportExcelUtils.outputFileData(excelContent, fileSavePath);
} catch (Exception e) {
context.getLogger().error(e);
}
return XFileResult.success(XFileType.APPLICATION_XLSX, fileSavePath);
}
@XText("新增导入")
@XApiUpload
public XServiceResult importFile(XContext context, ImportFileInput input) {
List<String> headerList = getExcelHeaderList();
List<Map<String, Object>> mapList = ExcelUtils.readExcel(input.getFile().getInputStream(), input.getFile().getFileName(), headerList, 0);
try {
List<BaseDataView> dataList = new ArrayList<>(mapList.size());
Date minDate = null;
Date maxDate = null;
for (Map<String, Object> objectMap : mapList) {
BaseDataView dataView = BeanUtil.toBean(objectMap, BaseDataView.class);
dataView.setOuId(input.getWellOuId());
dataView.setLineId(input.getLineId());
if (ObjectUtil.isNotNull(dataView.getDataDate())) {
if (ObjectUtil.isNull(minDate)) {
minDate = dataView.getDataDate();
maxDate = dataView.getDataDate();
}
if (DateUtil.compare(minDate, dataView.getDataDate()) > 0) {
minDate = dataView.getDataDate();
} else if (DateUtil.compare(maxDate, dataView.getDataDate()) < 0) {
maxDate = dataView.getDataDate();
}
}
dataList.add(dataView);
}
if (ObjectUtil.isNull(minDate)) {
return XServiceResult.error(1000, "日期错误");
}
BaseDataMapper mapper = context.getBean(BaseDataMapper.class);
mapper.delete(new LambdaQueryWrapper<BaseDataEnt>()
.eq(BaseDataEnt::getLineId, input.getLineId())
.ge(BaseDataEnt::getDataDate, minDate)
.le(BaseDataEnt::getDataDate, maxDate));
BaseDataViewMapper viewMapper = context.getBean(BaseDataViewMapper.class);
viewMapper.batchInsert(dataList);
BaseDataImportLogMapper logMapper = context.getBean(BaseDataImportLogMapper.class);
BaseDataImportLogEnt ent = new BaseDataImportLogEnt();
ent.setOuId(input.getWellOuId());
ent.setLineId(input.getLineId());
ent.setBeginDate(minDate);
ent.setEndDate(maxDate);
ent.setCreateTime(new Date());
logMapper.insert(ent);
} catch (Exception e) {
return XServiceResult.error(-1, e.getMessage());
}
return XServiceResult.OK;
}
// @XText("下载导入模板")
// @XApiGet
// public XFileResult downloadImportTemplate(XContext context) {
// String fileSavePath = XStorageTool.getAbsolutePath("/temp/excel/导入模板_" + DateUtil.formatDate(new Date()) + ".xlsx");
// String templateFilePath = "template/import_template.xlsx";
// InputStream templateInputStream = this.getClass().getClassLoader().getResourceAsStream(templateFilePath);
// byte[] excelContent = ExportExcelUtils.genSingleExcelFileData(templateInputStream, null);
// try {
// ExportExcelUtils.outputFileData(excelContent, fileSavePath);
// } catch (Exception e) {
// context.getLogger().error(e);
// }
// return XFileResult.success(XFileType.APPLICATION_XLSX, fileSavePath);
// }
//
// @XText("新增导入")
// @XApiUpload
// public XServiceResult importFile(XContext context, ImportFileInput input) {
// List<String> headerList = getExcelHeaderList();
// List<Map<String, Object>> mapList = ExcelUtils.readExcel(input.getFile().getInputStream(), input.getFile().getFileName(), headerList, 0);
// try {
// List<BaseDataView> dataList = new ArrayList<>(mapList.size());
// Date minDate = null;
// Date maxDate = null;
// for (Map<String, Object> objectMap : mapList) {
// BaseDataView dataView = BeanUtil.toBean(objectMap, BaseDataView.class);
// dataView.setOuId(input.getWellOuId());
// dataView.setLineId(input.getLineId());
// if (ObjectUtil.isNotNull(dataView.getDataDate())) {
// if (ObjectUtil.isNull(minDate)) {
// minDate = dataView.getDataDate();
// maxDate = dataView.getDataDate();
// }
// if (DateUtil.compare(minDate, dataView.getDataDate()) > 0) {
// minDate = dataView.getDataDate();
// } else if (DateUtil.compare(maxDate, dataView.getDataDate()) < 0) {
// maxDate = dataView.getDataDate();
// }
// }
// dataList.add(dataView);
// }
// if (ObjectUtil.isNull(minDate)) {
// return XServiceResult.error(1000, "日期错误");
// }
// BaseDataMapper mapper = context.getBean(BaseDataMapper.class);
// mapper.delete(new LambdaQueryWrapper<BaseDataEnt>()
// .eq(BaseDataEnt::getLineId, input.getLineId())
// .ge(BaseDataEnt::getDataDate, minDate)
// .le(BaseDataEnt::getDataDate, maxDate));
// BaseDataViewMapper viewMapper = context.getBean(BaseDataViewMapper.class);
// viewMapper.batchInsert(dataList);
// BaseDataImportLogMapper logMapper = context.getBean(BaseDataImportLogMapper.class);
// BaseDataImportLogEnt ent = new BaseDataImportLogEnt();
// ent.setOuId(input.getWellOuId());
// ent.setLineId(input.getLineId());
// ent.setBeginDate(minDate);
// ent.setEndDate(maxDate);
// ent.setCreateTime(new Date());
// logMapper.insert(ent);
// } catch (Exception e) {
// return XServiceResult.error(-1, e.getMessage());
// }
// return XServiceResult.OK;
// }
private List<String> getExcelHeaderList() {
List<Map<String, Object>> fieldList = new ArrayList<>();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment