Commit e518ab47 authored by ZWT's avatar ZWT

feat(零碳): 长庆

1.系统管理模块,查询线路及组织机构树接口修改,增加查询逻辑,通过线路名称模糊查询树列表,完成接口冒烟测试并同步线上接口文档;
2.系统管理模块,查询光伏电站及组织机构树接口修改,增加查询逻辑,通过电站名称模糊查询树列表,完成接口冒烟测试并同步线上接口文档;
3.基础信息配置模块,新增市电峰谷导入模板下载接口,完成接口冒烟测试并同步线上接口文档;
4.基础信息配置模块,市电峰谷模板下载接口修改,增加多选月份导出配置数据逻辑,修改线上接口文档并完成接口冒烟测试;
5.基础信息配置模块,新增市电峰谷数据导入接口,增加导入数据校验逻辑,完成接口冒烟测试并添加线上接口文档;
6.基础间开配置模块,新增编辑制度模板导出接口,添加线上接口文档并完成接口冒烟测试;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent dadb6897
package pps.core.common.enums;
import xstartup.error.XError;
/**
* 业务错误
*
* @author ZWT
* @date 2023/09/12
*/
public enum BusinessError implements XError {
FileFormatError(2204, "文件格式有误,请检查上传文件格式!"),
UndiscoveredData(2205, "未发现数据,请检查后重新导入!"),
;
private int code;
private String text;
BusinessError(int code, String text) {
this.code = code;
this.text = text;
}
@Override
public int getCode() {
return code;
}
@Override
public String getText() {
return text;
}
}
...@@ -4,8 +4,6 @@ import cn.hutool.core.collection.CollUtil; ...@@ -4,8 +4,6 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
...@@ -13,7 +11,6 @@ import pps.cloud.system.service.data.sys_area.QuerySysAreaOutput; ...@@ -13,7 +11,6 @@ import pps.cloud.system.service.data.sys_area.QuerySysAreaOutput;
import pps.cloud.system.service.data.sys_dictionary.GetSysDictionaryViewOutput; import pps.cloud.system.service.data.sys_dictionary.GetSysDictionaryViewOutput;
import pps.cloud.system.service.data.sys_organization.GetSysOrganizationViewOutput; import pps.cloud.system.service.data.sys_organization.GetSysOrganizationViewOutput;
import pps.core.base.entity.*; import pps.core.base.entity.*;
import pps.core.base.enums.BusinessError;
import pps.core.base.mapper.*; import pps.core.base.mapper.*;
import pps.core.base.service.data.base_diesel_generator.QueryBaseDieselGeneratorInput; import pps.core.base.service.data.base_diesel_generator.QueryBaseDieselGeneratorInput;
import pps.core.base.service.data.base_diesel_generator.QueryBaseDieselGeneratorOutput; import pps.core.base.service.data.base_diesel_generator.QueryBaseDieselGeneratorOutput;
...@@ -25,16 +22,12 @@ import pps.core.base.service.data.base_photovoltaic_plant.QueryBasePhotovoltaicP ...@@ -25,16 +22,12 @@ import pps.core.base.service.data.base_photovoltaic_plant.QueryBasePhotovoltaicP
import pps.core.base.service.data.base_price_strategy.GetBasePriceStrategyViewInput; import pps.core.base.service.data.base_price_strategy.GetBasePriceStrategyViewInput;
import pps.core.base.service.data.base_wellhead.QueryBaseWellheadInput; import pps.core.base.service.data.base_wellhead.QueryBaseWellheadInput;
import pps.core.base.service.data.base_wellhead.QueryBaseWellheadOutput; import pps.core.base.service.data.base_wellhead.QueryBaseWellheadOutput;
import pps.core.base.service.data.base_excel.ImportExcelInput;
import pps.core.base.service.data.base_excel.ImportPriceStrategyExcelInput;
import pps.core.base.utils.ServiceUtil; import pps.core.base.utils.ServiceUtil;
import pps.core.common.constant.BusinessConstant; import pps.core.common.constant.BusinessConstant;
import pps.core.common.entity.BaseModel; import pps.core.common.entity.BaseModel;
import pps.core.common.excel.config.CascadeWriteHandler; import pps.core.common.excel.config.CascadeWriteHandler;
import pps.core.common.excel.listener.ExcelListener;
import pps.core.common.excel.util.EasyExcelUtil; import pps.core.common.excel.util.EasyExcelUtil;
import pps.core.common.excel.util.ExcelStyleTool; import pps.core.common.excel.util.ExcelStyleTool;
import pps.core.common.excel.util.ValidationUtil;
import pps.core.common.session.PpsUserSession; import pps.core.common.session.PpsUserSession;
import pps.core.common.utils.BaseUtils; import pps.core.common.utils.BaseUtils;
import xstartup.annotation.XService; import xstartup.annotation.XService;
...@@ -45,7 +38,6 @@ import xstartup.base.tool.XStorageTool; ...@@ -45,7 +38,6 @@ import xstartup.base.tool.XStorageTool;
import xstartup.data.XFileResult; import xstartup.data.XFileResult;
import xstartup.data.XFileType; import xstartup.data.XFileType;
import xstartup.data.XServiceResult; import xstartup.data.XServiceResult;
import xstartup.data.XUploadFile;
import xstartup.feature.api.annotation.XApiGet; import xstartup.feature.api.annotation.XApiGet;
import xstartup.feature.api.annotation.XApiUpload; import xstartup.feature.api.annotation.XApiUpload;
import xstartup.helper.XTransactionHelper; import xstartup.helper.XTransactionHelper;
...@@ -344,7 +336,7 @@ public class ExcelService { ...@@ -344,7 +336,7 @@ public class ExcelService {
@XText("光伏电站配置导入") @XText("光伏电站配置导入")
@XApiUpload @XApiUpload
public XServiceResult importPhotovoltaicPlant(XContext context, ImportExcelInput input) { public XServiceResult importPhotovoltaicPlant(XContext context, ImportExcelInput input) {
List<ExcelPhotovoltaicPlantTemplate> list = this.getExcelDataAndCheck(input.getFile(), ExcelPhotovoltaicPlantTemplate.class, List<ExcelPhotovoltaicPlantTemplate> list = EasyExcelUtil.getExcelDataAndCheck(input.getFile(), ExcelPhotovoltaicPlantTemplate.class,
"电站名称", ExcelPhotovoltaicPlantTemplate::getStationName); "电站名称", ExcelPhotovoltaicPlantTemplate::getStationName);
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
return XServiceResult.OK; return XServiceResult.OK;
...@@ -414,7 +406,7 @@ public class ExcelService { ...@@ -414,7 +406,7 @@ public class ExcelService {
@XText("井口配置导入") @XText("井口配置导入")
@XApiUpload @XApiUpload
public XServiceResult importWellhead(XContext context, ImportExcelInput input) { public XServiceResult importWellhead(XContext context, ImportExcelInput input) {
List<ExcelWellheadTemplate> list = this.getExcelDataAndCheck(input.getFile(), ExcelWellheadTemplate.class, List<ExcelWellheadTemplate> list = EasyExcelUtil.getExcelDataAndCheck(input.getFile(), ExcelWellheadTemplate.class,
"井号", ExcelWellheadTemplate::getWellNumber); "井号", ExcelWellheadTemplate::getWellNumber);
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
return XServiceResult.OK; return XServiceResult.OK;
...@@ -479,7 +471,7 @@ public class ExcelService { ...@@ -479,7 +471,7 @@ public class ExcelService {
@XText("柴发设备配置导入") @XText("柴发设备配置导入")
@XApiUpload @XApiUpload
public XServiceResult importDieselGenerator(XContext context, ImportExcelInput input) { public XServiceResult importDieselGenerator(XContext context, ImportExcelInput input) {
List<ExcelDieselGeneratorTemplate> list = this.getExcelDataAndCheck(input.getFile(), ExcelDieselGeneratorTemplate.class, List<ExcelDieselGeneratorTemplate> list = EasyExcelUtil.getExcelDataAndCheck(input.getFile(), ExcelDieselGeneratorTemplate.class,
"设备名称", ExcelDieselGeneratorTemplate::getDeviceName); "设备名称", ExcelDieselGeneratorTemplate::getDeviceName);
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
return XServiceResult.OK; return XServiceResult.OK;
...@@ -542,7 +534,7 @@ public class ExcelService { ...@@ -542,7 +534,7 @@ public class ExcelService {
@XText("储能设备配置导入") @XText("储能设备配置导入")
@XApiUpload @XApiUpload
public XServiceResult importEnergyStorageDevice(XContext context, ImportExcelInput input) { public XServiceResult importEnergyStorageDevice(XContext context, ImportExcelInput input) {
List<ExcelEnergyStorageDeviceTemplate> list = this.getExcelDataAndCheck(input.getFile(), ExcelEnergyStorageDeviceTemplate.class, List<ExcelEnergyStorageDeviceTemplate> list = EasyExcelUtil.getExcelDataAndCheck(input.getFile(), ExcelEnergyStorageDeviceTemplate.class,
"设备名称", ExcelEnergyStorageDeviceTemplate::getDeviceName); "设备名称", ExcelEnergyStorageDeviceTemplate::getDeviceName);
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
return XServiceResult.OK; return XServiceResult.OK;
...@@ -608,13 +600,13 @@ public class ExcelService { ...@@ -608,13 +600,13 @@ public class ExcelService {
@XText("市电峰谷配置导入") @XText("市电峰谷配置导入")
@XApiUpload @XApiUpload
public XServiceResult importPriceStrategy(XContext context, ImportPriceStrategyExcelInput input) { public XServiceResult importPriceStrategy(XContext context, ImportPriceStrategyExcelInput input) {
List<ExcelPriceStrategyTemplate> list = this.getExcelDataAndCheck(input.getFile(), ExcelPriceStrategyTemplate.class, List<ExcelPriceStrategyTemplate> list = EasyExcelUtil.getExcelDataAndCheck(input.getFile(), ExcelPriceStrategyTemplate.class,
null, null); null, null);
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
return XServiceResult.OK; return XServiceResult.OK;
} }
//设置行号并转换开始/结束时间 //设置行号并转换开始/结束时间
List<Integer> errorRowList = new ArrayList<>(32); List<Integer> errorRowList = new ArrayList<>(list.size());
int rowNum = 2; int rowNum = 2;
for (ExcelPriceStrategyTemplate excelPriceStrategyTemplate : list) { for (ExcelPriceStrategyTemplate excelPriceStrategyTemplate : list) {
try { try {
...@@ -634,8 +626,8 @@ public class ExcelService { ...@@ -634,8 +626,8 @@ public class ExcelService {
throw new XServiceException("第[" + CollUtil.join(errorRowList, ",") + "]行,开始或结束时间输入错误!"); throw new XServiceException("第[" + CollUtil.join(errorRowList, ",") + "]行,开始或结束时间输入错误!");
} }
//按月份分组,按开井时间排序校验开关井时间 //按月份分组,按开井时间排序校验开关井时间
StringBuilder stringBuilder = new StringBuilder();
list.sort(Comparator.comparing(ExcelPriceStrategyTemplate::getStartTime)); list.sort(Comparator.comparing(ExcelPriceStrategyTemplate::getStartTime));
StringBuilder stringBuilder = new StringBuilder();
Map<String, List<ExcelPriceStrategyTemplate>> collect = list.stream() Map<String, List<ExcelPriceStrategyTemplate>> collect = list.stream()
.collect(Collectors.groupingBy(ExcelPriceStrategyTemplate::getMonth)); .collect(Collectors.groupingBy(ExcelPriceStrategyTemplate::getMonth));
Set<String> monthSet = collect.keySet(); Set<String> monthSet = collect.keySet();
...@@ -724,67 +716,6 @@ public class ExcelService { ...@@ -724,67 +716,6 @@ public class ExcelService {
/*------------------------------------ private ------------------------------------*/ /*------------------------------------ private ------------------------------------*/
/**
* 获取excel数据并检查
*
* @param file 文件
* @param head 头
* @param headerName 标头名称
* @param classifier 分类器
* @return {@link List }<{@link T }>
*/
private <T> List<T> getExcelDataAndCheck(XUploadFile file, Class<T> head, String headerName, Function<? super T, ? extends String> classifier) {
this.checkFileTypeIsExcel(file.getFileName());
ExcelListener<T> excelListener = new ExcelListener<>(-1);
EasyExcel.read(file.getInputStream(), head, excelListener).sheet().doRead();
List<T> dataList = excelListener.getDataList();
this.checkExcelDataSize(dataList);
ValidationUtil.doValidate(dataList);
//检查某个名称字段是否重复
if (ObjectUtil.isNotNull(classifier) || CharSequenceUtil.isNotBlank(headerName)) {
List<String> duplicate = dataList.stream()
.collect(Collectors.groupingBy(classifier, Collectors.counting()))
.entrySet()
.stream()
.filter(e -> e.getValue() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
if (CollUtil.isNotEmpty(duplicate)) {
throw new XServiceException("表格内[" + headerName + "]列, 名称为[" + CollUtil.join(duplicate, ",") + "]重复");
}
}
return dataList;
}
/**
* 检查文件类型为excel
*
* @param fileName 文件名
*/
private void checkFileTypeIsExcel(String fileName) {
// 截取文件后缀
String fileSuffix = null;
if (CharSequenceUtil.isNotBlank(fileName)) {
fileSuffix = CharSequenceUtil.subAfter(fileName, ".", true);
}
String[] parts = {"xlsx", "xls"};
// 判断文件是否是excel文件
if (!CharSequenceUtil.equalsAny(fileSuffix, parts)) {
throw new XServiceException(BusinessError.FileFormatError);
}
}
/**
* 检查excel数据大小
*
* @param dataList 数据列表
*/
private void checkExcelDataSize(List dataList) {
if (CollUtil.isEmpty(dataList)) {
throw new XServiceException(BusinessError.UndiscoveredData);
}
}
/** /**
* 获取采油厂地图 * 获取采油厂地图
* *
......
package pps.core.space.service; package pps.core.space.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.CharSequenceUtil;
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.core.common.constant.BusinessConstant;
import pps.core.common.excel.util.EasyExcelUtil; import pps.core.common.excel.util.EasyExcelUtil;
import pps.core.common.excel.util.ExcelStyleTool; import pps.core.common.excel.util.ExcelStyleTool;
import pps.core.space.service.data.base_excel.ExcelSpaceOptimizeTemplate; import pps.core.space.service.data.base_excel.ExcelSpaceOptimizeTemplate;
import pps.core.space.service.data.base_excel.ImportExcelInput;
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.exception.XServiceException;
import xstartup.base.tool.XStorageTool; import xstartup.base.tool.XStorageTool;
import xstartup.data.XFileResult; import xstartup.data.XFileResult;
import xstartup.data.XFileType; import xstartup.data.XFileType;
import xstartup.data.XServiceResult;
import xstartup.feature.api.annotation.XApiGet; import xstartup.feature.api.annotation.XApiGet;
import xstartup.feature.api.annotation.XApiUpload;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/** /**
* excel导入导出 * excel导入导出
...@@ -47,4 +58,68 @@ public class ExcelService { ...@@ -47,4 +58,68 @@ public class ExcelService {
).finish(); ).finish();
return XFileResult.success(XFileType.APPLICATION_XLSX, fileSavePath); return XFileResult.success(XFileType.APPLICATION_XLSX, fileSavePath);
} }
/**
* 编辑制度导入
*
* @param context 上下文
* @param input 输入
* @return {@link XServiceResult }
*/
@XText("编辑制度导入")
@XApiUpload(anonymous = true)
public XServiceResult importPriceStrategy(XContext context, ImportExcelInput input) {
List<ExcelSpaceOptimizeTemplate> list = EasyExcelUtil.getExcelDataAndCheck(input.getFile(), ExcelSpaceOptimizeTemplate.class,
null, null);
if (CollUtil.isEmpty(list)) {
return XServiceResult.OK;
}
//设置行号并转换开始/结束时间
List<Integer> errorRowList = new ArrayList<>(list.size());
int rowNum = 2;
for (ExcelSpaceOptimizeTemplate template : list) {
try {
//转换开始时间和结束时间(开始时间不能为24:00)
template.setStart(DateTime.of(template.getStartTime(), BusinessConstant.MINUTES_FORMAT));
if (CharSequenceUtil.equals(template.getEndTime(), BusinessConstant.END_OF_DAY_TIME)) {
template.setEnd(BusinessConstant.DATE_FLAG);
} else {
template.setEnd(DateTime.of(template.getEndTime(), BusinessConstant.MINUTES_FORMAT));
}
} catch (Exception e) {
errorRowList.add(rowNum);
}
template.setRowNum(rowNum++);
}
if (CollUtil.isNotEmpty(errorRowList)) {
throw new XServiceException("第[" + CollUtil.join(errorRowList, ",") + "]行,开始或结束时间输入错误!");
}
//排序
list.sort(Comparator.comparing(ExcelSpaceOptimizeTemplate::getStartTime));
//开关井时间校验
if (list.size() > 1) {
StringBuilder stringBuilder = new StringBuilder();
ExcelSpaceOptimizeTemplate start = list.get(0);
DateTime firstEnd = start.getEnd();
if (start.getStart().compareTo(firstEnd) >= 0) {
stringBuilder.append("第[").append(start.getRowNum()).append("]行,开始时间大于等于结束时间;");
}
for (int i = 1; i < list.size(); i++) {
ExcelSpaceOptimizeTemplate end = list.get(i);
DateTime secondStart = end.getStart();
DateTime secondEnd = end.getEnd();
if (secondStart.compareTo(secondEnd) >= 0) {
stringBuilder.append("第[").append(start.getRowNum()).append("]行,开始时间大于等于结束时间;");
} else if (firstEnd.compareTo(secondStart) > 0) {
stringBuilder.append("第[").append(start.getRowNum()).append("]行,结束时间大于第[").append(end.getRowNum()).append("]行开始时间;");
}
start = end;
firstEnd = secondEnd;
}
if (stringBuilder.length() > 0) {
throw new XServiceException(stringBuilder.toString());
}
}
return XServiceResult.OK;
}
} }
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