增加获取越线详情远程接口
This commit is contained in:
@@ -1,14 +1,11 @@
|
|||||||
package com.njcn.dataProcess.api;
|
package com.njcn.dataProcess.api;
|
||||||
|
|
||||||
import com.njcn.common.pojo.annotation.OperateInfo;
|
|
||||||
import com.njcn.common.pojo.constant.ServerInfo;
|
import com.njcn.common.pojo.constant.ServerInfo;
|
||||||
import com.njcn.common.pojo.enums.common.LogEnum;
|
|
||||||
import com.njcn.common.pojo.response.HttpResult;
|
import com.njcn.common.pojo.response.HttpResult;
|
||||||
import com.njcn.dataProcess.api.fallback.DataLimitRateDetailFeignClientFallbackFactory;
|
import com.njcn.dataProcess.api.fallback.DataLimitRateDetailFeignClientFallbackFactory;
|
||||||
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
||||||
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
||||||
import com.njcn.dataProcess.pojo.dto.DataLimitRateDto;
|
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailTimeDto;
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import org.springframework.cloud.openfeign.FeignClient;
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
@@ -32,4 +29,7 @@ public interface DataLimitRateDetailFeignClient {
|
|||||||
|
|
||||||
@PostMapping("/getLimitRateDetailTime")
|
@PostMapping("/getLimitRateDetailTime")
|
||||||
HttpResult<List<String>> getLimitRateDetailTime(@RequestParam("id") String id, @RequestParam("time") String time);
|
HttpResult<List<String>> getLimitRateDetailTime(@RequestParam("id") String id, @RequestParam("time") String time);
|
||||||
|
|
||||||
|
@PostMapping("/getLimitRateDetailTimeList")
|
||||||
|
HttpResult<List<DataLimitRateDetailTimeDto>> getLimitRateDetailTimeList(@RequestBody LineCountEvaluateParam lineParam);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import com.njcn.common.pojo.response.HttpResult;
|
|||||||
import com.njcn.dataProcess.api.DataLimitRateDetailFeignClient;
|
import com.njcn.dataProcess.api.DataLimitRateDetailFeignClient;
|
||||||
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
||||||
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
||||||
import com.njcn.dataProcess.pojo.dto.DataLimitRateDto;
|
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailTimeDto;
|
||||||
import com.njcn.dataProcess.util.DataProcessingEnumUtil;
|
import com.njcn.dataProcess.util.DataProcessingEnumUtil;
|
||||||
import feign.hystrix.FallbackFactory;
|
import feign.hystrix.FallbackFactory;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -56,6 +56,12 @@ public class DataLimitRateDetailFeignClientFallbackFactory implements FallbackFa
|
|||||||
log.error("{}异常,降级处理,异常为:{}","根据监测点id获取所有超标时间",cause.toString());
|
log.error("{}异常,降级处理,异常为:{}","根据监测点id获取所有超标时间",cause.toString());
|
||||||
throw new BusinessException(finalExceptionEnum);
|
throw new BusinessException(finalExceptionEnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HttpResult<List<DataLimitRateDetailTimeDto>> getLimitRateDetailTimeList(LineCountEvaluateParam lineParam) {
|
||||||
|
log.error("{}异常,降级处理,异常为:{}","获取原始数据越线时间",cause.toString());
|
||||||
|
throw new BusinessException(finalExceptionEnum);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
package com.njcn.dataProcess.pojo.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author web2023
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class DataLimitRateDetailTimeDto implements Serializable {
|
||||||
|
/**
|
||||||
|
* 监测点ID合格率的变电站/装置/母线/线路序号
|
||||||
|
*/
|
||||||
|
private String lineId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合格率时间
|
||||||
|
*/
|
||||||
|
private String time;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 闪变越限次数
|
||||||
|
*/
|
||||||
|
private List<String> flickerOvertime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 频率偏差越限次数
|
||||||
|
*/
|
||||||
|
private List<String> freqDevOvertime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 电压偏差越限次数
|
||||||
|
*/
|
||||||
|
private List<String> voltageDevOvertime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 三相电压不平衡度越限次数
|
||||||
|
*/
|
||||||
|
private List<String> ubalanceOvertime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 电压谐波畸变率越限次数
|
||||||
|
*/
|
||||||
|
private List<String> uaberranceOvertime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 负序电流限值次数
|
||||||
|
*/
|
||||||
|
private List<String> iNegOvertime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 电压谐波含有率越限次数
|
||||||
|
*/
|
||||||
|
private List<String> uharmOvertime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 电流谐波幅值越限次数
|
||||||
|
*/
|
||||||
|
private List<String> iharmOvertime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 0.5次间谐波电压限值次数
|
||||||
|
*/
|
||||||
|
private List<String> inuharmOvertime;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@ import com.njcn.dataProcess.annotation.InsertBean;
|
|||||||
import com.njcn.dataProcess.annotation.QueryBean;
|
import com.njcn.dataProcess.annotation.QueryBean;
|
||||||
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
||||||
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
||||||
import com.njcn.dataProcess.pojo.dto.DataLimitTargetDto;
|
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailTimeDto;
|
||||||
import com.njcn.dataProcess.service.IDataLimitRateDetail;
|
import com.njcn.dataProcess.service.IDataLimitRateDetail;
|
||||||
import com.njcn.web.controller.BaseController;
|
import com.njcn.web.controller.BaseController;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
@@ -67,6 +67,13 @@ public class DataLimitRateDetailController extends BaseController {
|
|||||||
List<DataLimitRateDetailDto> rawData = limitRateDetailInsert.getRawData(lineParam);
|
List<DataLimitRateDetailDto> rawData = limitRateDetailInsert.getRawData(lineParam);
|
||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, rawData, methodDescribe);
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, rawData, methodDescribe);
|
||||||
}
|
}
|
||||||
|
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
|
||||||
|
@PostMapping("/getLimitRateDetailTimeList")
|
||||||
|
@ApiOperation("获取原始数据越线时间")
|
||||||
|
public HttpResult<List<DataLimitRateDetailTimeDto>> getLimitRateDetailTimeList(@RequestBody LineCountEvaluateParam lineParam) {
|
||||||
|
String methodDescribe = getMethodDescribe("getLimitRateDetailTimeList");
|
||||||
|
List<DataLimitRateDetailTimeDto> rawData = limitRateDetailInsert.getLimitRateDetailTime(lineParam);
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, rawData, methodDescribe);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.njcn.dataProcess.service;
|
|||||||
import com.github.jeffreyning.mybatisplus.service.IMppService;
|
import com.github.jeffreyning.mybatisplus.service.IMppService;
|
||||||
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
||||||
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
||||||
|
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailTimeDto;
|
||||||
import com.njcn.dataProcess.pojo.po.RStatLimitRateDetailD;
|
import com.njcn.dataProcess.pojo.po.RStatLimitRateDetailD;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -24,6 +25,15 @@ public interface IDataLimitRateDetail extends IMppService<RStatLimitRateDetailD>
|
|||||||
*/
|
*/
|
||||||
List<String> getLimitRateDetailTime(String id,String time);
|
List<String> getLimitRateDetailTime(String id,String time);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 稳态超标时间
|
||||||
|
* @param lineParam
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<DataLimitRateDetailTimeDto> getLimitRateDetailTime(LineCountEvaluateParam lineParam);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量插入数据
|
* 批量插入数据
|
||||||
* @param limitRateDetailList
|
* @param limitRateDetailList
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
|
|||||||
import com.njcn.dataProcess.dao.relation.mapper.RStatLimitRateDetailRelationMapper;
|
import com.njcn.dataProcess.dao.relation.mapper.RStatLimitRateDetailRelationMapper;
|
||||||
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
||||||
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
||||||
|
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailTimeDto;
|
||||||
import com.njcn.dataProcess.pojo.po.RStatLimitRateDetailD;
|
import com.njcn.dataProcess.pojo.po.RStatLimitRateDetailD;
|
||||||
import com.njcn.dataProcess.service.IDataLimitRateDetail;
|
import com.njcn.dataProcess.service.IDataLimitRateDetail;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -26,6 +27,11 @@ public class InfluxdbDataLimitRateDetailImpl extends MppServiceImpl<RStatLimitRa
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DataLimitRateDetailTimeDto> getLimitRateDetailTime(LineCountEvaluateParam lineParam) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void batchInsertion(List<DataLimitRateDetailDto> limitRateList) {
|
public void batchInsertion(List<DataLimitRateDetailDto> limitRateList) {
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
package com.njcn.dataProcess.service.impl.relation;
|
package com.njcn.dataProcess.service.impl.relation;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.date.DatePattern;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
|
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
|
||||||
import com.njcn.dataProcess.dao.relation.mapper.RStatLimitRateDetailRelationMapper;
|
import com.njcn.dataProcess.dao.relation.mapper.RStatLimitRateDetailRelationMapper;
|
||||||
import com.njcn.dataProcess.pojo.dto.AbnormalData;
|
import com.njcn.dataProcess.pojo.dto.*;
|
||||||
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
import com.njcn.dataProcess.param.LineCountEvaluateParam;
|
||||||
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailDto;
|
|
||||||
import com.njcn.dataProcess.pojo.po.RStatLimitRateDetailD;
|
import com.njcn.dataProcess.pojo.po.RStatLimitRateDetailD;
|
||||||
import com.njcn.dataProcess.service.IDataLimitRateDetail;
|
import com.njcn.dataProcess.service.IDataLimitRateDetail;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -16,6 +16,9 @@ import org.springframework.beans.BeanUtils;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -60,19 +63,44 @@ public class RelationDataLimitRateDetailImpl extends MppServiceImpl<RStatLimitRa
|
|||||||
Class<?> fieldType = field.getType();
|
Class<?> fieldType = field.getType();
|
||||||
System.out.println("Field name: " + field.getName() + ", Type: " + fieldType.getName());
|
System.out.println("Field name: " + field.getName() + ", Type: " + fieldType.getName());
|
||||||
}
|
}
|
||||||
} catch (SecurityException |IllegalAccessException e) {
|
} catch (SecurityException | IllegalAccessException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
if (CollUtil.isNotEmpty(json)){
|
return getString(json);
|
||||||
List<String> times = json.stream().map(AbnormalData.Json::getTime).collect(Collectors.toList());
|
|
||||||
String join = String.join(",", times);
|
|
||||||
String[] split = join.split(",");
|
|
||||||
return Arrays.stream(split).distinct().collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DataLimitRateDetailTimeDto> getLimitRateDetailTime(LineCountEvaluateParam lineParam) {
|
||||||
|
List<DataLimitRateDetailTimeDto> info = new ArrayList<>();
|
||||||
|
LambdaQueryWrapper<RStatLimitRateDetailD> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
lambdaQueryWrapper.in(CollUtil.isNotEmpty(lineParam.getLineId()), RStatLimitRateDetailD::getLineId, lineParam.getLineId())
|
||||||
|
.ge(RStatLimitRateDetailD::getTime, lineParam.getStartTime())
|
||||||
|
.le(RStatLimitRateDetailD::getTime, lineParam.getEndTime());
|
||||||
|
|
||||||
|
List<RStatLimitRateDetailD> list = this.list(lambdaQueryWrapper);
|
||||||
|
DataLimitRateDetailTimeDto dto;
|
||||||
|
for (RStatLimitRateDetailD detailD : list) {
|
||||||
|
dto = new DataLimitRateDetailTimeDto();
|
||||||
|
dto.setLineId(detailD.getLineId());
|
||||||
|
dto.setTime(detailD.getTime().format((DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))));
|
||||||
|
dto.setFlickerOvertime(toList(detailD.getFlickerOvertime()));
|
||||||
|
dto.setFreqDevOvertime(toList(detailD.getFreqDevOvertime()));
|
||||||
|
dto.setVoltageDevOvertime(toList(detailD.getVoltageDevOvertime()));
|
||||||
|
dto.setUbalanceOvertime(toList(detailD.getUbalanceOvertime()));
|
||||||
|
dto.setUaberranceOvertime(toList(detailD.getUaberranceOvertime()));
|
||||||
|
dto.setINegOvertime(toList(detailD.getINegOvertime()));
|
||||||
|
dto.setUharmOvertime(toList(detailD,2,25,"uharm"));
|
||||||
|
dto.setIharmOvertime(toList(detailD,2,25,"iharm"));
|
||||||
|
dto.setInuharmOvertime(toList(detailD,1,16,"inuharm"));
|
||||||
|
info.add(dto);
|
||||||
|
}
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void batchInsertion(List<DataLimitRateDetailDto> limitRateList) {
|
public void batchInsertion(List<DataLimitRateDetailDto> limitRateList) {
|
||||||
List<RStatLimitRateDetailD> result = new ArrayList<>();
|
List<RStatLimitRateDetailD> result = new ArrayList<>();
|
||||||
@@ -88,17 +116,52 @@ public class RelationDataLimitRateDetailImpl extends MppServiceImpl<RStatLimitRa
|
|||||||
public List<DataLimitRateDetailDto> getRawData(LineCountEvaluateParam lineParam) {
|
public List<DataLimitRateDetailDto> getRawData(LineCountEvaluateParam lineParam) {
|
||||||
List<DataLimitRateDetailDto> result = new ArrayList<>();
|
List<DataLimitRateDetailDto> result = new ArrayList<>();
|
||||||
LambdaQueryWrapper<RStatLimitRateDetailD> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<RStatLimitRateDetailD> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
lambdaQueryWrapper.in(CollUtil.isNotEmpty(lineParam.getLineId()),RStatLimitRateDetailD::getLineId,lineParam.getLineId())
|
lambdaQueryWrapper.in(CollUtil.isNotEmpty(lineParam.getLineId()), RStatLimitRateDetailD::getLineId, lineParam.getLineId())
|
||||||
.ge(RStatLimitRateDetailD::getTime,lineParam.getStartTime())
|
.ge(RStatLimitRateDetailD::getTime, lineParam.getStartTime())
|
||||||
.le(RStatLimitRateDetailD::getTime,lineParam.getEndTime());
|
.le(RStatLimitRateDetailD::getTime, lineParam.getEndTime());
|
||||||
|
|
||||||
List<RStatLimitRateDetailD> list = this.list(lambdaQueryWrapper);
|
List<RStatLimitRateDetailD> list = this.list(lambdaQueryWrapper);
|
||||||
|
|
||||||
list.forEach(item->{
|
list.forEach(item -> {
|
||||||
DataLimitRateDetailDto dto = new DataLimitRateDetailDto();
|
DataLimitRateDetailDto dto = new DataLimitRateDetailDto();
|
||||||
BeanUtils.copyProperties(item,dto);
|
BeanUtils.copyProperties(item, dto);
|
||||||
result.add(dto);
|
result.add(dto);
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<String> toList(RStatLimitRateDetailD detailD,Integer start, Integer end, String targetName){
|
||||||
|
List<AbnormalData.Json> json = new ArrayList<>();
|
||||||
|
for (int i = start; i <= end; i++) {
|
||||||
|
// 构造方法名
|
||||||
|
String methodName = targetName + i + "Overtime";
|
||||||
|
try {
|
||||||
|
// 获取 DataHarmDto 类的 getVx 方法
|
||||||
|
Method getVMethod = RStatLimitRateDetailD.class.getMethod(methodName);
|
||||||
|
String value = (String) getVMethod.invoke(detailD);
|
||||||
|
json.addAll(JSON.parseArray(value, AbnormalData.Json.class));
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return getString(json);
|
||||||
|
}
|
||||||
|
private List<String> toList(String json){
|
||||||
|
List<AbnormalData.Json> jsons = JSON.parseArray(json, AbnormalData.Json.class);
|
||||||
|
return getString(jsons);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getString(List<AbnormalData.Json> jsons) {
|
||||||
|
if (CollUtil.isNotEmpty(jsons)){
|
||||||
|
List<String> times = jsons.stream().map(AbnormalData.Json::getTime).collect(Collectors.toList());
|
||||||
|
String join = String.join(",", times);
|
||||||
|
String[] split = join.split(",");
|
||||||
|
return Arrays.stream(split).distinct().collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user