fix: 修复存在的问题

This commit is contained in:
Xu Zhimeng 2023-08-08 19:11:37 +08:00
parent 59f373df3c
commit 5672b47ca4
10 changed files with 493 additions and 159 deletions

View File

@ -26,6 +26,11 @@ export default {
this._chart.setOption(this.option)
this.initEventListener()
},
destroyed() {
if(this._chart) {
this._chart.dispose()
}
},
methods: {
initEventListener() {
events.forEach(eventName => {

View File

@ -30,6 +30,11 @@ export default {
this._chart.setOption(this.option)
this.initEventListener()
},
destroyed() {
if(this._chart) {
this._chart.dispose()
}
},
methods: {
initEventListener() {
events.forEach(eventName => {

View File

@ -39,4 +39,24 @@ export function exportEchartImg(chartInstance, type = 'png', backgroundColor = '
link.click()
document.body.removeChild(link) //下载完成移除元素
}
/**
* 按份数分割轴线
* @param {Number} max
* @param {Number} min
* @param {Number} cnt
* @param {Number} maxBoundaryGap
*/
export function splitAxis(max, min, cnt, maxBoundaryGap = 1.1) {
const _min = Math.floor(min)
const interval = Math.ceil((Math.ceil(max * maxBoundaryGap) - _min) / cnt)
const _max = _min + interval * cnt
return {
min: _min,
interval,
max: _max
}
}

View File

@ -3,6 +3,7 @@ import * as api from '@/api/api'
import { isURL } from '@/utils/validate'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import onlineCommons from '@jeecg/antd-online-mini'
import { isNull, isUndefined } from 'xe-utils/methods'
export function timeFix() {
const time = new Date()
@ -702,4 +703,8 @@ export function flat(arr, flatKey = 'children') {
}
return result
}, [])
}
export function isNullOrUndefined(val) {
return isNull(val) || isUndefined(val)
}

View File

@ -11,17 +11,7 @@
QC Flags
<beta-gamma-qc-flags slot="content" :data="qcFlags" @click="handleQcFlagClick" />
</pop-over-with-icon>
<pop-over-with-icon placement="bottomLeft" style="width: 159px" v-model="spectraVisible">
Spectra
<spectra
slot="content"
v-model="spectraType"
@input="
spectraVisible = false
changeChartByType($event)
"
/>
</pop-over-with-icon>
<custom-select v-model="spectraType" :options="SampleType" @change="changeChartByType" style="width: 246px;"></custom-select>
</div>
<!-- 二级交互栏结束 -->
@ -148,6 +138,7 @@ import BetaGammaDetailedInfomation from './components/SubOperators/BetaGammaDeta
import BetaGammaQcFlags from './components/SubOperators/BetaGammaQcFlags.vue'
import PopOverWithIcon from './components/SubOperators/PopOverWithIcon.vue'
import Spectra from './components/SubOperators/Spectra.vue'
import CustomSelect from '@/components/CustomSelect/index.vue'
const StatisticsType = {
'Collection Time': 'Colloc_Time',
@ -156,6 +147,25 @@ const StatisticsType = {
'Air Volume': 'Sample_Volumn'
}
const SampleType = [
{
label: 'Sample Data',
value: 'sample'
},
{
label: 'GasBg Data',
value: 'gasBg'
},
{
label: 'DetBg Data',
value: 'detBg'
},
{
label: 'QC Data',
value: 'qc'
}
]
export default {
components: {
BetaGammaChartContainer,
@ -168,7 +178,8 @@ export default {
Spectra,
BetaGammaQcFlags,
BetaGammaDetailedInfomation,
StatisticsParamerHistoryModalForQcFlags
StatisticsParamerHistoryModalForQcFlags,
CustomSelect
},
props: {
sample: {
@ -176,6 +187,8 @@ export default {
}
},
data() {
this.SampleType = SampleType
return {
qcFlags: {},
@ -209,7 +222,7 @@ export default {
},
methods: {
async getSampleDetail() {
this.spectraType = 'sample'
this.spectraType = this.SampleType[0].value
const { dbName, sampleId } = this.sample
try {
@ -230,7 +243,7 @@ export default {
}
},
changeChartByType(type) {
changeChartByType() {
const {
betaOriginalData,
betaProjectedData,
@ -253,7 +266,7 @@ export default {
XeVolumeBtn, // QC Flags
GasBgBtn, // QC Flags
DetBgBtn // QC Flags
} = this.sampleDetail[type]
} = this.sampleDetail[this.spectraType]
this.spectrumData = spectrumData

View File

@ -10,6 +10,7 @@
{{ item }}
</span>
<span @click="handleUnzoom">Unzoom</span>
<span @click="handleROI">ROI</span>
</div>
<div class="beta-gamma-spectrum-chart-main">
<!-- 2D 图表为了相应Unzoom采用的v-show -->
@ -328,7 +329,8 @@ export default {
twoDOption,
threeDSurfaceOption,
threeDScatterOption
threeDScatterOption,
showROI: true
}
},
@ -360,6 +362,12 @@ export default {
this.reDrawRect()
},
// ROI
handleROI() {
this.showROI = !this.showROI
this.reDrawRect()
},
resize() {
this.$refs.chartRef && this.$refs.chartRef.resize()
this.$refs._3dSurfaceRef && this.$refs._3dSurfaceRef.resize()
@ -473,17 +481,19 @@ export default {
reDrawRect() {
const rectList = []
this.boundaryData.forEach(({ minX, maxX, minY, maxY, color }) => {
// rect
const rect = [
[minX, minY],
[maxX, minY],
[maxX, maxY],
[minX, maxY]
]
if (this.showROI) {
this.boundaryData.forEach(({ minX, maxX, minY, maxY, color }) => {
// rect
const rect = [
[minX, minY],
[maxX, minY],
[maxX, maxY],
[minX, maxY]
]
rectList.push(...this.drawOneRect(rect, color))
})
rectList.push(...this.drawOneRect(rect, color))
})
}
this.twoDOption.series.markLine.data = rectList
},

View File

@ -11,7 +11,7 @@
<span> Channel: {{ betaGammaInfo.channel }} </span>
<span>
Gamma Channel Width:
<a-input-number :min="1" v-model="gammaChannelWidth"></a-input-number>
<a-input-number :min="1" v-model="gammaChannelWidth" size="small"></a-input-number>
</span>
</div>
<div class="energy">
@ -64,13 +64,13 @@
<div class="content channel-and-energy">
<a-form-model layout="inline">
<a-form-model-item label="Channel">
<a-input type="number" v-model="channelAndEnergyModel.channel"></a-input>
<a-input-number type="number" v-model="channelAndEnergyModel.channel" size="small"></a-input-number>
</a-form-model-item>
<a-form-model-item label="Energy">
<a-input type="number" v-model="channelAndEnergyModel.energy"></a-input>
<a-input-number type="number" v-model="channelAndEnergyModel.energy" size="small"></a-input-number>
</a-form-model-item>
</a-form-model>
<a-button type="primary" @click="handleAddChannelAndEnergy">Add</a-button>
<a-button type="primary" @click="handleAddChannelAndEnergy" size="small">Add</a-button>
</div>
<!-- 表格开始 -->
<a-table
@ -122,9 +122,9 @@
<span>C to E : </span>
<span>
E =
<a-input type="number" size="small" v-model="newCalibrationFuncModel.paramA" /> +
<a-input type="number" size="small" v-model="newCalibrationFuncModel.paramB" /> *C +
<a-input type="number" size="small" v-model="newCalibrationFuncModel.paramC" /> *C <sup>2</sup>
<a-input-number size="small" v-model="newCalibrationFuncModel.paramA" /> +
<a-input-number size="small" v-model="newCalibrationFuncModel.paramB" /> *C +
<a-input-number size="small" v-model="newCalibrationFuncModel.paramC" /> *C <sup>2</sup>
</span>
</p>
<div class="func">
@ -174,10 +174,11 @@
<script>
import CustomChart from '@/components/CustomChart/index.vue'
import TitleOverBorder from '@/views/spectrumAnalysis/components/TitleOverBorder.vue'
import { getAction } from '@/api/manage'
import { getAction, postAction } from '@/api/manage'
import { cloneDeep } from 'lodash'
import { exportEchartImg, getXAxisAndYAxisByPosition } from '@/utils/chartHelper'
import { exportEchartImg, getXAxisAndYAxisByPosition, splitAxis } from '@/utils/chartHelper'
import { graphic } from 'echarts'
import { isNullOrUndefined } from '@/utils/util'
const initialBetaGammaChartOption = {
grid: {
@ -252,7 +253,8 @@ const initialBetaGammaChartOption = {
data: [],
itemStyle: {
color: '#fff'
}
},
cursor: 'default'
}
}
@ -388,11 +390,11 @@ const initialFigureChartOption = {
const [channel, energy1] = series1.value
let html = `<div class="channel">Channel: ${channel}</div>
<div class="energy">Energy: ${energy1.toFixed(3)}</div>`
<div class="energy">Energy: ${energy1.toPrecision(6)}</div>`
if (series2) {
const [_, energy2] = series2.value
html += `<div class="warning">Energy: ${energy2}</div>`
html += `<div class="warning">Energy: ${energy2.toPrecision(6)}</div>`
}
return html
@ -456,7 +458,7 @@ const initialFigureChartOption = {
fontSize: 14,
color: '#5b9cba'
},
nameGap: 55
nameGap: 80
},
series: [
{
@ -503,7 +505,7 @@ const columns = [
title: 'Energy/keV',
dataIndex: 'energy',
align: 'center',
customRender: (text) => {
customRender: text => {
return text.toPrecision(6)
}
},
@ -527,9 +529,9 @@ const columns = [
]
const newCalibrationFuncModel = {
paramA: '',
paramB: '',
paramC: ''
paramA: undefined,
paramB: undefined,
paramC: undefined
}
export default {
@ -571,7 +573,10 @@ export default {
left: 0
},
channelAndEnergyModel: {},
channelAndEnergyModel: {
channel: undefined,
energy: undefined
},
c2e: {},
e2c: {},
@ -581,7 +586,11 @@ export default {
newCalibrationFuncModel: cloneDeep(newCalibrationFuncModel),
newCalibrationIsAppliedTo: '2',
recalculateROICountsFor: []
recalculateROICountsFor: [],
count: 0, // tableWidgets
isFirstFitting: true,
isInverse: false //
}
},
created() {
@ -613,19 +622,29 @@ export default {
this.c2e = CToE
this.e2c = EToC
this.oldScatterSeries = oldScatterSeries
this.count = oldScatterSeries.length
this.isFirstFitting = true
this.betaGammaChartOption.series.data = histogramData.map(({ b, g, c }) => [b, g, c])
this.gammaEnergy = gammaEnergy
this.gammaGatedBetaSpectrum = gammaGatedBetaSpectrum
this.oldScatterSeries = oldScatterSeries
const gammaEnergyValue = betaEnergy.map(item => item[0])
const gammaEnergyMax = Math.ceil(Math.max(...gammaEnergyValue))
const gammaEnergyMin = Math.floor(Math.min(...gammaEnergyValue))
const gammaEnergyInterval = Math.ceil(((gammaEnergyMax - gammaEnergyMin) / 4) * 1.1)
this.figureChartOption.yAxis.max = gammaEnergyInterval * 4
this.figureChartOption.yAxis.min = gammaEnergyMin
this.figureChartOption.yAxis.interval = Math.ceil((gammaEnergyMax * 1.1) / 4)
const gammaEnergyMax = Math.max(...gammaEnergyValue)
const gammaEnergyMin = Math.min(...gammaEnergyValue)
const { max, min, interval } = splitAxis(gammaEnergyMax, gammaEnergyMin, 4)
this.figureChartOption.yAxis.max = max
this.figureChartOption.yAxis.min = min
this.figureChartOption.yAxis.interval = interval
this.figureChartOption.series[0].data = gammaEnergyValue.map((item, index) => [index, item])
this.figureChartOption.series[0].markPoint.data = oldScatterSeries.map(({ x, y }) => ({ xAxis: x, yAxis: y }))
this.oldChartOption = cloneDeep(this.figureChartOption)
} else {
this.$message.error(res.message)
}
@ -647,15 +666,42 @@ export default {
// gamma-gated beta spectrum
const yAxis = parseInt(point[1].toFixed())
this.currEnergy = this.gammaEnergy[yAxis][0].toFixed(2) // Energy
this.channelAndEnergyModel = {}
this.currEnergy = parseFloat(this.gammaEnergy[yAxis][0].toFixed(2)) // Energy
this.channelAndEnergyModel = {
channel: undefined,
energy: undefined
}
const currGammaGatedBetaSpectrum = this.gammaGatedBetaSpectrum[yAxis]
const max = Math.max(...currGammaGatedBetaSpectrum)
const interval = Math.ceil((max / 4) * 1.1)
this.gammaGatedChartOption.yAxis.max = interval * 4
this.gammaGatedChartOption.yAxis.interval = interval
this.gammaGatedChartOption.series.data = currGammaGatedBetaSpectrum.map((item, index) => [index, item])
this.getGammaGated(yAxis)
}
},
//
async getGammaGated(gammaChannel) {
try {
const {
success,
result: { data },
message
} = await getAction('/spectrumAnalysis/getGammaGated', {
gammaChannel,
sampleId: this.sampleId,
chartHeight: this.gammaEnergy.length,
channelWidth: this.gammaChannelWidth
})
if (success) {
const max = Math.max(...data.map(({ y }) => y))
const { max: _max, interval } = splitAxis(max, 0, 4)
this.gammaGatedChartOption.yAxis.interval = interval
this.gammaGatedChartOption.yAxis.max = _max
this.gammaGatedChartOption.series.data = data.map(({ x, y }) => [x, y])
} else {
this.$message.error(message)
}
} catch (error) {
console.error(error)
}
},
@ -670,10 +716,13 @@ export default {
if (this.gammaEnergy && this.gammaEnergy.length) {
// Channel Energy
const yAxis = parseInt(point[1].toFixed())
const energy = this.gammaEnergy[yAxis][0].toFixed(2)
this.betaGammaInfo = {
channel: yAxis,
energy
const gammaEnergy = this.gammaEnergy[yAxis]
if (gammaEnergy) {
const energy = gammaEnergy[0].toPrecision(6)
this.betaGammaInfo = {
channel: yAxis,
energy
}
}
}
}
@ -704,21 +753,64 @@ export default {
handleAddChannelAndEnergy() {
const { channel, energy } = this.channelAndEnergyModel
if (!channel || !energy) {
if (isNullOrUndefined(channel) || isNullOrUndefined(energy)) {
return
}
this.list.push({
rowCount: this.list.length + 1,
channel,
energy
})
this.channelAndEnergyModel = {}
this.figureChartOption.series[1].markPoint.data.push({ xAxis: channel, yAxis: energy })
const { min, max } = this.getFigureChartMaxAndMin()
const newMax = energy > max ? energy : max
const newMin = energy < min ? energy : min
// /
if (newMax === energy || newMin === energy) {
const { max: _max, min: _min, interval } = splitAxis(newMax, newMin, 4)
this.figureChartOption.yAxis.max = _max
this.figureChartOption.yAxis.min = _min
this.figureChartOption.yAxis.interval = interval
}
this.channelAndEnergyModel = {
channel: undefined,
energy: undefined
}
this.isInverse = true
},
//
handleDel(index) {
this.list.splice(index, 1)
const willDelItem = this.list.splice(index, 1)[0]
const findIndex = this.figureChartOption.series[1].markPoint.data.findIndex(
item => item.xAxis == willDelItem.channel && item.yAxis == willDelItem.energy
)
if (-1 !== findIndex) {
const markPointData = this.figureChartOption.series[1].markPoint.data
const { max: prevMax, min: prevMin } = this.getFigureChartMaxAndMin()
const deletedItem = markPointData.splice(findIndex, 1)[0] //
// /
if (deletedItem.yAxis == prevMax || deletedItem.yAxis == prevMin) {
const { max: newMax, min: newMin } = this.getFigureChartMaxAndMin()
const { max: _max, min: _min, interval } = splitAxis(newMax, newMin, 4)
this.figureChartOption.yAxis.max = _max
this.figureChartOption.yAxis.min = _min
this.figureChartOption.yAxis.interval = interval
}
}
this.isInverse = true
},
//
@ -732,8 +824,12 @@ export default {
this.newCalibrationFuncModel = cloneDeep(newCalibrationFuncModel)
this.list = []
this.newE2C = []
this.figureChartOption = this.oldChartOption
this.figureChartOption = cloneDeep(this.oldChartOption)
this.isFirstFitting = true
this.isInverse = false
},
// Fitting
@ -743,35 +839,54 @@ export default {
return
}
try {
const { success, result, message } = await getAction('/spectrumAnalysis/fitting', {
const { success, result, message } = await postAction('/spectrumAnalysis/fitting', {
...this.newCalibrationFuncModel,
tempPoints: this.figureChartOption.series[0].markPoint.data.map(item => item.xAxis).join(',')
tempPoints: this.isFirstFitting
? this.oldScatterSeries
: this.list.map(item => ({ x: item.channel, y: item.energy })),
count: this.isFirstFitting || !this.isInverse ? undefined : this.count
})
if (success) {
const { EToC, newLineSeries, newScatterSeriesData, tableWidgets } = result
this.isFirstFitting = false
const { EToC, newLineSeries, newScatterSeriesData, tableWidgets, CToE } = result
this.newE2C = EToC
this.list = tableWidgets
this.oldChartOption = cloneDeep(this.figureChartOption)
if (tableWidgets) {
this.list = tableWidgets
}
// C to E
if (CToE) {
const [paramA, paramB, paramC] = CToE
this.newCalibrationFuncModel = {
paramA: Number(paramA).toPrecision(6),
paramB: Number(paramB).toPrecision(6),
paramC: Number(paramC).toPrecision(6)
}
}
const energyValues = newLineSeries.map(item => item.y)
const { max: prevMax, min: prevMin } = this.figureChartOption.yAxis
const { max: prevMax, min: prevMin } = this.oldChartOption.yAxis
const energyMax = Math.max(Math.max(...energyValues), prevMax)
const energyMin = Math.min(Math.min(...energyValues), prevMin)
const energyInterval = Math.ceil(((energyMax - energyMin) / 4) * 1.1)
this.figureChartOption.yAxis.max = energyInterval * 4
this.figureChartOption.yAxis.min = energyMin
this.figureChartOption.yAxis.interval = Math.ceil((energyMax * 1.1) / 4)
const { min, max, interval } = splitAxis(energyMax, energyMin, 4)
this.figureChartOption.yAxis.max = max
this.figureChartOption.yAxis.min = min
this.figureChartOption.yAxis.interval = interval
this.figureChartOption.series[1].data = newLineSeries.map(({ x, y }) => [x, y])
this.figureChartOption.series[1].markPoint.data = newScatterSeriesData.map(({ x, y }) => {
return {
xAxis: x,
yAxis: y
}
})
if (newScatterSeriesData) {
this.figureChartOption.series[1].markPoint.data = newScatterSeriesData.map(({ x, y }) => {
return {
xAxis: x,
yAxis: y
}
})
}
} else {
this.$message.error(message)
}
@ -780,6 +895,30 @@ export default {
}
},
// Figure Chart
getFigureChartMaxAndMin() {
const [series0, series1] = this.figureChartOption.series
const {
data: data0,
markPoint: { data: markPointData0 }
} = series0
const {
data: data1,
markPoint: { data: markPointData1 }
} = series1
const newArr = [
...data0.map(item => item[1]),
...markPointData0.map(item => item.yAxis),
...data1.map(item => item[1]),
...markPointData1.map(item => item.yAxis)
]
return {
max: Math.max(...newArr),
min: Math.min(...newArr)
}
},
/**
* 返回的科学计数法的字符串处理
* @param {string} str
@ -816,7 +955,7 @@ p {
.QCs {
display: flex;
gap: 20px;
gap: 10px;
.beta-gamma-spectrum {
flex: 10;
@ -832,7 +971,7 @@ p {
}
.beta-gamma-chart {
height: 427px;
height: 353px;
position: relative;
.markline {
@ -847,7 +986,7 @@ p {
.rect {
position: absolute;
left: 55px;
width: 442px;
width: 446px;
border: 1px solid #0f0;
background-color: rgba(0, 255, 0, 0.4);
transform: translateY(-50%);
@ -860,7 +999,7 @@ p {
flex: 11;
.gamma-gated-chart {
height: 250px;
height: 200px;
position: relative;
.ant-btn {
@ -871,12 +1010,12 @@ p {
}
.channel-and-energy {
margin-top: 20px;
margin-top: 10px;
display: flex;
justify-content: space-between;
align-items: center;
.ant-input {
.ant-input-number {
width: 120px;
}
@ -886,7 +1025,7 @@ p {
}
.ant-table-wrapper {
margin-top: 20px;
margin-top: 10px;
&.has-data {
::v-deep {
@ -910,10 +1049,10 @@ p {
}
.figure {
margin-top: 20px;
margin-top: 10px;
&-chart {
height: 250px;
height: 200px;
position: relative;
.ant-btn {
@ -925,7 +1064,7 @@ p {
}
.calibration-parameter {
margin-top: 20px;
margin-top: 10px;
.calibration-funcs {
margin-top: 15px;
@ -935,7 +1074,7 @@ p {
&-func {
display: flex;
flex: 1;
gap: 20px;
gap: 10px;
> div {
&:first-child {
@ -973,9 +1112,9 @@ p {
}
.footer {
margin-top: 20px;
margin-top: 10px;
display: flex;
gap: 20px;
gap: 10px;
.title-over-border {
&:first-child {

View File

@ -11,7 +11,9 @@
:option="gammaSpectrumChartOption"
@zr:click="handleGammaSpectrumChartClick"
/>
<a-button type="primary" @click="handleSnapshot($refs.gammaSpectrumChart)">Snapshot</a-button>
<a-button type="primary" @click="handleSnapshot($refs.gammaSpectrumChart)" size="small"
>Snapshot</a-button
>
<!-- 自定义tooltip用于点击图表后的tooltip显示 -->
<div
v-if="tooltipVisible"
@ -29,13 +31,17 @@
<div class="content channel-and-energy">
<a-form-model layout="inline">
<a-form-model-item label="Channel">
<a-input v-model="channelAndEnergyModel.channel"></a-input>
<a-input-number v-model="channelAndEnergyModel.channel" size="small"></a-input-number>
</a-form-model-item>
<a-form-model-item label="Energy">
<a-input ref="energyInputRef" v-model="channelAndEnergyModel.energy"></a-input>
<a-input-number
ref="energyInputRef"
v-model="channelAndEnergyModel.energy"
size="small"
></a-input-number>
</a-form-model-item>
</a-form-model>
<a-button type="primary" @click="handleAddChannelAndEnergy">Add</a-button>
<a-button type="primary" @click="handleAddChannelAndEnergy" size="small">Add</a-button>
</div>
<!-- 表格开始 -->
<a-table
@ -57,7 +63,7 @@
<div class="content">
<div class="figure-chart">
<custom-chart ref="figureChartRef" :option="figureChartOption" />
<a-button type="primary" @click="handleSnapshot($refs.figureChartRef)">Snapshot</a-button>
<a-button type="primary" @click="handleSnapshot($refs.figureChartRef)" size="small">Snapshot</a-button>
</div>
</div>
</div>
@ -89,9 +95,9 @@
<span>C to E : </span>
<span>
E =
<a-input type="number" size="small" v-model="newCalibrationFuncModel.paramA" /> +
<a-input type="number" size="small" v-model="newCalibrationFuncModel.paramB" /> *C +
<a-input type="number" size="small" v-model="newCalibrationFuncModel.paramC" /> *C <sup>2</sup>
<a-input-number size="small" v-model="newCalibrationFuncModel.paramA" /> +
<a-input-number size="small" v-model="newCalibrationFuncModel.paramB" /> *C +
<a-input-number size="small" v-model="newCalibrationFuncModel.paramC" /> *C <sup>2</sup>
</span>
</p>
<div class="func">
@ -141,11 +147,12 @@
<script>
import CustomChart from '@/components/CustomChart/index.vue'
import TitleOverBorder from '@/views/spectrumAnalysis/components/TitleOverBorder.vue'
import { getAction } from '@/api/manage'
import { getAction, postAction } from '@/api/manage'
import { graphic } from 'echarts'
import { exportEchartImg, getXAxisAndYAxisByPosition } from '@/utils/chartHelper'
import { exportEchartImg, getXAxisAndYAxisByPosition, splitAxis } from '@/utils/chartHelper'
import { cloneDeep } from 'lodash'
import { isNullOrUndefined } from '@/utils/util'
const initialGammaSpectrumChartOption = {
grid: {
@ -279,11 +286,11 @@ const initialFigureChartOption = {
const [channel, energy1] = series1.value
let html = `<div class="channel">Channel: ${channel}</div>
<div class="energy">Energy: ${energy1.toFixed(3)}</div>`
<div class="energy">Energy: ${energy1.toPrecision(6)}</div>`
if (series2) {
const [_, energy2] = series2.value
html += `<div class="warning">Energy: ${energy2}</div>`
html += `<div class="warning">Energy: ${energy2.toPrecision(6)}</div>`
}
return html
@ -347,7 +354,7 @@ const initialFigureChartOption = {
fontSize: 14,
color: '#5b9cba'
},
nameGap: 55
nameGap: 80
},
series: [
{
@ -394,7 +401,7 @@ const columns = [
title: 'Energy/keV',
dataIndex: 'energy',
align: 'center',
customRender: (text) => {
customRender: text => {
return text.toPrecision(6)
}
},
@ -418,9 +425,9 @@ const columns = [
]
const newCalibrationFuncModel = {
paramA: '',
paramB: '',
paramC: ''
paramA: undefined,
paramB: undefined,
paramC: undefined
}
export default {
@ -450,12 +457,19 @@ export default {
},
tooltipChannel: '',
channelAndEnergyModel: {},
channelAndEnergyModel: {
channel: undefined,
energy: undefined
},
newCalibrationFuncModel: cloneDeep(newCalibrationFuncModel),
newCalibrationIsAppliedTo: '2',
recalculateROICountsFor: []
recalculateROICountsFor: [],
count: 0, // tableWidgets
isFirstFitting: true,
isInverse: false //
}
},
created() {
@ -480,22 +494,32 @@ export default {
this.c2e = CToE
this.e2c = EToC
this.oldScatterSeries = oldScatterSeries
this.count = oldScatterSeries.length
this.isFirstFitting = true
const interval = Math.ceil(((max - min) / 4) * 1.1)
this.gammaSpectrumChartOption.yAxis.max = interval * 4
this.gammaSpectrumChartOption.yAxis.min = min
this.gammaSpectrumChartOption.yAxis.interval = interval
const { max: _max, min: _min, interval: _interval } = splitAxis(max, min, 4)
this.gammaSpectrumChartOption.yAxis.max = _max
this.gammaSpectrumChartOption.yAxis.min = _min
this.gammaSpectrumChartOption.yAxis.interval = _interval
this.gammaSpectrumChartOption.series.data = gammaSpectrum.map(({ x, y }) => [x, y])
const gammaEnergyValue = gammaEnergy.map(item => item[0])
const gammaEnergyMax = Math.ceil(Math.max(...gammaEnergyValue))
const gammaEnergyMin = Math.floor(Math.min(...gammaEnergyValue))
const gammaEnergyInterval = Math.ceil(((gammaEnergyMax - gammaEnergyMin) / 4) * 1.1)
this.figureChartOption.yAxis.max = gammaEnergyInterval * 4
this.figureChartOption.yAxis.min = gammaEnergyMin
this.figureChartOption.yAxis.interval = Math.ceil((gammaEnergyMax * 1.1) / 4)
const { max: __max, min: __min, interval: __interval } = splitAxis(
Math.max(...gammaEnergyValue),
Math.min(...gammaEnergyValue),
4
)
this.figureChartOption.yAxis.max = __max
this.figureChartOption.yAxis.min = __min
this.figureChartOption.yAxis.interval = __interval
this.figureChartOption.series[0].data = gammaEnergyValue.map((item, index) => [index, item])
this.figureChartOption.series[0].markPoint.data = oldScatterSeries.map(({ x, y }) => ({ xAxis: x, yAxis: y }))
this.oldChartOption = cloneDeep(this.figureChartOption)
} else {
this.$message.error(res.message)
}
@ -539,21 +563,63 @@ export default {
handleAddChannelAndEnergy() {
const { channel, energy } = this.channelAndEnergyModel
if (!channel || !energy) {
if (isNullOrUndefined(channel) || isNullOrUndefined(energy)) {
return
}
this.list.push({
rowCount: this.list.length + 1,
channel,
energy
})
this.channelAndEnergyModel = {}
this.figureChartOption.series[1].markPoint.data.push({ xAxis: channel, yAxis: energy })
const { min, max } = this.getFigureChartMaxAndMin()
const newMax = energy > max ? energy : max
const newMin = energy < min ? energy : min
// /
if (newMax === energy || newMin === energy) {
const { max: _max, min: _min, interval } = splitAxis(newMax, newMin, 4)
this.figureChartOption.yAxis.max = _max
this.figureChartOption.yAxis.min = _min
this.figureChartOption.yAxis.interval = interval
}
this.channelAndEnergyModel = {
channel: undefined,
energy: undefined
}
this.isInverse = true
},
//
handleDel(index) {
this.list.splice(index, 1)
const willDelItem = this.list.splice(index, 1)[0]
const findIndex = this.figureChartOption.series[1].markPoint.data.findIndex(
item => item.xAxis == willDelItem.channel && item.yAxis == willDelItem.energy
)
if (-1 !== findIndex) {
const markPointData = this.figureChartOption.series[1].markPoint.data
const { max: prevMax, min: prevMin } = this.getFigureChartMaxAndMin()
const deletedItem = markPointData.splice(findIndex, 1)[0] //
// /
if (deletedItem.yAxis == prevMax || deletedItem.yAxis == prevMin) {
const { max: newMax, min: newMin } = this.getFigureChartMaxAndMin()
const { max: _max, min: _min, interval } = splitAxis(newMax, newMin, 4)
this.figureChartOption.yAxis.max = _max
this.figureChartOption.yAxis.min = _min
this.figureChartOption.yAxis.interval = interval
}
}
this.isInverse = true
},
// Reset Button
@ -561,8 +627,10 @@ export default {
this.newCalibrationFuncModel = cloneDeep(newCalibrationFuncModel)
this.list = []
this.newE2C = []
this.figureChartOption = this.oldChartOption
this.figureChartOption = cloneDeep(this.oldChartOption)
this.isFirstFitting = true
this.isInverse = false
},
// Fitting
@ -572,35 +640,51 @@ export default {
return
}
try {
const { success, result, message } = await getAction('/spectrumAnalysis/fitting', {
const { success, result, message } = await postAction('/spectrumAnalysis/fitting', {
...this.newCalibrationFuncModel,
tempPoints: this.figureChartOption.series[0].markPoint.data.map(item => item.xAxis).join(',')
tempPoints: this.isFirstFitting
? this.oldScatterSeries
: this.list.map(item => ({ x: item.channel, y: item.energy })),
count: this.isFirstFitting || !this.isInverse ? undefined : this.count
})
if (success) {
const { EToC, newLineSeries, newScatterSeriesData, tableWidgets } = result
this.isFirstFitting = false
const { EToC, newLineSeries, newScatterSeriesData, tableWidgets, CToE } = result
this.newE2C = EToC
this.list = tableWidgets
this.oldChartOption = cloneDeep(this.figureChartOption)
if (tableWidgets) {
this.list = tableWidgets
}
// C to E
if (CToE) {
const [paramA, paramB, paramC] = CToE
this.newCalibrationFuncModel = {
paramA: Number(paramA).toPrecision(6),
paramB: Number(paramB).toPrecision(6),
paramC: Number(paramC).toPrecision(6)
}
}
const energyValues = newLineSeries.map(item => item.y)
const { max: prevMax, min: prevMin } = this.figureChartOption.yAxis
const { max: prevMax, min: prevMin } = this.oldChartOption.yAxis
const energyMax = Math.max(Math.max(...energyValues), prevMax)
const energyMin = Math.min(Math.min(...energyValues), prevMin)
const energyInterval = Math.ceil(((energyMax - energyMin) / 4) * 1.1)
this.figureChartOption.yAxis.max = energyInterval * 4
this.figureChartOption.yAxis.min = energyMin
this.figureChartOption.yAxis.interval = Math.ceil((energyMax * 1.1) / 4)
const { min, max, interval } = splitAxis(energyMax, energyMin, 4)
this.figureChartOption.yAxis.max = max
this.figureChartOption.yAxis.min = min
this.figureChartOption.yAxis.interval = interval
this.figureChartOption.series[1].data = newLineSeries.map(({ x, y }) => [x, y])
this.figureChartOption.series[1].markPoint.data = newScatterSeriesData.map(({ x, y }) => {
return {
if (newScatterSeriesData) {
this.figureChartOption.series[1].markPoint.data = newScatterSeriesData.map(({ x, y }) => ({
xAxis: x,
yAxis: y
}
})
}))
}
} else {
this.$message.error(message)
}
@ -609,6 +693,30 @@ export default {
}
},
// Figure Chart
getFigureChartMaxAndMin() {
const [series0, series1] = this.figureChartOption.series
const {
data: data0,
markPoint: { data: markPointData0 }
} = series0
const {
data: data1,
markPoint: { data: markPointData1 }
} = series1
const newArr = [
...data0.map(item => item[1]),
...markPointData0.map(item => item.yAxis),
...data1.map(item => item[1]),
...markPointData1.map(item => item.yAxis)
]
return {
max: Math.max(...newArr),
min: Math.min(...newArr)
}
},
/**
* 返回的科学计数法的字符串处理
* @param {string} str
@ -637,7 +745,7 @@ p {
}
.gamma-spectrum-qc {
.gamma-spectrum-chart {
height: 300px;
height: 200px;
position: relative;
.ant-btn {
@ -648,11 +756,11 @@ p {
}
.channel-and-energy {
margin-top: 20px;
margin-top: 10px;
display: flex;
align-items: center;
.ant-input {
.ant-input-number {
width: 150px;
}
@ -663,7 +771,7 @@ p {
}
.ant-table-wrapper {
margin-top: 20px;
margin-top: 10px;
&.has-data {
::v-deep {
@ -686,10 +794,10 @@ p {
}
.figure {
margin-top: 20px;
margin-top: 10px;
&-chart {
height: 250px;
height: 200px;
position: relative;
.ant-btn {
@ -701,7 +809,7 @@ p {
}
.calibration-parameter {
margin-top: 20px;
margin-top: 10px;
.calibration-funcs {
margin-top: 15px;
@ -711,7 +819,7 @@ p {
&-func {
display: flex;
flex: 1;
gap: 20px;
gap: 10px;
> div {
&:first-child {
@ -749,9 +857,9 @@ p {
}
.footer {
margin-top: 20px;
margin-top: 10px;
display: flex;
gap: 20px;
gap: 10px;
.title-over-border {
&:first-child {

View File

@ -1,5 +1,12 @@
<template>
<custom-modal v-model="visible" :width="1200" title="Tool of Calibration" :footer="null" destroy-on-close>
<custom-modal
v-model="visible"
:width="1200"
title="Tool of Calibration"
class="beta-gamma-tool-of-calibration"
:footer="null"
destroy-on-close
>
<a-tabs :animated="false">
<a-tab-pane tab="Gamma Detector Calibration" key="1">
<gamma-detector-calibration @exit="visible = false" :sampleId="sampleId" />
@ -26,4 +33,28 @@ export default {
}
</script>
<style></style>
<style lang="less">
.beta-gamma-tool-of-calibration {
.ant-modal-body {
padding-top: 0;
}
.ant-tabs-nav .ant-tabs-tab {
padding: 5px 10px;
margin: 0 !important;
}
}
</style>
<style lang="less" scoped>
::v-deep {
.ant-form-item-label,
.ant-form-item-control {
line-height: 30px !important;
}
.title-over-border-content {
padding: 10px;
}
}
</style>

View File

@ -1,6 +1,6 @@
<template>
<custom-modal v-model="visible" :width="750" title="QC Result">
<a-table :columns="columns" :dataSource="list" :pagination="false"> </a-table>
<a-table :loading="isLoading" :columns="columns" :dataSource="list" :pagination="false"> </a-table>
<a-space slot="custom-footer" :size="20">
<a-button type="primary">Save Text</a-button>
<a-button type="primary">Save Excel</a-button>
@ -37,7 +37,6 @@ const columns = [
customRender: 'status'
},
customCell: record => {
console.log('%c [ ]-36', 'font-size:13px; background:pink; color:#bf2c9f;', record)
return {
style: {
backgroundColor: record.status.toLowerCase() == 'pass' ? '#008000 !important' : '#f00 !important'
@ -82,7 +81,6 @@ export default {
})
if (res.success) {
const result = res.result
console.log('%c [ result ]-89', 'font-size:13px; background:pink; color:#bf2c9f;', result)
this.list.push({
qcFlags: 'Collection Time (h)',