feat: 对接分析功能

This commit is contained in:
Xu Zhimeng 2023-10-18 17:59:53 +08:00
parent edf91d5e74
commit 52e360eca5

View File

@ -89,16 +89,18 @@
<div class="title">Gamma Window Setting</div>
<div class="content">
<div class="label">Gamma Window Begin:</div>
<a-input-number size="small" v-model="model.windowBegin"></a-input-number> Channel
<a-input-number size="small" v-model="model.windowBegin" @change="calculateTotalCount"></a-input-number>
Channel
<div class="label">Gamma Window End:</div>
<a-input-number size="small" v-model="model.windowEnd"></a-input-number> Channel
<a-input-number size="small" v-model="model.windowEnd" @change="calculateTotalCount"></a-input-number>
Channel
</div>
</div>
<div class="setting-item">
<div class="title">Parameter Setting</div>
<div class="content">
<div class="label">Min of Energy:</div>
<a-input-number size="small" v-model="model.energy"></a-input-number> keV
<a-input-number size="small" v-model="model.minEnergy"></a-input-number> keV
<div class="label">Half Life:</div>
<a-input-number size="small" v-model="model.halfLife"></a-input-number> Day
</div>
@ -106,16 +108,16 @@
<div class="setting-item">
<div class="title">Function of Fitting</div>
<div class="content">
<a-radio-group v-model="model.fittingType">
<a-radio value="1">Linear</a-radio>
<a-radio value="2">2-polynomial</a-radio>
<a-radio-group v-model="model.fitType" @change="handleFuncChange">
<a-radio value="liner">Linear</a-radio>
<a-radio value="poly2">2-polynomial</a-radio>
</a-radio-group>
</div>
</div>
</div>
<div class="btns">
<a-button type="primary">Analyse</a-button>
<a-button type="primary" :loading="isAnalysing" @click="handleAnalyse">Analyse</a-button>
<a-button @click="visible = false">Exit</a-button>
</div>
</div>
@ -133,8 +135,10 @@
:class="tableList.length ? 'has-data' : ''"
:scroll="{ y: 101 }"
>
<template slot="delete">
<a-button type="link" size="small">Delete</a-button>
<template slot="delete" slot-scope="text, record, index">
<a-button type="link" size="small" @click="handleDel(index)">
<a-icon type="delete" style="color: red;"></a-icon>
</a-button>
</template>
</a-table>
<!-- 表格结束 -->
@ -155,25 +159,20 @@
<!-- 右下角信息开始 -->
<div class="info">
<title-over-border title="Function of Fitting">
<template v-if="model.fittingType == '1'">
y = ax + b
</template>
<template v-if="model.fittingType == '2'">
y = axx + bx + c
</template>
{{ currFunction }}
</title-over-border>
<title-over-border title="Xe Activity (Bq)">
<div class="xe-activity">
<div class="item">
<label>Reference Time :</label>
<span>
这是内容
{{ xeActivity.referenceTime }}
</span>
</div>
<div class="item">
<label>Xe Activity (Bq) :</label>
<span>
这是内容
{{ xeActivity.activity }}
</span>
</div>
</div>
@ -193,7 +192,7 @@ import ModalMixin from '@/mixins/ModalMixin'
import { cloneDeep } from 'lodash'
import CustomChart from '@/components/CustomChart/index.vue'
import { exportEchartImg, getXAxisAndYAxisByPosition, splitAxis } from '@/utils/chartHelper'
import { getAction } from '@/api/manage'
import { getAction, postAction } from '@/api/manage'
import { useBaseChartSetting } from '../../../useChart'
import TitleOverBorder from '../../TitleOverBorder.vue'
import SampleDataMixin from '@/views/spectrumAnalysis/SampleDataMixin'
@ -389,32 +388,23 @@ const initialResultChartOption = {
},
symbol: 'none',
data: [],
markLine: {
symbol: 'none',
label: {
show: false
},
animation: false,
emphasis: {
disabled: true
},
lineStyle: {
color: '#f00'
},
data: []
}
animation: false
},
{
type: 'line',
type: 'scatter',
itemStyle: {
color: '#A8DA56'
color: 'red'
},
symbol: 'none',
data: []
symbolSize: 6,
data: [],
zlevel: 2,
animation: false
}
]
}
initialResultChartOption.yAxis.boundaryGap = ['20%', '20%']
const columns = [
{
title: 'Index',
@ -425,17 +415,17 @@ const columns = [
},
{
title: 'Eb',
dataIndex: 'Eb',
dataIndex: 'eb',
align: 'center'
},
{
title: 'Nx',
dataIndex: 'Nx',
dataIndex: 'nx',
align: 'center'
},
{
title: 'Ny',
dataIndex: 'Ny',
dataIndex: 'ny',
align: 'center'
},
{
@ -448,11 +438,17 @@ const columns = [
]
const initialModel = {
windowBegin: null,
windowEnd: null,
energy: 0.1,
windowBegin: undefined,
windowEnd: undefined,
minEnergy: 0.1,
halfLife: 5.243,
fittingType: '1'
fitType: 'liner'
}
// Function of Fitting
const funcList = {
liner: 'y = ax + b',
poly2: 'y = axx + bx + c'
}
export default {
@ -484,6 +480,8 @@ export default {
},
totalCount: [0, 0],
currFunction: '',
xeActivity: {},
isLoading: false,
@ -491,7 +489,8 @@ export default {
gammaChannelEnergy: [],
model: cloneDeep(initialModel),
tableList: []
tableList: [],
isAnalysing: false
}
},
methods: {
@ -499,10 +498,11 @@ export default {
this.customToolTip.visible = false
this.customToolTip2.visible = false
this.gammaSpectrumChartOption = cloneDeep(initialGammaChartOption)
this.betaSpectrumChartOption = cloneDeep(initialBetaChartOption)
this.resultChartOption = cloneDeep(initialResultChartOption)
this.model = cloneDeep(initialModel)
this.currFunction = funcList[this.model.fitType]
this.calculateTotalCount()
@ -567,18 +567,18 @@ export default {
//
handleChartClick({ offsetX, offsetY, event }, isMouseLeft) {
event.preventDefault()
const point = getXAxisAndYAxisByPosition(this.$refs.gammaSpectrumChart.getChartInstance(), offsetX, offsetY)
if (point) {
const markLineData = this.gammaSpectrumChartOption.series[0].markLine.data
const xAxis = parseInt(point[0].toFixed())
let currToolTip = this.customToolTip2
//
if (isMouseLeft) {
//
if(!isNullOrUndefined(this.model.windowEnd) && xAxis >= this.model.windowEnd) {
if (!isNullOrUndefined(this.model.windowEnd) && xAxis >= this.model.windowEnd) {
this.clearMarkLineAndToolTip()
return
}
@ -587,10 +587,10 @@ export default {
markLineData[0].xAxis = xAxis
this.model.windowBegin = xAxis
}
}
//
else {
if(!isNullOrUndefined(this.model.windowBegin) && xAxis <= this.model.windowBegin) {
if (!isNullOrUndefined(this.model.windowBegin) && xAxis <= this.model.windowBegin) {
this.clearMarkLineAndToolTip()
return
}
@ -624,17 +624,112 @@ export default {
this.model.windowBegin = null
this.model.windowEnd = null
this.calculateTotalCount()
},
// Total Count
calculateTotalCount() {
if(!this.model.windowBegin || !this.model.windowEnd) {
if (!this.model.windowBegin || !this.model.windowEnd || this.model.windowBegin >= this.model.windowEnd) {
this.totalCount = [0, 0]
return
}
const gammaOriginSeriseData = this.gammaSpectrumChartOption.series[0].data
const betaProjectedSeriseData = this.betaSpectrumChartOption.series[1].data
const originSeriseTotalCount = gammaOriginSeriseData
.slice(this.model.windowBegin, this.model.windowEnd + 1)
.reduce((prev, curr) => prev + curr[1], 0)
const projectedSeriseTotalCount = betaProjectedSeriseData
.slice(this.model.windowBegin, this.model.windowEnd + 1)
.reduce((prev, curr) => prev + curr[1], 0)
this.totalCount = [originSeriseTotalCount, projectedSeriseTotalCount]
},
// Function of Fitting
handleFuncChange() {
this.xeActivity = {}
this.currFunction = funcList[this.model.fitType]
},
handleSnapshot() {
exportEchartImg(this.$refs.chartRef.getChartInstance())
},
//
async handleAnalyse() {
const { windowBegin, windowEnd, minEnergy, halfLife, fitType } = this.model
if (
isNullOrUndefined(windowBegin) ||
isNullOrUndefined(windowEnd) ||
isNullOrUndefined(minEnergy) ||
isNullOrUndefined(halfLife)
) {
return
}
try {
const { sampleFileName, detFileName } = this.sampleData
const params = {
sampleId: null,
dbName: '',
sampleFileName,
detFileName,
gammaBegin: windowBegin,
gammaEnd: windowEnd,
minEnergy,
halfLife,
fitType //Linear liner 2-Polynomial poly2
}
this.isAnalysing = true
const { success, result, message } = await postAction('/spectrumAnalysis/analyseExtrapolation', params)
if (success) {
console.log('%c [ ]-679', 'font-size:13px; background:pink; color:#bf2c9f;', result)
const {
functionFit, // Function of Fitting
resultViewLineDataValue, // 线
resultViewScatterDataValue, //
tableData, //
xeAct
} = result
this.currFunction = functionFit
const [lineSeries, scatterSeries] = this.resultChartOption.series
lineSeries.data = resultViewLineDataValue.map(({ x, y }) => [x, y])
scatterSeries.data = resultViewScatterDataValue.map(({ x, y }) => [x, y])
this.resetResultChartPerform()
this.xeActivity = {
referenceTime: this.detail.acquisitionStart,
activity: Number.isNaN(xeAct)? xeAct: Number(xeAct).toPrecision(6)
}
this.tableList = tableData
} else {
this.$message.error(message)
}
} catch (error) {
console.error(error)
} finally {
this.isAnalysing = false
}
},
resetResultChartPerform() {
this.resultChartOption.yAxis.min = undefined
this.resultChartOption.yAxis.max = undefined
this.resultChartOption.xAxis.min = undefined
this.resultChartOption.xAxis.max = undefined
this.resultChartOption.yAxis.interval = undefined
this.resultChartOption.xAxis.interval = undefined
},
//
handleDel(index) {
this.tableList.splice(index, 1)
this.resultChartOption.series[1].data.splice(index, 1)
}
}
}
@ -836,7 +931,7 @@ export default {
}
.xe-activity {
width: 80%;
width: 90%;
.item {
display: flex;