beta功能查询条件数据接口参数内容修改,返回当前用户当天关注台站及探测器信息,勾选allUser返回全部台站,探测器信息
gamma功能加载主页面数据接口增加字段analyst获取对应分析员的分析结果 web模块增加downloadFile方法用于下载sample及sample相关分析谱文件 mapper类缺少注解问题修改
This commit is contained in:
parent
4f29d3235c
commit
bbfd2c477b
|
@ -437,6 +437,8 @@ public class FTPUtil {
|
||||||
public File downloadFile(String fromPath, String toPath) {
|
public File downloadFile(String fromPath, String toPath) {
|
||||||
FTPClient ftpClient = null;
|
FTPClient ftpClient = null;
|
||||||
InputStream inputStream = null;
|
InputStream inputStream = null;
|
||||||
|
// 声明一个临时文件
|
||||||
|
File tempFile = null;
|
||||||
try {
|
try {
|
||||||
ftpClient = LoginFTP();
|
ftpClient = LoginFTP();
|
||||||
// 切换被动模式
|
// 切换被动模式
|
||||||
|
@ -446,10 +448,11 @@ public class FTPUtil {
|
||||||
ftpClient.setControlEncoding("UTF-8");
|
ftpClient.setControlEncoding("UTF-8");
|
||||||
ftpClient.setFileTransferMode(FTPClient.STREAM_TRANSFER_MODE);
|
ftpClient.setFileTransferMode(FTPClient.STREAM_TRANSFER_MODE);
|
||||||
inputStream = ftpClient.retrieveFileStream(fromPath);
|
inputStream = ftpClient.retrieveFileStream(fromPath);
|
||||||
// 声明一个临时文件
|
if (Objects.nonNull(inputStream)) {
|
||||||
File tempFile = File.createTempFile(toPath, null);
|
tempFile = File.createTempFile(toPath, null);
|
||||||
// 将FTP文件的输入流复制给临时文件
|
// 将FTP文件的输入流复制给临时文件
|
||||||
FileUtils.copyInputStreamToFile(inputStream, tempFile);
|
FileUtils.copyInputStreamToFile(inputStream, tempFile);
|
||||||
|
}
|
||||||
return tempFile;
|
return tempFile;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
|
@ -32,8 +32,8 @@ public class GammaController {
|
||||||
|
|
||||||
@GetMapping("initValue")
|
@GetMapping("initValue")
|
||||||
@ApiOperation(value = "初始化gamma数据", notes = "初始化gamma数据")
|
@ApiOperation(value = "初始化gamma数据", notes = "初始化gamma数据")
|
||||||
public Result initValue(Integer sampleId, String dbName, String fileName, HttpServletRequest request) {
|
public Result initValue(Integer sampleId, String dbName, String analyst, String fileName, HttpServletRequest request) {
|
||||||
return gammaService.initValue(sampleId, dbName, fileName, request);
|
return gammaService.initValue(sampleId, dbName, analyst, fileName, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,8 +43,8 @@ public class GammaController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("gammaByDB")
|
@GetMapping("gammaByDB")
|
||||||
public Result gammaByDB(Integer sampleId, String dbName, HttpServletRequest request){
|
public Result gammaByDB(Integer sampleId, String dbName, String analyst, HttpServletRequest request){
|
||||||
return gammaService.gammaByDB(dbName, sampleId, request);
|
return gammaService.gammaByDB(dbName, sampleId, analyst, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("gammaByFile")
|
@GetMapping("gammaByFile")
|
||||||
|
|
|
@ -26,8 +26,8 @@ public class SpectrumAnalysesController {
|
||||||
|
|
||||||
@GetMapping("getDBSearchList")
|
@GetMapping("getDBSearchList")
|
||||||
@ApiOperation(value = "查询查询条件数据接口", notes = "查询查询条件数据接口")
|
@ApiOperation(value = "查询查询条件数据接口", notes = "查询查询条件数据接口")
|
||||||
public Result getDBSearchList(HttpServletRequest request, boolean AllUsers, String dbName, String[] menuTypes) {
|
public Result getDBSearchList(HttpServletRequest request, boolean AllUsers) {
|
||||||
return spectrumAnalysisService.getDBSearchList(request, AllUsers, dbName, menuTypes);
|
return spectrumAnalysisService.getDBSearchList(request, AllUsers);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("getDBSpectrumList")
|
@GetMapping("getDBSpectrumList")
|
||||||
|
|
|
@ -31,6 +31,9 @@ public class GardsSampleDataSpectrum extends GardsSampleData {
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private String dbName;
|
private String dbName;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
private String analyst;
|
||||||
|
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
@Excel(name = "NO" ,orderNum = "1")
|
@Excel(name = "NO" ,orderNum = "1")
|
||||||
private Integer no;
|
private Integer no;
|
||||||
|
|
|
@ -12,11 +12,11 @@ import java.util.List;
|
||||||
|
|
||||||
public interface IGammaService{
|
public interface IGammaService{
|
||||||
|
|
||||||
Result initValue(Integer sampleId, String dbName, String fileName, HttpServletRequest request);
|
Result initValue(Integer sampleId, String dbName, String analyst, String fileName, HttpServletRequest request);
|
||||||
|
|
||||||
Result testFun(String fileName, HttpServletRequest request);
|
Result testFun(String fileName, HttpServletRequest request);
|
||||||
|
|
||||||
Result gammaByDB(String dbName, Integer sampleId, HttpServletRequest request);
|
Result gammaByDB(String dbName, Integer sampleId, String analyst, HttpServletRequest request);
|
||||||
|
|
||||||
Result gammaByFile(String fileName, HttpServletRequest request);
|
Result gammaByFile(String fileName, HttpServletRequest request);
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ import java.util.List;
|
||||||
|
|
||||||
public interface ISpectrumAnalysisService {
|
public interface ISpectrumAnalysisService {
|
||||||
|
|
||||||
Result getDBSearchList(HttpServletRequest request, boolean AllUsers, String dbName, String[] menuTypes);
|
Result getDBSearchList(HttpServletRequest request, boolean AllUsers);
|
||||||
|
|
||||||
Result getDBSpectrumList(QueryRequest queryRequest, GardsSampleDataSpectrum gardsSampleData, String dbName, String[] menuTypes, boolean AllUsers, boolean CollectStopB, boolean AcqStartB, Date startDate, Date endDate, HttpServletRequest request);
|
Result getDBSpectrumList(QueryRequest queryRequest, GardsSampleDataSpectrum gardsSampleData, String dbName, String[] menuTypes, boolean AllUsers, boolean CollectStopB, boolean AcqStartB, Date startDate, Date endDate, HttpServletRequest request);
|
||||||
|
|
||||||
|
|
|
@ -140,7 +140,7 @@ public class GammaServiceImpl extends AbstractLogOrReport implements IGammaServi
|
||||||
private IGardsAnalySettingSpectrumService analySettingSpectrumService;
|
private IGardsAnalySettingSpectrumService analySettingSpectrumService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Result initValue(Integer sampleId, String dbName, String samfileName, HttpServletRequest request) {
|
public Result initValue(Integer sampleId, String dbName, String analyst, String samfileName, HttpServletRequest request) {
|
||||||
Result result = new Result();
|
Result result = new Result();
|
||||||
//获取用户名
|
//获取用户名
|
||||||
String userName = JwtUtil.getUserNameByToken(request);
|
String userName = JwtUtil.getUserNameByToken(request);
|
||||||
|
@ -168,7 +168,7 @@ public class GammaServiceImpl extends AbstractLogOrReport implements IGammaServi
|
||||||
if (dbName.equals("auto")) {
|
if (dbName.equals("auto")) {
|
||||||
gammaFileUtil.SetBaseInfo(phd, "RNAUTO");
|
gammaFileUtil.SetBaseInfo(phd, "RNAUTO");
|
||||||
} else if (dbName.equals("man")) {
|
} else if (dbName.equals("man")) {
|
||||||
gammaFileUtil.SetBaseInfo(phd, userName);
|
gammaFileUtil.SetBaseInfo(phd, analyst);
|
||||||
}
|
}
|
||||||
// 从数据库中读取phd其他相关信息
|
// 从数据库中读取phd其他相关信息
|
||||||
boolean bRet = getResultFromDB(dbName, userName, sampleId, phd, result);
|
boolean bRet = getResultFromDB(dbName, userName, sampleId, phd, result);
|
||||||
|
@ -433,7 +433,7 @@ public class GammaServiceImpl extends AbstractLogOrReport implements IGammaServi
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Result gammaByDB(String dbName, Integer sampleId, HttpServletRequest request) {
|
public Result gammaByDB(String dbName, Integer sampleId, String analyst, HttpServletRequest request) {
|
||||||
Result result = new Result();
|
Result result = new Result();
|
||||||
// 通过token获取用户名
|
// 通过token获取用户名
|
||||||
String userName = JwtUtil.getUserNameByToken(request);
|
String userName = JwtUtil.getUserNameByToken(request);
|
||||||
|
@ -466,7 +466,7 @@ public class GammaServiceImpl extends AbstractLogOrReport implements IGammaServi
|
||||||
if (dbName.equals("auto")) {
|
if (dbName.equals("auto")) {
|
||||||
gammaFileUtil.SetBaseInfo(phd, "RNAUTO");
|
gammaFileUtil.SetBaseInfo(phd, "RNAUTO");
|
||||||
} else if (dbName.equals("man")) {
|
} else if (dbName.equals("man")) {
|
||||||
gammaFileUtil.SetBaseInfo(phd, userName);
|
gammaFileUtil.SetBaseInfo(phd, analyst);
|
||||||
}
|
}
|
||||||
// 从数据库中读取phd其他相关信息
|
// 从数据库中读取phd其他相关信息
|
||||||
boolean bRet = getResultFromDB(dbName, userName, sampleId, phd, result);
|
boolean bRet = getResultFromDB(dbName, userName, sampleId, phd, result);
|
||||||
|
@ -1459,13 +1459,13 @@ public class GammaServiceImpl extends AbstractLogOrReport implements IGammaServi
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!tablePeaksList.get(j).isNetAreaB()) {
|
if (!tablePeaksList.get(j).isNetAreaB()) {
|
||||||
Af.add(Integer.valueOf(tablePeaksList.get(j).getLab()));
|
Af.add(Integer.valueOf(tablePeaksList.get(j).getLab())-1);
|
||||||
}
|
}
|
||||||
if (!tablePeaksList.get(j).isCentroid()) {
|
if (!tablePeaksList.get(j).isCentroid()) {
|
||||||
Cf.add(Integer.valueOf(tablePeaksList.get(j).getLab()));
|
Cf.add(Integer.valueOf(tablePeaksList.get(j).getLab())-1);
|
||||||
}
|
}
|
||||||
if (!tablePeaksList.get(j).isFwhmB()) {
|
if (!tablePeaksList.get(j).isFwhmB()) {
|
||||||
Ff.add(Integer.valueOf(tablePeaksList.get(j).getLab()));
|
Ff.add(Integer.valueOf(tablePeaksList.get(j).getLab())-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ObjectMapper mapper = new ObjectMapper();
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
|
|
@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.google.common.cache.Cache;
|
import com.google.common.cache.Cache;
|
||||||
|
import io.swagger.models.auth.In;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
|
@ -108,26 +109,20 @@ public class SpectrumAnalysisServiceImpl extends AbstractLogOrReport implements
|
||||||
@Autowired
|
@Autowired
|
||||||
private IGardsHistogramSpectrumService histogramService;
|
private IGardsHistogramSpectrumService histogramService;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private JdbcTemplate jdbcTemplate;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Result getDBSearchList(HttpServletRequest request, boolean AllUsers, String dbName, String[] menuTypes) {
|
public Result getDBSearchList(HttpServletRequest request, boolean AllUsers) {
|
||||||
Result result = new Result();
|
Result result = new Result();
|
||||||
Map<String, List<String>> map = new HashMap<>();
|
Map<String, List<String>> map = new HashMap<>();
|
||||||
List<String> menuTypeList = Arrays.asList(menuTypes);
|
//获取台站编码
|
||||||
//查询谱对应的台站类型
|
List<String> stationCodes = new LinkedList<>();
|
||||||
if (CollectionUtils.isEmpty(menuTypeList)){
|
List<String> detectorCodes = new LinkedList<>();
|
||||||
result.error500("The spectrum type cannot be empty");
|
//根据台站id查询台站名称
|
||||||
return result;
|
Map<String, String> stationMap = (Map<String, String>)redisUtil.get("stationMap");
|
||||||
}
|
//从redis中获取探测器信息
|
||||||
List<String> stationTypes = sysDictService.findStationType(menuTypeList);
|
Map<Integer, String> detectorInfoMap = (Map<Integer, String>)redisUtil.get("detectorsMap");
|
||||||
if (CollectionUtils.isEmpty(stationTypes)) {
|
//获取台站信息
|
||||||
result.error500("Please add the station type corresponding to the current system type in the data dictionary");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
List<String> userStations = new LinkedList<>();
|
List<String> userStations = new LinkedList<>();
|
||||||
//如果没有勾选AllUsers
|
//如果没有勾选AllUsers
|
||||||
if (Objects.nonNull(AllUsers) && !AllUsers){
|
if (Objects.nonNull(AllUsers) && !AllUsers){
|
||||||
|
@ -137,23 +132,43 @@ public class SpectrumAnalysisServiceImpl extends AbstractLogOrReport implements
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
userStations = userTaskUtil.findUserStation(userName);
|
userStations = userTaskUtil.findUserStation(userName);
|
||||||
|
//判断当前用户在当天是否有排班任务的台站信息
|
||||||
|
if (CollectionUtils.isNotEmpty(userStations)) {
|
||||||
|
if (CollectionUtils.isNotEmpty(stationMap)){
|
||||||
|
for (Map.Entry<String, String> entry:stationMap.entrySet()) {
|
||||||
|
if (userStations.contains(entry.getKey())) {
|
||||||
|
stationCodes.add(entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (CollectionUtils.isNotEmpty(detectorInfoMap)) {
|
||||||
|
for (Map.Entry<Integer, String> entry:detectorInfoMap.entrySet()) {
|
||||||
|
if (String.valueOf(entry.getKey()).length() <= 3) {
|
||||||
|
if (userStations.contains(String.valueOf(entry.getKey()))) {
|
||||||
|
detectorCodes.add(entry.getValue());
|
||||||
}
|
}
|
||||||
if (dbName.equalsIgnoreCase("auto")){
|
|
||||||
dbName = "RNAUTO.GARDS_ANALYSES";
|
|
||||||
}else if (dbName.equalsIgnoreCase("man")){
|
|
||||||
dbName = "RNMAN.GARDS_ANALYSES";
|
|
||||||
} else {
|
} else {
|
||||||
result.error500("The database type does not exist");
|
if (userStations.contains(String.valueOf(entry.getKey()).substring(0, 3))) {
|
||||||
return result;
|
detectorCodes.add(entry.getValue());
|
||||||
}
|
}
|
||||||
List<GardsSampleDataSpectrum> sampleData = spectrumAnalysisMapper.getDBSearchList(dbName, stationTypes, userStations, AllUsers);
|
|
||||||
//获取台站编码
|
|
||||||
List<String> stationCodes = new LinkedList<>();
|
|
||||||
List<String> detectorCodes = new LinkedList<>();
|
|
||||||
if (CollectionUtils.isNotEmpty(sampleData)){
|
|
||||||
stationCodes = sampleData.stream().map(GardsSampleDataSpectrum::getStationName).distinct().collect(Collectors.toList());
|
|
||||||
detectorCodes = sampleData.stream().map(GardsSampleDataSpectrum::getDetectorsName).distinct().collect(Collectors.toList());
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (CollectionUtils.isNotEmpty(stationMap)) {
|
||||||
|
for (Map.Entry<String, String> entry: stationMap.entrySet()) {
|
||||||
|
stationCodes.add(entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (CollectionUtils.isNotEmpty(detectorInfoMap)) {
|
||||||
|
for (Map.Entry<Integer, String> entry: detectorInfoMap.entrySet()) {
|
||||||
|
detectorCodes.add(entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stationCodes = stationCodes.stream().sorted().collect(Collectors.toList());
|
||||||
|
detectorCodes = detectorCodes.stream().sorted().collect(Collectors.toList());
|
||||||
map.put("stationCode", stationCodes);
|
map.put("stationCode", stationCodes);
|
||||||
map.put("detectorCode", detectorCodes);
|
map.put("detectorCode", detectorCodes);
|
||||||
result.setSuccess(true);
|
result.setSuccess(true);
|
||||||
|
|
|
@ -105,6 +105,12 @@ public class WebStatisticsController {
|
||||||
return readLineUtil.readFtpFile(filePath,response);
|
return readLineUtil.readFtpFile(filePath,response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("downloadFile")
|
||||||
|
@ApiOperation("查看Radionuclide的文件")
|
||||||
|
public void downloadFile(@RequestParam Integer sampleId, HttpServletResponse response){
|
||||||
|
gardsSampleDataWebService.downloadFile(sampleId, response);
|
||||||
|
}
|
||||||
|
|
||||||
@GetMapping("sohFile")
|
@GetMapping("sohFile")
|
||||||
@ApiOperation(value = "查看RMSSHO的文件",notes = "查看RMSSHO的文件")
|
@ApiOperation(value = "查看RMSSHO的文件",notes = "查看RMSSHO的文件")
|
||||||
public Result sohFile(@RequestParam Integer sohId,
|
public Result sohFile(@RequestParam Integer sohId,
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package org.jeecg.modules.mapper;
|
package org.jeecg.modules.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.jeecg.modules.base.entity.original.GardsBgEfficiencyPairs;
|
import org.jeecg.modules.base.entity.original.GardsBgEfficiencyPairs;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
public interface GardsBgEfficiencyPairsMapper extends BaseMapper<GardsBgEfficiencyPairs> {
|
public interface GardsBgEfficiencyPairsMapper extends BaseMapper<GardsBgEfficiencyPairs> {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package org.jeecg.modules.mapper;
|
package org.jeecg.modules.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.jeecg.modules.base.entity.original.GardsCalibrationPairsOrig;
|
import org.jeecg.modules.base.entity.original.GardsCalibrationPairsOrig;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
public interface GardsCalibrationPairsOrigMapper extends BaseMapper<GardsCalibrationPairsOrig> {
|
public interface GardsCalibrationPairsOrigMapper extends BaseMapper<GardsCalibrationPairsOrig> {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package org.jeecg.modules.mapper;
|
package org.jeecg.modules.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.jeecg.modules.base.entity.original.GardsHistogram;
|
import org.jeecg.modules.base.entity.original.GardsHistogram;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
public interface GardsHistogramMapper extends BaseMapper<GardsHistogram> {
|
public interface GardsHistogramMapper extends BaseMapper<GardsHistogram> {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package org.jeecg.modules.mapper;
|
package org.jeecg.modules.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.jeecg.modules.base.entity.original.GardsRoiLimits;
|
import org.jeecg.modules.base.entity.original.GardsRoiLimits;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
public interface GardsRoiLimitsMapper extends BaseMapper<GardsRoiLimits> {
|
public interface GardsRoiLimitsMapper extends BaseMapper<GardsRoiLimits> {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package org.jeecg.modules.mapper;
|
package org.jeecg.modules.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.jeecg.modules.base.entity.original.GardsSampleCertLine;
|
import org.jeecg.modules.base.entity.original.GardsSampleCertLine;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
public interface GardsSampleCertLineMapper extends BaseMapper<GardsSampleCertLine> {
|
public interface GardsSampleCertLineMapper extends BaseMapper<GardsSampleCertLine> {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package org.jeecg.modules.mapper;
|
package org.jeecg.modules.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.jeecg.modules.base.entity.original.GardsSampleCert;
|
import org.jeecg.modules.base.entity.original.GardsSampleCert;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
public interface GardsSampleCertMapper extends BaseMapper<GardsSampleCert> {
|
public interface GardsSampleCertMapper extends BaseMapper<GardsSampleCert> {
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,10 @@ package org.jeecg.modules.mapper;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.jeecg.modules.base.entity.original.GardsSampleData;
|
import org.jeecg.modules.base.entity.original.GardsSampleData;
|
||||||
import org.jeecg.modules.entity.GardsSampleDataWeb;
|
import org.jeecg.modules.entity.GardsSampleDataWeb;
|
||||||
|
import org.jeecg.modules.entity.vo.SpectrumFileRecord;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -17,4 +19,12 @@ public interface GardsSampleDataWebMapper extends BaseMapper<GardsSampleDataWeb>
|
||||||
|
|
||||||
Page<GardsSampleDataWeb> findParticulatePage(String dataType, String spectralQualifie, String startDate, String endDate, List<Integer> stationIdList, Page<GardsSampleDataWeb> page);
|
Page<GardsSampleDataWeb> findParticulatePage(String dataType, String spectralQualifie, String startDate, String endDate, List<Integer> stationIdList, Page<GardsSampleDataWeb> page);
|
||||||
|
|
||||||
|
Integer getAnalysisID(@Param(value = "sampleId") Integer sampleId);
|
||||||
|
|
||||||
|
SpectrumFileRecord getDBSpectrumFilePath(Integer sampleId, Integer analysisID);
|
||||||
|
|
||||||
|
String getQCFilePath(String siteDetCode, String collectStartStr);
|
||||||
|
|
||||||
|
Integer getSampleId(@Param(value = "filePathName") String filePathName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package org.jeecg.modules.mapper;
|
package org.jeecg.modules.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.jeecg.modules.base.entity.original.GardsSampleDescription;
|
import org.jeecg.modules.base.entity.original.GardsSampleDescription;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
public interface GardsSampleDescriptionMapper extends BaseMapper<GardsSampleDescription> {
|
public interface GardsSampleDescriptionMapper extends BaseMapper<GardsSampleDescription> {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package org.jeecg.modules.mapper;
|
package org.jeecg.modules.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.jeecg.modules.base.entity.original.GardsSampleRatios;
|
import org.jeecg.modules.base.entity.original.GardsSampleRatios;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
public interface GardsSampleRatiosMapper extends BaseMapper<GardsSampleRatios> {
|
public interface GardsSampleRatiosMapper extends BaseMapper<GardsSampleRatios> {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package org.jeecg.modules.mapper;
|
package org.jeecg.modules.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.jeecg.modules.base.entity.original.GardsSpectrum;
|
import org.jeecg.modules.base.entity.original.GardsSpectrum;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
public interface GardsSpectrumMapper extends BaseMapper<GardsSpectrum> {
|
public interface GardsSpectrumMapper extends BaseMapper<GardsSpectrum> {
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,4 +126,44 @@
|
||||||
ORDER BY ACQUISITION_START DESC
|
ORDER BY ACQUISITION_START DESC
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="getAnalysisID" resultType="java.lang.Integer">
|
||||||
|
SELECT ANALYSIS_DB.IDANALYSIS FROM RNAUTO.GARDS_ANALYSES ANALYSIS_DB WHERE ANALYSIS_DB.SAMPLE_ID = #{sampleId} and ANALYST = 'RNAUTO'
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="getDBSpectrumFilePath" resultType="org.jeecg.modules.entity.vo.SpectrumFileRecord">
|
||||||
|
SELECT
|
||||||
|
org_sample.SAMPLE_ID sampleId,
|
||||||
|
org_sample.INPUT_FILE_NAME sampleFilePath,
|
||||||
|
analyses.USEDGASPHD gasBgFilePath,
|
||||||
|
analyses.USEDDETPHD detBgFilePath,
|
||||||
|
analyses.LOG_PATH logFilePath,
|
||||||
|
analyses.REPORT_PAHT reportFilePath,
|
||||||
|
TRIM(org_sample.SITE_DET_CODE) siteDetCode,
|
||||||
|
org_sample.COLLECT_START collectStart
|
||||||
|
FROM ORIGINAL.GARDS_SAMPLE_DATA org_sample,
|
||||||
|
RNAUTO.GARDS_ANALYSES analyses
|
||||||
|
<where>
|
||||||
|
analyses.SAMPLE_ID = #{sampleId}
|
||||||
|
AND analyses.IDANALYSIS = #{analysisID}
|
||||||
|
AND org_sample.SAMPLE_ID=analyses.SAMPLE_ID
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="getQCFilePath" resultType="java.lang.String">
|
||||||
|
SELECT org_sample_data.INPUT_FILE_NAME
|
||||||
|
FROM ORIGINAL.GARDS_SAMPLE_DATA org_sample_data
|
||||||
|
<where>
|
||||||
|
org_sample_data.ACQUISITION_START=
|
||||||
|
(SELECT MAX(qc_samples.ACQUISITION_START) FROM ORIGINAL.GARDS_SAMPLE_DATA qc_samples WHERE qc_samples.SITE_DET_CODE= '${siteDetCode}'
|
||||||
|
AND qc_samples.DATA_TYPE='Q'
|
||||||
|
AND qc_samples.SPECTRAL_QUALIFIE='FULL'
|
||||||
|
AND qc_samples.ACQUISITION_START <= TO_DATE('${collectStartStr}', 'YYYY-MM-DD hh24:mi:ss'))
|
||||||
|
AND org_sample_data.SITE_DET_CODE= '${siteDetCode}'
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="getSampleId" resultType="java.lang.Integer">
|
||||||
|
SELECT SAMPLE_ID FROM ORIGINAL.GARDS_SAMPLE_DATA WHERE INPUT_FILE_NAME = #{filePathName}
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
|
@ -1,6 +1,7 @@
|
||||||
package org.jeecg.modules.service;
|
package org.jeecg.modules.service;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import io.swagger.models.auth.In;
|
||||||
import org.jeecg.common.api.QueryRequest;
|
import org.jeecg.common.api.QueryRequest;
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
import org.jeecg.modules.entity.GardsSampleDataWeb;
|
import org.jeecg.modules.entity.GardsSampleDataWeb;
|
||||||
|
@ -33,6 +34,7 @@ public interface IGardsSampleDataWebService extends IService<GardsSampleDataWeb>
|
||||||
|
|
||||||
Result sampleInfo(Integer sampleId);
|
Result sampleInfo(Integer sampleId);
|
||||||
|
|
||||||
|
void downloadFile(Integer sampleId, HttpServletResponse response);
|
||||||
|
|
||||||
GardsSampleDataWeb getOneSample(Integer sampleId);
|
GardsSampleDataWeb getOneSample(Integer sampleId);
|
||||||
|
|
||||||
|
|
|
@ -5,23 +5,26 @@ import cn.hutool.core.date.DateUtil;
|
||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.hutool.core.util.ZipUtil;
|
||||||
import com.baomidou.dynamic.datasource.annotation.DS;
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.StringPool;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
import org.jeecg.common.api.QueryRequest;
|
import org.jeecg.common.api.QueryRequest;
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
|
import org.jeecg.common.properties.ParameterProperties;
|
||||||
|
import org.jeecg.common.properties.SpectrumPathProperties;
|
||||||
|
import org.jeecg.common.util.*;
|
||||||
import org.jeecg.modules.base.enums.SampleFileHeader;
|
import org.jeecg.modules.base.enums.SampleFileHeader;
|
||||||
import org.jeecg.common.util.DateUtils;
|
|
||||||
import org.jeecg.common.util.ExportUtil;
|
|
||||||
import org.jeecg.common.util.ReadLineUtil;
|
|
||||||
import org.jeecg.common.util.RedisUtil;
|
|
||||||
import org.jeecg.modules.base.entity.original.*;
|
import org.jeecg.modules.base.entity.original.*;
|
||||||
import org.jeecg.modules.entity.GardsSampleDataWeb;
|
import org.jeecg.modules.entity.GardsSampleDataWeb;
|
||||||
import org.jeecg.modules.entity.data.*;
|
import org.jeecg.modules.entity.data.*;
|
||||||
|
import org.jeecg.modules.entity.vo.SpectrumFileRecord;
|
||||||
import org.jeecg.modules.mapper.*;
|
import org.jeecg.modules.mapper.*;
|
||||||
import org.jeecg.modules.service.IGardsSampleDataWebService;
|
import org.jeecg.modules.service.IGardsSampleDataWebService;
|
||||||
import org.jeecgframework.poi.excel.ExcelExportUtil;
|
import org.jeecgframework.poi.excel.ExcelExportUtil;
|
||||||
|
@ -30,8 +33,8 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.*;
|
||||||
import java.io.OutputStream;
|
import java.net.URLEncoder;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -66,6 +69,12 @@ public class GardsSampleDataWebServiceImpl extends ServiceImpl<GardsSampleDataWe
|
||||||
private GardsSampleCertLineMapper gardsSampleCertLineMapper;
|
private GardsSampleCertLineMapper gardsSampleCertLineMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private ReadLineUtil readLineUtil;
|
private ReadLineUtil readLineUtil;
|
||||||
|
@Autowired
|
||||||
|
private FTPUtil ftpUtil;
|
||||||
|
@Autowired
|
||||||
|
private SpectrumPathProperties spectrumPathProperties;
|
||||||
|
@Autowired
|
||||||
|
private ParameterProperties parameterProperties;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Result findParticulatePage(QueryRequest queryRequest, Integer[] stationIds, String dataType, String spectralQualifie, Date startTime,Date endTime) {
|
public Result findParticulatePage(QueryRequest queryRequest, Integer[] stationIds, String dataType, String spectralQualifie, Date startTime,Date endTime) {
|
||||||
|
@ -167,6 +176,136 @@ public class GardsSampleDataWebServiceImpl extends ServiceImpl<GardsSampleDataWe
|
||||||
return Result.OK(report);
|
return Result.OK(report);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void downloadFile(Integer sampleId, HttpServletResponse response) {
|
||||||
|
//创建一个zip文件 将需要压缩进去的文件都压缩到zip中
|
||||||
|
File zipFile = null;
|
||||||
|
FileInputStream inputStream = null;
|
||||||
|
OutputStream outputStream = null;
|
||||||
|
//sample,gas,det,qc的临时文件
|
||||||
|
File sampleFile = null;
|
||||||
|
InputStream sampleStream = null;
|
||||||
|
File gasFile = null;
|
||||||
|
InputStream gasStream = null;
|
||||||
|
File detFile = null;
|
||||||
|
InputStream detStream = null;
|
||||||
|
File qcFile = null;
|
||||||
|
InputStream qcStream = null;
|
||||||
|
try {
|
||||||
|
//根据sampleId查询自动处理库获取相应分析id
|
||||||
|
Integer analysisID = this.baseMapper.getAnalysisID(sampleId);
|
||||||
|
if (Objects.nonNull(analysisID)) {
|
||||||
|
//根据sampleId和分析id查询数据库文件信息
|
||||||
|
SpectrumFileRecord dbSpectrumFilePath = this.baseMapper.getDBSpectrumFilePath(sampleId, analysisID);
|
||||||
|
if (Objects.nonNull(dbSpectrumFilePath)) {
|
||||||
|
//判断临时存放压缩包位置是否存在
|
||||||
|
File dir = new File(parameterProperties.getLogFilePath());
|
||||||
|
if (!dir.exists()) {
|
||||||
|
dir.mkdirs();
|
||||||
|
}
|
||||||
|
//获取sample文件路径 截取sample文件名称 将PHD改为zip
|
||||||
|
String zipFileName = dbSpectrumFilePath.getSampleFilePath().substring(dbSpectrumFilePath.getSampleFilePath().lastIndexOf(StringPool.SLASH) + 1).replace("PHD", "zip");
|
||||||
|
//获取分析表中的采集开始时间
|
||||||
|
String collectStartStr = DateUtils.formatDate(dbSpectrumFilePath.getCollectStart(), "yyyy/MM/dd HH:mm:ss");
|
||||||
|
//根据探测器信息以及采集开始时间查询对应的qc文件路径
|
||||||
|
String dbQcFilePath = this.baseMapper.getQCFilePath(dbSpectrumFilePath.getSiteDetCode(), collectStartStr);
|
||||||
|
//根据各路径返回sample,gas,det,qc对应的文件sampleId
|
||||||
|
if (StringUtils.isNotBlank(dbSpectrumFilePath.getSampleFilePath())) {
|
||||||
|
sampleStream = ftpUtil.downloadFileStream(ftpUtil.getFtpRootPath() + spectrumPathProperties.getSaveFilePath()+ StringPool.SLASH + dbSpectrumFilePath.getSampleFilePath());
|
||||||
|
if (Objects.nonNull(sampleStream)) {
|
||||||
|
sampleFile = new File(parameterProperties.getLogFilePath() + StringPool.SLASH + dbSpectrumFilePath.getSampleFilePath().substring(dbSpectrumFilePath.getSampleFilePath().lastIndexOf(StringPool.SLASH) + 1));
|
||||||
|
FileUtils.copyInputStreamToFile(sampleStream, sampleFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.isNotBlank(dbSpectrumFilePath.getGasBgFilePath())) {
|
||||||
|
gasStream = ftpUtil.downloadFileStream(ftpUtil.getFtpRootPath() + spectrumPathProperties.getSaveFilePath()+ StringPool.SLASH + dbSpectrumFilePath.getGasBgFilePath());
|
||||||
|
if (Objects.nonNull(gasStream)) {
|
||||||
|
gasFile = new File(parameterProperties.getLogFilePath() + StringPool.SLASH + dbSpectrumFilePath.getGasBgFilePath().substring(dbSpectrumFilePath.getGasBgFilePath().lastIndexOf(StringPool.SLASH) + 1));
|
||||||
|
FileUtils.copyInputStreamToFile(gasStream, gasFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.isNotBlank(dbSpectrumFilePath.getDetBgFilePath())) {
|
||||||
|
detStream = ftpUtil.downloadFileStream(ftpUtil.getFtpRootPath() + spectrumPathProperties.getSaveFilePath()+ StringPool.SLASH + dbSpectrumFilePath.getDetBgFilePath());
|
||||||
|
if (Objects.nonNull(detStream)) {
|
||||||
|
detFile = new File(parameterProperties.getLogFilePath() + StringPool.SLASH + dbSpectrumFilePath.getDetBgFilePath().substring(dbSpectrumFilePath.getDetBgFilePath().lastIndexOf(StringPool.SLASH) + 1));
|
||||||
|
FileUtils.copyInputStreamToFile(detStream, detFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.isNotBlank(dbQcFilePath)) {
|
||||||
|
qcStream = ftpUtil.downloadFileStream(ftpUtil.getFtpRootPath() + spectrumPathProperties.getSaveFilePath()+ StringPool.SLASH + dbQcFilePath);
|
||||||
|
if (Objects.nonNull(qcStream)) {
|
||||||
|
qcFile = new File(parameterProperties.getLogFilePath() + StringPool.SLASH + dbQcFilePath.substring(dbQcFilePath.lastIndexOf(StringPool.SLASH) + 1));
|
||||||
|
FileUtils.copyInputStreamToFile(qcStream, qcFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(sampleFile) || Objects.nonNull(gasFile) || Objects.nonNull(detFile) ||Objects.nonNull(qcFile)) {
|
||||||
|
//创建zip的临时文件
|
||||||
|
zipFile = File.createTempFile("betaGammaZip", null);
|
||||||
|
File zip = ZipUtil.zip(zipFile, true, sampleFile, gasFile, detFile, qcFile);
|
||||||
|
//获取压缩文件的文件输入流
|
||||||
|
inputStream = new FileInputStream(zip);
|
||||||
|
//重置响应信息
|
||||||
|
response.reset();
|
||||||
|
//设置响应类型
|
||||||
|
response.setContentType("application/download");
|
||||||
|
//解决中文不能生成文件
|
||||||
|
response.setHeader("Content-Disposition", "attachment; fileName=" + URLEncoder.encode(zipFileName,"UTF-8"));
|
||||||
|
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
|
||||||
|
//获取响应流的输出流
|
||||||
|
outputStream = response.getOutputStream();
|
||||||
|
//定义一个字节大小
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int bytesRead;
|
||||||
|
// 将文件输出流写入到输出流中
|
||||||
|
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||||
|
outputStream.write(buffer, 0, bytesRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (Objects.nonNull(sampleFile)) {
|
||||||
|
sampleFile.delete();
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(sampleStream)) {
|
||||||
|
sampleStream.close();
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(gasFile)) {
|
||||||
|
gasFile.delete();
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(gasStream)) {
|
||||||
|
gasStream.close();
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(detFile)) {
|
||||||
|
detFile.delete();
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(detStream)) {
|
||||||
|
detStream.close();
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(qcFile)) {
|
||||||
|
qcFile.delete();
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(qcStream)) {
|
||||||
|
qcStream.close();
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(zipFile)) {
|
||||||
|
zipFile.delete();
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(inputStream)) {
|
||||||
|
inputStream.close();
|
||||||
|
}
|
||||||
|
if (Objects.nonNull(outputStream)) {
|
||||||
|
outputStream.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void findInfo(Integer sampleId, Report report) {
|
private void findInfo(Integer sampleId, Report report) {
|
||||||
//声明多个对象 分别封装独立的信息
|
//声明多个对象 分别封装独立的信息
|
||||||
GeneralInformation generalInformation = new GeneralInformation();
|
GeneralInformation generalInformation = new GeneralInformation();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user