海南初始版本提交

This commit is contained in:
hzj
2024-03-06 17:04:08 +08:00
parent 34b76fe7ff
commit 4ed75512fb
66 changed files with 7663 additions and 33 deletions

View File

@@ -0,0 +1,157 @@
package com.njcn.advance.controller.carrycapacity;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.alibaba.nacos.shaded.com.google.common.collect.Maps;
import com.njcn.advance.pojo.carrycapacity.excel.CarryCapcityDataIEexcel;
import com.njcn.advance.pojo.carrycapacity.excel.CarryCapcityDataPEexcel;
import com.njcn.advance.pojo.carrycapacity.excel.CarryCapcityDataQEexcel;
import com.njcn.advance.pojo.carrycapacity.excel.CarryCapcityDataVEexcel;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityCalParam;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityQueryDataParam;
import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityDResultVO;
import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityDataIVO;
import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityDataQVO;
import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityDataVO;
import com.njcn.advance.service.carrycapacity.CarryCapcityService;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.device.pq.pojo.vo.TerminalTree;
import com.njcn.poi.util.PoiUtil;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.apache.commons.compress.utils.Lists;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author hongawen
* @version 1.0.0
* @date 2023年07月21日 10:06
*/
@RestController
@RequestMapping("carrycapacity")
@Api(tags = "承载能力评估")
@RequiredArgsConstructor
public class CarryCapacityController extends BaseController {
private final CarryCapcityService carryCapcityService;
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/queryCarryCapacityData")
@ApiOperation("承载能力评估数据查询-主页面")
@ApiImplicitParam(name = "queryParam", value = "查询参数", required = true)
public HttpResult<CarryCapacityDataVO> queryCarryCapacityData(@RequestBody @Validated CarryCapacityQueryDataParam queryParam) {
String methodDescribe = getMethodDescribe("queryCarryCapacityData");
CarryCapacityDataVO carryCapacityDataVO = carryCapcityService.queryCarryCapacityData(queryParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, carryCapacityDataVO, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/queryCarryCapacityQData")
@ApiOperation("承载能力评估数据查询-无功功率")
@ApiImplicitParam(name = "queryParam", value = "查询参数", required = true)
public HttpResult<CarryCapacityDataQVO> queryCarryCapacityQData(@RequestBody @Validated CarryCapacityQueryDataParam queryParam) {
String methodDescribe = getMethodDescribe("queryCarryCapacityQData");
CarryCapacityDataQVO carryCapacityDataQVO = carryCapcityService.queryCarryCapacityQData(queryParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, carryCapacityDataQVO, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/queryCarryCapacityIData")
@ApiOperation("承载能力评估数据查询-谐波电流幅值")
@ApiImplicitParam(name = "queryParam", value = "查询参数", required = true)
public HttpResult<CarryCapacityDataIVO> queryCarryCapacityIData(@RequestBody @Validated CarryCapacityQueryDataParam queryParam) {
String methodDescribe = getMethodDescribe("queryCarryCapacityIData");
CarryCapacityDataIVO carryCapacityDataIVO = carryCapcityService.queryCarryCapacityIData(queryParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, carryCapacityDataIVO, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/carryCapacityCal")
@ApiOperation("承载能力评估")
@ApiImplicitParam(name = "calParam", value = "计算参数", required = true)
public HttpResult<CarryCapacityDResultVO> carryCapacityCal(@RequestBody @Validated CarryCapacityCalParam calParam) {
String methodDescribe = getMethodDescribe("carryCapacityCal");
CarryCapacityDResultVO carryCapacityDResultVO = carryCapcityService.carryCapacityCal(calParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, carryCapacityDResultVO, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@GetMapping("/carryCapacityTree")
@ApiOperation("承载能力评估-台账树")
public HttpResult<List<TerminalTree>> carryCapacityTree() {
String methodDescribe = getMethodDescribe("carryCapacityTree");
List<TerminalTree> terminalTree = carryCapcityService.carryCapacityTree();
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, terminalTree, methodDescribe);
}
@ResponseBody
@ApiOperation("导出设备模板")
@GetMapping(value = "getExcelTemplate")
public HttpResult<String> getExcelTemplate(HttpServletResponse response) {
final List<Map<String, Object>> sheetsList = Lists.newArrayList();
Map<String, Object> exportMap = Maps.newHashMap();
final ExportParams exportParams = new ExportParams(null, "电流幅值", ExcelType.HSSF);
// 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
exportMap.put("title", exportParams);
exportMap.put("entity", CarryCapcityDataIEexcel.class);
exportMap.put("data", new ArrayList<>());
// 加入多sheet配置列表
sheetsList.add(exportMap);
Map<String, Object> exportMap2 = Maps.newHashMap();
final ExportParams exportParams2 = new ExportParams(null, "电压", ExcelType.HSSF);
// 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
exportMap2.put("title", exportParams2);
exportMap2.put("entity", CarryCapcityDataVEexcel.class);
exportMap2.put("data", new ArrayList<>());
// 加入多sheet配置列表
sheetsList.add(exportMap2);
Map<String, Object> exportMap3 = Maps.newHashMap();
final ExportParams exportParams3 = new ExportParams(null, "有功功率", ExcelType.HSSF);
// 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
exportMap3.put("title", exportParams3);
exportMap3.put("entity", CarryCapcityDataPEexcel.class);
exportMap3.put("data", new ArrayList<>());
// 加入多sheet配置列表
sheetsList.add(exportMap3);
Map<String, Object> exportMap4 = Maps.newHashMap();
final ExportParams exportParams4 = new ExportParams(null, "无功功率", ExcelType.HSSF);
// 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
exportMap4.put("title", exportParams4);
exportMap4.put("entity", CarryCapcityDataQEexcel.class);
exportMap4.put("data", new ArrayList<>());
// 加入多sheet配置列表
sheetsList.add(exportMap4);
Workbook workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
String fileName = "数据集.xls";
ExportParams exportExcel = new ExportParams("数据集", "数据集");
PoiUtil.exportFileByWorkbook(workbook, fileName, response);
return null;
}
}

View File

@@ -0,0 +1,67 @@
package com.njcn.advance.controller.carrycapacity;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityStrategyParam;
import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityStrategyVO;
import com.njcn.advance.service.carrycapacity.CarryCapacityStrategyPOService;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Description:
* Date: 2024/3/5 10:35【需求编号】
*
* @author clam
* @version V1.0.0
*/
@RestController
@RequestMapping("carrycapacity")
@Api(tags = "承载能力评估策略配置")
@RequiredArgsConstructor
public class CarryCapacityStrategyController extends BaseController {
private final CarryCapacityStrategyPOService carryCapacityStrategyPOService;
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/add")
@ApiOperation("用户新增承载能力评估策略")
@ApiImplicitParam(name = "carryCapacityStrategyParam", value = "新增参数", required = true)
public HttpResult<Boolean> add(@RequestBody @Validated CarryCapacityStrategyParam carryCapacityStrategyParam) {
String methodDescribe = getMethodDescribe("add");
Boolean flag = carryCapacityStrategyPOService.add(carryCapacityStrategyParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, flag, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/queyDetail")
@ApiOperation("承载能力评估策略初始化查询")
public HttpResult<List<CarryCapacityStrategyVO>> queyDetail() {
String methodDescribe = getMethodDescribe("queyDetail");
List<CarryCapacityStrategyVO> carryCapacityStrategyVOList = carryCapacityStrategyPOService.queyDetail();
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, carryCapacityStrategyVOList, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/restore")
@ApiOperation("承载能力评估策略一键还原")
public HttpResult<Boolean> restore() {
String methodDescribe = getMethodDescribe("restore");
Boolean flag = carryCapacityStrategyPOService.restore();
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, flag, methodDescribe);
}
}

View File

@@ -0,0 +1,80 @@
package com.njcn.advance.controller.carrycapacity;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityUserParam;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityUserPO;
import com.njcn.advance.service.carrycapacity.CarryCapacityUserPOService;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @author hongawen
* @version 1.0.0
* @date 2023年07月21日 10:06
*/
@RestController
@RequestMapping("carrycapacityuser")
@Api(tags = "承载能力评估用户")
@RequiredArgsConstructor
public class CarryCapacityUserController extends BaseController {
private final CarryCapacityUserPOService carryCapacityUserPOService;
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/add")
@ApiOperation("承载能力评估用户新增")
@ApiImplicitParam(name = "carryCapacityUserParam", value = "新增参数", required = true)
public HttpResult<Boolean> add(@RequestBody @Validated CarryCapacityUserParam carryCapacityUserParam) {
String methodDescribe = getMethodDescribe("add");
Boolean flag = carryCapacityUserPOService.add(carryCapacityUserParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, flag, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/remove")
@ApiOperation("承载能力评估用户批量删除")
@ApiImplicitParam(name = "userIds", value = "用户id集合", required = true)
public HttpResult<Boolean> remove(@RequestParam("userIds") List<String> userIds) {
String methodDescribe = getMethodDescribe("remove");
Boolean flag = carryCapacityUserPOService.removeByIds(userIds);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, flag, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/update")
@ApiOperation("承载能力评估用户编辑")
@ApiImplicitParam(name = "userUpdateParam", value = "编辑参数", required = true)
public HttpResult<Boolean> update(@RequestBody @Validated CarryCapacityUserParam.CarryCapacityUserUpdateParam userUpdateParam) {
String methodDescribe = getMethodDescribe("update");
Boolean flag = carryCapacityUserPOService.updateUser(userUpdateParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, flag, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/queyDetailUser")
@ApiOperation("承载能力评估用户查询")
@ApiImplicitParam(name = "pageParam", value = "编辑参数", required = true)
public HttpResult<IPage<CarryCapacityUserPO>> queyDetailUser(@RequestBody @Validated CarryCapacityUserParam.CarryCapacityUserPageParam pageParam) {
String methodDescribe = getMethodDescribe("queyDetailUser");
IPage<CarryCapacityUserPO> page = carryCapacityUserPOService.queyDetailUser(pageParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, page, methodDescribe);
}
}

View File

@@ -0,0 +1,15 @@
package com.njcn.advance.mapper.carrycapacity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityDataPO;
/**
*
* Description:
* Date: 2024/3/6 14:45【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface CarryCapacityDataPOMapper extends BaseMapper<CarryCapacityDataPO> {
}

View File

@@ -0,0 +1,15 @@
package com.njcn.advance.mapper.carrycapacity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityResultPO;
/**
*
* Description:
* Date: 2024/3/1 15:38【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface CarryCapacityResultPOMapper extends BaseMapper<CarryCapacityResultPO> {
}

View File

@@ -0,0 +1,14 @@
package com.njcn.advance.mapper.carrycapacity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityStrategyPO;
/**
* Description:
* Date: 2024/3/5 10:54【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface CarryCapacityStrategyPOMapper extends BaseMapper<CarryCapacityStrategyPO> {
}

View File

@@ -0,0 +1,15 @@
package com.njcn.advance.mapper.carrycapacity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityUserPO;
/**
*
* Description:
* Date: 2024/2/20 11:15【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface CarryCapacityUserPOMapper extends BaseMapper<CarryCapacityUserPO> {
}

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.njcn.advance.mapper.carrycapacity.CarryCapacityDataPOMapper">
<resultMap id="BaseResultMap" type="com.njcn.advance.pojo.carrycapacity.po.CarryCapacityDataPO">
<!--@mbg.generated-->
<!--@Table carry_capacity_data-->
<id column="line_id" jdbcType="VARCHAR" property="lineId" />
<id column="start_time" jdbcType="DATE" property="startTime" />
<id column="end_time" jdbcType="DATE" property="endTime" />
<result column="date_list" jdbcType="VARCHAR" property="dateList" />
<result column="create_by" jdbcType="VARCHAR" property="createBy" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_by" jdbcType="VARCHAR" property="updateBy" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
line_id, start_time, end_time, date_list, create_by, create_time, update_by, update_time
</sql>
</mapper>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.njcn.advance.mapper.carrycapacity.CarryCapacityResultPOMapper">
<resultMap id="BaseResultMap" type="com.njcn.advance.pojo.carrycapacity.po.CarryCapacityResultPO">
<!--@mbg.generated-->
<!--@Table carry_capacity_result-->
<id column="id" jdbcType="VARCHAR" property="id" />
<result column="u_t_level" jdbcType="INTEGER" property="uTLevel" />
<result column="pf_t_level" jdbcType="INTEGER" property="pfTLevel" />
<result column="b_t_level" jdbcType="INTEGER" property="bTLevel" />
<result column="i_level" jdbcType="INTEGER" property="iLevel" />
<result column="reslut_level" jdbcType="INTEGER" property="reslutLevel" />
<result column="evaluate_date" jdbcType="DATE" property="evaluateDate" />
<result column="create_by" jdbcType="VARCHAR" property="createBy" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_by" jdbcType="VARCHAR" property="updateBy" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, u_t_level, pf_t_level, b_t_level, i_level, reslut_level, evaluate_date, create_by,
create_time, update_by, update_time
</sql>
</mapper>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.njcn.advance.mapper.carrycapacity.CarryCapacityStrategyPOMapper">
<resultMap id="BaseResultMap" type="com.njcn.advance.pojo.carrycapacity.po.CarryCapacityStrategyPO">
<!--@mbg.generated-->
<!--@Table carry_capacity_strategy-->
<result column="result" jdbcType="INTEGER" property="result" />
<result column="index_result" jdbcType="INTEGER" property="indexResult" />
<result column="comparison_operators" jdbcType="VARCHAR" property="comparisonOperators" />
<result column="count" jdbcType="INTEGER" property="count" />
<result column="proto_flag" jdbcType="INTEGER" property="protoFlag" />
<result column="user_flag" jdbcType="INTEGER" property="userFlag" />
<result column="create_by" jdbcType="VARCHAR" property="createBy" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_by" jdbcType="VARCHAR" property="updateBy" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
`result`, index_result, comparison_operators, `count`, proto_flag, user_flag, create_by,
create_time, update_by, update_time
</sql>
</mapper>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.njcn.advance.mapper.carrycapacity.CarryCapacityUserPOMapper">
<resultMap id="BaseResultMap" type="com.njcn.advance.pojo.carrycapacity.po.CarryCapacityUserPO">
<!--@mbg.generated-->
<!--@Table carry_capacity_user-->
<id column="user_id" jdbcType="VARCHAR" property="userId" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="user_type" jdbcType="VARCHAR" property="userType" />
<result column="voltage" jdbcType="VARCHAR" property="voltage" />
<result column="protocol_capacity" jdbcType="DOUBLE" property="protocolCapacity" />
<result column="area" jdbcType="VARCHAR" property="area" />
<result column="create_by" jdbcType="VARCHAR" property="createBy" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_by" jdbcType="VARCHAR" property="updateBy" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
user_id, user_name, user_type, voltage, protocol_capacity, area, create_by, create_time,
update_by, update_time
</sql>
</mapper>

View File

@@ -0,0 +1,16 @@
package com.njcn.advance.service.carrycapacity;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityDataPO;
import com.baomidou.mybatisplus.extension.service.IService;
/**
*
* Description:
* Date: 2024/3/6 14:45【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface CarryCapacityDataPOService extends IService<CarryCapacityDataPO>{
}

View File

@@ -0,0 +1,16 @@
package com.njcn.advance.service.carrycapacity;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityResultPO;
import com.baomidou.mybatisplus.extension.service.IService;
/**
*
* Description:
* Date: 2024/3/1 15:38【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface CarryCapacityResultPOService extends IService<CarryCapacityResultPO>{
}

View File

@@ -0,0 +1,26 @@
package com.njcn.advance.service.carrycapacity;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityStrategyParam;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityStrategyPO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityStrategyVO;
import java.util.List;
/**
*
* Description:
* Date: 2024/3/5 10:33【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface CarryCapacityStrategyPOService extends IService<CarryCapacityStrategyPO>{
Boolean add(CarryCapacityStrategyParam carryCapacityStrategyParam);
List<CarryCapacityStrategyVO> queyDetail();
Boolean restore();
}

View File

@@ -0,0 +1,23 @@
package com.njcn.advance.service.carrycapacity;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityUserParam;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityUserPO;
import com.baomidou.mybatisplus.extension.service.IService;
/**
*
* Description:
* Date: 2024/2/20 11:15【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface CarryCapacityUserPOService extends IService<CarryCapacityUserPO>{
Boolean add(CarryCapacityUserParam carryCapacityUserParam);
Boolean updateUser(CarryCapacityUserParam.CarryCapacityUserUpdateParam userUpdateParam);
IPage<CarryCapacityUserPO> queyDetailUser(CarryCapacityUserParam.CarryCapacityUserPageParam pageParm);
}

View File

@@ -0,0 +1,32 @@
package com.njcn.advance.service.carrycapacity;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityCalParam;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityQueryDataParam;
import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityDResultVO;
import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityDataIVO;
import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityDataQVO;
import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityDataVO;
import com.njcn.device.pq.pojo.vo.TerminalTree;
import java.util.List;
/**
* Description:
* Date: 2024/1/31 14:40【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface CarryCapcityService {
CarryCapacityDataVO queryCarryCapacityData(CarryCapacityQueryDataParam queryParam);
CarryCapacityDataQVO queryCarryCapacityQData(CarryCapacityQueryDataParam queryParam);
CarryCapacityDataIVO queryCarryCapacityIData(CarryCapacityQueryDataParam queryParam);
CarryCapacityDResultVO carryCapacityCal(CarryCapacityCalParam calParam);
List<TerminalTree> carryCapacityTree();
}

View File

@@ -0,0 +1,21 @@
package com.njcn.advance.service.carrycapacity.impl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityDataPO;
import com.njcn.advance.mapper.carrycapacity.CarryCapacityDataPOMapper;
import com.njcn.advance.service.carrycapacity.CarryCapacityDataPOService;
/**
*
* Description:
* Date: 2024/3/6 14:45【需求编号】
*
* @author clam
* @version V1.0.0
*/
@Service
public class CarryCapacityDataPOServiceImpl extends ServiceImpl<CarryCapacityDataPOMapper, CarryCapacityDataPO> implements CarryCapacityDataPOService{
}

View File

@@ -0,0 +1,19 @@
package com.njcn.advance.service.carrycapacity.impl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.advance.mapper.carrycapacity.CarryCapacityResultPOMapper;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityResultPO;
import com.njcn.advance.service.carrycapacity.CarryCapacityResultPOService;
/**
*
* Description:
* Date: 2024/3/1 15:38【需求编号】
*
* @author clam
* @version V1.0.0
*/
@Service
public class CarryCapacityResultPOServiceImpl extends ServiceImpl<CarryCapacityResultPOMapper, CarryCapacityResultPO> implements CarryCapacityResultPOService{
}

View File

@@ -0,0 +1,78 @@
package com.njcn.advance.service.carrycapacity.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.advance.mapper.carrycapacity.CarryCapacityStrategyPOMapper;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityStrategyParam;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityStrategyPO;
import com.njcn.advance.pojo.carrycapacity.vo.CarryCapacityStrategyVO;
import com.njcn.advance.service.carrycapacity.CarryCapacityStrategyPOService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* Description:
* Date: 2024/3/5 10:33【需求编号】
*
* @author clam
* @version V1.0.0
*/
@Service
public class CarryCapacityStrategyPOServiceImpl extends ServiceImpl<CarryCapacityStrategyPOMapper, CarryCapacityStrategyPO> implements CarryCapacityStrategyPOService{
@Override
@Transactional(rollbackFor = {Exception.class})
public Boolean add(CarryCapacityStrategyParam carryCapacityStrategyParam) {
CarryCapacityStrategyPO carryCapacityStrategyPO = new CarryCapacityStrategyPO();
BeanUtils.copyProperties(carryCapacityStrategyParam, carryCapacityStrategyPO);
//将原始策略处理为不启用
this.lambdaUpdate().eq(CarryCapacityStrategyPO::getResult, carryCapacityStrategyParam.getResult())
.eq(CarryCapacityStrategyPO::getIndexResult, carryCapacityStrategyParam.getIndexResult())
.eq(CarryCapacityStrategyPO::getProtoFlag, 1)
.set(CarryCapacityStrategyPO::getUserFlag,2)
.update();
QueryWrapper<CarryCapacityStrategyPO> lambdaQuery = new QueryWrapper<>();
lambdaQuery.lambda()
.eq(CarryCapacityStrategyPO::getResult, carryCapacityStrategyParam.getResult())
.eq(CarryCapacityStrategyPO::getIndexResult, carryCapacityStrategyParam.getIndexResult())
.eq(CarryCapacityStrategyPO::getProtoFlag, 2);
//将客户对应策略删除
this.remove(lambdaQuery);
//新增客户策略;
carryCapacityStrategyPO.setProtoFlag(2);
carryCapacityStrategyPO.setUserFlag(1);
boolean save = this.save(carryCapacityStrategyPO);
return save;
}
@Override
public List<CarryCapacityStrategyVO> queyDetail() {
List<CarryCapacityStrategyPO> list = this.lambdaQuery().eq(CarryCapacityStrategyPO::getUserFlag, 1).list();
List<CarryCapacityStrategyVO> collect = list.stream().map(temp -> {
CarryCapacityStrategyVO vo = new CarryCapacityStrategyVO();
BeanUtils.copyProperties(temp, vo);
return vo;
}).collect(Collectors.toList());
return collect;
}
@Override
public Boolean restore() {
//将客户对应策略删除
QueryWrapper<CarryCapacityStrategyPO> lambdaQuery = new QueryWrapper<>();
lambdaQuery.lambda()
.eq(CarryCapacityStrategyPO::getProtoFlag, 2);
this.remove(lambdaQuery
);
//将原始策略处理为启用
boolean update = this.lambdaUpdate().eq(CarryCapacityStrategyPO::getProtoFlag, 1)
.set(CarryCapacityStrategyPO::getUserFlag, 1)
.update();
return update;
}
}

View File

@@ -0,0 +1,69 @@
package com.njcn.advance.service.carrycapacity.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.advance.enums.AdvanceResponseEnum;
import com.njcn.advance.mapper.carrycapacity.CarryCapacityUserPOMapper;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityUserParam;
import com.njcn.advance.pojo.carrycapacity.po.CarryCapacityUserPO;
import com.njcn.advance.service.carrycapacity.CarryCapacityUserPOService;
import com.njcn.common.pojo.exception.BusinessException;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Objects;
/**
*
* Description:
* Date: 2024/2/20 11:15【需求编号】
*
* @author clam
* @version V1.0.0
*/
@Service
public class CarryCapacityUserPOServiceImpl extends ServiceImpl<CarryCapacityUserPOMapper, CarryCapacityUserPO> implements CarryCapacityUserPOService{
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean add(CarryCapacityUserParam carryCapacityUserParam) {
CarryCapacityUserPO carryCapacityUserPO = new CarryCapacityUserPO();
BeanUtils.copyProperties(carryCapacityUserParam, carryCapacityUserPO);
CarryCapacityUserPO one = this.lambdaQuery().eq(CarryCapacityUserPO::getUserName, carryCapacityUserParam.getUserName()).one();
if(Objects.nonNull(one)){
throw new BusinessException(AdvanceResponseEnum.USER_NAME_EXIST);
}
boolean save = this.save(carryCapacityUserPO);
return save;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateUser(CarryCapacityUserParam.CarryCapacityUserUpdateParam userUpdateParam) {
CarryCapacityUserPO carryCapacityUserPO = new CarryCapacityUserPO();
BeanUtils.copyProperties(userUpdateParam, carryCapacityUserPO);
CarryCapacityUserPO one = this.lambdaQuery().eq(CarryCapacityUserPO::getUserName, userUpdateParam.getUserName()).ne(CarryCapacityUserPO::getUserId,userUpdateParam.getUserId()).one();
if(Objects.nonNull(one)){
throw new BusinessException(AdvanceResponseEnum.USER_NAME_EXIST);
}
boolean save = this.updateById(carryCapacityUserPO);
return save;
}
@Override
public IPage<CarryCapacityUserPO> queyDetailUser(CarryCapacityUserParam.CarryCapacityUserPageParam pageParm) {
Page<CarryCapacityUserPO> returnpage = new Page<> (pageParm.getPageNum ( ), pageParm.getPageSize ( ));
QueryWrapper<CarryCapacityUserPO> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(StringUtils.isNotBlank(pageParm.getUserId()) ,CarryCapacityUserPO::getUserId,pageParm.getUserId())
.eq(StringUtils.isNotBlank(pageParm.getUserType()) ,CarryCapacityUserPO::getUserType,pageParm.getUserType())
.between(StringUtils.isNotBlank(pageParm.getStartTime()) && StringUtils.isNotBlank(pageParm.getEndTime()) ,CarryCapacityUserPO::getCreateTime,pageParm.getStartTime(),pageParm.getEndTime());
IPage<CarryCapacityUserPO> page = this.page (returnpage, queryWrapper);
return page;
}
}

View File

@@ -0,0 +1,699 @@
package com.njcn.advance.service.carrycapacity.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.njcn.advance.enums.AdvanceResponseEnum;
import com.njcn.advance.enums.CarryingCapacityEnum;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityCalParam;
import com.njcn.advance.pojo.carrycapacity.param.CarryCapacityQueryDataParam;
import com.njcn.advance.pojo.carrycapacity.vo.*;
import com.njcn.advance.service.carrycapacity.CarryCapacityStrategyPOService;
import com.njcn.advance.service.carrycapacity.CarryCapcityService;
import com.njcn.advance.utils.CZNLPG;
import com.njcn.advance.utils.Utils;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.common.utils.PubUtils;
import com.njcn.device.biz.pojo.po.Overlimit;
import com.njcn.device.pq.api.DeviceTreeClient;
import com.njcn.device.pq.api.LineFeignClient;
import com.njcn.device.pq.pojo.vo.TerminalTree;
import com.njcn.influx.deprecated.InfluxDBPublicParam;
import com.njcn.influx.imapper.DataHarmPowerPMapper;
import com.njcn.influx.imapper.DataHarmPowerQMapper;
import com.njcn.influx.imapper.DataVMapper;
import com.njcn.influx.imapper.IDataIMapper;
import com.njcn.influx.pojo.bo.CarryCapcityData;
import com.njcn.influx.pojo.po.DataHarmPowerP;
import com.njcn.influx.pojo.po.DataHarmPowerQ;
import com.njcn.influx.pojo.po.DataI;
import com.njcn.influx.pojo.po.DataV;
import com.njcn.redis.utils.RedisUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Description:
* Date: 2024/1/31 14:42【需求编号】
*
* @author clam
* @version V1.0.0
*/
@Service
@RequiredArgsConstructor
public class CarryCapcityServiceImpl implements CarryCapcityService {
private final LineFeignClient lineFeignClient;
private final DeviceTreeClient deviceTreeClient;
private final DataHarmPowerQMapper dataHarmPowerQMapper;
private final DataHarmPowerPMapper dataHarmPowerPMapper;
private final DataVMapper dataVMapper;
private final IDataIMapper dataIMapper;
private final CarryCapacityStrategyPOService carryCapacityStrategyPOService;
private final RedisUtil redisUtil;
private static final double DEFAULTVALUE=3.1415926;
//光伏评估
void photovoltaicEvaluate(double S_T, double S_pv) {
//电压等级
List<DataHarmPowerP> dataHarmPowerPList = null;
List<DataHarmPowerQ> dataHarmPowerQList = null;
Integer voltage = null;
//数据清洗取近一周的配变每日9时~15时段的负载率数据中概率95%小值所对应时刻的有功功率和无功功率值
List<Double> listP = dataHarmPowerPList.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.map(DataHarmPowerP::getP)
.collect(Collectors.toList());
List<Double> listQ = dataHarmPowerQList.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.map(DataHarmPowerQ::getQ)
.collect(Collectors.toList());
//todo 检查数据是否缺失校验数据完整性
double P_βmin = CZNLPG.calculatePercentile(listP, 1);
double Q_βmin = CZNLPG.calculatePercentile(listQ, 1);
double P_pv = S_pv * Integer.valueOf(CarryingCapacityEnum.K.getValue());
double Bt = CZNLPG.calculateB(P_βmin, Q_βmin, Double.valueOf(CarryingCapacityEnum.K.getValue()), S_T, S_pv, P_pv);
CZNLPG.calculatePF_T(P_βmin, Q_βmin,Double.valueOf(CarryingCapacityEnum.K.getValue()),S_pv);
//前2周的数据
List<DataHarmPowerP> dataHarmPowerPList2 = null;
List<DataHarmPowerQ> dataHarmPowerQList2 = null;
List<DataV> DataVList2 = null;
List<String> phaseType = Stream.of("A", "B", "C").collect(Collectors.toList());
//存储UA, UB,UC;
List<Double> uList = new ArrayList<>();
phaseType.stream().forEach(phase -> {
List<Double> listP2 = dataHarmPowerPList2.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp -> temp.getPhaseType().equals(phase))
.map(DataHarmPowerP::getP)
.collect(Collectors.toList());
List<Double> listQ2 = dataHarmPowerQList2.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp -> temp.getPhaseType().equals(phase))
.map(DataHarmPowerQ::getQ)
.collect(Collectors.toList());
List<Double> listV2 = DataVList2.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp -> temp.getPhasicType().equals(phase))
.map(DataV::getRms)
.collect(Collectors.toList());
//todo 抽取5000条数据抽取方式待确定
Double[] res = new Double[3];
CZNLPG.cznlpgDataTrain(listV2, listP2, listQ2, listV2.size(), res);
//前一周数据计算p_minq_min
List<Double> listPPhase = dataHarmPowerPList.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp -> temp.getPhaseType().equals(phase))
.map(DataHarmPowerP::getP)
.collect(Collectors.toList());
List<Double> listQPhase = dataHarmPowerQList.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp -> temp.getPhaseType().equals(phase))
.map(DataHarmPowerQ::getQ)
.collect(Collectors.toList());
//todo 检查数据是否缺失校验数据完整性
double p_min = CZNLPG.calculatePercentile(listPPhase, 1);
double q_min = CZNLPG.calculatePercentile(listQPhase, 1);
double U = CZNLPG.calculateU(res[0], res[1], res[2], p_min, Double.valueOf(CarryingCapacityEnum.K.getValue()), q_min, S_pv, voltage);
uList.add(U);
});
//取uList最大值
double U_T = uList.stream().mapToDouble(Double::doubleValue)
.max()
.getAsDouble();
List<Double> i_Th_List = new ArrayList<>();
List<DataI> dataIList = null;
List<Integer> integerList = Stream.of(2, 3, 4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25).collect(Collectors.toList());
integerList.stream().forEach(temp->{
List<Double> iList = new ArrayList<>();
phaseType.stream().forEach(phase -> {
List<DataI> tempDataIList = dataIList.stream().filter(temp1 -> Utils.isTimeInRange(temp1.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp1 -> temp1.getPhaseType().equals(phase))
.collect(Collectors.toList());
//todo 检查数据是否缺失校验数据完整性
List<Double> attributeValueByPropertyName = Utils.getAttributeValueByPropertyName(tempDataIList, "i" + temp);
double I_cp95 = CZNLPG.calculatePercentile(attributeValueByPropertyName, 0);
double I_phase = CZNLPG.calculateITm(I_cp95, Double.valueOf(CarryingCapacityEnum.K.getValue()),
voltage, S_pv, Double.valueOf(CarryingCapacityEnum.getValueByCode("K_H_" + temp)),
Double.valueOf(CarryingCapacityEnum.getValueByCode("I_INV_" + temp)));
iList.add(I_phase);
});
double I_th = iList.stream().mapToDouble(Double::doubleValue)
.max()
.getAsDouble();
i_Th_List.add(I_th);
});
//todo 根据监测点查找限值
}
@Override
public CarryCapacityDataVO queryCarryCapacityData(CarryCapacityQueryDataParam queryParam) {
CarryCapacityDataVO carryCapacityDataVO = new CarryCapacityDataVO();
String lineId = queryParam.getLineId();
// LineDetailDataVO data = lineFeignClient.getLineDetailData(lineId).getData();
// //时间间隔
// Integer timeInterval = data.getTimeInterval();
Integer timeInterval =1;
//根据时间间隔算出最低数据量 7天*6小时*60分钟*3项*90%/时间间隔
int minDataNum = 7*6*60*3*90/(100*timeInterval);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String startTime = LocalDateTimeUtil.format(queryParam.getStartTime(), formatter) + " 00:00:00";
String endTime = LocalDateTimeUtil.format(queryParam.getEndTime(), formatter) + " 23:59:00";
/* 近一周的数据包括电流,电压有功功率无功功率数据完整性校验就取有功功率一组数据校验因为要有都有要没有都没有数据查询按时间间隔和tag分组
缺失布置3.1415926后边更具3.1415926个数来判断数据完整性,及进行数据补充*/
//有功功率
String SqlP1 = "select mean(p) as value from data_harmpower_p where value_type='CP95' and phasic_type!='T' and line_id='"+lineId+
"' and time >= '" + startTime + "'and time <= '" +endTime + "'"+"group by time("+timeInterval+"m) ,* fill(3.1415926)"+InfluxDBPublicParam.TIME_ZONE;
List<CarryCapcityData> dataHarmPowerPList = dataHarmPowerPMapper.getSqlResult(SqlP1);
//数据校验
if(CollectionUtil.isEmpty(dataHarmPowerPList)){
throw new BusinessException(AdvanceResponseEnum.DATA_NOT_FOUND);
}else {
//数据清洗取近一周的配变每日9时~15时段的负载率数据中概率95%小值所对应时刻的有功功率和无功功率值
List<Double> listP = dataHarmPowerPList.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp -> temp.getValue()!=DEFAULTVALUE)
.map(CarryCapcityData::getValue)
.collect(Collectors.toList());
if (listP.size()<minDataNum){
throw new BusinessException(AdvanceResponseEnum.DATA_NOT_FOUND);
}
}
//数据缺失填补
linearInterpolation(dataHarmPowerPList);
carryCapacityDataVO.setData(dataHarmPowerPList);
List<String> phaseType = Stream.of("A", "B", "C").collect(Collectors.toList());
Map<String,Double> results = new HashMap<>(4);
//计算最小Cp95值用于评估
phaseType.stream().forEach(phase -> {
List<Double> listP = dataHarmPowerPList.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp -> temp.getValue()!=DEFAULTVALUE)
.filter(temp -> Objects.equals(temp.getPhaseType(),phase))
.map(CarryCapcityData::getValue)
.collect(Collectors.toList());
double P_βmin = CZNLPG.calculatePercentile(listP, 1);
results.put(phase, P_βmin);
});
carryCapacityDataVO.setP_βminMap(results);
//前2周的数据用于计算首端电流模型参数
String forwardStartTime = LocalDateTimeUtil.format(queryParam.getStartTime()
// .plusWeeks(-1)
, formatter) + " 00:00:00";
String forwardEndTime = LocalDateTimeUtil.format(queryParam.getEndTime()
// .plusWeeks(-1)
, formatter) + " 23:59:00";
String SqlP2 = "select mean(p) as value from data_harmpower_p where value_type='CP95' and phasic_type!='T' and line_id='"+lineId+
"' and time >= '" + forwardStartTime + "'and time <= '" +forwardEndTime + "'"+"group by time("+timeInterval+"m) ,* fill(3.1415926)"+InfluxDBPublicParam.TIME_ZONE;
List<CarryCapcityData> dataHarmPowerPList2 = dataHarmPowerPMapper.getSqlResult(SqlP2);
//数据校验
// if(CollectionUtil.isEmpty(dataHarmPowerPList2)){
// throw new BusinessException(AdvanceResponseEnum.DATA_NOT_FOUND);
// }else {
// //数据清洗取近一周的配变每日9时~15时段的负载率数据中概率95%小值所对应时刻的有功功率和无功功率值
// List<Double> listP = dataHarmPowerPList2.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
// .filter(temp -> temp.getValue()!=DEFAULTVALUE)
// .map(CarryCapcityData::getValue)
// .collect(Collectors.toList());
// if (listP.size()<minDataNum){
// throw new BusinessException(AdvanceResponseEnum.DATA_NOT_FOUND);
// }
// }
//数据缺失填补
linearInterpolation(dataHarmPowerPList2);
//有功功率
String SqlQ2 = "select mean(q) as value from data_harmpower_q where value_type='CP95' and phasic_type!='T' and line_id='"+lineId+
"' and time >= '" + forwardStartTime + "'and time <= '" +forwardEndTime + "'"+"group by time("+timeInterval+"m) ,* fill(3.1415926)"+InfluxDBPublicParam.TIME_ZONE;
List<CarryCapcityData> dataHarmPowerQList2 = dataHarmPowerQMapper.getSqlResult(SqlQ2);
//数据缺失填补
linearInterpolation(dataHarmPowerQList2);
//电压
String SqlU2 = "select mean(rms) as value from data_v where value_type='CP95' and phasic_type!='T' and line_id='"+lineId+
"' and time >= '" + forwardStartTime + "'and time <= '" +forwardEndTime + "'"+"group by time("+timeInterval+"m) ,* fill(3.1415926)"+InfluxDBPublicParam.TIME_ZONE;
List<CarryCapcityData> dataVList2 = dataVMapper.getSqlResult(SqlU2);
//数据缺失填补
linearInterpolation(dataVList2);
//用前2周的数据计算C,a,b
Map<String, Double[]> stringMap = calUParam(dataHarmPowerPList2, dataHarmPowerQList2, dataVList2);
carryCapacityDataVO.setStringMap(stringMap);
return carryCapacityDataVO;
}
@Override
public CarryCapacityDataQVO queryCarryCapacityQData(CarryCapacityQueryDataParam queryParam) {
CarryCapacityDataQVO carryCapacityDataQVO = new CarryCapacityDataQVO();
String lineId = queryParam.getLineId();
// LineDetailDataVO data = lineFeignClient.getLineDetailData(lineId).getData();
// //时间间隔
// Integer timeInterval = data.getTimeInterval();
Integer timeInterval =1;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String startTime = LocalDateTimeUtil.format(queryParam.getStartTime(), formatter) + " 00:00:00";
String endTime = LocalDateTimeUtil.format(queryParam.getEndTime(), formatter) + " 23:59:00";
//无功功率
String SqlQ1 = "select mean(q) as value from data_harmpower_q where value_type='CP95' and phasic_type!='T' and line_id='"+lineId+
"' and time >= '" + startTime + "'and time <= '" +endTime + "'"+"group by time("+timeInterval+"m) ,* fill(3.1415926)"+InfluxDBPublicParam.TIME_ZONE;
List<CarryCapcityData> dataHarmPowerList = dataHarmPowerQMapper.getSqlResult(SqlQ1);
//数据缺失填补
linearInterpolation(dataHarmPowerList);
carryCapacityDataQVO.setData(dataHarmPowerList);
List<String> phaseType = Stream.of("A", "B", "C").collect(Collectors.toList());
Map<String,Double> results = new HashMap<>(4);
//计算最小Cp95值用于评估
phaseType.stream().forEach(phase -> {
List<Double> listQ = dataHarmPowerList.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp -> temp.getValue()!=DEFAULTVALUE)
.filter(temp -> Objects.equals(temp.getPhaseType(),phase))
.map(CarryCapcityData::getValue)
.collect(Collectors.toList());
double Q_βmin = CZNLPG.calculatePercentile(listQ, 1);
results.put(phase, Q_βmin);
});
carryCapacityDataQVO.setQ_βminMap(results);
return carryCapacityDataQVO;
}
@Override
public CarryCapacityDataIVO queryCarryCapacityIData(CarryCapacityQueryDataParam queryParam) {
CarryCapacityDataIVO carryCapacityDataIVO = new CarryCapacityDataIVO();
String lineId = queryParam.getLineId();
// LineDetailDataVO data = lineFeignClient.getLineDetailData(lineId).getData();
// //时间间隔
// Integer timeInterval = data.getTimeInterval();
Integer timeInterval =1;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String startTime = LocalDateTimeUtil.format(queryParam.getStartTime(), formatter) + " 00:00:00";
String endTime = LocalDateTimeUtil.format(queryParam.getEndTime(), formatter) + " 23:59:00";
//电流
StringBuilder stringBuilder1 = new StringBuilder();
StringBuilder stringBuilder2 = new StringBuilder();
for (int i = 2; i <=25 ; i++) {
if (i==25){
stringBuilder1.append("mean(i_").append(i).append(") AS i_").append(i);
} else {
stringBuilder1.append("mean(i_").append(i).append(") AS i_").append(i).append(",");
}
}
stringBuilder2.append ("line_id='").append (lineId).append ("' and ").append(InfluxDBPublicParam.TIME + " >= '").append(startTime).append("' and ").append(InfluxDBPublicParam.TIME).append(" <= '").append(endTime).append("' group by time(").append(timeInterval).append("m),* fill(3.1415926) ").append(InfluxDBPublicParam.TIME_ZONE);
String sqlI1 = "select "+stringBuilder1+" from "+ InfluxDBPublicParam.DATA_I+" where value_type='CP95' and phasic_type!='T' and "+stringBuilder2;
List<DataI> dataI = dataIMapper.getSqlResult(sqlI1);
//数据缺失填补
linearInterpolationI(dataI);
List<CarryCapcityData> i_list = dataI.stream().map(temp -> {
CarryCapcityData carryCapcityData = new CarryCapcityData();
BeanUtils.copyProperties(temp, carryCapcityData);
carryCapcityData.setValue(Utils.getAttributeValueByPropertyName(temp, "i" + queryParam.getTime()));
return carryCapcityData;
}).collect(Collectors.toList());
carryCapacityDataIVO.setData(i_list);
List<Double> I_βmax =new ArrayList<>();
List<Integer> integerList = Stream.of(2, 3, 4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25).collect(Collectors.toList());
List<String> phaseType = Stream.of("A", "B", "C").collect(Collectors.toList());
integerList.stream().forEach(temp->{
List<Double> iList = new ArrayList<>();
phaseType.stream().forEach(phase -> {
List<DataI> tempDataIList = dataI.stream().filter(temp1 -> Utils.isTimeInRange(temp1.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp1 -> temp1.getPhaseType().equals(phase))
.collect(Collectors.toList());
List<Double> attributeValueByPropertyName = Utils.getAttributeValueByPropertyName(tempDataIList, "i" + temp);
double I_cp95 = CZNLPG.calculatePercentile(attributeValueByPropertyName, 0);
iList.add(I_cp95);
});
//取uList最大值
double i_Max = iList.stream().mapToDouble(Double::doubleValue)
.max()
.getAsDouble();
I_βmax.add(i_Max);
});
carryCapacityDataIVO.setI_βmax(I_βmax);
return carryCapacityDataIVO;
}
@Override
public CarryCapacityDResultVO carryCapacityCal(CarryCapacityCalParam calParam) {
CarryCapacityDResultVO carryCapacityDResultVO = new CarryCapacityDResultVO();
Double S_T = calParam.getS_T();
Double S_pv = calParam.getS_pv();
Double P_pv = calParam.getS_pv()*Double.valueOf(CarryingCapacityEnum.K.getValue());
List<String> phaseType = Stream.of("A", "B", "C").collect(Collectors.toList());
List<Double> uList = new ArrayList<>();
List<Double> BtList = new ArrayList<>();
List<Double> PF_TList = new ArrayList<>();
for (String phase : phaseType) {
Double P_βmin = calParam.getP_βminMap().get(phase);
Double Q_βmin = calParam.getQ_βminMap().get(phase);
Double[] res = calParam.getStringMap().get(phase);
double Bt = CZNLPG.calculateB(P_βmin, Q_βmin, Double.valueOf(CarryingCapacityEnum.K.getValue()), S_T, S_pv, P_pv);
BtList.add(Bt);
double PF_T = CZNLPG.calculatePF_T(P_βmin, Q_βmin, Double.valueOf(CarryingCapacityEnum.K.getValue()), S_pv);
PF_TList.add(PF_T);
double U = CZNLPG.calculateU(res[0], res[1], res[2], P_βmin, Double.valueOf(CarryingCapacityEnum.K.getValue()), Q_βmin, S_pv, Double.valueOf(calParam.getScale()));
uList.add(U);
}
//取uList最大值
double U_T_Max = uList.stream().mapToDouble(Double::doubleValue)
.max()
.getAsDouble();
double Bt_Max = BtList.stream().mapToDouble(Double::doubleValue)
.max()
.getAsDouble();
double PF_T_Max = PF_TList.stream().mapToDouble(Double::doubleValue)
.max()
.getAsDouble();
Integer uTLevel = CZNLPG.evaluateVoltageLevel(U_T_Max);
carryCapacityDResultVO.setUTLevel(uTLevel);
Integer pfTLevel = CZNLPG.evaluatePowerFactorLevel(PF_T_Max);
carryCapacityDResultVO.setPfTLevel(pfTLevel);
Integer bTLevel = CZNLPG.evaluateEquivalentLoadRateLevel(PF_T_Max);
carryCapacityDResultVO.setPfTLevel(bTLevel);
//谐波电流幅值判断
//获取限值
Overlimit overlimit = lineFeignClient.getOverLimitData(calParam.getLineId()).getData();
//各次谐波电流 均小于国标限值 返回1 存在某次谐波电流幅值 超出限值但在1.25倍限值内 返回2 存在某次谐波电流幅值超出限值1.25倍以上 返回3 存在多次谐波电流幅值均超出限值1.25倍以上 返回4
//i_count1小于国标限值的个数i_count2>=国标限值<=1.25倍的国标限值i_count3>1.25倍的国标限值
int i_count1=0,i_count2=0,i_count3=0;
for (int i = 0; i < calParam.getI_βmax().size(); i++) {
double I_TM = CZNLPG.calculateITm(calParam.getI_βmax().get(i), Double.valueOf(CarryingCapacityEnum.K.getValue()),
Double.valueOf(calParam.getScale()), S_pv, Double.valueOf(CarryingCapacityEnum.getValueByCode("K_H_" + (i + 2))),
Double.valueOf(CarryingCapacityEnum.getValueByCode("I_INV_" + (i + 2))));
double getUharm = PubUtils.getValueByMethod(overlimit, "getIharm", i + 2);
if (I_TM<getUharm) {
i_count1++;
} else if (I_TM >= getUharm && I_TM <= 1.25 * getUharm) {
i_count2++;
} else if (I_TM > 1.25 * getUharm) {
i_count3++;
}
}
Integer iLevel = 1;
if (i_count3>1) {
iLevel=4;
} else if (i_count3==1) {
iLevel=3;
} else if (i_count2==1) {
iLevel=2;
}else {
iLevel=1;
}
carryCapacityDResultVO.setILevel(iLevel);
//统计安全3级预警2级预警1级预警个数
List<Integer> list = Stream.of(uTLevel, pfTLevel, bTLevel, iLevel).collect(Collectors.toList());
int safe_count=0,warn_count3=0,warn_count2=0,warn_count1=0;
safe_count =(int) list.stream()
.filter(temp ->temp==1)
.count();
warn_count3 =(int) list.stream()
.filter(temp ->temp==2)
.count();
warn_count2 =(int) list.stream()
.filter(temp ->temp==3)
.count();
warn_count1 =(int) list.stream()
.filter(temp ->temp==1)
.count();
List<CarryCapacityStrategyVO> carryCapacityStrategyVOList = carryCapacityStrategyPOService.queyDetail();
//1-安全2-III级预警3-II级预警4-I 级预警,依次执行策略看是否符合
for (int i = 1; i < 5; i++) {
int finalI = i;
boolean b = StrategyReslut(carryCapacityStrategyVOList, i, 1, safe_count);
boolean b1 = StrategyReslut(carryCapacityStrategyVOList, i, 2, warn_count3);
boolean b2 = StrategyReslut(carryCapacityStrategyVOList, i, 3, warn_count2);
boolean b3 = StrategyReslut(carryCapacityStrategyVOList, i, 4, warn_count1);
if(b&&b1&&b2&&b3){
carryCapacityDResultVO.setReslutLevel(i);
break;
}
}
return carryCapacityDResultVO;
}
@Override
public List<TerminalTree> carryCapacityTree() {
List<TerminalTree> data = deviceTreeClient.getTerminalTree().getData();
data.forEach(temp->{
temp.getChildren().forEach(temp1->{
temp1.getChildren().forEach(temp2->{
temp2.getChildren().forEach(temp3->{
temp3.getChildren().forEach(temp4->{
List<TerminalTree> collect = temp4.getChildren().stream()
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.collect(Collectors.toList());
temp4.setChildren(collect);
});
});
});
});
});
return data;
}
/**
* @Description: 首先,找到缺失值的前一个和后一个非缺失值。
* 计算两个非缺失值之间的差值。
* 将差值除以两个非缺失值之间的距离,得到斜率。
* 使用斜率和前一个非缺失值计算缺失值的近似值。
* @Param:
* @Author: clam
* @Date: 2024/2/28
*/
public static void linearInterpolation(List<CarryCapcityData> data) {
for (int i = 0; i < data.size(); i++) {
if (data.get(i).getValue() == DEFAULTVALUE ) {
int prevIndex = i - 1;
int nextIndex = i + 1;
while (prevIndex >= 0 && data.get(prevIndex).getValue() == DEFAULTVALUE) {
prevIndex--;
}
while (nextIndex < data.size() && data.get(nextIndex).getValue() == DEFAULTVALUE) {
nextIndex++;
}
if (prevIndex >= 0 && nextIndex < data.size()) {
double slope = (data.get(nextIndex).getValue() - data.get(prevIndex).getValue()) / (nextIndex - prevIndex);
data.get(i).setValue(data.get(prevIndex).getValue() + slope * (i - prevIndex));
} else {
data.get(i).setValue(DEFAULTVALUE);
}
}
}
}
/**
* @Description: linearInterpolationI 电流数据缺失填补
* @Param:
* @return: void
* @Author: clam
* @Date: 2024/2/28
*/
public static void linearInterpolationI(List<DataI> data) {
for (int k= 2; k <=25 ; k++) {
for (int i = 0; i < data.size(); i++) {
if (data.get(i).getI2() == DEFAULTVALUE) {
int prevIndex = i - 1;
int nextIndex = i + 1;
while (prevIndex >= 0 && data.get(prevIndex).getI2() == DEFAULTVALUE) {
prevIndex--;
}
while (nextIndex < data.size() && data.get(nextIndex).getI2() == DEFAULTVALUE) {
nextIndex++;
}
if (prevIndex >= 0 && nextIndex < data.size()) {
double slope = (data.get(nextIndex).getI2() - data.get(prevIndex).getI2()) / (nextIndex - prevIndex);
data.get(i).setI2(data.get(prevIndex).getI2() + slope * (i - prevIndex));
data.get(i).setI3(data.get(prevIndex).getI3() + slope * (i - prevIndex));
data.get(i).setI4(data.get(prevIndex).getI4() + slope * (i - prevIndex));
data.get(i).setI5(data.get(prevIndex).getI5() + slope * (i - prevIndex));
data.get(i).setI6(data.get(prevIndex).getI6() + slope * (i - prevIndex));
data.get(i).setI7(data.get(prevIndex).getI7() + slope * (i - prevIndex));
data.get(i).setI8(data.get(prevIndex).getI8() + slope * (i - prevIndex));
data.get(i).setI9(data.get(prevIndex).getI9() + slope * (i - prevIndex));
data.get(i).setI10(data.get(prevIndex).getI10() + slope * (i - prevIndex));
data.get(i).setI11(data.get(prevIndex).getI11() + slope * (i - prevIndex));
data.get(i).setI12(data.get(prevIndex).getI12() + slope * (i - prevIndex));
data.get(i).setI13(data.get(prevIndex).getI13() + slope * (i - prevIndex));
data.get(i).setI14(data.get(prevIndex).getI14() + slope * (i - prevIndex));
data.get(i).setI15(data.get(prevIndex).getI15() + slope * (i - prevIndex));
data.get(i).setI16(data.get(prevIndex).getI16() + slope * (i - prevIndex));
data.get(i).setI17(data.get(prevIndex).getI17() + slope * (i - prevIndex));
data.get(i).setI18(data.get(prevIndex).getI18() + slope * (i - prevIndex));
data.get(i).setI19(data.get(prevIndex).getI19() + slope * (i - prevIndex));
data.get(i).setI20(data.get(prevIndex).getI20() + slope * (i - prevIndex));
data.get(i).setI21(data.get(prevIndex).getI21() + slope * (i - prevIndex));
data.get(i).setI22(data.get(prevIndex).getI22() + slope * (i - prevIndex));
data.get(i).setI23(data.get(prevIndex).getI23() + slope * (i - prevIndex));
data.get(i).setI24(data.get(prevIndex).getI24() + slope * (i - prevIndex));
data.get(i).setI25(data.get(prevIndex).getI25() + slope * (i - prevIndex));
} else {
data.get(i).setI2(DEFAULTVALUE);
data.get(i).setI3(DEFAULTVALUE);
data.get(i).setI4(DEFAULTVALUE);
data.get(i).setI5(DEFAULTVALUE);
data.get(i).setI6(DEFAULTVALUE);
data.get(i).setI7(DEFAULTVALUE);
data.get(i).setI8(DEFAULTVALUE);
data.get(i).setI9(DEFAULTVALUE);
data.get(i).setI10(DEFAULTVALUE);
data.get(i).setI11(DEFAULTVALUE);
data.get(i).setI12(DEFAULTVALUE);
data.get(i).setI13(DEFAULTVALUE);
data.get(i).setI14(DEFAULTVALUE);
data.get(i).setI15(DEFAULTVALUE);
data.get(i).setI16(DEFAULTVALUE);
data.get(i).setI17(DEFAULTVALUE);
data.get(i).setI18(DEFAULTVALUE);
data.get(i).setI19(DEFAULTVALUE);
data.get(i).setI20(DEFAULTVALUE);
data.get(i).setI21(DEFAULTVALUE);
data.get(i).setI22(DEFAULTVALUE);
data.get(i).setI23(DEFAULTVALUE);
data.get(i).setI24(DEFAULTVALUE);
data.get(i).setI25(DEFAULTVALUE);
}
}
}
}
}
/**
* @Description: calUParam 首端电压模型训练获取A,B,C三项C,ab参数
* @Param:
* @return: java.util.Map<java.lang.String,java.lang.Double[]>
* @Author: clam
* @Date: 2024/2/29
*/
public static Map<String,Double[]> calUParam(List<CarryCapcityData> dataHarmPowerPList2,List<CarryCapcityData> dataHarmPowerQList2,List<CarryCapcityData> DataVList2){
Map<String,Double[]> results = new HashMap<>(4);
List<String> phaseType = Stream.of("A", "B", "C").collect(Collectors.toList());
//存储UA, UB,UC;
List<Double> uList = new ArrayList<>();
phaseType.stream().forEach(phase -> {
List<Double> listP2 = dataHarmPowerPList2.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp -> temp.getPhaseType().equals(phase))
.map(CarryCapcityData::getValue)
.collect(Collectors.toList());
List<Double> listQ2 = dataHarmPowerQList2.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp -> temp.getPhaseType().equals(phase))
.map(CarryCapcityData::getValue)
.collect(Collectors.toList());
List<Double> listV2 = DataVList2.stream().filter(temp -> Utils.isTimeInRange(temp.getTime(), LocalTime.of(9, 0), LocalTime.of(15, 0)))
.filter(temp -> temp.getPhaseType().equals(phase))
.map(CarryCapcityData::getValue)
.collect(Collectors.toList());
//todo 抽取5000条数据抽取方式待确定
Double[] res = new Double[3];
CZNLPG.cznlpgDataTrain(listV2, listP2, listQ2, listV2.size(), res);
results.put(phase, res);
});
return results;
}
private static boolean compareNumbers(int num1, int num2, String operator) {
if (operator.equals("/")) {
return true;
}
else if (operator.equals("<") ) {
return num1 < num2;
} else if (operator.equals(">")) {
return num1 > num2;
} else if (operator.equals("<=")) {
return num1 <= num2;
} else if (operator.equals(">=")) {
return num1 >= num2;
} else if (operator.equals("==")) {
return num1 == num2;
} else if (operator.equals("!=")) {
return num1 != num2;
} else {
throw new IllegalArgumentException("无效的操作符");
}
}
private static boolean StrategyReslut(List<CarryCapacityStrategyVO> carryCapacityStrategyVOList, int result_level, int index_result_level,int result_count) {
CarryCapacityStrategyVO carryCapacityStrategyVO = carryCapacityStrategyVOList.stream()
.filter(temp -> temp.getResult() == result_level)
.filter(temp -> temp.getIndexResult() == index_result_level)
.collect(Collectors.toList()).get(0);
boolean b1 = compareNumbers(result_count, carryCapacityStrategyVO.getCount(), carryCapacityStrategyVO.getComparisonOperators());
return b1;
}
}

View File

@@ -0,0 +1,314 @@
package com.njcn.advance.utils;
import org.apache.commons.math3.linear.DecompositionSolver;
import org.apache.commons.math3.linear.LUDecomposition;
import org.apache.commons.math3.linear.MatrixUtils;
import org.apache.commons.math3.linear.RealMatrix;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
public class CZNLPG {
private static final String DATA_CSV = "C:\\njcn\\pqs\\pqs-advance\\advance-boot\\src\\main\\resources\\test.csv";
private static final int MAX_PRO_DATA_NUM = 5000;
private static final int MAX_DATA_COL_NUM = 9;
private static double[][] arr = new double[MAX_PRO_DATA_NUM][MAX_DATA_COL_NUM];
public static void main(String[] args) {
double[] data_u = new double[MAX_PRO_DATA_NUM];
double[] data_p = new double[MAX_PRO_DATA_NUM];
double[] data_q = new double[MAX_PRO_DATA_NUM];
int data_num = parseCSV(DATA_CSV, data_u, data_p, data_q);
System.out.println("data_num: " + data_num);
double[] res = new double[3];
// cznlpgDataTrain(data_u, data_p, data_q, data_num, res);
System.out.println("C = " + res[0] + " a = " + res[1] + " b = " + res[2]);
}
private static int parseCSV(String path, double[] data_u, double[] data_p, double[] data_q) {
int line = 0;
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
String lines;
while ((lines = br.readLine()) != null) {
String[] tokens = lines.split(",");
for (int i = 0; i < tokens.length; i++) {
arr[line][i] = Double.parseDouble(tokens[i]);
}
System.out.println("line " + line + ": ");
for (int i = 0; i < tokens.length; i++) {
System.out.println("arr[" + line + "][" + i + "]=" + arr[line][i]);
}
data_u[line] = arr[line][0];
data_p[line] = arr[line][1];
data_q[line] = arr[line][2];
line++;
}
} catch (IOException e) {
e.printStackTrace();
}
return line;
}
/*
* 模型训练
* */
public static void cznlpgDataTrain(List<Double> u, List<Double> p, List<Double> q, int num, Double[] outRes) {
if (num > MAX_PRO_DATA_NUM) {
return;
}
RealMatrix matPQ = MatrixUtils.createRealMatrix(num, 3);
RealMatrix matU = MatrixUtils.createRealMatrix(num, 1);
RealMatrix matW = MatrixUtils.createRealMatrix(3, 1);
// Matrix assignment
for (int i = 0; i < num; i++) {
matPQ.setEntry(i, 0, 1);
matPQ.setEntry(i, 1, p.get(i));
matPQ.setEntry(i, 2, q.get(i));
matU.setEntry(i, 0, u.get(i));
}
System.out.println("matPQ=");
printMatrix(matPQ);
System.out.println("matPQ transpose=");
printMatrix(matPQ.transpose());
// w = inv(PQ1'*PQ1)*PQ1'*U
// U = 224.5133 - 2.3041e-5 * P - 1.1900e-4 * Q
RealMatrix matPQT = matPQ.transpose();
RealMatrix matInverse = inverseMatrix(matPQT.multiply(matPQ));
matW = matInverse.multiply(matPQT).multiply(matU);
outRes[0] = matW.getEntry(0, 0);
outRes[1] = matW.getEntry(1, 0);
outRes[2] = matW.getEntry(2, 0);
}
private static void printMatrix(RealMatrix matrix) {
System.out.println(matrix);
}
//矩阵求逆
public static RealMatrix inverseMatrix(RealMatrix matrix) {
LUDecomposition LUDe = new LUDecomposition(matrix);
DecompositionSolver solver = LUDe.getSolver();
RealMatrix result = solver.getInverse();
return result;
}
/**
* @Description: 负载率约束指标计算P_βmin和Q_βmin分别为近一周的配变每日9时~15时段的负载率数据中概率95%小值所对应时刻的有功功率和无功功率值;
* S_T为配变额定容量S_pv为拟接入光伏容量k为修正系数 ,取值可参照如下。
* 台区日照条件 k
* 光照强度大于1250kWh/m^2 0.8~0.9
* 光照强度小于1250kWh/m^2 0.75~0.8
* 海南 0.8
* @Param:
* @return: double Loadrate
* @Author: clam
* @Date: 2024/1/26
*/
public static double calculateB(double P_βmin, double Q_βmin, double k, double S_T, double S_pv, double P_pv) {
double term1 = Math.pow(P_βmin - k * S_T, 2);
double term2 = Math.pow(Q_βmin, 2);
double numerator = Math.sqrt(term1 + term2);
if (P_βmin > P_pv) {
return numerator / S_pv;
} else {
return -numerator / S_pv;
}
}
/**
* @Description: calculatePF_T 功率因数指标计算
* @Param:
* @return: double
* @Author: clam
* @Date: 2024/2/20
*/
public static double calculatePF_T(double P_βmin, double Q_βmin, double k, double S_pv) {
double term1 = Math.pow(P_βmin - k * S_pv, 2);
double term2 = Math.pow(Q_βmin, 2);
double v = P_βmin - k * S_pv;
double numerator = Math.sqrt(term1 + term2);
return v/numerator;
}
/**
* @Description: 总结:
* p_min和 q_min能够根据测点数据获取得到
* S_pv为拟接入光伏容量此部分需要现场选取好台区后获取。
* k为修正系数徐工提供海南k系数是否需要考虑不同季节台区日照系数。
* C、a、b需要用模型计算是此算法中难点。
* 结论【拟接入光伏容量】为入参【A/B/C相有功功率】和【A/B/C相无功功率值】95%小值从A/B/C相历史数据中计算得出 为枚举参数;能够计算三相配变首端电压 、 、 从而得出U 。
* 380v -U=C-a(p_min -k*S_pv/3)-b*q_min
* 220v -U=C-a(p_min -k*S_pv)-b*q_min
*
* @Param:
* @return: double
* @Author: clam
* @Date: 2024/2/2
*/
public static double calculateU(double C, double a, double b, double p_min, double K, double q_min,double S_pv, double voltage) {
if (voltage == 220) {
return C-a*(p_min-K*S_pv)-b*q_min;
} else if (voltage == 380) {
return C-a*(p_min-K*S_pv/3)-b*q_min;
} else {
return 0;
}
}
/**
* I_(stock,h)为台区一周内的h次谐波电流95%概率大值I_"inv" ^h%为光伏逆变器第h次的典型谐波电流含有率
* S_pv为拟接入光伏容量此部分需要现场选取好台区后获取。
* k为修正系数徐工提供海南k系数是否需要考虑不同季节台区日照系数。
* 结论【电压等级】为入参I_(stock,h)为台区一周内的h次谐波电流95%概率大值I_"inv" ^h%为光伏逆变器第h次的典型谐波电流含有率
* 为枚举参数k为枚举参数能够计算各次的谐波电流幅值 、 、 ,从而得出 。
*/
public static double calculateITm(double I_cp95, double k, double voltage, double S_pv, double K, double I_inv) {
double term1 = Math.pow(I_cp95, 2);
double term2 = 0, term3 = 0;
if (voltage == 220) {
term2 = Math.pow(k * S_pv * I_inv / 220, 2);
term3 = K * I_cp95 * (k * S_pv * I_inv / 220);
} else if (voltage == 380) {
term2 = Math.pow(k * S_pv * I_inv / 3 * 220, 2);
term3 = K * I_cp95 * (k * S_pv * I_inv / 3 * 220);
} else {
return 0;
}
double sumOfTerms = term1 + term2 + term3;
return Math.sqrt(sumOfTerms);
}
/**
* @Description: evaluateVoltageLevel 根据规则评估配变首端电压等级
* @Param:
* @return: int
* @Author: clam
* @Date: 2024/1/30
*/
public static int evaluateVoltageLevel(double voltage) {
if (voltage <= 235.4) {
return 1; // 安全
} else if (voltage > 235.4 && voltage <= 253.0) {
return 2; // Ⅲ级预警
} else if (voltage > 253.0 && voltage < 260.0) {
return 3; // Ⅱ级预警
} else {
return 4; // Ⅰ级预警
}
}
/**
* @Description: evaluatePowerFactorLevel // 根据规则评估功率因数等级
* @Param:
* @return: int
* @Author: clam
* @Date: 2024/1/30
*/
public static int evaluatePowerFactorLevel(double powerFactor) {
if (powerFactor >= 0.9) {
return 1; // 安全
} else if (powerFactor >= 0.85 && powerFactor < 0.9) {
return 2; // Ⅲ级预警
} else if (powerFactor >= 0.8 && powerFactor < 0.85) {
return 3; // Ⅱ级预警
} else {
return 4; // Ⅰ级预警
}
}
/**
* @Description: / 根据规则评估等效负载率等级
* @Param:
* @return: int
* @Author: clam
* @Date: 2024/1/30
*/
public static int evaluateEquivalentLoadRateLevel(double equivalentLoadRate) {
if (equivalentLoadRate >= 0.0) {
return 1; // 安全
} else if (equivalentLoadRate >= -40.0 && equivalentLoadRate < 0.0) {
return 2; // Ⅲ级预警
} else if (equivalentLoadRate >= -80.0 && equivalentLoadRate < -40.0) {
return 3; // Ⅱ级预警
} else {
return 4; // Ⅰ级预警
}
}
/**
* @Description: 判断O:各项指标是否均为“安全” 安全接入
* 判断2: 至多2项指标达到“III级预警”其余指标均为“安全” 3接入预警
* @: 超过2项指标达到“III级预警”且无“II级预警”及以上的指标:或至多1项指标达到“I 级预警且其余指标均为“安全” 2接入预警
* 判断@: 至多2项指标达到“II 级预警”且其余指标均为“安全”: 或至多1项指标达到“II级预警”且其余指标存在“III级预警” 1级接入预警
* 否则 限制接入
* @Param:
* @return:
* @Author: clam
* @Date: 2024/1/30
*/
public static int evaluateG(List<Integer> indicators) {
long count1 = indicators.stream().filter(i -> i == 1).count();
long count2 = indicators.stream().filter(i -> i == 2).count();
long count3 = indicators.stream().filter(i -> i == 3).count();
if (count1 == 4) {
return 1;
} else if (count2 <= 2 && count2 + count1 == 4) {
return 2;
} else if ((count2 >= 2 && count2 + count1 == 4) || (count3 == 1 && count1 == 3)) {
return 3;
} else if ((count3 <= 2 && count1 + count3 == 4) || (count3 == 1 && count2 >= 1 && count1 + count2 == 3)) {
return 4;
} else {
return 5;
}
}
/**
* 计算一组数据的最大95概率值最小95概率值 入参一组double集合一个flag表示计算类型 返回double
*
* @param data
* @param type 0 最大95概率值 1 最小95概率值
* @return
*/
public static double calculatePercentile(List<Double> data, Integer type) {
// 对数组进行排序
// 正序排序
Collections.sort(data);
int index =0;
if (type == 0) {
// 计算最大95%概率值的索引
index =(int) Math.ceil(0.95 * data.size()) ;
} else if (type == 1) {
// 计算最小95%概率值的索引
index = (int) Math.ceil(0.05 * data.size()) - 1;
}
// 根据计算类型返回相应的值
return data.get(index);
}
}

View File

@@ -10,6 +10,9 @@ package com.njcn.advance.utils;
import cn.hutool.core.collection.CollectionUtil;
import java.lang.reflect.Field;
import java.time.Instant;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
@@ -99,4 +102,34 @@ public class Utils {
}
return result;
}
// 辅助方法:检查时间是否在指定范围内
public static boolean isTimeInRange(Instant instant, LocalTime startTime, LocalTime endTime) {
LocalTime localTime = instant.atZone(Instant.now().atZone(java.time.ZoneId.systemDefault()).getZone()).toLocalTime();
return !localTime.isBefore(startTime) && !localTime.isAfter(endTime);
}
public static <T> List<Double> getAttributeValueByPropertyName(List<T> list, String propertyName) {
List<Double> resultList = new ArrayList<>();
for (T item : list) {
try {
Field field = item.getClass().getDeclaredField(propertyName);
field.setAccessible(true);
resultList.add((Double) field.get(item));
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
return resultList;
}
public static <T> Double getAttributeValueByPropertyName(T item, String propertyName) {
Double result = null;
try {
Field field = item.getClass().getDeclaredField(propertyName);
field.setAccessible(true);
result=(Double) field.get(item);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
return result;
}
}

File diff suppressed because it is too large Load Diff