Commit baa68bd5 authored by ZWT's avatar ZWT

feat(零碳): 长庆

1.添加easy excel配置,增加转换器,增加全局excel导出样式,增加场站下拉选解析器;
2.开发光伏电站模板导出接口,增加模板导出类,并完成接口冒烟测试及接口文档;
3.间开制度管理模块新增设为基础制度开关接口,添加线上接口文档并完成接口冒烟测试;
4.开发井口配置模板导出接口,增加模板导出类,并完成接口冒烟测试及接口文档;
5.开发第三方有功功率历史数据导入接口,增加模板配置类,添加线上接口文档并完成接口冒烟测试;
6.开发给长庆使用的获取第三方认证token接口,验证获取token后是否能正常跳转指定页面,创建长庆用演示用户及角色;
7.开发柴发设备配置模板导出接口,增加模板导出类,并完成接口冒烟测试及接口文档;
8.开发储能设备配置模板导出接口,增加模板导出类,并完成接口冒烟测试及接口文档;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 02b46d15
package pps.core.common.excel;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* 出色倾听者
*
* @author ZWT
* @date 2024/05/09
*/
@Slf4j
public class ExcelListener<T> extends AnalysisEventListener<T> {
/**
* 可以通过实例获取该值
*/
private List<T> dataList = new ArrayList<>();
/**
* 表头map(单行表头),列号-->列名
*/
private Map<Integer, String> headMap = new LinkedHashMap<>();
/**
* 读取行数最大值(含表头)<br>
* limit: -1 默认 不限制 <br>
* 0 不限制 <br>
* n 限制行数 <br>
*/
private int limit = -1;
public ExcelListener() {
}
public ExcelListener(int limit) {
this.limit = limit;
}
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
this.headMap.putAll(headMap);
}
@Override
public void invoke(T object, AnalysisContext context) {
Integer rowNumber = context.readSheetHolder().getApproximateTotalRowNumber();
if (this.limit > 0 && rowNumber > this.limit) {
throw new ExcelAnalysisException("导入数据内容超出总行数[" + this.limit + "]条限制");
}
//数据存储到list,供批量处理,或后续自己业务逻辑处理。
log.info("解析到一条数据:{}", JSONUtil.toJsonStr(object));
dataList.add(object);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//非必要语句,查看导入的数据
System.out.println("导入的数据条数为: " + dataList.size());
}
/************************************** get && set ***********************************************************/
public List<T> getDataList() {
return dataList;
}
public void setDataList(List<T> dataList) {
this.dataList = dataList;
}
public Map<Integer, String> getHeadMap() {
return headMap;
}
public void setHeadMap(Map<Integer, String> headMap) {
this.headMap = headMap;
}
}
\ No newline at end of file
package pps.core.common.excel;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.List;
/**
* 验证util
*
* @author ZWT
* @date 2024/05/09
*/
public class ValidationUtil {
public static Validator getValidator() {
return validator;
}
static Validator validator;
static {
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
validator = validatorFactory.getValidator();
}
/**
* {
* "code": "DATA_VALID_FAILED",
* "msg": "数据校验失败",
* "data": [
* {
* "rowNum": 2,
* "errMsg": [
* "作者超出20长度"
* ]
* },
* {
* "rowNum": 3,
* "errMsg": [
* "出版日期格式(yyyy-MM-dd)有误",
* "作者超出20长度"
* ]
* }
* ]
* }
*
* @param var1 var1
* @param var2 var2
*/
public static <T> void doValidate(List<T> var1, Class<?>... var2) {
// List<ImportExpVO> expVOList = new ArrayList<>();
// int rowNum = 1;
// for (T var0 : var1) {
// rowNum++; // 跳过标题行, 此为excel的行号
// List<String> errMsg = new ArrayList<>();
// Set<ConstraintViolation<T>> validateRstSet = ValidationUtil.getValidator().validate(var0, var2);
// for (ConstraintViolation<T> constraintViolation : validateRstSet) {
// errMsg.add(constraintViolation.getMessage());
// }
// if (errMsg.size() > 0) {
// expVOList.add(ImportExpVO.builder().rowNum(rowNum).errMsg(errMsg).build());
// }
// }
// if (expVOList.size() > 0) {
// // 组装异常数据
// throw new EasyExcelException(EasyExcelExtExceptionTypes.DATA_VALID_FAILED, expVOList);
// }
}
}
\ No newline at end of file
...@@ -2,6 +2,9 @@ package pps.core.base.service; ...@@ -2,6 +2,9 @@ package pps.core.base.service;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import pps.cloud.system.service.SystemAreaService; import pps.cloud.system.service.SystemAreaService;
...@@ -11,17 +14,17 @@ import pps.core.base.service.data.base_excel.ExcelDieselGeneratorTemplate; ...@@ -11,17 +14,17 @@ import pps.core.base.service.data.base_excel.ExcelDieselGeneratorTemplate;
import pps.core.base.service.data.base_excel.ExcelEnergyStorageDeviceTemplate; import pps.core.base.service.data.base_excel.ExcelEnergyStorageDeviceTemplate;
import pps.core.base.service.data.base_excel.ExcelPhotovoltaicPlantTemplate; import pps.core.base.service.data.base_excel.ExcelPhotovoltaicPlantTemplate;
import pps.core.base.service.data.base_excel.ExcelWellheadTemplate; import pps.core.base.service.data.base_excel.ExcelWellheadTemplate;
import pps.core.base.utils.EasyExcelUtil; import pps.core.base.service.data.excel.ImportExcelInput;
import pps.core.common.excel.CascadeWriteHandler; import pps.core.common.excel.CascadeWriteHandler;
import pps.core.common.excel.EasyExcelUtil;
import pps.core.common.excel.ExcelStyleTool; import pps.core.common.excel.ExcelStyleTool;
import xstartup.annotation.XService; import xstartup.annotation.XService;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import xstartup.base.XContext; import xstartup.base.XContext;
import xstartup.base.tool.XStorageTool; import xstartup.base.tool.XStorageTool;
import xstartup.data.XFileResult; import xstartup.data.*;
import xstartup.data.XFileType;
import xstartup.data.XListResult;
import xstartup.feature.api.annotation.XApiGet; import xstartup.feature.api.annotation.XApiGet;
import xstartup.feature.api.annotation.XApiUpload;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -145,5 +148,44 @@ public class ExcelService { ...@@ -145,5 +148,44 @@ public class ExcelService {
/*------------------------------------ 导入 ------------------------------------*/ /*------------------------------------ 导入 ------------------------------------*/
@XText("光伏电站配置导入")
@XApiUpload(anonymous = true)
public XServiceResult importPhotovoltaicPlant(XContext context, ImportExcelInput input) {
XUploadFile file = input.getFile();
// 文件名称
String fileName = file.getFileName();
// 截取文件后缀
String fileSuffix = null;
if (CharSequenceUtil.isNotBlank(fileName)) {
fileSuffix = fileName.substring(fileName.indexOf("."));
}
// 判断文件是否是excel文件
if (!CharSequenceUtil.equalsAny(fileSuffix, "xlsx", "xls")) {
//"文件格式有误,请检查上传文件格式!!"
}
ExcelReader reader = ExcelUtil.getReader(file.getInputStream(), 0);
int rowCount = reader.getRowCount();
if (rowCount <= 1) {
//导入的为空模板,请检查后重新导入!!
}
return XServiceResult.OK;
}
@XText("井口配置导入")
@XApiUpload(anonymous = true)
public XServiceResult importWellhead(XContext context, ImportExcelInput input) {
return XServiceResult.OK;
}
@XText("柴发设备配置导入")
@XApiUpload(anonymous = true)
public XServiceResult importDieselGenerator(XContext context, ImportExcelInput input) {
return XServiceResult.OK;
}
@XText("储能设备配置导入")
@XApiUpload(anonymous = true)
public XServiceResult importEnergyStorageDevice(XContext context, ImportExcelInput input) {
return XServiceResult.OK;
}
} }
package pps.core.base.service.data.excel;
import lombok.Data;
import xstartup.annotation.XText;
import xstartup.data.XUploadFile;
/**
* Excel导入
*
* @author ZWT
* @date 2024/05/09 15:59
*/
@Data
public class ImportExcelInput {
@XText("excel文件")
private XUploadFile file;
}
package pps.core.base.utils;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.metadata.WriteSheet;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import pps.core.common.excel.ExcelSelected;
import pps.core.common.excel.ExcelSelectedResolve;
import pps.core.common.excel.SelectedSheetWriteHandler;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 简单excel实用程序
*
* @author ZWT
* @date 2024/05/07
*/
@Slf4j
public class EasyExcelUtil {
/**
* 创建即将导出的sheet页(sheet页中含有带下拉框的列)
*
* @param head 导出的表头信息和配置
* @param sheetNo sheet索引
* @param sheetName sheet名称
* @param <T> 泛型
* @return sheet页
*/
public static <T> WriteSheet writeSelectedSheet(Class<T> head, Integer sheetNo, String sheetName) {
Map<Integer, ExcelSelectedResolve> selectedMap = resolveSelectedAnnotation(head);
return EasyExcel.writerSheet(sheetNo, sheetName)
.head(head)
.registerWriteHandler(new SelectedSheetWriteHandler(selectedMap))
.build();
}
/**
* 解析表头类中的下拉注解
*
* @param head 表头类
* @param <T> 泛型
* @return Map<下拉框列索引, 下拉框内容> map
*/
private static <T> Map<Integer, ExcelSelectedResolve> resolveSelectedAnnotation(Class<T> head) {
Map<Integer, ExcelSelectedResolve> selectedMap = new HashMap<>(64);
// getDeclaredFields(): 返回全部声明的属性;getFields(): 返回public类型的属性
Field[] fields = head.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
// 解析注解信息
ExcelSelected selected = field.getAnnotation(ExcelSelected.class);
ExcelProperty property = field.getAnnotation(ExcelProperty.class);
if (selected != null) {
ExcelSelectedResolve excelSelectedResolve = new ExcelSelectedResolve();
String[] source = excelSelectedResolve.resolveSelectedSource(selected);
if (source != null && source.length > 0) {
excelSelectedResolve.setSource(source);
excelSelectedResolve.setFirstRow(selected.firstRow());
excelSelectedResolve.setLastRow(selected.lastRow());
if (property != null && property.index() >= 0) {
selectedMap.put(property.index(), excelSelectedResolve);
} else {
selectedMap.put(i, excelSelectedResolve);
}
}
}
}
return selectedMap;
}
public static boolean isIDNumber(String IDNumber) {
if (IDNumber == null || "".equals(IDNumber)) {
return false;
}
// 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
String regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" +
"(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
//假设18位身份证号码:41000119910101123X 410001 19910101 123X
//^开头
//[1-9] 第一位1-9中的一个 4
//\\d{5} 五位数字 10001(前六位省市县地区)
//(18|19|20) 19(现阶段可能取值范围18xx-20xx年)
//\\d{2} 91(年份)
//((0[1-9])|(10|11|12)) 01(月份)
//(([0-2][1-9])|10|20|30|31)01(日期)
//\\d{3} 三位数字 123(第十七位奇数代表男,偶数代表女)
//[0-9Xx] 0123456789Xx其中的一个 X(第十八位为校验值)
//$结尾
//假设15位身份证号码:410001910101123 410001 910101 123
//^开头
//[1-9] 第一位1-9中的一个 4
//\\d{5} 五位数字 10001(前六位省市县地区)
//\\d{2} 91(年份)
//((0[1-9])|(10|11|12)) 01(月份)
//(([0-2][1-9])|10|20|30|31)01(日期)
//\\d{3} 三位数字 123(第十五位奇数代表男,偶数代表女),15位身份证不含X
//$结尾
boolean matches = IDNumber.matches(regularExpression);
//判断第18位校验值
if (matches) {
if (IDNumber.length() == 18) {
try {
char[] charArray = IDNumber.toCharArray();
//前十七位加权因子
int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
//这是除以11后,可能产生的11位余数对应的验证码
String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
int sum = 0;
for (int i = 0; i < idCardWi.length; i++) {
int current = Integer.parseInt(String.valueOf(charArray[i]));
int count = current * idCardWi[i];
sum += count;
}
char idCardLast = charArray[17];
int idCardMod = sum % 11;
if (idCardY[idCardMod].equalsIgnoreCase(String.valueOf(idCardLast))) {
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return false;
}
return matches;
}
public static boolean isMobile(String phone) {
Pattern p;
Matcher m;
boolean b = false;
// 验证手机号
String s2 = "^[1](([3|5|6|7|8|9][\\d])|([4][4,5,6,7,8,9])|([6][2,5,6,7])|([7][^9])|([9][1,8,9]))[\\d]{8}$";
if (StringUtils.isNotBlank(phone)) {
p = Pattern.compile(s2);
m = p.matcher(phone);
b = m.matches();
}
return b;
}
}
\ No newline at end of file
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