feat: There is no way the, 标准 被代替 补漏。。 详情点击代替、被代替标准效验接口修改
This commit is contained in:
@@ -42,6 +42,18 @@ public class DataSyncController {
|
|||||||
private IDataSyncService iDataSyncService;
|
private IDataSyncService iDataSyncService;
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperation("国内外标准库代替被代替 数据补全")
|
||||||
|
@PostMapping("/dtAndBdtToStandData")
|
||||||
|
public void dtAndBdtToStandData() {
|
||||||
|
iDataSyncService.dtAndBdtToStandData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("企业标准库代替被代替 数据补全")
|
||||||
|
@PostMapping("/dtAndBdtToBussData")
|
||||||
|
public void dtAndBdtToBussData() {
|
||||||
|
iDataSyncService.dtAndBdtToBussData();
|
||||||
|
}
|
||||||
|
|
||||||
@ApiOperation("同步用户数据")
|
@ApiOperation("同步用户数据")
|
||||||
@PostMapping("/importUserData")
|
@PostMapping("/importUserData")
|
||||||
public String importUserData() throws Exception {
|
public String importUserData() throws Exception {
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ package com.adc.da.slrs.DataSync.service;
|
|||||||
|
|
||||||
public interface IDataSyncService {
|
public interface IDataSyncService {
|
||||||
|
|
||||||
|
void dtAndBdtToStandData();
|
||||||
|
void dtAndBdtToBussData();
|
||||||
|
|
||||||
public String dataSync();
|
public String dataSync();
|
||||||
|
|
||||||
public String orgDataSync();
|
public String orgDataSync();
|
||||||
|
|||||||
+209
@@ -2,10 +2,19 @@ package com.adc.da.slrs.DataSync.service.impl;
|
|||||||
|
|
||||||
import com.adc.da.login.util.UserUtils;
|
import com.adc.da.login.util.UserUtils;
|
||||||
import com.adc.da.slrs.DataSync.service.IDataSyncService;
|
import com.adc.da.slrs.DataSync.service.IDataSyncService;
|
||||||
|
import com.adc.da.slrs.sarBussStandAttrInfo.dao.SarBussStandAttrInfoDao;
|
||||||
|
import com.adc.da.slrs.sarBussStandAttrInfo.service.ISarBussStandAttrInfoService;
|
||||||
|
import com.adc.da.slrs.sarBussionessStand.entity.SarBussionessStand;
|
||||||
|
import com.adc.da.slrs.sarBussionessStand.service.ISarBussionessStandService;
|
||||||
import com.adc.da.slrs.sarInstitution.entity.TsInstitution;
|
import com.adc.da.slrs.sarInstitution.entity.TsInstitution;
|
||||||
import com.adc.da.slrs.sarInstitution.service.ITsInstitutionService;
|
import com.adc.da.slrs.sarInstitution.service.ITsInstitutionService;
|
||||||
import com.adc.da.slrs.sarPosition.entity.TsPosition;
|
import com.adc.da.slrs.sarPosition.entity.TsPosition;
|
||||||
import com.adc.da.slrs.sarPosition.service.ITsPositionService;
|
import com.adc.da.slrs.sarPosition.service.ITsPositionService;
|
||||||
|
import com.adc.da.slrs.sarStandAttrInfo.dao.SarStandAttrInfoDao;
|
||||||
|
import com.adc.da.slrs.sarStandAttrInfo.entity.SarStandAttrInfo;
|
||||||
|
import com.adc.da.slrs.sarStandAttrInfo.service.ISarStandAttrInfoService;
|
||||||
|
import com.adc.da.slrs.sarStandardsInfo.entity.SarStandardsInfo;
|
||||||
|
import com.adc.da.slrs.sarStandardsInfo.service.ISarStandardsInfoService;
|
||||||
import com.adc.da.slrs.sarUser.entity.TsUser;
|
import com.adc.da.slrs.sarUser.entity.TsUser;
|
||||||
import com.adc.da.slrs.sarUser.service.ITsUserService;
|
import com.adc.da.slrs.sarUser.service.ITsUserService;
|
||||||
import com.adc.da.sync.service.SyncUserService;
|
import com.adc.da.sync.service.SyncUserService;
|
||||||
@@ -14,18 +23,22 @@ import com.adc.da.sys.entity.UserOrgEO;
|
|||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import lombok.extern.log4j.Log4j;
|
import lombok.extern.log4j.Log4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.ibatis.jdbc.Null;
|
import org.apache.ibatis.jdbc.Null;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.scheduling.annotation.Async;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class DataSyncServiceImpl implements IDataSyncService {
|
public class DataSyncServiceImpl implements IDataSyncService {
|
||||||
@@ -37,10 +50,206 @@ public class DataSyncServiceImpl implements IDataSyncService {
|
|||||||
ITsUserService tsUserService;
|
ITsUserService tsUserService;
|
||||||
@Autowired
|
@Autowired
|
||||||
ITsInstitutionService tsInstitutionService;
|
ITsInstitutionService tsInstitutionService;
|
||||||
|
@Autowired
|
||||||
|
private ISarStandardsInfoService iSarStandardsInfoService;
|
||||||
|
@Autowired
|
||||||
|
private ISarBussionessStandService iSarBussionessStandService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SarStandAttrInfoDao sarStandAttrInfoEODao;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ISarStandAttrInfoService iSarStandAttrInfoService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SarBussStandAttrInfoDao sarBussStandAttrInfoEODao;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ISarBussStandAttrInfoService iSarBussStandAttrInfoService;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static Logger logger = LoggerFactory.getLogger(DataSyncServiceImpl.class);
|
private static Logger logger = LoggerFactory.getLogger(DataSyncServiceImpl.class);
|
||||||
|
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = {RuntimeException.class,Exception.class})
|
||||||
|
@Async
|
||||||
|
public void dtAndBdtToStandData(){
|
||||||
|
QueryWrapper wrapper = new QueryWrapper();
|
||||||
|
wrapper.select("sar_standards_info.*, r.DTBJH AS dtbzh, r.BDTBZH");
|
||||||
|
wrapper.last("LEFT JOIN sar_stand_attr_info r ON r.STAND_ID = sar_standards_info.ID WHERE sar_standards_info.VALID_FLAG = '0'");
|
||||||
|
List<SarStandardsInfo> standardsInfos = iSarStandardsInfoService.list(wrapper);
|
||||||
|
|
||||||
|
if(!standardsInfos.isEmpty()){
|
||||||
|
|
||||||
|
// 1. 遍历全部数据
|
||||||
|
standardsInfos.forEach(info -> {
|
||||||
|
// 1.1 判断代替标准号
|
||||||
|
if(StringUtils.isNotBlank(info.getDtbzh())){
|
||||||
|
// 1.1.1 找出当前代替标准版所有被代替标准
|
||||||
|
List<String> dtList = Arrays.stream(info.getDtbzh().split(",")).map(String::trim).collect(Collectors.toList());
|
||||||
|
if(!dtList.isEmpty()){
|
||||||
|
for (String s : dtList) {
|
||||||
|
|
||||||
|
if(s.contains("null")){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
List<SarStandardsInfo> bdtList = standardsInfos.stream().filter(info1 -> {
|
||||||
|
if(StringUtils.isNotBlank(info1.getDtbzh()) && info1.getDtbzh().contains(s)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
// 1.1.1.1合并被代替标准
|
||||||
|
if(!bdtList.isEmpty()){
|
||||||
|
// 1.1.1.1.1 获取需要更新的代替标准
|
||||||
|
List<SarStandardsInfo> updInfo = standardsInfos.stream().filter(info1 -> {
|
||||||
|
String addStrandNumber = "";
|
||||||
|
if (StringUtils.isNotEmpty(info1.getStandYear())) {
|
||||||
|
addStrandNumber = info1.getStandSort() + " " + info1.getStandNumber() + "-" + info1.getStandYear();
|
||||||
|
} else {
|
||||||
|
addStrandNumber = info1.getStandSort() + " " + info1.getStandNumber();
|
||||||
|
}
|
||||||
|
if(StringUtils.isNotBlank(addStrandNumber) && s.trim().equals(addStrandNumber.trim())){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
|
||||||
|
// 1.1.1.1.2 是否存在需要更新的代替标准
|
||||||
|
if(!updInfo.isEmpty()){
|
||||||
|
// 1.1.1.1.2.1 拼接 被代替标准号
|
||||||
|
String btd = bdtList.stream().map(info1 -> {
|
||||||
|
String addStrandNumber = "";
|
||||||
|
if (StringUtils.isNotEmpty(info1.getStandYear())) {
|
||||||
|
addStrandNumber = info1.getStandSort() + " " + info1.getStandNumber() + "-" + info1.getStandYear();
|
||||||
|
} else {
|
||||||
|
addStrandNumber = info1.getStandSort() + " " + info1.getStandNumber();
|
||||||
|
}
|
||||||
|
return addStrandNumber;
|
||||||
|
}).collect(Collectors.joining(","));
|
||||||
|
System.out.println(btd);
|
||||||
|
|
||||||
|
// 1.1.1.1.2.2 找出已存在的被代替标准 及 去重, 如没找出,则使用最新被代替
|
||||||
|
List<String> notExBtdList = Arrays.stream(btd.split(",")).map(String::trim).collect(Collectors.toList());
|
||||||
|
if(StringUtils.isNotBlank(updInfo.get(0).getBDTBZH())){
|
||||||
|
List<String> exBdtList = Arrays.stream(updInfo.get(0).getBDTBZH().split(",")).map(String::trim).collect(Collectors.toList());
|
||||||
|
if(!exBdtList.isEmpty()){
|
||||||
|
exBdtList = exBdtList.stream().filter(String -> {
|
||||||
|
if(StringUtils.isNotBlank(String) && !String.contains("null")){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
notExBtdList.addAll(exBdtList);
|
||||||
|
notExBtdList = notExBtdList.stream().distinct().collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String btdStr = notExBtdList.stream().map(String::toString).collect(Collectors.joining(","));
|
||||||
|
|
||||||
|
// 1.1.1.1.2.3 更新
|
||||||
|
UpdateWrapper updateWrapper = new UpdateWrapper();
|
||||||
|
updateWrapper.eq("STAND_ID",updInfo.get(0).getId());
|
||||||
|
updateWrapper.set("BDTBZH",btdStr);
|
||||||
|
iSarStandAttrInfoService.update(updateWrapper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = {RuntimeException.class,Exception.class})
|
||||||
|
public void dtAndBdtToBussData(){
|
||||||
|
QueryWrapper wrapper = new QueryWrapper();
|
||||||
|
wrapper.select("sar_bussioness_stand.*, r.DTQBBHBUSS, r.BDTQBBHBUSS");
|
||||||
|
wrapper.last("LEFT JOIN sar_buss_stand_attr_info r ON r.STAND_ID = sar_bussioness_stand.ID WHERE sar_bussioness_stand.VALID_FLAG = '0' and sar_bussioness_stand.id in ('021b0c0c9e774ba9a76abbf923d59f5','jdmygltv37qvyb5s87ea')");
|
||||||
|
List<SarBussionessStand> bussionessStands = iSarBussionessStandService.list(wrapper);
|
||||||
|
|
||||||
|
if(!bussionessStands.isEmpty()){
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 1. 遍历全部数据
|
||||||
|
bussionessStands.forEach(info -> {
|
||||||
|
// 1.1 判断代替标准号
|
||||||
|
if(StringUtils.isNotBlank(info.getDTQBBHBUSS())){
|
||||||
|
// 1.1.1 找出当前代替标准版所有被代替标准
|
||||||
|
List<String> dtList = Arrays.stream(info.getDTQBBHBUSS().split(",")).map(String::trim).collect(Collectors.toList());
|
||||||
|
if(!dtList.isEmpty()){
|
||||||
|
for (String s : dtList) {
|
||||||
|
|
||||||
|
if(s.contains("null")){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
List<SarBussionessStand> bdtList = bussionessStands.stream().filter(info1 -> {
|
||||||
|
if(StringUtils.isNotBlank(info1.getDTQBBHBUSS()) && info1.getDTQBBHBUSS().contains(s)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
// 1.1.1.1合并被代替标准
|
||||||
|
if(!bdtList.isEmpty()){
|
||||||
|
// 1.1.1.1.1 获取需要更新的代替标准
|
||||||
|
List<SarBussionessStand> updInfo = bussionessStands.stream().filter(info1 -> {
|
||||||
|
if(StringUtils.isNotBlank(info1.getStandCode()) && s.trim().equals(info1.getStandCode().trim())){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
|
||||||
|
// 1.1.1.1.2 是否存在需要更新的代替标准
|
||||||
|
if(!updInfo.isEmpty()){
|
||||||
|
// 1.1.1.1.2.1 拼接 被代替标准号
|
||||||
|
String btd = bdtList.stream().map(info1 -> {
|
||||||
|
String addStrandNumber = "";
|
||||||
|
if (StringUtils.isNotEmpty(info1.getStandYear())) {
|
||||||
|
addStrandNumber = info1.getStandSort() + " " + info1.getStandNumber() + "-" + info1.getStandYear();
|
||||||
|
} else {
|
||||||
|
addStrandNumber = info1.getStandSort() + " " + info1.getStandNumber();
|
||||||
|
}
|
||||||
|
return addStrandNumber;
|
||||||
|
}).collect(Collectors.joining(","));
|
||||||
|
System.out.println(btd);
|
||||||
|
|
||||||
|
// 1.1.1.1.2.2 找出已存在的被代替标准 及 去重, 如没找出,则使用最新被代替
|
||||||
|
List<String> notExBtdList = Arrays.stream(btd.split(",")).map(String::trim).collect(Collectors.toList());
|
||||||
|
if(StringUtils.isNotBlank(updInfo.get(0).getBDTQBBHBUSS())){
|
||||||
|
List<String> exBdtList = Arrays.stream(updInfo.get(0).getBDTQBBHBUSS().split(",")).map(String::trim).collect(Collectors.toList());
|
||||||
|
if(!exBdtList.isEmpty()){
|
||||||
|
exBdtList = exBdtList.stream().filter(String -> {
|
||||||
|
if(StringUtils.isNotBlank(String) && !String.contains("null")){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
notExBtdList.addAll(exBdtList);
|
||||||
|
notExBtdList = notExBtdList.stream().distinct().collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String btdStr = notExBtdList.stream().map(String::toString).collect(Collectors.joining(","));
|
||||||
|
|
||||||
|
// 1.1.1.1.2.3 更新
|
||||||
|
UpdateWrapper updateWrapper = new UpdateWrapper();
|
||||||
|
updateWrapper.eq("STAND_ID",updInfo.get(0).getId());
|
||||||
|
updateWrapper.set("BDTQBBHBUSS",btdStr);
|
||||||
|
iSarBussStandAttrInfoService.update(updateWrapper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Transactional(rollbackFor = {RuntimeException.class,Exception.class})
|
@Transactional(rollbackFor = {RuntimeException.class,Exception.class})
|
||||||
public String dataSync(){
|
public String dataSync(){
|
||||||
|
|||||||
+2
@@ -20,6 +20,8 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public interface ISarBussionessStandService extends IService<SarBussionessStand> {
|
public interface ISarBussionessStandService extends IService<SarBussionessStand> {
|
||||||
|
|
||||||
|
void updateCiteStand(SarBussionessStand sarBussionessStandEO, SarBussionessStand beforeSarStandardsInfo, String upField, String beUpedField);
|
||||||
|
|
||||||
SarBussionessStand getStandInfoByReviseStatus(String reviseStatus,String standSort,String taskId);
|
SarBussionessStand getStandInfoByReviseStatus(String reviseStatus,String standSort,String taskId);
|
||||||
|
|
||||||
void attrInfoDetails (SarBussionessStand row) throws Exception;
|
void attrInfoDetails (SarBussionessStand row) throws Exception;
|
||||||
|
|||||||
+2
-1
@@ -757,7 +757,7 @@ public class SarBussionessStandServiceImpl extends ServiceImpl<SarBussionessStan
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 新增修改标准过程中,根据代替标准号,修改被代替标准号对应的标准
|
// 新增修改标准过程中,根据代替标准号,修改被代替标准号对应的标准
|
||||||
public void updateCiteStand(SarBussionessStand sarBussionessStandEO, SarBussionessStand beforeSarStandardsInfo, String upField, String beUpedField) throws Exception {
|
public void updateCiteStand(SarBussionessStand sarBussionessStandEO, SarBussionessStand beforeSarStandardsInfo, String upField, String beUpedField){
|
||||||
// 记录要被代替标准号的数据
|
// 记录要被代替标准号的数据
|
||||||
// SarStandardsInfoEO chageEO= new SarStandardsInfoEO();
|
// SarStandardsInfoEO chageEO= new SarStandardsInfoEO();
|
||||||
SarBussionessStand sarStandardsSelectEO = new SarBussionessStand();
|
SarBussionessStand sarStandardsSelectEO = new SarBussionessStand();
|
||||||
@@ -1734,6 +1734,7 @@ public class SarBussionessStandServiceImpl extends ServiceImpl<SarBussionessStan
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SarBussionessStand> queryByList(SarBussionessStandEOPage sarBussionessStandEOPage){
|
public List<SarBussionessStand> queryByList(SarBussionessStandEOPage sarBussionessStandEOPage){
|
||||||
|
sarBussionessStandEOPage.setValidFlag("0");
|
||||||
return this.baseMapper.queryByList(sarBussionessStandEOPage);
|
return this.baseMapper.queryByList(sarBussionessStandEOPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
@@ -19,6 +19,8 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public interface ISarStandardsInfoService extends IService<SarStandardsInfo> {
|
public interface ISarStandardsInfoService extends IService<SarStandardsInfo> {
|
||||||
|
|
||||||
|
void updateCiteStand(SarStandardsInfo sarStandardsInfoEO, SarStandardsInfo beforeSarStandardsInfo, String upField, String beUpedField);
|
||||||
|
|
||||||
// void reverseQueryStand(List<String> ids, String standName,String type);
|
// void reverseQueryStand(List<String> ids, String standName,String type);
|
||||||
|
|
||||||
List<SarStandardsInfo> getSarStandardsInfoPage(SarStandardsInfoEOPage page) throws Exception;
|
List<SarStandardsInfo> getSarStandardsInfoPage(SarStandardsInfoEOPage page) throws Exception;
|
||||||
|
|||||||
+1
-1
@@ -1538,7 +1538,7 @@ public class SarStandardsInfoServiceImpl extends ServiceImpl<SarStandardsInfoDao
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 新增修改标准过程中,根据代替标准号,修改被代替标准号对应的标准
|
// 新增修改标准过程中,根据代替标准号,修改被代替标准号对应的标准
|
||||||
public void updateCiteStand(SarStandardsInfo sarStandardsInfoEO, SarStandardsInfo beforeSarStandardsInfo, String upField, String beUpedField) throws Exception {
|
public void updateCiteStand(SarStandardsInfo sarStandardsInfoEO, SarStandardsInfo beforeSarStandardsInfo, String upField, String beUpedField){
|
||||||
// 记录要被代替标准号的数据
|
// 记录要被代替标准号的数据
|
||||||
// SarStandardsInfoEO chageEO= new SarStandardsInfoEO();
|
// SarStandardsInfoEO chageEO= new SarStandardsInfoEO();
|
||||||
SarStandardsInfo sarStandardsSelectEO = new SarStandardsInfo();
|
SarStandardsInfo sarStandardsSelectEO = new SarStandardsInfo();
|
||||||
|
|||||||
+1
-1
@@ -141,7 +141,7 @@
|
|||||||
and stand_name ${standNameOperator} #{standName}
|
and stand_name ${standNameOperator} #{standName}
|
||||||
</if>
|
</if>
|
||||||
<if test="standCode != null" >
|
<if test="standCode != null" >
|
||||||
and stand_code ${standCodeOperator} #{standCode}
|
and trim(replace(stand_code,' ','')) ${standCodeOperator} trim(replace(#{standCode},' ',''))
|
||||||
</if>
|
</if>
|
||||||
<if test="id != null" >
|
<if test="id != null" >
|
||||||
and id ${idOperator} #{id}
|
and id ${idOperator} #{id}
|
||||||
|
|||||||
Reference in New Issue
Block a user