fix: 完成AnalyzeInteractiveTool弹窗中的部分操作,修改刷选操作以解决Log10下选框表现不正确的问题,对接Comments下的View中的接口,对接Energy Calibration接口
This commit is contained in:
parent
75db97b2e8
commit
0b3258f723
|
@ -13,6 +13,10 @@ export default {
|
|||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
opts: {
|
||||
type: Object,
|
||||
default: () => {}
|
||||
},
|
||||
height: {
|
||||
type: Number,
|
||||
default: 0
|
||||
|
@ -23,7 +27,7 @@ export default {
|
|||
},
|
||||
mounted() {
|
||||
this._chart = echarts.init(this.$refs.containerRef)
|
||||
this._chart.setOption(this.option)
|
||||
this._chart.setOption(this.option, this.opts)
|
||||
this.initEventListener()
|
||||
},
|
||||
destroyed() {
|
||||
|
@ -64,7 +68,7 @@ export default {
|
|||
option: {
|
||||
handler() {
|
||||
if (this._chart) {
|
||||
this._chart.setOption(this.option)
|
||||
this._chart.setOption(this.option, this.opts)
|
||||
}
|
||||
},
|
||||
deep: true
|
||||
|
|
|
@ -13,9 +13,9 @@ export default {
|
|||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
notMerge: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
opts: {
|
||||
type: Object,
|
||||
default: () => {}
|
||||
},
|
||||
height: {
|
||||
type: Number,
|
||||
|
@ -27,7 +27,7 @@ export default {
|
|||
},
|
||||
mounted() {
|
||||
this._chart = echarts.init(this.$refs.containerRef)
|
||||
this._chart.setOption(this.option)
|
||||
this._chart.setOption(this.option, this.opts)
|
||||
this.initEventListener()
|
||||
},
|
||||
destroyed() {
|
||||
|
@ -68,9 +68,7 @@ export default {
|
|||
option: {
|
||||
handler() {
|
||||
if (this._chart) {
|
||||
this._chart.setOption(this.option, {
|
||||
notMerge: this.notMerge
|
||||
})
|
||||
this._chart.setOption(this.option, this.opts)
|
||||
}
|
||||
},
|
||||
deep: true
|
||||
|
|
|
@ -53,6 +53,10 @@ export default {
|
|||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
canDeselect: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
multiple: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
|
@ -66,7 +70,7 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
// 实现单击选中/反选功能
|
||||
customRow(record) {
|
||||
customRow(record, index) {
|
||||
const key = record[this.rowKey]
|
||||
return {
|
||||
class: this.innerSelectedRowKeys.includes(key) ? 'ant-table-row-selected' : '',
|
||||
|
@ -75,10 +79,15 @@ export default {
|
|||
if(!this.canSelect) {
|
||||
return
|
||||
}
|
||||
// 反选
|
||||
if (this.innerSelectedRowKeys.includes(key)) {
|
||||
const findIndex = this.innerSelectedRowKeys.findIndex(k => k == key)
|
||||
this.innerSelectedRowKeys.splice(findIndex, 1)
|
||||
} else {
|
||||
if(this.multiple || this.canDeselect) {
|
||||
const findIndex = this.innerSelectedRowKeys.findIndex(k => k == key)
|
||||
this.innerSelectedRowKeys.splice(findIndex, 1)
|
||||
}
|
||||
}
|
||||
// 选中
|
||||
else {
|
||||
if(this.multiple) {
|
||||
this.innerSelectedRowKeys.push(key)
|
||||
}
|
||||
|
@ -86,6 +95,8 @@ export default {
|
|||
this.innerSelectedRowKeys = [key]
|
||||
}
|
||||
}
|
||||
|
||||
this.$emit('rowClick', record, index)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,119 +1,133 @@
|
|||
<template>
|
||||
<custom-modal v-model="visible" :width="1280" title="Interactive Analyse Tools" :footer="null">
|
||||
<div class="interactive-analysis-tools">
|
||||
<div class="interactive-analysis-tools-left">
|
||||
<div class="chart">
|
||||
<custom-chart :option="option" />
|
||||
</div>
|
||||
<div class="thumbnail"></div>
|
||||
<div class="table">
|
||||
<p class="title">
|
||||
<span @click="handleChangeMarkLine('prev')">< </span>
|
||||
6 Peaks with Anthro.Nuclides
|
||||
<span @click="handleChangeMarkLine('next')">></span>
|
||||
</p>
|
||||
<custom-table
|
||||
:class="list.length ? 'has-data' : ''"
|
||||
:list="list"
|
||||
:columns="columns"
|
||||
:scroll="{ y: 288 }"
|
||||
:selectedRowKeys.sync="selectedKeys"
|
||||
>
|
||||
</custom-table>
|
||||
<div class="operators">
|
||||
<a-button type="primary" @click="nuclideReviewModalVisible = true">Nuclide Review Window</a-button>
|
||||
<a-button type="primary" @click="handleAddComment('Peak')">Add Peak Comment</a-button>
|
||||
<a-button type="primary" @click="handleAddComment('General')">Add General Comment</a-button>
|
||||
<custom-modal v-model="visible" :width="1280" title="Interactive Analyse Tools" :footer="null" destroy-on-close>
|
||||
<a-spin :spinning="isLoading">
|
||||
<div class="interactive-analysis-tools">
|
||||
<div class="interactive-analysis-tools-left">
|
||||
<div class="chart">
|
||||
<CustomChart ref="chartRef" :option="option" :opts="opts" @zr:click="handleChartClick" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="interactive-analysis-tools-right">
|
||||
<title-over-border title="Peak">
|
||||
<div class="peak-box">
|
||||
<!-- 按钮组1 -->
|
||||
<template v-if="btnGroupType == 1">
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">Insert</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">Delete</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">Fit</a-button>
|
||||
</div>
|
||||
|
||||
<div class="peak-box-item symbol" :key="4">
|
||||
<a-button type="primary" @click="handleChangeMarkLine('prev')"><</a-button>
|
||||
<a-button type="primary" @click="handleChangeMarkLine('next')">></a-button>
|
||||
</div>
|
||||
|
||||
<div class="peak-box-item base-line">
|
||||
<a-button type="primary" @click="btnGroupType = 2">BaseLine</a-button>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 按钮组2 -->
|
||||
<template v-if="btnGroupType == 2">
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">(A)dd CP</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">(R)emove CP</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">(M)odify CP</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">Edit (S)lope</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">Undo</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">Replot</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary" @click="btnGroupType = 1">Accept</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary" @click="btnGroupType = 1">Cancel</a-button>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 缩略图 -->
|
||||
<div class="thumbnail">
|
||||
<CustomChart :option="thumbnailOption" />
|
||||
</div>
|
||||
</title-over-border>
|
||||
<div class="reset-btn-box">
|
||||
<a-button type="primary">Reset Chart</a-button>
|
||||
<!-- 缩略图结束 -->
|
||||
|
||||
<!-- 表格 -->
|
||||
<div class="table">
|
||||
<p class="title">
|
||||
<span @click="handleChangeMarkLine('prev')">< </span>
|
||||
6 Peaks with Anthro.Nuclides
|
||||
<span @click="handleChangeMarkLine('next')">></span>
|
||||
</p>
|
||||
<custom-table
|
||||
:class="list.length ? 'has-data' : ''"
|
||||
:list="list"
|
||||
:columns="columns"
|
||||
:scroll="{ y: 288 }"
|
||||
:selectedRowKeys.sync="selectedKeys"
|
||||
rowKey="index"
|
||||
:canDeselect="false"
|
||||
@rowClick="handleTableRowClick"
|
||||
>
|
||||
</custom-table>
|
||||
<div class="operators">
|
||||
<a-button type="primary" @click="nuclideReviewModalVisible = true">Nuclide Review Window</a-button>
|
||||
<a-button type="primary" @click="handleAddComment('Peak')">Add Peak Comment</a-button>
|
||||
<a-button type="primary" @click="handleAddComment('General')">Add General Comment</a-button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 表格结束 -->
|
||||
</div>
|
||||
<div class="identify-box">
|
||||
<title-over-border title="Nuclide Identify">
|
||||
<a-form-model class="tolerance">
|
||||
<a-form-model-item label="Tolerance">
|
||||
<a-input-number></a-input-number>
|
||||
</a-form-model-item>
|
||||
</a-form-model>
|
||||
<div class="identify-item">
|
||||
<div class="title">
|
||||
Possible Nuclide
|
||||
</div>
|
||||
<div class="content"></div>
|
||||
</div>
|
||||
<div class="identify-item">
|
||||
<div class="title">
|
||||
Nuclide Identified
|
||||
</div>
|
||||
<div class="content"></div>
|
||||
</div>
|
||||
<div class="identify-operators">
|
||||
<a-space>
|
||||
<a-input></a-input>
|
||||
<a-button type="primary">Add</a-button>
|
||||
<a-button type="primary" @click="handleDel">Del</a-button>
|
||||
</a-space>
|
||||
|
||||
<!-- 右侧 -->
|
||||
<div class="interactive-analysis-tools-right">
|
||||
<title-over-border title="Peak">
|
||||
<div class="peak-box">
|
||||
<!-- 按钮组1 -->
|
||||
<template v-if="btnGroupType == 1">
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">Insert</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary" @click="handleDel">Delete</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">Fit</a-button>
|
||||
</div>
|
||||
|
||||
<div class="peak-box-item symbol" :key="4">
|
||||
<a-button type="primary" @click="handleChangeMarkLine('prev')"><</a-button>
|
||||
<a-button type="primary" @click="handleChangeMarkLine('next')">></a-button>
|
||||
</div>
|
||||
|
||||
<div class="peak-box-item base-line">
|
||||
<a-button type="primary" @click="btnGroupType = 2">BaseLine</a-button>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 按钮组2 -->
|
||||
<template v-if="btnGroupType == 2">
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">(A)dd CP</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">(R)emove CP</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">(M)odify CP</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">Edit (S)lope</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">Undo</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary">Replot</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary" @click="btnGroupType = 1">Accept</a-button>
|
||||
</div>
|
||||
<div class="peak-box-item">
|
||||
<a-button type="primary" @click="btnGroupType = 1">Cancel</a-button>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</title-over-border>
|
||||
<div class="reset-btn-box">
|
||||
<a-button type="primary">Reset Chart</a-button>
|
||||
</div>
|
||||
<div class="identify-box">
|
||||
<title-over-border title="Nuclide Identify">
|
||||
<a-form-model class="tolerance">
|
||||
<a-form-model-item label="Tolerance">
|
||||
<a-input-number></a-input-number>
|
||||
</a-form-model-item>
|
||||
</a-form-model>
|
||||
<div class="identify-item">
|
||||
<div class="title">
|
||||
Possible Nuclide
|
||||
</div>
|
||||
<div class="content"></div>
|
||||
</div>
|
||||
<div class="identify-item">
|
||||
<div class="title">
|
||||
Nuclide Identified
|
||||
</div>
|
||||
<div class="content"></div>
|
||||
</div>
|
||||
<div class="identify-operators">
|
||||
<a-space>
|
||||
<a-input></a-input>
|
||||
<a-button type="primary">Add</a-button>
|
||||
<a-button type="primary">Del</a-button>
|
||||
</a-space>
|
||||
</div>
|
||||
</title-over-border>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 右侧结束 -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</a-spin>
|
||||
<!-- Comment弹窗 开始 -->
|
||||
<comment-modal v-model="commentModalVisible" :type="commentType" />
|
||||
<!-- Comment弹窗 结束 -->
|
||||
|
@ -134,91 +148,110 @@ import FitPeaksAndBaseLineModal from './components/FitPeaksAndBaselineModal.vue'
|
|||
import NuclideReviewModal from './components/NuclideReviewModal.vue'
|
||||
import ModalMixin from '@/mixins/ModalMixin'
|
||||
import { getAction } from '@/api/manage'
|
||||
import { cloneDeep } from 'lodash'
|
||||
import Response from './Response.json'
|
||||
import { getXAxisAndYAxisByPosition } from '@/utils/chartHelper'
|
||||
|
||||
// 初始配置
|
||||
const initialOption = {
|
||||
grid: {
|
||||
top: 20,
|
||||
bottom: 20,
|
||||
left: 100,
|
||||
right: 20
|
||||
top: 40,
|
||||
left: 60,
|
||||
right: 50,
|
||||
containLabel: true
|
||||
},
|
||||
xAxis: {
|
||||
min: 1,
|
||||
max: 8192,
|
||||
interval: 1143,
|
||||
axisLabel: {
|
||||
color: '#fff'
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
min: 1,
|
||||
max: 994914,
|
||||
axisLabel: {
|
||||
color: '#fff'
|
||||
},
|
||||
name: 'Counts',
|
||||
nameLocation: 'center',
|
||||
nameGap: 60,
|
||||
nameTextStyle: {
|
||||
fontSize: 16,
|
||||
color: '#5b9cba'
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: 'line',
|
||||
data: [],
|
||||
itemStyle: {
|
||||
color: '#FCFE02'
|
||||
},
|
||||
markLine: {
|
||||
data: [
|
||||
{
|
||||
xAxis: 1000
|
||||
}
|
||||
],
|
||||
symbol: 'none',
|
||||
lineStyle: {
|
||||
color: '#f00'
|
||||
},
|
||||
label: {
|
||||
show: false
|
||||
title: {
|
||||
text: '',
|
||||
left: 'center',
|
||||
bottom: 10,
|
||||
textStyle: {
|
||||
color: '#8FD4F8',
|
||||
rich: {
|
||||
a: {
|
||||
padding: [0, 20, 0, 0],
|
||||
fontSize: 16
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
type: 'line',
|
||||
data: [],
|
||||
itemStyle: {
|
||||
color: '#F87E28'
|
||||
}
|
||||
},
|
||||
{
|
||||
type: 'line',
|
||||
data: [],
|
||||
itemStyle: {
|
||||
color: '#01F6FE'
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
lineStyle: {
|
||||
color: '#3CAEBB',
|
||||
width: 1
|
||||
}
|
||||
},
|
||||
formatter: params => {
|
||||
const [channel] = params[0].value
|
||||
return `<div class="channel">Channel: ${channel}</div>
|
||||
<div class="energy">Energy: ${(0).toFixed(2)}</div>`
|
||||
},
|
||||
className: 'figure-chart-option-tooltip'
|
||||
},
|
||||
xAxis: {
|
||||
name: 'Channel',
|
||||
nameTextStyle: {
|
||||
color: '#8FD4F8',
|
||||
fontSize: 16,
|
||||
align: 'right',
|
||||
verticalAlign: 'top',
|
||||
padding: [30, 0, 0, 0]
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: '#ade6ee'
|
||||
}
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
textStyle: {
|
||||
color: '#ade6ee'
|
||||
}
|
||||
},
|
||||
min: 1,
|
||||
max: 'dataMax',
|
||||
animation: false
|
||||
},
|
||||
yAxis: {
|
||||
name: 'Counts',
|
||||
nameTextStyle: {
|
||||
color: '#8FD4F8',
|
||||
fontSize: 16
|
||||
},
|
||||
axisLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#ade6ee'
|
||||
}
|
||||
},
|
||||
splitLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: 'rgba(173, 230, 238, .2)'
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
textStyle: {
|
||||
color: '#ade6ee'
|
||||
}
|
||||
},
|
||||
min: 1,
|
||||
max: 'dataMax',
|
||||
animation: false
|
||||
},
|
||||
series: [],
|
||||
brush: {}
|
||||
}
|
||||
|
||||
const columns = [
|
||||
{
|
||||
title: 'ID',
|
||||
dataIndex: 'id',
|
||||
customRender: (_, __, index) => {
|
||||
return index + 1
|
||||
},
|
||||
width: 60
|
||||
},
|
||||
{
|
||||
|
@ -258,6 +291,43 @@ const columns = [
|
|||
}
|
||||
]
|
||||
|
||||
// 缩略图配置
|
||||
const thumbnailOption = {
|
||||
grid: {
|
||||
top: 0,
|
||||
left: 5,
|
||||
right: 5,
|
||||
bottom: 0
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
show: false
|
||||
},
|
||||
min: 1,
|
||||
max: 'dataMax'
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
show: false
|
||||
},
|
||||
min: 1
|
||||
},
|
||||
series: []
|
||||
}
|
||||
export default {
|
||||
mixins: [ModalMixin],
|
||||
components: {
|
||||
|
@ -269,15 +339,19 @@ export default {
|
|||
},
|
||||
props: {
|
||||
sampleId: {
|
||||
type: Number,
|
||||
required: true
|
||||
type: Number
|
||||
}
|
||||
},
|
||||
data() {
|
||||
this.columns = columns
|
||||
return {
|
||||
option: initialOption,
|
||||
option: cloneDeep(initialOption),
|
||||
opts: { notMerge: false },
|
||||
thumbnailOption: cloneDeep(thumbnailOption),
|
||||
|
||||
isLoading: false,
|
||||
list: [],
|
||||
|
||||
commentModalVisible: false, // Comment 弹窗是否显示
|
||||
commentType: 'Peak',
|
||||
|
||||
|
@ -292,11 +366,104 @@ export default {
|
|||
methods: {
|
||||
async getInfo() {
|
||||
try {
|
||||
this.isLoading = true
|
||||
this.option.series = []
|
||||
|
||||
const { success, result, message } = await getAction('/gamma/InteractiveTool', {
|
||||
sampleId: this.sampleId
|
||||
})
|
||||
if (success) {
|
||||
console.log('%c [ ]-300', 'font-size:13px; background:pink; color:#bf2c9f;', result)
|
||||
const {
|
||||
barChart,
|
||||
channelBaseCPChart,
|
||||
channelBaseLineChart,
|
||||
channelCountChart,
|
||||
channelPeakChart,
|
||||
table
|
||||
} = result
|
||||
this.isLoading = false
|
||||
|
||||
console.log('%c [ ]-374', 'font-size:13px; background:pink; color:#bf2c9f;', result)
|
||||
|
||||
this.channelPeakChart = channelPeakChart
|
||||
|
||||
const series = []
|
||||
|
||||
// 推入BaseLine
|
||||
series.push({
|
||||
...this.buildSeriesOption(
|
||||
'BaseLine',
|
||||
channelBaseLineChart.pointlist.map(({ x, y }) => [x, y]),
|
||||
`rgb(${channelBaseLineChart.color})`
|
||||
),
|
||||
markLine: {
|
||||
silent: true,
|
||||
symbol: 'none',
|
||||
label: {
|
||||
show: false
|
||||
},
|
||||
lineStyle: {
|
||||
color: 'red',
|
||||
width: 1
|
||||
},
|
||||
data: [{ xAxis: -1 }]
|
||||
},
|
||||
zlevel: 10
|
||||
})
|
||||
|
||||
// 推入Count
|
||||
series.push(
|
||||
this.buildSeriesOption(
|
||||
'CountChart',
|
||||
channelCountChart.pointlist.map(({ x, y }) => [x, y]),
|
||||
`rgb(${channelCountChart.color})`
|
||||
)
|
||||
)
|
||||
|
||||
// 推入Peak
|
||||
const peakSeries = []
|
||||
channelPeakChart.forEach((item, index) => {
|
||||
peakSeries.push(
|
||||
this.buildSeriesOption(
|
||||
'Peak_' + (index + 1),
|
||||
item.pointlist.map(({ x, y }) => [x, y]),
|
||||
`rgb(${item.color})`
|
||||
)
|
||||
)
|
||||
})
|
||||
|
||||
series.push(...peakSeries)
|
||||
|
||||
// 推入基线控制点
|
||||
series.push({
|
||||
name: 'BaseLine_Ctrl_Point',
|
||||
type: 'scatter',
|
||||
data: channelBaseCPChart.map(({ size, color, point: { x, y } }) => {
|
||||
return {
|
||||
value: [x, y],
|
||||
itemStyle: {
|
||||
color: 'transparent',
|
||||
borderColor: color,
|
||||
borderWidth: size / 2
|
||||
}
|
||||
}
|
||||
}),
|
||||
emphasis: {
|
||||
disabled: true
|
||||
},
|
||||
animation: false,
|
||||
zlevel: 20
|
||||
})
|
||||
|
||||
this.thumbnailOption.series.push(
|
||||
this.buildSeriesOption(
|
||||
'BarChart',
|
||||
barChart.map(({ x, y }) => [x, y])
|
||||
)
|
||||
)
|
||||
|
||||
this.list = table
|
||||
this.option.series = series
|
||||
} else {
|
||||
this.$message.error(message)
|
||||
}
|
||||
|
@ -305,28 +472,118 @@ export default {
|
|||
}
|
||||
},
|
||||
|
||||
beforeModalOpen() {
|
||||
this.getInfo()
|
||||
// 构建series
|
||||
buildSeriesOption(name, data, color, extra = {}) {
|
||||
return {
|
||||
name,
|
||||
type: 'line',
|
||||
data,
|
||||
itemStyle: {
|
||||
color
|
||||
},
|
||||
lineStyle: {
|
||||
width: 1
|
||||
},
|
||||
symbol: 'none',
|
||||
symbolSize: 1,
|
||||
emphasis: {
|
||||
disabled: true
|
||||
},
|
||||
animation: false,
|
||||
...extra
|
||||
}
|
||||
},
|
||||
|
||||
// 切换图表上的红色竖线
|
||||
handleChangeMarkLine(direction) {
|
||||
if (direction == 'prev') {
|
||||
this.option.series[0].markLine.data[0].xAxis = 900
|
||||
} else if (direction == 'next') {
|
||||
this.option.series[0].markLine.data[0].xAxis = 1100
|
||||
}
|
||||
this.list = new Array(20).fill(0).map((_, index) => ({
|
||||
id: index.toString(),
|
||||
energy: 'energy',
|
||||
centroid: 'centroid',
|
||||
fwhm: 'fwhm',
|
||||
area: 'area',
|
||||
detectability: 'detectability',
|
||||
cmnt: 'cmnt',
|
||||
nuclides: 'nuclides'
|
||||
}))
|
||||
beforeModalOpen() {
|
||||
this.getInfo()
|
||||
this.opts.notMerge = false
|
||||
|
||||
this.$nextTick(() => {
|
||||
this.option.brush = { toolbox: [] }
|
||||
this.selectedKeys = []
|
||||
})
|
||||
},
|
||||
|
||||
// 点击图表,设置红线,改变表格的选中项
|
||||
handleChartClick(param) {
|
||||
console.log('%c [ param ]-510', 'font-size:13px; background:pink; color:#bf2c9f;', param)
|
||||
const { offsetX, offsetY } = param
|
||||
const point = getXAxisAndYAxisByPosition(this.$refs.chartRef.getChartInstance(), offsetX, offsetY)
|
||||
if (point) {
|
||||
const xAxis = parseInt(point[0].toFixed())
|
||||
console.log('%c [ xAxis ]-515', 'font-size:13px; background:pink; color:#bf2c9f;', xAxis)
|
||||
this.option.series[0].markLine.data[0].xAxis = xAxis
|
||||
|
||||
// 获取每一段 Channel 中的最大值
|
||||
const maxXAxises = this.getPeakMaxValues()
|
||||
console.log('%c [ maxXAxises ]-519', 'font-size:13px; background:pink; color:#bf2c9f;', maxXAxises)
|
||||
|
||||
let index = 0
|
||||
// 计算当前选中的xAxis跟哪条 peak的最大值 最近
|
||||
if (xAxis >= maxXAxises[maxXAxises.length - 1]) {
|
||||
index = maxXAxises.length - 1
|
||||
} else if (xAxis <= maxXAxises[0]) {
|
||||
index = 0
|
||||
} else {
|
||||
for (let i = 1; i < maxXAxises.length; i++) {
|
||||
const prev = maxXAxises[i - 1]
|
||||
const curr = maxXAxises[i]
|
||||
|
||||
console.log('%c [ ]-533', 'font-size:13px; background:pink; color:#bf2c9f;', prev, curr)
|
||||
if (xAxis >= prev && xAxis <= curr) {
|
||||
index = xAxis - prev < curr - xAxis ? i - 1 : i
|
||||
break
|
||||
}
|
||||
continue
|
||||
}
|
||||
}
|
||||
console.log('%c [ index ]-541', 'font-size:13px; background:pink; color:#bf2c9f;', index)
|
||||
this.selectedKeys = [this.list[index].index]
|
||||
}
|
||||
},
|
||||
|
||||
// 切换图表上的红色竖线及表格选中
|
||||
handleChangeMarkLine(direction) {
|
||||
const markLineOption = this.option.series[0].markLine.data[0]
|
||||
const prevAxis = markLineOption.xAxis
|
||||
|
||||
// 获取每一段 Channel 中的最大值
|
||||
const maxXAxises = this.getPeakMaxValues()
|
||||
if (direction == 'next') {
|
||||
// 找到第一个比prevAxis大的xAxis
|
||||
const find = maxXAxises.find(xAxis => xAxis > prevAxis)
|
||||
if (find) {
|
||||
markLineOption.xAxis = find
|
||||
}
|
||||
} else if (direction == 'prev') {
|
||||
// 找到第一个比prevAxis小的xAxis
|
||||
const find = cloneDeep(maxXAxises)
|
||||
.reverse()
|
||||
.find(xAxis => xAxis < prevAxis)
|
||||
if (find) {
|
||||
markLineOption.xAxis = find
|
||||
}
|
||||
}
|
||||
|
||||
const xAxis = markLineOption.xAxis
|
||||
if (xAxis >= 0) {
|
||||
const index = maxXAxises.findIndex(item => item == xAxis)
|
||||
if (index !== -1) {
|
||||
this.selectedKeys = [this.list[index].index]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// 获取每一段 Channel 中的最大值
|
||||
getPeakMaxValues() {
|
||||
const maxXAxises = this.channelPeakChart.map(item => {
|
||||
const allY = item.pointlist.map(point => point.y)
|
||||
const max = item.pointlist.find(point => point.y == Math.max(...allY))
|
||||
return max.x
|
||||
})
|
||||
return maxXAxises
|
||||
},
|
||||
|
||||
// 显示comment弹窗
|
||||
handleAddComment(type) {
|
||||
this.commentType = type
|
||||
|
@ -336,7 +593,7 @@ export default {
|
|||
// 删除
|
||||
handleDel() {
|
||||
if (!this.selectedKeys.length) {
|
||||
this.$message.warn('Please Select At Least 1 Peak To Delete')
|
||||
this.$message.warn('No peak to delete.')
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -344,7 +601,46 @@ export default {
|
|||
title: 'Warning',
|
||||
content: 'Are you sure to delete this peak?',
|
||||
onOk: () => {
|
||||
console.log('%c [ ]-294', 'font-size:13px; background:pink; color:#bf2c9f;', this.selectedKeys)
|
||||
const [willDelKey] = this.selectedKeys
|
||||
const findIndex = this.list.findIndex(item => item.index == willDelKey)
|
||||
this.list.splice(findIndex, 1)
|
||||
this.selectedKeys = []
|
||||
|
||||
const seriesIndex = this.option.series.findIndex(item => {
|
||||
return item.name == 'Peak_' + willDelKey
|
||||
})
|
||||
|
||||
this.opts.notMerge = true
|
||||
this.option.series.splice(seriesIndex, 1)
|
||||
this.channelPeakChart.splice(findIndex, 1)
|
||||
|
||||
this.$nextTick(() => {
|
||||
this.opts.notMerge = false
|
||||
this.option.brush = { toolbox: [] }
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 表格的行点击
|
||||
handleTableRowClick(_, index) {
|
||||
const pointlist = this.channelPeakChart[index].pointlist
|
||||
|
||||
const allY = pointlist.map(point => point.y)
|
||||
const findMax = pointlist.find(point => point.y == Math.max(...allY))
|
||||
this.option.series[0].markLine.data[0].xAxis = findMax.x
|
||||
},
|
||||
|
||||
// 鼠标按下时开启可刷选状态
|
||||
handleMouseDown() {
|
||||
const chart = this.$refs.chartRef.getChartInstance()
|
||||
chart.dispatchAction({
|
||||
type: 'takeGlobalCursor',
|
||||
// 如果想变为“可刷选状态”,必须设置。不设置则会关闭“可刷选状态”。
|
||||
key: 'brush',
|
||||
brushOption: {
|
||||
// 参见 brush 组件的 brushType。如果设置为 false 则关闭“可刷选状态”。
|
||||
brushType: 'rect'
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -377,6 +673,7 @@ export default {
|
|||
font-size: 20px;
|
||||
text-align: center;
|
||||
margin-bottom: 10px;
|
||||
user-select: none;
|
||||
|
||||
span {
|
||||
cursor: pointer;
|
||||
|
|
|
@ -115,8 +115,7 @@ export default {
|
|||
mixins: [ModalMixin],
|
||||
props: {
|
||||
sampleId: {
|
||||
type: Number,
|
||||
required: true
|
||||
type: Number
|
||||
}
|
||||
},
|
||||
data() {
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
</title-over-border>
|
||||
<!-- 右侧图表 -->
|
||||
<div class="statistics-paramer-history-chart">
|
||||
<custom-chart ref="chartRef" :option="option" :notMerge="true"></custom-chart>
|
||||
<custom-chart ref="chartRef" :option="option" :opts="{ notMerge: true }"></custom-chart>
|
||||
</div>
|
||||
</div>
|
||||
</custom-modal>
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
</title-over-border>
|
||||
<!-- 右侧图表 -->
|
||||
<div class="statistics-paramer-history-chart">
|
||||
<custom-chart ref="chartRef" :option="option" :notMerge="true"></custom-chart>
|
||||
<custom-chart ref="chartRef" :option="option" :opts="{ notMerge: true }"></custom-chart>
|
||||
</div>
|
||||
</div>
|
||||
</custom-modal>
|
||||
|
|
|
@ -1,89 +1,90 @@
|
|||
<template>
|
||||
<custom-modal v-model="visible" :width="1280" title="Energy Calibration" :footer="null">
|
||||
<div class="energy-calibration">
|
||||
<div class="left">
|
||||
<!-- Calibration Data -->
|
||||
<title-over-border title="Calibration Data">
|
||||
<div class="calibration-data">
|
||||
<a-form-model
|
||||
:colon="false"
|
||||
:labelCol="{
|
||||
style: {
|
||||
width: '70px',
|
||||
textAlign: 'left',
|
||||
flexShrink: 0
|
||||
}
|
||||
}"
|
||||
:wrapperCol="{
|
||||
style: {
|
||||
flex: 1
|
||||
}
|
||||
}"
|
||||
>
|
||||
<a-form-model-item label="Channel">
|
||||
<a-input></a-input>
|
||||
</a-form-model-item>
|
||||
<a-form-model-item label="Energy">
|
||||
<a-input></a-input>
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="' '">
|
||||
<a-button type="primary">Insert</a-button>
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="' '">
|
||||
<a-button type="primary">Modify</a-button>
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="' '">
|
||||
<a-button type="primary">Delete</a-button>
|
||||
</a-form-model-item>
|
||||
</a-form-model>
|
||||
<!-- 表格 -->
|
||||
<a-table
|
||||
:columns="columns"
|
||||
:dataSource="list"
|
||||
:pagination="false"
|
||||
:class="list.length ? 'has-data' : ''"
|
||||
:scroll="{ y: 182 }"
|
||||
></a-table>
|
||||
<!-- 表格结束 -->
|
||||
<div class="operators">
|
||||
<div>
|
||||
<a-button type="primary">Call</a-button>
|
||||
<a-button type="primary">Save</a-button>
|
||||
</div>
|
||||
<div>
|
||||
<a-button type="primary">Apply</a-button>
|
||||
<a-spin :spinning="isLoading">
|
||||
<div class="energy-calibration">
|
||||
<div class="left">
|
||||
<!-- Calibration Data -->
|
||||
<title-over-border title="Calibration Data">
|
||||
<div class="calibration-data">
|
||||
<a-form-model
|
||||
:colon="false"
|
||||
:labelCol="{
|
||||
style: {
|
||||
width: '70px',
|
||||
textAlign: 'left',
|
||||
flexShrink: 0
|
||||
}
|
||||
}"
|
||||
:wrapperCol="{
|
||||
style: {
|
||||
flex: 1
|
||||
}
|
||||
}"
|
||||
>
|
||||
<a-form-model-item label="Channel">
|
||||
<a-input></a-input>
|
||||
</a-form-model-item>
|
||||
<a-form-model-item label="Energy">
|
||||
<a-input></a-input>
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="' '">
|
||||
<a-button type="primary">Insert</a-button>
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="' '">
|
||||
<a-button type="primary">Modify</a-button>
|
||||
</a-form-model-item>
|
||||
<a-form-model-item :label="' '">
|
||||
<a-button type="primary">Delete</a-button>
|
||||
</a-form-model-item>
|
||||
</a-form-model>
|
||||
<!-- 表格 -->
|
||||
<a-table
|
||||
:columns="columns"
|
||||
:dataSource="list"
|
||||
:pagination="false"
|
||||
:class="list.length ? 'has-data' : ''"
|
||||
:scroll="{ y: 182 }"
|
||||
></a-table>
|
||||
<!-- 表格结束 -->
|
||||
<div class="operators">
|
||||
<div>
|
||||
<a-button type="primary">Call</a-button>
|
||||
<a-button type="primary">Save</a-button>
|
||||
</div>
|
||||
<div>
|
||||
<a-button type="primary">Apply</a-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</title-over-border>
|
||||
<!-- Equation -->
|
||||
<title-over-border class="mt-20" title="Equation">
|
||||
<div class="equation">
|
||||
Energy = -0.056137 + C * 0.334493 + C<sup>2</sup> * 3.10365e - 08 + C<sup>3</sup> * -4.05186e - 12
|
||||
</div>
|
||||
</title-over-border>
|
||||
<!-- curve -->
|
||||
<title-over-border class="mt-20" title="curve">
|
||||
<div class="curve">
|
||||
<custom-chart :option="option" />
|
||||
</div>
|
||||
</title-over-border>
|
||||
</div>
|
||||
<div class="right">
|
||||
<title-over-border title="Data Source" style="height: 100%">
|
||||
<div class="data-source">
|
||||
<div class="data-source-main">
|
||||
<div class="title">PHD</div>
|
||||
<div class="content"></div>
|
||||
</title-over-border>
|
||||
<!-- Equation -->
|
||||
<title-over-border class="mt-20" title="Equation">
|
||||
<div class="equation" v-html="equation"></div>
|
||||
</title-over-border>
|
||||
<!-- curve -->
|
||||
<title-over-border class="mt-20" title="curve">
|
||||
<div class="curve">
|
||||
<custom-chart :option="option" />
|
||||
</div>
|
||||
<div class="footer mt-20">
|
||||
<a-button type="primary">Set to Current</a-button>
|
||||
<div class="mt-20">CallUpdate2</div>
|
||||
</title-over-border>
|
||||
</div>
|
||||
<div class="right">
|
||||
<title-over-border title="Data Source" style="height: 100%">
|
||||
<div class="data-source">
|
||||
<div class="content">
|
||||
<div class="item" v-for="(item, index) in dataSourceList" :key="index">
|
||||
{{ item }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer mt-20">
|
||||
<a-button type="primary">Set to Current</a-button>
|
||||
<div class="mt-20">CallUpdate2</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</title-over-border>
|
||||
</title-over-border>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</a-spin>
|
||||
</custom-modal>
|
||||
</template>
|
||||
|
||||
|
@ -91,6 +92,8 @@
|
|||
import ModalMixin from '@/mixins/ModalMixin'
|
||||
import TitleOverBorder from '../TitleOverBorder.vue'
|
||||
import CustomChart from '@/components/CustomChart/index.vue'
|
||||
import { getAction } from '@/api/manage'
|
||||
import { cloneDeep } from 'lodash'
|
||||
|
||||
const columns = [
|
||||
{
|
||||
|
@ -188,18 +191,46 @@ const initialOption = {
|
|||
export default {
|
||||
components: { TitleOverBorder, CustomChart },
|
||||
mixins: [ModalMixin],
|
||||
props: {
|
||||
sampleId: {
|
||||
type: Number
|
||||
}
|
||||
},
|
||||
data() {
|
||||
this.columns = columns
|
||||
return {
|
||||
list: [
|
||||
{
|
||||
energy: 'energy',
|
||||
channel: 'channel',
|
||||
fit: 'fit',
|
||||
delta: 'delta'
|
||||
isLoading: false,
|
||||
equation: '',
|
||||
dataSourceList: [],
|
||||
list: [],
|
||||
option: cloneDeep(initialOption)
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async getData() {
|
||||
try {
|
||||
this.isLoading = true
|
||||
const { success, result, message } = await getAction('/gamma/energyCalibration', {
|
||||
sampleId: this.sampleId
|
||||
})
|
||||
this.isLoading = false
|
||||
if (success) {
|
||||
console.log('%c [ ]-220', 'font-size:13px; background:pink; color:#bf2c9f;', result)
|
||||
const { AllData, equation, list_dataSource, param, table, uncert } = result
|
||||
|
||||
this.dataSourceList = list_dataSource
|
||||
this.equation = equation
|
||||
this.list = table
|
||||
} else {
|
||||
this.$message.error(message)
|
||||
}
|
||||
],
|
||||
option: initialOption
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
},
|
||||
|
||||
beforeModalOpen() {
|
||||
this.getData()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -281,7 +312,7 @@ export default {
|
|||
}
|
||||
|
||||
.equation {
|
||||
height: 32px;
|
||||
height: 40px;
|
||||
line-height: 32px;
|
||||
text-align: center;
|
||||
background-color: #1b5465;
|
||||
|
@ -297,16 +328,17 @@ export default {
|
|||
margin-left: 20px;
|
||||
|
||||
.data-source {
|
||||
.title {
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
background-color: #296d81;
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
.content {
|
||||
height: 300px;
|
||||
height: 330px;
|
||||
background-color: #275466;
|
||||
overflow: auto;
|
||||
|
||||
.item {
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
background-color: #296d81;
|
||||
padding: 0 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
<template>
|
||||
<custom-modal v-model="visible" title="Spectrum Comments" :okHandler="handleOk" :footer="isAdd ? undefined : null">
|
||||
<a-textarea v-model="comments" :rows="8" :disabled="!isAdd"></a-textarea>
|
||||
<a-spin :spinning="isLoading">
|
||||
<a-textarea v-model="comments" :rows="8" :disabled="!isAdd"></a-textarea>
|
||||
</a-spin>
|
||||
</custom-modal>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getAction } from '@/api/manage'
|
||||
import ModalMixin from '@/mixins/ModalMixin'
|
||||
export default {
|
||||
mixins: [ModalMixin],
|
||||
|
@ -12,17 +15,42 @@ export default {
|
|||
isAdd: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
sampleId: {
|
||||
type: Number
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
isLoading: false,
|
||||
comments: ''
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// ModalMixin 中的生命周期方法
|
||||
beforeModalOpen() {
|
||||
this.comments = ''
|
||||
if (this.isAdd) {
|
||||
this.comments = ''
|
||||
} else {
|
||||
this.getInfo()
|
||||
}
|
||||
},
|
||||
|
||||
async getInfo() {
|
||||
try {
|
||||
this.isLoading = true
|
||||
const { success, result, message } = await getAction('/gamma/viewComment', {
|
||||
sampleId: this.sampleId
|
||||
})
|
||||
this.isLoading = false
|
||||
if (success) {
|
||||
this.comments = result
|
||||
} else {
|
||||
this.$message.error(message)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
},
|
||||
handleOk() {
|
||||
console.log('%c [ ]-26', 'font-size:13px; background:pink; color:#bf2c9f;', this.comments)
|
||||
|
|
|
@ -123,8 +123,7 @@ export default {
|
|||
mixins: [ModalMixin],
|
||||
props: {
|
||||
sampleId: {
|
||||
type: Number,
|
||||
required: true
|
||||
type: Number
|
||||
}
|
||||
},
|
||||
data() {
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
@brushEnd="handleBrushEnd"
|
||||
style="height: 100%"
|
||||
/>
|
||||
|
||||
<!-- 右上角缩略图 -->
|
||||
<div class="gamma-analysis-thumbnail">
|
||||
<custom-3d-chart
|
||||
ref="thumbnailChartRef"
|
||||
|
@ -52,6 +52,7 @@
|
|||
style="height: 100%"
|
||||
/>
|
||||
</div>
|
||||
<!-- 缩略图结束 -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- 主体部分结束 -->
|
||||
|
@ -70,6 +71,7 @@ import ButtonWithSwitchIcon from './components/SubOperators/ButtonWithSwitchIcon
|
|||
import { getAction } from '@/api/manage'
|
||||
import Response from './response.json'
|
||||
import { getXAxisAndYAxisByPosition } from '@/utils/chartHelper'
|
||||
import { cloneDeep } from 'lodash'
|
||||
|
||||
// 初始配置
|
||||
const initialOption = {
|
||||
|
@ -97,8 +99,9 @@ const initialOption = {
|
|||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
lineStyle: {
|
||||
color: '#099D24',
|
||||
width: 2
|
||||
color: '#3CAEBB',
|
||||
width: 1,
|
||||
type: 'solid'
|
||||
}
|
||||
},
|
||||
formatter: undefined,
|
||||
|
@ -126,12 +129,18 @@ const initialOption = {
|
|||
color: '#ade6ee'
|
||||
}
|
||||
},
|
||||
min: 0,
|
||||
min: 1,
|
||||
max: 'dataMax',
|
||||
animation: false
|
||||
animation: false,
|
||||
axisLabel: {
|
||||
formatter: value => {
|
||||
return parseInt(value)
|
||||
}
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
name: 'Counts',
|
||||
type: 'value',
|
||||
nameTextStyle: {
|
||||
color: '#8FD4F8',
|
||||
fontSize: 16
|
||||
|
@ -153,9 +162,14 @@ const initialOption = {
|
|||
color: '#ade6ee'
|
||||
}
|
||||
},
|
||||
min: 0,
|
||||
min: 1,
|
||||
max: 'dataMax',
|
||||
animation: false
|
||||
animation: false,
|
||||
axisLabel: {
|
||||
formatter: (value) => {
|
||||
return value.toFixed(1)
|
||||
}
|
||||
}
|
||||
},
|
||||
series: [],
|
||||
brush: {}
|
||||
|
@ -180,10 +194,11 @@ const thumbnailOption = {
|
|||
axisLabel: {
|
||||
show: false
|
||||
},
|
||||
min: 0,
|
||||
min: 1,
|
||||
max: 'dataMax'
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
|
@ -192,7 +207,9 @@ const thumbnailOption = {
|
|||
},
|
||||
axisLabel: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
min: 1,
|
||||
max: 'dataMax',
|
||||
},
|
||||
series: []
|
||||
}
|
||||
|
@ -215,8 +232,8 @@ export default {
|
|||
data() {
|
||||
return {
|
||||
isLoading: false,
|
||||
option: initialOption,
|
||||
thumbnailOption,
|
||||
option: cloneDeep(initialOption),
|
||||
thumbnailOption: cloneDeep(thumbnailOption),
|
||||
|
||||
detailedInfomation: [],
|
||||
qcFlags: [],
|
||||
|
@ -244,7 +261,6 @@ export default {
|
|||
dbName,
|
||||
sampleId
|
||||
})
|
||||
// const { success, result, message } = Response
|
||||
console.log('%c [ result ]-243', 'font-size:13px; background:pink; color:#bf2c9f;', result)
|
||||
if (success) {
|
||||
this.isLoading = false
|
||||
|
@ -310,6 +326,7 @@ export default {
|
|||
this.shapeEnergyData = shapeEnergyData
|
||||
|
||||
this.option.yAxis.max = Math.ceil(Math.max(...shadowChannelChart.pointlist.map(item => item.y)) * 1.1)
|
||||
this.thumbnailOption.yAxis.max = Math.ceil(Math.max(...shadowChannelChart.pointlist.map(item => item.y)) * 1.1)
|
||||
|
||||
// 推入Spectrum Line
|
||||
this.option.series.push({
|
||||
|
@ -335,7 +352,7 @@ export default {
|
|||
},
|
||||
lineStyle: {
|
||||
color: 'red',
|
||||
width: 2
|
||||
width: 1
|
||||
},
|
||||
data: [{ xAxis: -1 }]
|
||||
},
|
||||
|
@ -368,7 +385,7 @@ export default {
|
|||
lineStyle: {
|
||||
type: 'solid',
|
||||
color: '#1397a3',
|
||||
width: 2
|
||||
width: 1
|
||||
},
|
||||
data: []
|
||||
}
|
||||
|
@ -431,7 +448,7 @@ export default {
|
|||
// 推入基线控制点
|
||||
this.option.series.push({
|
||||
name: 'BaseLine_Ctrl_Point',
|
||||
type: 'scatterGL',
|
||||
type: 'scatter',
|
||||
data: shapeChannelData.map(({ size, color, point: { x, y } }) => {
|
||||
return {
|
||||
value: [x, y],
|
||||
|
@ -445,7 +462,8 @@ export default {
|
|||
emphasis: {
|
||||
disabled: true
|
||||
},
|
||||
animation: false
|
||||
animation: false,
|
||||
zlevel: 20
|
||||
})
|
||||
|
||||
// 推入Peak Line
|
||||
|
@ -477,15 +495,15 @@ export default {
|
|||
},
|
||||
|
||||
tooltipFormatter(params) {
|
||||
if (this.graphAssistance.axisType == 'Energy') {
|
||||
if (this.isEnergy()) {
|
||||
const energy = params[0].value[0]
|
||||
const channel = this.getChannelByEnergy(energy)
|
||||
|
||||
return `<div class="channel">Channel: ${channel}</div>
|
||||
<div class="energy">Energy: ${energy.toFixed(2)}</div>`
|
||||
} else {
|
||||
const channel = parseInt(params[0].value[0])
|
||||
const energy = this.allEnergy.pointlist[channel]
|
||||
const channel = parseInt(params[0].value[0].toFixed())
|
||||
const energy = this.allEnergy.pointlist[channel - 1]
|
||||
return energy
|
||||
? `<div class="channel">Channel: ${channel}</div>
|
||||
<div class="energy">Energy: ${energy.x.toFixed(2)}</div>`
|
||||
|
@ -499,8 +517,14 @@ export default {
|
|||
if (type == 'labelChange') {
|
||||
switch (label) {
|
||||
case 'Linear':
|
||||
this.option.yAxis.type = 'value'
|
||||
this.thumbnailOption.yAxis.type = 'value'
|
||||
this.handleReset()
|
||||
break
|
||||
case 'Log10':
|
||||
this.option.yAxis.type = 'log'
|
||||
this.thumbnailOption.yAxis.type = 'log'
|
||||
this.handleReset()
|
||||
break
|
||||
case 'Channel':
|
||||
case 'Energy':
|
||||
|
@ -574,7 +598,7 @@ export default {
|
|||
redrawLineBySeriesName(seriesName, energyData, channelData, isShow = true) {
|
||||
const series = this.findSeriesByName(seriesName)
|
||||
if (isShow) {
|
||||
const data = this.graphAssistance.axisType == 'Energy' ? energyData : channelData
|
||||
const data = this.isEnergy() ? energyData : channelData
|
||||
series.data = data.pointlist.map(({ x, y }) => [x, y])
|
||||
} else {
|
||||
series.data = []
|
||||
|
@ -584,7 +608,7 @@ export default {
|
|||
// 重绘控制点
|
||||
redrawCtrlPointBySeriesName() {
|
||||
const series = this.findSeriesByName('BaseLine_Ctrl_Point')
|
||||
const data = this.graphAssistance.axisType == 'Energy' ? this.shapeEnergyData : this.shapeChannelData
|
||||
const data = this.isEnergy() ? this.shapeEnergyData : this.shapeChannelData
|
||||
series.data = data.map(({ size, color, point: { x, y } }) => {
|
||||
return {
|
||||
value: [x, y],
|
||||
|
@ -603,7 +627,7 @@ export default {
|
|||
return -1 == item.name.indexOf('Peak_')
|
||||
})
|
||||
|
||||
const data = this.graphAssistance.axisType == 'Energy' ? this.energyPeakGroup : this.channelPeakGroup
|
||||
const data = this.isEnergy() ? this.energyPeakGroup : this.channelPeakGroup
|
||||
const peakLines = []
|
||||
data.forEach((item, index) => {
|
||||
peakLines.push({
|
||||
|
@ -627,7 +651,7 @@ export default {
|
|||
// 重绘右上角的缩略图
|
||||
redrawThumbnailChart() {
|
||||
const series = this.thumbnailOption.series[0]
|
||||
const data = this.graphAssistance.axisType == 'Energy' ? this.shadowEnergyChart : this.shadowChannelChart
|
||||
const data = this.isEnergy() ? this.shadowEnergyChart : this.shadowChannelChart
|
||||
series.data = data.pointlist.map(({ x, y }) => [x, y])
|
||||
},
|
||||
|
||||
|
@ -636,8 +660,13 @@ export default {
|
|||
const { offsetX, offsetY } = param
|
||||
const point = getXAxisAndYAxisByPosition(this.$refs.chartRef.getChartInstance(), offsetX, offsetY)
|
||||
if (point) {
|
||||
const xAxis = parseInt(point[0].toFixed())
|
||||
const xAxis = point[0]
|
||||
this.option.series[0].markLine.data[0].xAxis = xAxis
|
||||
|
||||
const channel = this.isEnergy() ? this.getChannelByEnergy(xAxis) : parseInt(xAxis.toFixed())
|
||||
const energy = this.isEnergy() ? xAxis.toFixed(2) : this.allEnergy.pointlist[channel - 1].x.toFixed(2)
|
||||
const counts = this.isEnergy() ? this.allEnergy.pointlist[channel - 1] : this.allChannel.pointlist[channel - 1]
|
||||
this.option.title.text = `{a|Channel:${channel}} {a|Energy:${energy}} {a|Counts:${counts.y}} {a|Detectability:0}`
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -725,12 +754,12 @@ export default {
|
|||
const point2 = chart.convertFromPixel({ seriesIndex: 0 }, [maxX, maxY]).map(num => parseInt(num.toFixed()))
|
||||
|
||||
const xAxisMax = chart.getModel().getComponent('xAxis').axis.scale._extent[1]
|
||||
const yAxisMax = chart.getModel().getComponent('yAxis').axis.scale._extent[1]
|
||||
const yAxisMax = this.option.yAxis.max
|
||||
|
||||
let [x1, y2, x2, y1] = [...point1, ...point2] // 根据解析出的数据确定真实的范围
|
||||
|
||||
const xAxisLimit = this.rangeNumber(0, xAxisMax)
|
||||
const yAxisLimit = this.rangeNumber(0, yAxisMax)
|
||||
const xAxisLimit = this.rangeNumber(1, xAxisMax)
|
||||
const yAxisLimit = this.rangeNumber(1, yAxisMax)
|
||||
|
||||
x1 = xAxisLimit(x1)
|
||||
x2 = xAxisLimit(x2)
|
||||
|
@ -743,13 +772,19 @@ export default {
|
|||
this.option.yAxis.min = y1
|
||||
this.option.yAxis.max = y2
|
||||
|
||||
if (this.graphAssistance.axisType == 'Energy') {
|
||||
if (this.isEnergy()) {
|
||||
const channel1 = this.getChannelByEnergy(x1)
|
||||
const channel2 = this.getChannelByEnergy(x2)
|
||||
this.setThumbnailChartRect(channel1, y2, channel2, y1)
|
||||
} else {
|
||||
this.setThumbnailChartRect(x1, y2, x2, y1)
|
||||
}
|
||||
|
||||
const thumbnailChart = this.$refs.thumbnailChartRef.getChartInstance()
|
||||
const [, maxYPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [0, y1]) // 方框的上下两条边的yAxis转为pix
|
||||
const [, minYPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [0, y2])
|
||||
const rectHeightPixel = maxYPixel - minYPixel // 计算方框的左右边长(pix)
|
||||
this.halfHeightPixel = rectHeightPixel / 2
|
||||
}
|
||||
|
||||
this.clearBrush(chart)
|
||||
|
@ -793,25 +828,31 @@ export default {
|
|||
if (point && this.thumbnailChartRect && this.thumbnailChartRect.length) {
|
||||
const [x1, y2, x2, y1] = this.thumbnailChartRect
|
||||
const halfWidth = Math.ceil((x2 - x1) / 2)
|
||||
const halfHeight = Math.ceil((y2 - y1) / 2)
|
||||
|
||||
const [, maxYAxisPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [0, this.thumbnailOption.yAxis.max]) // 缩略图最大值转为pix
|
||||
const [, minYAxisPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [0, 1])
|
||||
|
||||
let [xAxis, yAxis] = point
|
||||
|
||||
xAxis = parseInt(xAxis)
|
||||
yAxis = parseInt(yAxis)
|
||||
|
||||
const xAxisMax = thumbnailChart.getModel().getComponent('xAxis').axis.scale._extent[1]
|
||||
const yAxisMax = thumbnailChart.getModel().getComponent('yAxis').axis.scale._extent[1]
|
||||
|
||||
const xAxisLimit = this.rangeNumber(halfWidth, xAxisMax - halfWidth)
|
||||
const yAxisLimit = this.rangeNumber(halfHeight, yAxisMax - halfHeight)
|
||||
const xAxisLimit = this.rangeNumber(1 + halfWidth, xAxisMax - halfWidth)
|
||||
|
||||
const halfHeightPixel = this.halfHeightPixel
|
||||
const yAxisLimit = this.rangeNumber(maxYAxisPixel + halfHeightPixel, minYAxisPixel - halfHeightPixel)
|
||||
|
||||
xAxis = xAxisLimit(xAxis)
|
||||
yAxis = yAxisLimit(yAxis)
|
||||
|
||||
this.setThumbnailChartRect(xAxis - halfWidth, yAxis + halfHeight, xAxis + halfWidth, yAxis - halfHeight)
|
||||
let [,yAxisPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [0, yAxis])
|
||||
yAxisPixel = yAxisLimit(yAxisPixel)
|
||||
|
||||
|
||||
if (this.graphAssistance.axisType == 'Energy') {
|
||||
const minYAxis = thumbnailChart.convertFromPixel({ seriesIndex: 0 }, [0, yAxisPixel + halfHeightPixel])[1] // 再把y轴最小值从pix转为yAxis
|
||||
const maxYAxis = thumbnailChart.convertFromPixel({ seriesIndex: 0 }, [0, yAxisPixel - halfHeightPixel])[1]
|
||||
|
||||
this.setThumbnailChartRect(xAxis - halfWidth, maxYAxis, xAxis + halfWidth, minYAxis)
|
||||
|
||||
if (this.isEnergy()) {
|
||||
const x1 = parseInt(this.shadowEnergyChart.pointlist[xAxis - halfWidth].x)
|
||||
const x2 = parseInt(this.shadowEnergyChart.pointlist[xAxis + halfWidth].x)
|
||||
|
||||
|
@ -822,16 +863,16 @@ export default {
|
|||
this.option.xAxis.max = xAxis + halfWidth
|
||||
}
|
||||
|
||||
this.option.yAxis.min = yAxis - halfHeight
|
||||
this.option.yAxis.max = yAxis + halfHeight
|
||||
this.option.yAxis.min = minYAxis
|
||||
this.option.yAxis.max = maxYAxis
|
||||
}
|
||||
},
|
||||
|
||||
// 重置
|
||||
handleReset() {
|
||||
this.option.xAxis.min = 0
|
||||
this.option.xAxis.min = 1
|
||||
this.option.xAxis.max = 'dataMax'
|
||||
this.option.yAxis.min = 0
|
||||
this.option.yAxis.min = 1
|
||||
this.option.yAxis.max = Math.ceil(Math.max(...this.shadowChannelChart.pointlist.map(item => item.y)) * 1.1)
|
||||
|
||||
this.thumbnailOption.series[0].markLine.data = []
|
||||
|
@ -885,6 +926,10 @@ export default {
|
|||
}
|
||||
}
|
||||
return channel
|
||||
},
|
||||
|
||||
isEnergy() {
|
||||
return this.graphAssistance.axisType == 'Energy'
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
|
|
|
@ -96,7 +96,7 @@
|
|||
<!-- Efficiency Calibration 弹窗结束 -->
|
||||
|
||||
<!-- Energy Calibration 弹窗开始 -->
|
||||
<energy-calibration-modal v-model="energyCalibrationModalShow" />
|
||||
<energy-calibration-modal v-model="energyCalibrationModalShow" :sampleId="sampleData.sampleId" />
|
||||
<!-- Energy Calibration 弹窗结束 -->
|
||||
|
||||
<!-- Resolution Calibration 弹窗开始 -->
|
||||
|
@ -104,7 +104,11 @@
|
|||
<!-- Resolution Calibration 弹窗结束 -->
|
||||
|
||||
<!-- SpectrumComments 弹窗开始 -->
|
||||
<spectrum-comments-modal v-model="gammaCommentsModalVisible" :isAdd="isGammaCommentsAdd" />
|
||||
<spectrum-comments-modal
|
||||
v-model="gammaCommentsModalVisible"
|
||||
:isAdd="isGammaCommentsAdd"
|
||||
:sampleId="sampleData.sampleId"
|
||||
/>
|
||||
<!-- SpectrumComments 弹窗结束 -->
|
||||
|
||||
<!-- Color Config 弹窗开始 -->
|
||||
|
@ -124,7 +128,12 @@
|
|||
<!-- Config User Library 弹窗结束 -->
|
||||
|
||||
<!-- Arr 和 RRR 弹窗开始 -->
|
||||
<arr-rrr-modal v-model="arrOrRRRModalVisible" :type="arrOrRRRModalType" :sampleId="this.sampleData.sampleId" :extraData="this.arrOrRRRModalExtraData" />
|
||||
<arr-rrr-modal
|
||||
v-model="arrOrRRRModalVisible"
|
||||
:type="arrOrRRRModalType"
|
||||
:sampleId="this.sampleData.sampleId"
|
||||
:extraData="this.arrOrRRRModalExtraData"
|
||||
/>
|
||||
<!-- Arr 弹窗结束 -->
|
||||
|
||||
<!-- Spectrum 弹窗开始 -->
|
||||
|
@ -719,13 +728,25 @@ export default {
|
|||
{
|
||||
type: 'a-menu-item',
|
||||
title: 'View Comments',
|
||||
show: this.isBetaGamma || this.isGamma,
|
||||
show: this.isBetaGamma,
|
||||
handler: this.handleViewComments
|
||||
},
|
||||
{
|
||||
type: 'a-menu-item',
|
||||
title: 'Add Comments',
|
||||
show: this.isBetaGamma || this.isGamma,
|
||||
show: this.isBetaGamma,
|
||||
handler: this.handleAddComments
|
||||
},
|
||||
{
|
||||
type: 'a-menu-item',
|
||||
title: 'View',
|
||||
show: this.isGamma,
|
||||
handler: this.handleViewComments
|
||||
},
|
||||
{
|
||||
type: 'a-menu-item',
|
||||
title: 'Add',
|
||||
show: this.isGamma,
|
||||
handler: this.handleAddComments
|
||||
}
|
||||
]
|
||||
|
|
Loading…
Reference in New Issue
Block a user