xuhuihui 3 years ago
parent
commit
3adadad58b
  1. 29
      04.系统编码/Backend/src/main/java/com/userinformation/backend/controller/QualityCompareController.java
  2. 2
      04.系统编码/Backend/src/main/java/com/userinformation/backend/controller/TLogPController.java
  3. 84
      04.系统编码/Backend/src/main/java/com/userinformation/backend/service/QualityCompareService.java
  4. 10
      04.系统编码/Backend/src/main/resources/application.yml
  5. 5
      04.系统编码/Frontend/src/components/MicrowaveRadiation.vue
  6. 82
      04.系统编码/Frontend/src/components/RamanLidar.vue
  7. 7
      04.系统编码/Frontend/src/model/high-chart-create.ts

29
04.系统编码/Backend/src/main/java/com/userinformation/backend/controller/QualityCompareController.java

@ -0,0 +1,29 @@
package com.userinformation.backend.controller;
import com.userinformation.backend.service.QualityCompareService;
import com.userinformation.backend.util.RequestResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
/**
* @author: xiaowuler
* @createTime: 2022-05-05 16:31
* @describe: 质控对比 控制层
*/
@RestController
@RequestMapping("/qualityCompare")
public class QualityCompareController {
private final QualityCompareService qualityCompareService;
public QualityCompareController(QualityCompareService qualityCompareService) {
this.qualityCompareService = qualityCompareService;
}
@RequestMapping("findByTimeAndElement")
public RequestResult findByTimeAndElement(String date, String var, String locate) throws IOException {
date = "5_1_10";
return RequestResult.success(qualityCompareService.findByTimeAndElement(date, var, locate));
}
}

2
04.系统编码/Backend/src/main/java/com/userinformation/backend/controller/TLogPController.java

@ -23,6 +23,6 @@ public class TLogPController {
@RequestMapping("findLater")
public String findLater(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime){
return tLogPService.findLater(startTime, endTime);
return tLogPService.findLater(startTime, endTime.plusSeconds(1));
}
}

84
04.系统编码/Backend/src/main/java/com/userinformation/backend/service/QualityCompareService.java

@ -0,0 +1,84 @@
package com.userinformation.backend.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* @author: xiaowuler
* @createTime: 2022-05-05 16:36
* @describe: 质控对比服务层
*/
@Service
public class QualityCompareService {
private static final String SEPARATOR = ",";
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy_M_d_HH");
@Value("${custom.quality-path}")
private String qualityPath;
public List<Float[]> findByTimeAndElement(String date, String var, String locate) throws IOException {
// String filepath = qualityPath + var + "-" + date + ".CSV";
String filepath = "C:\\Users\\xiaowuler\\Desktop\\原始产品数据\\MEXT-2021-05-01.CSV";
LocalDateTime time = LocalDateTime.parse("2021_" + date, DATE_FORMATTER).withHour(0).plusDays(1);
return read(filepath, time);
}
private List<Float[]> read(String filepath, LocalDateTime time) throws IOException {
List<String> lines = Files.readAllLines(Paths.get(filepath));
// 将文件数据进行反转,从最后一行开始读取
Collections.reverse(lines);
List<Float[]> data = new ArrayList<>(288);
for(String line : lines){
List<String> rows = Arrays.asList(line.split(SEPARATOR));
// 相关数据时间转换,以比较,并按照10分钟间隔过滤
LocalDateTime targetTime = LocalDateTime.parse(rows.get(0), TIME_FORMATTER);
if (targetTime.isAfter(time)) {
continue;
}
time = fillNaN(time, targetTime, data);
data.add(getValues(rows));
time = time.minusMinutes(5);
}
Collections.reverse(data);
AtomicInteger index = new AtomicInteger(0);
// 匹配老师处理的数据
return data.stream().filter(values -> index.getAndIncrement() % 12 != 0).collect(Collectors.toList());
}
private LocalDateTime fillNaN(LocalDateTime time, LocalDateTime targetTime, List<Float[]> data){
if (Duration.between(targetTime, time).toMinutes() > 5) {
Float[] values = new Float[801];
Arrays.fill(values, Float.NaN);
data.add(values);
time = time.minusMinutes(10);
fillNaN(time, targetTime, data);
}
return time;
}
private Float[] getValues(List<String> rows){
Float[] values = rows.stream().skip(7).limit(801).map(row -> Float.parseFloat(row)).toArray(Float[]::new);
int length = values.length;
if (length != 801) {
values = Arrays.copyOf(values, 801);
Arrays.fill(values, length - 1, 800, Float.NaN);
}
return values;
}
}

10
04.系统编码/Backend/src/main/resources/application.yml

@ -20,9 +20,11 @@ custom:
image:
url: ${custom.parent-url}:${server.port}/product
gifPath: ${custom.image.path}/gif
# path: D:/Deployments/LamanRadar/product
# parent-url: http://localhost
path: /home/project/NJEnvironmentPlatform/html/product
parent-url: http://10.124.102.10
path: D:/Deployments/LamanRadar/product
parent-url: http://localhost
quality-path: C:/Users/xiaowuler/Desktop/原始产品数据
# path: /home/project/NJEnvironmentPlatform/html/product
# parent-url: http://10.124.102.10
# quality-path: C:/Users/xiaowuler/Desktop/原始产品数据
# path: /home/develop/product
# parent-url: http://rdp.nagr.com.cn

5
04.系统编码/Frontend/src/components/MicrowaveRadiation.vue

@ -200,7 +200,7 @@
</div>
<div v-show ="currentTab === 'T-logP'" class="picture-container contrast-picture-container">
<img :src="tLogPPicture" style="width: 20%">
<img :src="tLogPPicture" class="T-logpImg">
</div>
</div>
@ -1014,6 +1014,9 @@ export default {
z-index: 1000;
}
}
.T-logpImg {
transform: scale(0.5);
}
}
.raman-picture-container {
width: calc(~"100% - 1rem");

82
04.系统编码/Frontend/src/components/RamanLidar.vue

@ -52,10 +52,10 @@
<div class="container panel">
<div class="toolbar day-toolbar" v-if="currentElement === 'singleWatervapor' || currentElement === 'aod-icot-wcot'
|| currentElement === 'extinctionOptics' || currentElement === 'backscatter'
|| currentElement === 'pm2_5' || currentElement === 'pblh'
|| currentElement === 'cloudSol' || currentElement === 'cloudbaseheight'
|| currentElement === 'cloudtopheight'">
|| currentElement === 'extinctionOptics' || currentElement === 'backscatter'
|| currentElement === 'pm2_5' || currentElement === 'pblh'
|| currentElement === 'cloudSol' || currentElement === 'cloudbaseheight'
|| currentElement === 'cloudtopheight'">
<div class="times">
<div class="time-item" v-for="(time, index) in times" :key="index"
:class="{'active': currentTime === time.date, 'first-hour': time.hour === '00'}">
@ -72,7 +72,6 @@
</div>
</div>
<div class="toolbar day-toolbar" v-if="currentElement === 'extinction' || currentElement=== 'lidarratio' || currentElement === 'watervapor'">
<div class="times">
<div class="time-item" v-for="(time, index) in times" :key="index"
@ -91,8 +90,6 @@
</div>
</div>
<div class="picture-view">
<div class="picture-container raman-picture-container" v-show="currentElement === 'singleWatervapor'">
<div class="picture special-picture">
@ -116,7 +113,7 @@
</div>
</div>
<div class="picture-container raman-picture-container" v-show = "currentElement=== 'extinctionOptics'">
<div class="picture-container raman-picture-container" v-show = "currentElement=== 'extinctionOptics'">
<div class="picture special-picture">
<div v-loading="loadingExtinctionOpticsStatus"
style="width: 100%;height: 100%"
@ -125,9 +122,9 @@
<canvas id='extinction_optics_chart'></canvas>
</div>
</div>
</div>
</div>
<div class="picture-container raman-picture-container" v-show="currentElement=== 'backscatter'">
<div class="picture-container raman-picture-container" v-show="currentElement=== 'backscatter'">
<div class="picture special-picture">
<div v-loading="loadingBackscatterStatus"
style="width: 100%;"
@ -269,7 +266,6 @@
<script lang="ts">
import {onMounted, reactive, toRefs, watch} from 'vue';
import moment from "moment";
import {RamanLidarConfig} from '../uilts/Config';
import {post} from '../uilts/axios';
import {ElMessage} from "element-plus";
import {ConstantRamanLidar} from "../model/constant";
@ -291,6 +287,7 @@ export default {
LidarRatio: HighChartCreate,
opticalThickness: HighChartCreate,
cloudRecognitionDrawer: HeatMapDrawer,
extinctionBeforeDrawer: HeatMapDrawer,
extinctionDrawer: HeatMapDrawer,
watervaporDrawer: HeatMapDrawer,
opticsExtinctionDrawer: HeatMapDrawer,
@ -307,6 +304,7 @@ export default {
opticalThickness: null,
cloudRecognitionDrawer: null,
extinctionDrawer: null,
extinctionBeforeDrawer: null,
watervaporDrawer: null,
singleWatervaporDrawer: null,
opticsExtinctionDrawer: null,
@ -589,7 +587,7 @@ export default {
// break;
case 'extinction' :
// initTimeLineDay()
reloadCloudRecognition('extinction', 801, 'extinction', drawExtinctionBefore);
reloadExtinctionBefore();
reloadCloudRecognition('extinction', 801, 'extinction', drawExtinctionAfter);
break;
case 'watervapor' :
@ -602,6 +600,48 @@ export default {
}
}
const reloadExtinctionBefore = () => {
let params = {
date: moment(options.date).format('YYYY-MM-DD'),
var: 'MEXT',
locate: options.currentRegion
}
post("/qualityCompare/findByTimeAndElement", params).then((response: any) => {
if (response.error != 0){
console.log("未找到质控前数据文件");
return;
}
let matrix = convertValueToBox(response.data);
creates.extinctionBeforeDrawer = new HeatMapDrawer(800, 650, matrix, "extinction_chart-before", 'km/sr','质控后');
creates.extinctionBeforeDrawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 2000, 4000, 6000, 8000, 10000, 12000], true, true));
creates.extinctionBeforeDrawer.setColorChart(prepareExtinctionnColors());
creates.extinctionBeforeDrawer.draw();
})
}
const convertValueToBox = (data) => {
let timeMoment = moment(options.date).add(-1, 'd');
let timeFormat = timeMoment.format("MM月DD日HH时");
let boxes = new Array<Array<Box>>();
let index = 1;
data.forEach(r => {
if (index % 11 == 0){
timeMoment.add(1, 'h');
timeFormat = timeMoment.format("MM月DD日HH时");
}
let rows = new Array<Box>(r.length);
for (let h = 0, len = r.length; h < len; h++) {
rows[h] = new Box(index - 1, h, 0, 0, r[h], h * 15, timeFormat, "米");
}
index++;
boxes.push(rows);
})
return boxes;
}
const preprocessing = (type: string) => {
switch (type) {
@ -908,9 +948,6 @@ export default {
creates.watervaporDrawer.draw();
}
const prepareWatervaporColors = () => {
return new ColorChart(['#990000', '#CC0000', '#FF0000', '#FF3300', '#FF6600', '#FF9900', '#FFCC00', '#FFFF00', '#CCFF33', '#99FF66',
'#66FF99', '#33FFCC', '#00FFFF', '#00CCFF', '#0099FF', '#0066FF', '#0033FF', '#0000FF', '#0000CC', '#000099'],
@ -918,21 +955,6 @@ export default {
);
}
const drawExtinctionBefore = (result: CustomeArray<any>) => {
if (result.length != 24) return;
options.loadingExtinctionStatus = false;
if (creates.extinctionDrawer != null) {
creates.extinctionDrawer.close();
}
let matrix = converCloudRecognition(801, result, 'extinction');
creates.extinctionDrawer = new HeatMapDrawer(800, 650, matrix, "extinction_chart-before", 'km/sr','质控前');
creates.extinctionDrawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 2000, 4000, 6000, 8000, 10000, 12000], true, true));
creates.extinctionDrawer.setColorChart(prepareExtinctionnColors());
creates.extinctionDrawer.draw();
}
const drawExtinctionAfter = (result: CustomeArray<any>) => {
if (result.length != 24) return;

7
04.系统编码/Frontend/src/model/high-chart-create.ts

@ -149,6 +149,13 @@ export class HighChartCreate {
}
public init(): void{
// 不换算单位, 不然出现 k
Highcharts.setOptions({
lang: {
numericSymbols: null
},
})
const options = this.getOptions();
this.highChart = Highcharts.chart(this.id, options);
// return this.highChart;

Loading…
Cancel
Save