Merge branch 'feature-analysis-RLR-renpy' of http://git.hivekion.com:3000/xiaoguangbin/AnalysisSystemForRadionuclide_vue into master-dev

This commit is contained in:
xiaoguangbin 2023-11-01 11:04:11 +08:00
commit 515f8ff43f
19 changed files with 17875 additions and 1031 deletions

View File

@ -1,11 +1,21 @@
<template> <template>
<a-modal :class="'custom-modal' + (innerFullscreen ? ' fullscreen' : '')" v-bind="_attrs" v-model="visible" @cancel="handleCancel"> <a-modal
:class="'custom-modal' + (innerFullscreen ? ' fullscreen' : '')"
v-bind="_attrs"
v-model="visible"
:maskClosable="false"
@cancel="handleCancel"
>
<img slot="closeIcon" src="@/assets/images/global/close.png" /> <img slot="closeIcon" src="@/assets/images/global/close.png" />
<div slot="title"> <div slot="title">
<div class="custom-modal-title"> <div class="custom-modal-title">
<span>{{ title }}</span> <span>{{ title }}</span>
<template v-if="enableFullScreen"> <template v-if="enableFullScreen">
<img v-if="innerFullscreen" src="@/assets/images/global/quit-fullscreen.png" @click="innerFullscreen = false" /> <img
v-if="innerFullscreen"
src="@/assets/images/global/quit-fullscreen.png"
@click="innerFullscreen = false"
/>
<img v-else src="@/assets/images/global/fullscreen.png" @click="innerFullscreen = true" /> <img v-else src="@/assets/images/global/fullscreen.png" @click="innerFullscreen = true" />
</template> </template>
</div> </div>
@ -24,24 +34,24 @@
export default { export default {
props: { props: {
value: { value: {
type: Boolean type: Boolean,
}, },
okHandler: { okHandler: {
type: Function type: Function,
}, },
title: { title: {
type: String type: String,
}, },
enableFullScreen: { enableFullScreen: {
type: Boolean, type: Boolean,
default: false default: false,
} },
}, },
data() { data() {
return { return {
visible: this.value, visible: this.value,
confirmLoading: false, confirmLoading: false,
innerFullscreen: false innerFullscreen: false,
} }
}, },
watch: { watch: {
@ -56,7 +66,7 @@ export default {
}, },
innerFullscreen(val) { innerFullscreen(val) {
this.$emit('fullscreen', val) this.$emit('fullscreen', val)
} },
}, },
methods: { methods: {
async onSave() { async onSave() {
@ -64,7 +74,7 @@ export default {
try { try {
this.confirmLoading = true this.confirmLoading = true
const success = await this.okHandler() const success = await this.okHandler()
if(success !== false) { if (success !== false) {
this.visible = false this.visible = false
} }
} catch (error) { } catch (error) {
@ -80,8 +90,8 @@ export default {
this.visible = false this.visible = false
}, },
handleCancel() { handleCancel() {
this.$emit("cancel") this.$emit('cancel')
} },
}, },
computed: { computed: {
_attrs() { _attrs() {
@ -96,8 +106,8 @@ export default {
// footer // footer
hasCustomFooter() { hasCustomFooter() {
return !!this.$slots['custom-footer'] return !!this.$slots['custom-footer']
} },
} },
} }
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>

View File

@ -18,3 +18,40 @@ export const transformPointListData = pointlist => {
} }
return pointlist.map(({ x, y }) => [x, y]) return pointlist.map(({ x, y }) => [x, y])
} }
// 查找最近的峰(C++相关)
export const findNearPeak = (channel, peakList) => {
let t_bFind = false, // 是否在峰内
i = 0,
peakNum = peakList.length
for (; i < peakNum; ++i) {
const peak = peakList[i]
if (channel >= peak.left && channel <= peak.right) {
// 如果 channel 在峰的左右边界内
if (peak.multiIndex > 0 && channel > peak.peakCentroid) {
// 如果是重峰,且 channel 在重峰的第一个峰的中心道右侧
let j = i
let temp = channel - peak.peakCentroid
while (++j < peakNum && peakList[j].multiIndex == peak.multiIndex) {
if (Math.abs(peakList[j].peakCentroid - channel) < temp) {
// 找出重峰中峰中心道离 channel 最近的峰
temp = Math.abs(peakList[j].peakCentroid - channel)
i = j
}
}
}
// channel 在索引(i)对应的峰内
t_bFind = true
break
} else if (peak.left > channel) {
// channel 不在任何峰内,找离它最近的峰
if (i > 0 && channel - peakList[i - 1].peakCentroid < peak.peakCentroid - channel) i -= 1
break
}
}
if (i >= peakNum) i -= 1
return {
index: i,
find: t_bFind
}
}

File diff suppressed because it is too large Load Diff

View File

@ -216,7 +216,7 @@ import Response from './Response.json'
import { updateBaseLine } from '@/utils/WasmHelper' import { updateBaseLine } from '@/utils/WasmHelper'
import RectList from './components/RectList.vue' import RectList from './components/RectList.vue'
import { isNullOrUndefined } from '@/utils/util' import { isNullOrUndefined } from '@/utils/util'
import { getLineData, transformPointListData } from '@/utils/sampleHelper' import { findNearPeak, getLineData, transformPointListData } from '@/utils/sampleHelper'
// //
const initialOption = { const initialOption = {
@ -433,6 +433,12 @@ export default {
EditSlopeModal, EditSlopeModal,
RectList, RectList,
}, },
props: {
colorConfig: {
type: Object,
default: () => ({}),
},
},
data() { data() {
this.columns = columns this.columns = columns
return { return {
@ -450,7 +456,6 @@ export default {
list: [], list: [],
BaseCtrls: {}, BaseCtrls: {},
baseCtrls_Copy: {}, baseCtrls_Copy: {},
FitBaseLine: '#fff',
sampleId: -1, sampleId: -1,
peakCommentModalVisible: false, // Comment peakCommentModalVisible: false, // Comment
@ -502,7 +507,7 @@ export default {
const currSampleDetailInfo = await this.$store.dispatch('GET_SAMPLE_DATA', inputFileName) const currSampleDetailInfo = await this.$store.dispatch('GET_SAMPLE_DATA', inputFileName)
const { const {
data: { allData, shadowChannelChart, shapeChannelData, peak }, data: { allData, shadowChannelChart, shapeChannelData, peak, BaseCtrls },
} = currSampleDetailInfo } = currSampleDetailInfo
const channelBaseLine = getLineData(allData, 'BaseLine', 'channel') const channelBaseLine = getLineData(allData, 'BaseLine', 'channel')
@ -515,8 +520,7 @@ export default {
this.channelCountChart = shadowChannelChart this.channelCountChart = shadowChannelChart
this.channelPeakChart = channelPeakGroup this.channelPeakChart = channelPeakGroup
this.energy = allEnergy this.energy = allEnergy
// this.BaseCtrls = BaseCtrls this.BaseCtrls = BaseCtrls
// this.FitBaseLine = FitBaseLine
this.barChart = shadowChannelChart this.barChart = shadowChannelChart
this.setChartOption(channelBaseLine, shadowChannelChart, channelPeakGroup, shapeChannelData, shadowChannelChart) this.setChartOption(channelBaseLine, shadowChannelChart, channelPeakGroup, shapeChannelData, shadowChannelChart)
@ -566,36 +570,15 @@ export default {
const { offsetX, offsetY } = param const { offsetX, offsetY } = param
const point = getXAxisAndYAxisByPosition(this.$refs.chartRef.getChartInstance(), offsetX, offsetY) const point = getXAxisAndYAxisByPosition(this.$refs.chartRef.getChartInstance(), offsetX, offsetY)
if (point) { if (point) {
const xAxis = parseInt(point[0].toFixed()) const xAxis = Math.round(point[0])
this.option.series[0].markLine.data[0].xAxis = xAxis this.setMarkLineXAxis(xAxis)
this.currChannel = xAxis this.currChannel = xAxis
const { index } = findNearPeak(xAxis, this.list)
// Channel
const maxXAxises = this.getPeakMaxValues()
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]
if (xAxis >= prev && xAxis <= curr) {
index = xAxis - prev < curr - xAxis ? i - 1 : i
break
}
continue
}
}
if (this.list.length) { if (this.list.length) {
const selectedRow = this.list[index] const selectedRow = this.list[index]
this.selectedKeys = [selectedRow.index] this.selectTableRow(selectedRow.index)
this.getSelPosNuclide(selectedRow) this.getSelPosNuclide(selectedRow)
this.selectedTableItem = selectedRow this.selectedTableItem = selectedRow
} }
@ -645,34 +628,43 @@ export default {
// 线 // 线
handleChangeMarkLine(direction) { handleChangeMarkLine(direction) {
const markLineOption = this.option.series[0].markLine.data[0] const prevAxis = this.getMarkLineXAxis()
const prevAxis = markLineOption.xAxis let i,
size = this.list.length
// Channel
const maxXAxises = this.getPeakMaxValues()
if (direction == 'next') { if (direction == 'next') {
// prevAxisxAxis for (i = 0; i < size; i++) {
const find = maxXAxises.find((xAxis) => xAxis > prevAxis) const centroid = Math.round(this.list[i].peakCentroid)
if (find) { if (centroid > prevAxis) {
markLineOption.xAxis = find this.setMarkLineXAxis(centroid)
const selectedRow = this.list[i]
this.selectedTableItem = selectedRow
this.selectTableRow(selectedRow.index)
this.getSelPosNuclide(selectedRow)
return
}
} }
} else if (direction == 'prev') { } else if (direction == 'prev') {
// prevAxisxAxis for (i = size - 1; i >= 0; i--) {
const find = cloneDeep(maxXAxises) if (Math.round(this.list[i].peakCentroid) < prevAxis) {
.reverse() this.setMarkLineXAxis(Math.round(this.list[i].peakCentroid))
.find((xAxis) => xAxis < prevAxis) const selectedRow = this.list[i]
if (find) { this.selectedTableItem = selectedRow
markLineOption.xAxis = find this.selectTableRow(selectedRow.index)
this.getSelPosNuclide(selectedRow)
return
} }
} }
}
},
const xAxis = markLineOption.xAxis selectTableRow(key) {
if (xAxis >= 0) { this.selectedKeys = [key]
const index = maxXAxises.findIndex((item) => item == xAxis) },
if (index !== -1) {
this.selectedKeys = [this.list[index].index] // 线
} setMarkLineXAxis(xAxis) {
} const markLineOption = this.option.series[0].markLine.data[0]
markLineOption.xAxis = xAxis
const { xAxis: chartXAxisOption } = this.option const { xAxis: chartXAxisOption } = this.option
const { max, min } = chartXAxisOption const { max, min } = chartXAxisOption
@ -688,6 +680,11 @@ export default {
} }
}, },
getMarkLineXAxis() {
const markLineOption = this.option.series[0].markLine.data[0]
return markLineOption.xAxis
},
// possible nuclide identified nuclide // possible nuclide identified nuclide
async getSelPosNuclide(row) { async getSelPosNuclide(row) {
this.model.possibleNuclide = '' this.model.possibleNuclide = ''
@ -699,7 +696,7 @@ export default {
const { sampleId, inputFileName: fileName } = this.sampleData const { sampleId, inputFileName: fileName } = this.sampleData
const { success, result, message } = await getAction('/gamma/getSelPosNuclide', { const { success, result, message } = await getAction('/gamma/getSelPosNuclide', {
sampleId, sampleId,
channel: parseInt(row.peakCentroid), channel: Math.round(row.peakCentroid),
fileName, fileName,
}) })
if (success) { if (success) {
@ -776,6 +773,7 @@ export default {
shadowEnergyChart, shadowEnergyChart,
shapeChannelData, shapeChannelData,
shapeEnergyData, shapeEnergyData,
peak: table,
}) })
this.channelPeakChart = channelPeakChart this.channelPeakChart = channelPeakChart
@ -864,6 +862,7 @@ export default {
shadowEnergyChart, shadowEnergyChart,
shapeChannelData, shapeChannelData,
shapeEnergyData, shapeEnergyData,
peak: table,
}) })
this.channelPeakChart = channelPeakChart this.channelPeakChart = channelPeakChart
@ -881,7 +880,10 @@ export default {
series.push(this.buildCtrlPoint(this.channelBaseCPChart)) series.push(this.buildCtrlPoint(this.channelBaseCPChart))
this.list = table this.list = table
this.opts.notMerge = true
this.option.series = series this.option.series = series
this.resetChartOpts()
this.selectedKeys = [] this.selectedKeys = []
} else { } else {
@ -917,7 +919,7 @@ export default {
return return
} }
const channel = row.peakCentroid const channel = Math.round(row.peakCentroid)
this.currChannel = channel this.currChannel = channel
this.option.series[0].markLine.data[0].xAxis = channel this.option.series[0].markLine.data[0].xAxis = channel
@ -1041,7 +1043,7 @@ export default {
const baseLineEditSeries = buildLineSeries( const baseLineEditSeries = buildLineSeries(
'BaseLine_Edit', 'BaseLine_Edit',
this.baseCtrls_Copy.baseline.map((val, index) => [index + 1, val]), this.baseCtrls_Copy.baseline.map((val, index) => [index + 1, val]),
this.FitBaseLine, this.colorConfig.Color_Fitbase || '#fff',
{ {
zlevel: 21, zlevel: 21,
} }

View File

@ -30,6 +30,13 @@ const columns = [
title: 'Value', title: 'Value',
dataIndex: 'value', dataIndex: 'value',
align: 'center', align: 'center',
customRender: (text) => {
if (text !== 'Match' && text !== 'UnMatch') {
return parseFloat(Number(text).toPrecision(6))
} else {
return text
}
},
}, },
{ {
title: 'Status', title: 'Status',

View File

@ -24,53 +24,59 @@ const configList = [
{ {
title: 'Spectrum Line', title: 'Spectrum Line',
key: 'Color_Spec', key: 'Color_Spec',
desc: 'Color of the original spectrum line' desc: 'Color of the original spectrum line',
}, },
{ {
title: 'Baseline', title: 'Baseline',
key: 'Color_Base', key: 'Color_Base',
desc: 'Color of baseline' desc: 'Color of baseline',
}, },
{ {
title: 'Lc Line', title: 'Lc Line',
key: 'Color_Lc', key: 'Color_Lc',
desc: 'Color of lc line' desc: 'Color of lc line',
}, },
{ {
title: 'Scac Line', title: 'Scac Line',
key: 'Color_Scac', key: 'Color_Scac',
desc: 'Color of scac line' desc: 'Color of scac line',
}, },
{ {
title: 'Peak Line', title: 'Peak Line',
key: 'Color_Peak', key: 'Color_Peak',
desc: "Color of all peaks' curve" desc: "Color of all peaks' curve",
}, },
{ {
title: 'Compare Line', title: 'Compare Line',
key: 'Color_Compare', key: 'Color_Compare',
desc: 'Color of another spectrum line which is used to compare with current spectrum' desc: 'Color of another spectrum line which is used to compare with current spectrum',
}, },
{ {
title: 'Spec Sum Line', title: 'Spec Sum Line',
key: 'Color_Strip', key: 'Color_Strip',
desc: 'Color of the line which is the sum of current spectrum and other spectrum Multiplied by a ratio' desc: 'Color of the line which is the sum of current spectrum and other spectrum Multiplied by a ratio',
}, },
{ {
title: 'Spec Cut Line', title: 'Spec Cut Line',
key: 'spectCutLine', key: 'spectCutLine',
desc: 'Color of the line which is the difference of current spectrum and other spectrum Multiplied by a ratio' desc: 'Color of the line which is the difference of current spectrum and other spectrum Multiplied by a ratio',
}, },
{ {
title: 'FitBase Line', title: 'FitBase Line',
key: 'Color_Fitbase', key: 'Color_Fitbase',
desc: 'Color of the base line in edit state' desc: 'Color of the base line in edit state',
} },
] ]
export default { export default {
mixins: [ModalMixin], mixins: [ModalMixin],
components: { components: {
ColorPicker ColorPicker,
},
props: {
colorConfig: {
type: Object,
default: () => ({}),
},
}, },
data() { data() {
this.configList = configList this.configList = configList
@ -84,8 +90,8 @@ export default {
Color_Compare: 'green', // Sample -> Compare Color_Compare: 'green', // Sample -> Compare
Color_Strip: 'rgb(0, 0, 255)', // Sample -> Compare Color_Strip: 'rgb(0, 0, 255)', // Sample -> Compare
spectCutLine: 'rgb(33, 90, 104)', // spectCutLine: 'rgb(33, 90, 104)', //
Color_Fitbase: 'white' // Interactive Tool BaseLine线 Color_Fitbase: 'white', // Interactive Tool BaseLine线
} },
} }
}, },
methods: { methods: {
@ -93,40 +99,16 @@ export default {
return color return color
}, },
async getData() { beforeModalOpen() {
try { Object.entries(this.colorConfig).forEach(([k, v]) => {
this.isLoading = true
const { success, result, message } = await getAction('/gamma/viewColorConfig')
if (success) {
Object.entries(result).forEach(([k, v]) => {
this.config[k] = v this.config[k] = v
}) })
} else {
this.$message.error(message)
}
} catch (error) {
console.error(error)
} finally {
this.isLoading = false
}
},
beforeModalOpen() {
this.getData()
}, },
// //
async handleApply() { async handleApply() {
const { const { Color_Spec, Color_Peak, Color_Lc, Color_Base, Color_Scac, Color_Compare, Color_Strip, Color_Fitbase } =
Color_Spec, this.config
Color_Peak,
Color_Lc,
Color_Base,
Color_Scac,
Color_Compare,
Color_Strip,
Color_Fitbase
} = this.config
const { success, message } = await putAction('/gamma/updateColorConfig', { const { success, message } = await putAction('/gamma/updateColorConfig', {
colorSpec: Color_Spec, colorSpec: Color_Spec,
colorPeak: Color_Peak, colorPeak: Color_Peak,
@ -135,22 +117,16 @@ export default {
colorScac: Color_Scac, colorScac: Color_Scac,
colorCompare: Color_Compare, colorCompare: Color_Compare,
colorFitbase: Color_Fitbase, colorFitbase: Color_Fitbase,
colorStrip: Color_Strip colorStrip: Color_Strip,
}) })
if (success) { if (success) {
this.$bus.$emit( this.$emit('colorChange', this.config)
'colorChange',
Object.entries(this.config).reduce((prev, [key, value]) => {
prev[key] = value
return prev
}, {})
)
} else { } else {
this.$message.error(message) this.$message.error(message)
throw new Error(message) throw new Error(message)
} }
} },
} },
} }
</script> </script>

View File

@ -12,13 +12,13 @@
style: { style: {
width: '70px', width: '70px',
textAlign: 'left', textAlign: 'left',
flexShrink: 0 flexShrink: 0,
} },
}" }"
:wrapperCol="{ :wrapperCol="{
style: { style: {
flex: 1 flex: 1,
} },
}" }"
> >
<a-form-model-item label="Energy"> <a-form-model-item label="Energy">
@ -54,13 +54,7 @@
<div> <div>
<label> <label>
<a-button type="primary" :loading="isCalling" @click="handleCall">Call</a-button> <a-button type="primary" :loading="isCalling" @click="handleCall">Call</a-button>
<input <input ref="fileInput" type="file" accept=".ent" style="display: none" @change="handleFileChange" />
ref="fileInput"
type="file"
accept=".ent"
style="display: none;"
@change="handleFileChange"
/>
</label> </label>
<a-button type="primary" :loading="isSaving" @click="handleSave">Save</a-button> <a-button type="primary" :loading="isSaving" @click="handleSave">Save</a-button>
</div> </div>
@ -126,23 +120,23 @@ const columns = [
{ {
title: 'Energy(keV)', title: 'Energy(keV)',
dataIndex: 'energy', dataIndex: 'energy',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Efficiency', title: 'Efficiency',
dataIndex: 'efficiency', dataIndex: 'efficiency',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Fit(keV)', title: 'Fit(keV)',
dataIndex: 'fit', dataIndex: 'fit',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Delta(%)', title: 'Delta(%)',
dataIndex: 'delta', dataIndex: 'delta',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
} },
] ]
const initialOption = { const initialOption = {
@ -150,99 +144,99 @@ const initialOption = {
top: 20, top: 20,
right: 20, right: 20,
bottom: 50, bottom: 50,
left: 70 left: 70,
}, },
title: { title: {
text: 'Channel', text: 'Channel',
textStyle: { textStyle: {
color: '#8FD4F8', color: '#8FD4F8',
fontSize: 14, fontSize: 14,
fontWeight: 'normal' fontWeight: 'normal',
}, },
right: 10, right: 10,
bottom: 0 bottom: 0,
}, },
tooltip: { tooltip: {
trigger: 'axis', trigger: 'axis',
formatter: params => { formatter: (params) => {
const [x, y] = params[0].value const [x, y] = params[0].value
const energy = parseInt(x) const energy = parseInt(x)
const efficiency = y.toFixed(3) const efficiency = y.toFixed(3)
return `<div class="channel">Energy: ${energy}</div> return `<div class="channel">Energy: ${energy}</div>
<div class="energy">Efficiency: ${efficiency}</div>` <div class="energy">Efficiency: ${efficiency}</div>`
}, },
className: 'figure-chart-option-tooltip' className: 'figure-chart-option-tooltip',
}, },
xAxis: { xAxis: {
min: 1, min: 1,
max: 'dataMax', max: 'dataMax',
axisLabel: { axisLabel: {
color: '#fff' color: '#fff',
}, },
axisLine: { axisLine: {
lineStyle: { lineStyle: {
color: '#fff' color: '#fff',
} },
}, },
splitLine: { splitLine: {
show: false show: false,
} },
}, },
yAxis: { yAxis: {
axisLabel: { axisLabel: {
color: '#fff' color: '#fff',
}, },
axisTick: { axisTick: {
show: false show: false,
}, },
axisLine: { axisLine: {
lineStyle: { lineStyle: {
color: '#fff' color: '#fff',
} },
}, },
splitLine: { splitLine: {
show: false show: false,
}, },
name: 'keV', name: 'keV',
nameLocation: 'center', nameLocation: 'center',
nameGap: 50, nameGap: 50,
nameTextStyle: { nameTextStyle: {
color: '#8FD4F8', color: '#8FD4F8',
fontSize: 14 fontSize: 14,
}
}, },
series: [] },
series: [],
} }
const functions = [ const functions = [
{ {
label: 'Interpolation', label: 'Interpolation',
value: 1 value: 1,
}, },
{ {
label: 'HT Efficiency', label: 'HT Efficiency',
value: 5 value: 5,
}, },
{ {
label: 'Log Polynomial', label: 'Log Polynomial',
value: 6 value: 6,
}, },
{ {
label: 'Invlog Polynomial', label: 'Invlog Polynomial',
value: 8 value: 8,
}, },
{ {
label: 'HAE Efficiency(1-3)', label: 'HAE Efficiency(1-3)',
value: 93 value: 93,
}, },
{ {
label: 'HAE Efficiency(1-2)', label: 'HAE Efficiency(1-2)',
value: 94 value: 94,
}, },
{ {
label: 'HAE Efficiency(1-2-3)', label: 'HAE Efficiency(1-2-3)',
value: 95 value: 95,
} },
] ]
export default { export default {
@ -266,11 +260,11 @@ export default {
currSelectedDataSource: '', currSelectedDataSource: '',
appliedDataSource: '', appliedDataSource: '',
opts: { opts: {
notMerge: true notMerge: true,
}, },
ECutAnalysis_Low: -1, ECutAnalysis_Low: -1,
G_energy_span: -1, G_energy_span: -1,
funcId: 1 funcId: 1,
} }
}, },
methods: { methods: {
@ -282,7 +276,7 @@ export default {
sampleId, sampleId,
fileName, fileName,
currentText, currentText,
width: 922 width: 922,
}) })
this.isLoading = false this.isLoading = false
if (success) { if (success) {
@ -332,15 +326,15 @@ export default {
value: [x, y], value: [x, y],
itemStyle: { itemStyle: {
color: scatterPoint.color, color: scatterPoint.color,
borderWidth: 0 borderWidth: 0,
} },
} }
}), }),
emphasis: { emphasis: {
disabled: true disabled: true,
}, },
animation: false, animation: false,
zlevel: 20 zlevel: 20,
}) })
this.option.series = series this.option.series = series
} }
@ -390,7 +384,7 @@ export default {
this.list.splice(i, 0, { this.list.splice(i, 0, {
energy: energy, energy: energy,
efficiency efficiency,
}) })
this.uncert.splice(i, 0, 0.5) this.uncert.splice(i, 0, 0.5)
@ -463,12 +457,12 @@ export default {
const { success, result, message } = await postAction('/gamma/changeDataEfficiency', { const { success, result, message } = await postAction('/gamma/changeDataEfficiency', {
sampleId, sampleId,
fileName, fileName,
m_vCurEnergy: this.list.map(item => item.energy), m_vCurEnergy: this.list.map((item) => item.energy),
m_vCurEffi: this.list.map(item => item.efficiency), m_vCurEffi: this.list.map((item) => item.efficiency),
m_vCurUncert: this.uncert, m_vCurUncert: this.uncert,
m_curParam: this.param, m_curParam: this.param,
funcId: this.funcId, funcId: this.funcId,
width: 922 width: 922,
}) })
if (success) { if (success) {
this.handleResult(result) this.handleResult(result)
@ -487,10 +481,10 @@ export default {
try { try {
this.isSaving = true this.isSaving = true
const res = await postAction('/gamma/saveDataEfficiency', { const res = await postAction('/gamma/saveDataEfficiency', {
m_vCurEnergy: this.list.map(item => item.energy), m_vCurEnergy: this.list.map((item) => item.energy),
m_vCurEffi: this.list.map(item => item.efficiency), m_vCurEffi: this.list.map((item) => item.efficiency),
m_vCurUncert: this.uncert, m_vCurUncert: this.uncert,
funcId: this.funcId funcId: this.funcId,
}) })
if (typeof res == 'string') { if (typeof res == 'string') {
const blob = new Blob([res], { type: 'text/plain' }) const blob = new Blob([res], { type: 'text/plain' })
@ -548,18 +542,18 @@ export default {
let curCalName = this.currSelectedDataSource let curCalName = this.currSelectedDataSource
// InputPHD // InputPHD
if (!curCalName.includes('Input')) { if (!curCalName.includes('Input')) {
curCalName = `Input ${this.dataSourceList.filter(item => item.includes('Input')).length + 1}` curCalName = `Input ${this.dataSourceList.filter((item) => item.includes('Input')).length + 1}`
} }
const { sampleId, inputFileName: fileName } = this.sampleData const { sampleId, inputFileName: fileName } = this.sampleData
const { success, result, message } = await postAction('/gamma/applyDataEfficiency', { const { success, result, message } = await postAction('/gamma/applyDataEfficiency', {
m_vCurEnergy: this.list.map(item => item.energy), m_vCurEnergy: this.list.map((item) => item.energy),
m_vCurEffi: this.list.map(item => item.efficiency), m_vCurEffi: this.list.map((item) => item.efficiency),
m_vCurUncert: this.uncert, m_vCurUncert: this.uncert,
m_curParam: this.param, m_curParam: this.param,
curCalName, curCalName,
sampleId, sampleId,
fileName fileName,
}) })
if (success) { if (success) {
this.handleDataSourceClick(curCalName) this.handleDataSourceClick(curCalName)
@ -591,8 +585,8 @@ export default {
} catch (error) { } catch (error) {
console.error(error) console.error(error)
} }
} },
} },
} }
</script> </script>

View File

@ -12,13 +12,13 @@
style: { style: {
width: '70px', width: '70px',
textAlign: 'left', textAlign: 'left',
flexShrink: 0 flexShrink: 0,
} },
}" }"
:wrapperCol="{ :wrapperCol="{
style: { style: {
flex: 1 flex: 1,
} },
}" }"
> >
<a-form-model-item label="Channel"> <a-form-model-item label="Channel">
@ -54,13 +54,7 @@
<div> <div>
<label> <label>
<a-button type="primary" :loading="isCalling" @click="handleCall">Call</a-button> <a-button type="primary" :loading="isCalling" @click="handleCall">Call</a-button>
<input <input ref="fileInput" type="file" accept=".ent" style="display: none" @change="handleFileChange" />
ref="fileInput"
type="file"
accept=".ent"
style="display: none;"
@change="handleFileChange"
/>
</label> </label>
<a-button type="primary" :loading="isSaving" @click="handleSave">Save</a-button> <a-button type="primary" :loading="isSaving" @click="handleSave">Save</a-button>
</div> </div>
@ -121,23 +115,23 @@ const columns = [
{ {
title: 'Channel', title: 'Channel',
dataIndex: 'channel', dataIndex: 'channel',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Energy(keV)', title: 'Energy(keV)',
dataIndex: 'energy', dataIndex: 'energy',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Fit(keV)', title: 'Fit(keV)',
dataIndex: 'fit', dataIndex: 'fit',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Delta(%)', title: 'Delta(%)',
dataIndex: 'delta', dataIndex: 'delta',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
} },
] ]
const initialOption = { const initialOption = {
@ -145,68 +139,68 @@ const initialOption = {
top: 20, top: 20,
right: 20, right: 20,
bottom: 50, bottom: 50,
left: 70 left: 70,
}, },
title: { title: {
text: 'Channel', text: 'Channel',
textStyle: { textStyle: {
color: '#8FD4F8', color: '#8FD4F8',
fontSize: 14, fontSize: 14,
fontWeight: 'normal' fontWeight: 'normal',
}, },
right: 10, right: 10,
bottom: 0 bottom: 0,
}, },
tooltip: { tooltip: {
trigger: 'axis', trigger: 'axis',
formatter: params => { formatter: (params) => {
const [x, y] = params[0].value const [x, y] = params[0].value
const channel = parseInt(x) const channel = parseInt(x)
const energy = y.toFixed(3) const energy = y.toFixed(3)
return `<div class="channel">Channel: ${channel}</div> return `<div class="channel">Channel: ${channel}</div>
<div class="energy">Energy: ${energy}</div>` <div class="energy">Energy: ${energy}</div>`
}, },
className: 'figure-chart-option-tooltip' className: 'figure-chart-option-tooltip',
}, },
xAxis: { xAxis: {
min: 1, min: 1,
max: 'dataMax', max: 'dataMax',
axisLabel: { axisLabel: {
color: '#fff' color: '#fff',
}, },
axisLine: { axisLine: {
lineStyle: { lineStyle: {
color: '#fff' color: '#fff',
} },
}, },
splitLine: { splitLine: {
show: false show: false,
} },
}, },
yAxis: { yAxis: {
axisLabel: { axisLabel: {
color: '#fff' color: '#fff',
}, },
axisTick: { axisTick: {
show: false show: false,
}, },
axisLine: { axisLine: {
lineStyle: { lineStyle: {
color: '#fff' color: '#fff',
} },
}, },
splitLine: { splitLine: {
show: false show: false,
}, },
name: 'keV', name: 'keV',
nameLocation: 'center', nameLocation: 'center',
nameGap: 50, nameGap: 50,
nameTextStyle: { nameTextStyle: {
color: '#8FD4F8', color: '#8FD4F8',
fontSize: 14 fontSize: 14,
}
}, },
series: [] },
series: [],
} }
export default { export default {
@ -228,11 +222,11 @@ export default {
currSelectedDataSource: '', currSelectedDataSource: '',
appliedDataSource: '', appliedDataSource: '',
opts: { opts: {
notMerge: true notMerge: true,
}, },
rg_high: -1, rg_high: -1,
rg_low: -1 rg_low: -1,
} }
}, },
methods: { methods: {
@ -244,7 +238,7 @@ export default {
sampleId, sampleId,
fileName, fileName,
currentText, currentText,
width: 922 width: 922,
}) })
this.isLoading = false this.isLoading = false
if (success) { if (success) {
@ -294,15 +288,15 @@ export default {
value: [x, y], value: [x, y],
itemStyle: { itemStyle: {
color: scatterPoint.color, color: scatterPoint.color,
borderWidth: 0 borderWidth: 0,
} },
} }
}), }),
emphasis: { emphasis: {
disabled: true disabled: true,
}, },
animation: false, animation: false,
zlevel: 20 zlevel: 20,
}) })
this.option.series = series this.option.series = series
} }
@ -351,7 +345,7 @@ export default {
this.list.splice(i, 0, { this.list.splice(i, 0, {
channel: centroid, channel: centroid,
energy energy,
}) })
this.uncert.splice(i, 0, 0.5) this.uncert.splice(i, 0, 0.5)
@ -424,11 +418,11 @@ export default {
const { success, result, message } = await postAction('/gamma/changeDataEnergy', { const { success, result, message } = await postAction('/gamma/changeDataEnergy', {
sampleId, sampleId,
fileName, fileName,
m_vCurCentroid: this.list.map(item => item.channel), m_vCurCentroid: this.list.map((item) => item.channel),
m_vCurEnergy: this.list.map(item => item.energy), m_vCurEnergy: this.list.map((item) => item.energy),
m_vCurUncert: this.uncert, m_vCurUncert: this.uncert,
m_curParam: this.param, m_curParam: this.param,
width: 922 width: 922,
}) })
if (success) { if (success) {
this.handleResult(result) this.handleResult(result)
@ -447,9 +441,9 @@ export default {
try { try {
this.isSaving = true this.isSaving = true
const res = await postAction('/gamma/saveDataEnergy', { const res = await postAction('/gamma/saveDataEnergy', {
m_vCurCentroid: this.list.map(item => item.channel), m_vCurCentroid: this.list.map((item) => item.channel),
m_vCurEnergy: this.list.map(item => item.energy), m_vCurEnergy: this.list.map((item) => item.energy),
m_vCurUncert: this.uncert m_vCurUncert: this.uncert,
}) })
if (typeof res == 'string') { if (typeof res == 'string') {
const blob = new Blob([res], { type: 'text/plain' }) const blob = new Blob([res], { type: 'text/plain' })
@ -507,18 +501,18 @@ export default {
let curCalName = this.currSelectedDataSource let curCalName = this.currSelectedDataSource
// InputPHD // InputPHD
if (!curCalName.includes('Input')) { if (!curCalName.includes('Input')) {
curCalName = `Input ${this.dataSourceList.filter(item => item.includes('Input')).length + 1}` curCalName = `Input ${this.dataSourceList.filter((item) => item.includes('Input')).length + 1}`
} }
const { sampleId, inputFileName: fileName } = this.sampleData const { sampleId, inputFileName: fileName } = this.sampleData
const { success, result, message } = await postAction('/gamma/applyDataEnergy', { const { success, result, message } = await postAction('/gamma/applyDataEnergy', {
m_vCurCentroid: this.list.map(item => item.channel), m_vCurCentroid: this.list.map((item) => item.channel),
m_vCurEnergy: this.list.map(item => item.energy), m_vCurEnergy: this.list.map((item) => item.energy),
m_vCurUncert: this.uncert, m_vCurUncert: this.uncert,
m_curParam: this.param, m_curParam: this.param,
curCalName, curCalName,
sampleId, sampleId,
fileName fileName,
}) })
if (success) { if (success) {
this.handleDataSourceClick(curCalName) this.handleDataSourceClick(curCalName)
@ -550,8 +544,8 @@ export default {
} catch (error) { } catch (error) {
console.error(error) console.error(error)
} }
} },
} },
} }
</script> </script>

View File

@ -138,7 +138,7 @@
</template> </template>
<!-- 底部按钮结束 --> <!-- 底部按钮结束 -->
</custom-modal> </custom-modal>
<a-modal v-model="visible_file" :width="1200" title="File List" @cancel="cancelFileModale"> <a-modal v-model="visible_file" :width="1200" title="File List" :maskClosable="false" @cancel="cancelFileModale">
<a-spin :spinning="loading_file"> <a-spin :spinning="loading_file">
<div style="position: relative; padding-bottom: 40px; height: 460px; overflow: hidden"> <div style="position: relative; padding-bottom: 40px; height: 460px; overflow: hidden">
<a-row type="flex" style="margin-bottom: 15px"> <a-row type="flex" style="margin-bottom: 15px">
@ -445,7 +445,9 @@ export default {
}) })
if (findFile) { if (findFile) {
const regExp = new RegExp(`(${otherFilePrefix}${fileType}_${qualify}_\\d{1,}\\.{0,}\\d{0,}).*?(\\.PHD)`) const regExp = new RegExp(
`(${otherFilePrefix}${fileType}_${qualify}_\\d{1,}\\.{0,}\\d{0,}).*?(\\.PHD)`
)
record[nameKeys[index]] = { record[nameKeys[index]] = {
file: findFile, file: findFile,
fileName: findFile.name.replace(regExp, '$1$2'), fileName: findFile.name.replace(regExp, '$1$2'),

View File

@ -64,53 +64,56 @@ const columns = [
title: 'Energy (keV)', title: 'Energy (keV)',
dataIndex: 'energy', dataIndex: 'energy',
customRender: (text) => { customRender: (text) => {
return text && text !== 'null' ? Number(text).toPrecision(6) : text return text && text !== 'null' ? parseFloat(Number(text).toPrecision(6)) : text
}, },
}, },
{ {
title: 'Yield (%)', title: 'Yield (%)',
dataIndex: 'yield', dataIndex: 'yield',
customRender: (text) => {
return text && text !== 'null' ? parseFloat(Number(text).toPrecision(6)) : text
},
}, },
{ {
title: 'Efficiency', title: 'Efficiency',
dataIndex: 'efficiency', dataIndex: 'efficiency',
customRender: (text) => { customRender: (text) => {
return text && text !== 'null' ? Number(text).toPrecision(6) : text return text && text !== 'null' ? parseFloat(Number(text).toPrecision(6)) : text
}, },
}, },
{ {
title: 'Activity (Bq)', title: 'Activity (Bq)',
dataIndex: 'activity', dataIndex: 'activity',
customRender: (text) => { customRender: (text) => {
return text && text !== 'null' ? Number(text).toPrecision(6) : text return text && text !== 'null' ? parseFloat(Number(text).toPrecision(6)) : text
}, },
}, },
{ {
title: 'Act Err (%)', title: 'Act Err (%)',
dataIndex: 'actErr', dataIndex: 'actErr',
customRender: (text) => { customRender: (text) => {
return text && text !== 'null' ? Number(text).toPrecision(6) : text return text && text !== 'null' ? parseFloat(Number(text).toPrecision(6)) : text
}, },
}, },
{ {
title: 'MDA (Bq)', title: 'MDA (Bq)',
dataIndex: 'mda', dataIndex: 'mda',
customRender: (text) => { customRender: (text) => {
return text && text !== 'null' ? Number(text).toPrecision(6) : text return text && text !== 'null' ? parseFloat(Number(text).toPrecision(6)) : text
}, },
}, },
{ {
title: 'Conc (uBq/m3)', title: 'Conc (uBq/m3)',
dataIndex: 'conc', dataIndex: 'conc',
customRender: (text) => { customRender: (text) => {
return text && text !== 'null' ? Number(text).toPrecision(6) : text return text && text !== 'null' ? parseFloat(Number(text).toPrecision(6)) : text
}, },
}, },
{ {
title: 'MDC (uBq/m3)', title: 'MDC (uBq/m3)',
dataIndex: 'mdc', dataIndex: 'mdc',
customRender: (text) => { customRender: (text) => {
return text && text !== 'null' ? Number(text).toPrecision(5) : text return text && text !== 'null' ? parseFloat(Number(text).toPrecision(6)) : text
}, },
}, },
] ]

View File

@ -86,9 +86,7 @@
</div> </div>
<div class="nuclide-library-settings-operation"> <div class="nuclide-library-settings-operation">
<a-space :size="10"> <a-space :size="10">
<span> <span> Energy: </span>
Energy:
</span>
<a-input v-model="model.editEnergy"></a-input> <a-input v-model="model.editEnergy"></a-input>
<a-input-number <a-input-number
v-model="model.err" v-model="model.err"
@ -122,18 +120,18 @@ const daughterColumns = [
{ {
title: 'Name', title: 'Name',
dataIndex: 'daughters', dataIndex: 'daughters',
align: 'center' align: 'center',
}, },
{ {
title: 'Ratio', title: 'Ratio',
dataIndex: 'branchingratios', dataIndex: 'branchingratios',
align: 'center' align: 'center',
}, },
{ {
title: 'Status', title: 'Status',
dataIndex: 'daughtersstable', dataIndex: 'daughtersstable',
align: 'center' align: 'center',
} },
] ]
// //
@ -143,43 +141,35 @@ const mainColumns = [
width: 80, width: 80,
customRender: (_, __, index) => { customRender: (_, __, index) => {
return index + 1 return index + 1
} },
}, },
{ {
title: 'Full Name', title: 'Full Name',
dataIndex: 'fullName' dataIndex: 'fullName',
}, },
{ {
title: 'Energy(keV)', title: 'Energy(keV)',
dataIndex: 'energy', dataIndex: 'energy',
width: 100, width: 100,
customRender: text => { customRender: (text) => parseFloat(Number(text).toPrecision(6)),
return toFixed(text, 3)
}
}, },
{ {
title: 'Energy Uncert(%)', title: 'Energy Uncert(%)',
dataIndex: 'energyUncert', dataIndex: 'energyUncert',
width: 120, width: 120,
customRender: text => { customRender: (text) => parseFloat(Number(text * 100).toPrecision(6)),
return text ? toFixed(text * 100, 6) : ''
}
}, },
{ {
title: 'Yield', title: 'Yield',
dataIndex: 'yield', dataIndex: 'yield',
width: 80, width: 80,
customRender: text => { customRender: (text) => parseFloat(Number(text).toPrecision(6)),
return toFixed(text, 3)
}
}, },
{ {
title: 'Yield Uncert(%)', title: 'Yield Uncert(%)',
dataIndex: 'yieldUncert', dataIndex: 'yieldUncert',
width: 120, width: 120,
customRender: text => { customRender: (text) => parseFloat(Number(text).toPrecision(6)),
return toFixed(text, 3)
}
}, },
{ {
title: 'KeyLine', title: 'KeyLine',
@ -187,15 +177,15 @@ const mainColumns = [
width: 100, width: 100,
align: 'center', align: 'center',
scopedSlots: { scopedSlots: {
customRender: 'keyLine' customRender: 'keyLine',
} },
} },
] ]
export default { export default {
mixins: [ModalMixin, SampleDataMixin], mixins: [ModalMixin, SampleDataMixin],
components: { components: {
TitleOverBorder TitleOverBorder,
}, },
data() { data() {
this.daughterColumns = daughterColumns this.daughterColumns = daughterColumns
@ -210,7 +200,7 @@ export default {
model: {}, model: {},
selectedNuclide: {}, // Nuclide selectedNuclide: {}, // Nuclide
selectedParent: {} // Parent selectedParent: {}, // Parent
} }
}, },
methods: { methods: {
@ -224,19 +214,19 @@ export default {
const { success, result, message } = await getAction('/gamma/NuclideLibrary', { const { success, result, message } = await getAction('/gamma/NuclideLibrary', {
sampleId, sampleId,
fileName, fileName,
...this.model ...this.model,
}) })
if (success) { if (success) {
const { const {
daughter: { list_parent, table_daughter }, daughter: { list_parent, table_daughter },
nuclLinesLibs, nuclLinesLibs,
nuclideInfo, nuclideInfo,
nuclides nuclides,
} = result } = result
this.nuclideList = nuclides this.nuclideList = nuclides
this.parentList = list_parent ? list_parent.filter(item => item) : [] this.parentList = list_parent ? list_parent.filter((item) => item) : []
this.daughterList = table_daughter ? table_daughter.filter(item => item.daughters) : [] this.daughterList = table_daughter ? table_daughter.filter((item) => item.daughters) : []
this.nuclideInfo = nuclideInfo this.nuclideInfo = nuclideInfo
this.nuclLinesLibs = nuclLinesLibs this.nuclLinesLibs = nuclLinesLibs
@ -259,7 +249,7 @@ export default {
libraryName: 'UserLibrary', libraryName: 'UserLibrary',
err: 0.5, err: 0.5,
editEnergy: '', editEnergy: '',
nuclideName: '' nuclideName: '',
} }
this.getInfo(true) this.getInfo(true)
}, },
@ -300,8 +290,8 @@ export default {
handleParentDBClick(item) { handleParentDBClick(item) {
this.model.nuclideName = item this.model.nuclideName = item
this.getInfo() this.getInfo()
} },
} },
} }
</script> </script>

View File

@ -12,13 +12,13 @@
style: { style: {
width: '70px', width: '70px',
textAlign: 'left', textAlign: 'left',
flexShrink: 0 flexShrink: 0,
} },
}" }"
:wrapperCol="{ :wrapperCol="{
style: { style: {
flex: 1 flex: 1,
} },
}" }"
> >
<a-form-model-item label="Energy"> <a-form-model-item label="Energy">
@ -54,13 +54,7 @@
<div> <div>
<label> <label>
<a-button type="primary" :loading="isCalling" @click="handleCall">Call</a-button> <a-button type="primary" :loading="isCalling" @click="handleCall">Call</a-button>
<input <input ref="fileInput" type="file" accept=".ent" style="display: none" @change="handleFileChange" />
ref="fileInput"
type="file"
accept=".ent"
style="display: none;"
@change="handleFileChange"
/>
</label> </label>
<a-button type="primary" :loading="isSaving" @click="handleSave">Save</a-button> <a-button type="primary" :loading="isSaving" @click="handleSave">Save</a-button>
</div> </div>
@ -121,23 +115,23 @@ const columns = [
{ {
title: 'Energy(keV)', title: 'Energy(keV)',
dataIndex: 'energy', dataIndex: 'energy',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'FWHM(keV)', title: 'FWHM(keV)',
dataIndex: 'fwhm', dataIndex: 'fwhm',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Fit(keV)', title: 'Fit(keV)',
dataIndex: 'fit', dataIndex: 'fit',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Delta(%)', title: 'Delta(%)',
dataIndex: 'delta', dataIndex: 'delta',
customRender: (text) => Number(text).toFixed(3) customRender: (text) => parseFloat(Number(text).toPrecision(6)),
} },
] ]
const initialOption = { const initialOption = {
@ -145,68 +139,68 @@ const initialOption = {
top: 20, top: 20,
right: 20, right: 20,
bottom: 50, bottom: 50,
left: 70 left: 70,
}, },
title: { title: {
text: 'Channel', text: 'Channel',
textStyle: { textStyle: {
color: '#8FD4F8', color: '#8FD4F8',
fontSize: 14, fontSize: 14,
fontWeight: 'normal' fontWeight: 'normal',
}, },
right: 10, right: 10,
bottom: 0 bottom: 0,
}, },
tooltip: { tooltip: {
trigger: 'axis', trigger: 'axis',
formatter: params => { formatter: (params) => {
const [x, y] = params[0].value const [x, y] = params[0].value
const energy = parseInt(x) const energy = parseInt(x)
const fwhm = y.toFixed(3) const fwhm = y.toFixed(3)
return `<div class="channel">Energy: ${energy}</div> return `<div class="channel">Energy: ${energy}</div>
<div class="energy">Fwhm: ${fwhm}</div>` <div class="energy">Fwhm: ${fwhm}</div>`
}, },
className: 'figure-chart-option-tooltip' className: 'figure-chart-option-tooltip',
}, },
xAxis: { xAxis: {
min: 1, min: 1,
max: 'dataMax', max: 'dataMax',
axisLabel: { axisLabel: {
color: '#fff' color: '#fff',
}, },
axisLine: { axisLine: {
lineStyle: { lineStyle: {
color: '#fff' color: '#fff',
} },
}, },
splitLine: { splitLine: {
show: false show: false,
} },
}, },
yAxis: { yAxis: {
axisLabel: { axisLabel: {
color: '#fff' color: '#fff',
}, },
axisTick: { axisTick: {
show: false show: false,
}, },
axisLine: { axisLine: {
lineStyle: { lineStyle: {
color: '#fff' color: '#fff',
} },
}, },
splitLine: { splitLine: {
show: false show: false,
}, },
name: 'keV', name: 'keV',
nameLocation: 'center', nameLocation: 'center',
nameGap: 50, nameGap: 50,
nameTextStyle: { nameTextStyle: {
color: '#8FD4F8', color: '#8FD4F8',
fontSize: 14 fontSize: 14,
}
}, },
series: [] },
series: [],
} }
export default { export default {
@ -228,10 +222,10 @@ export default {
currSelectedDataSource: '', currSelectedDataSource: '',
appliedDataSource: '', appliedDataSource: '',
opts: { opts: {
notMerge: true notMerge: true,
}, },
ECutAnalysis_Low: -1, ECutAnalysis_Low: -1,
G_energy_span: -1 G_energy_span: -1,
} }
}, },
methods: { methods: {
@ -243,7 +237,7 @@ export default {
sampleId, sampleId,
fileName, fileName,
currentText, currentText,
width: 922 width: 922,
}) })
this.isLoading = false this.isLoading = false
if (success) { if (success) {
@ -293,15 +287,15 @@ export default {
value: [x, y], value: [x, y],
itemStyle: { itemStyle: {
color: scatterPoint.color, color: scatterPoint.color,
borderWidth: 0 borderWidth: 0,
} },
} }
}), }),
emphasis: { emphasis: {
disabled: true disabled: true,
}, },
animation: false, animation: false,
zlevel: 20 zlevel: 20,
}) })
this.option.series = series this.option.series = series
} }
@ -350,7 +344,7 @@ export default {
this.list.splice(i, 0, { this.list.splice(i, 0, {
energy: energy, energy: energy,
fwhm fwhm,
}) })
this.uncert.splice(i, 0, 0.5) this.uncert.splice(i, 0, 0.5)
@ -423,10 +417,10 @@ export default {
const { success, result, message } = await postAction('/gamma/changeDataResolution', { const { success, result, message } = await postAction('/gamma/changeDataResolution', {
sampleId, sampleId,
fileName, fileName,
m_vCurEnergy: this.list.map(item => item.energy), m_vCurEnergy: this.list.map((item) => item.energy),
m_vCurReso: this.list.map(item => item.fwhm), m_vCurReso: this.list.map((item) => item.fwhm),
m_vCurUncert: this.uncert, m_vCurUncert: this.uncert,
m_curParam: this.param m_curParam: this.param,
}) })
if (success) { if (success) {
this.handleResult(result) this.handleResult(result)
@ -445,9 +439,9 @@ export default {
try { try {
this.isSaving = true this.isSaving = true
const res = await postAction('/gamma/saveDataResolution', { const res = await postAction('/gamma/saveDataResolution', {
m_vCurEnergy: this.list.map(item => item.energy), m_vCurEnergy: this.list.map((item) => item.energy),
m_vCurReso: this.list.map(item => item.fwhm), m_vCurReso: this.list.map((item) => item.fwhm),
m_vCurUncert: this.uncert m_vCurUncert: this.uncert,
}) })
if (typeof res == 'string') { if (typeof res == 'string') {
const blob = new Blob([res], { type: 'text/plain' }) const blob = new Blob([res], { type: 'text/plain' })
@ -505,18 +499,18 @@ export default {
let curCalName = this.currSelectedDataSource let curCalName = this.currSelectedDataSource
// InputPHD // InputPHD
if (!curCalName.includes('Input')) { if (!curCalName.includes('Input')) {
curCalName = `Input ${this.dataSourceList.filter(item => item.includes('Input')).length + 1}` curCalName = `Input ${this.dataSourceList.filter((item) => item.includes('Input')).length + 1}`
} }
const { sampleId, inputFileName: fileName } = this.sampleData const { sampleId, inputFileName: fileName } = this.sampleData
const { success, result, message } = await postAction('/gamma/applyDataResolution', { const { success, result, message } = await postAction('/gamma/applyDataResolution', {
m_vCurEnergy: this.list.map(item => item.energy), m_vCurEnergy: this.list.map((item) => item.energy),
m_vCurReso: this.list.map(item => item.fwhm), m_vCurReso: this.list.map((item) => item.fwhm),
m_vCurUncert: this.uncert, m_vCurUncert: this.uncert,
m_curParam: this.param, m_curParam: this.param,
curCalName, curCalName,
sampleId, sampleId,
fileName fileName,
}) })
if (success) { if (success) {
this.handleDataSourceClick(curCalName) this.handleDataSourceClick(curCalName)
@ -548,8 +542,8 @@ export default {
} catch (error) { } catch (error) {
console.error(error) console.error(error)
} }
} },
} },
} }
</script> </script>

View File

@ -47,10 +47,12 @@ const columns = [
{ {
title: 'Energy(keV)', title: 'Energy(keV)',
dataIndex: 'energy', dataIndex: 'energy',
customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Centroid', title: 'Centroid',
dataIndex: 'centroid', dataIndex: 'centroid',
customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Multiplet', title: 'Multiplet',
@ -59,22 +61,27 @@ const columns = [
{ {
title: 'Fwhm(keV)', title: 'Fwhm(keV)',
dataIndex: 'fwhm', dataIndex: 'fwhm',
customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'NetArea', title: 'NetArea',
dataIndex: 'netArea', dataIndex: 'netArea',
customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'AreaErr(%)', title: 'AreaErr(%)',
dataIndex: 'areaErr', dataIndex: 'areaErr',
customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Significant', title: 'Significant',
dataIndex: 'significant', dataIndex: 'significant',
customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Sensitivity', title: 'Sensitivity',
dataIndex: 'sensitivity', dataIndex: 'sensitivity',
customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Indentify', title: 'Indentify',

View File

@ -42,7 +42,7 @@
<!-- 二级交互栏结束 --> <!-- 二级交互栏结束 -->
<!-- 主体部分 --> <!-- 主体部分 -->
<div class="gamma-analysis-main"> <div class="gamma-analysis-main">
<div class="gamma-analysis-chart"> <div class="gamma-analysis-chart" ref="chartContainerRef" tabindex="0" @keydown="handleKeyboardEvent">
<CustomChart <CustomChart
ref="chartRef" ref="chartRef"
:option="option" :option="option"
@ -140,6 +140,8 @@ import { ACCESS_TOKEN } from '@/store/mutation-types'
import StripModal from './components/Modals/StripModal.vue' import StripModal from './components/Modals/StripModal.vue'
import { FilePicker } from '@/utils/FilePicker' import { FilePicker } from '@/utils/FilePicker'
import { zipFile } from '@/utils/file' import { zipFile } from '@/utils/file'
import { findNearPeak } from '@/utils/sampleHelper'
import baseCtrlJson from './baseCtrlJson.json'
export default { export default {
props: { props: {
@ -232,20 +234,14 @@ export default {
this.setChartBottomTitle(0, 0, 0) this.setChartBottomTitle(0, 0, 0)
this.option.tooltip.formatter = this.tooltipFormatter this.option.tooltip.formatter = this.tooltipFormatter
this.$bus.$on('colorChange', this.handleColorChange)
this.$bus.$on('gammaRefresh', this.handleRefresh) this.$bus.$on('gammaRefresh', this.handleRefresh)
this.$bus.$on('accept', this.handleAccept) this.$bus.$on('accept', this.handleAccept)
document.addEventListener('keydown', this.handleKeyboardEvent)
}, },
destroyed() { destroyed() {
this.cancelLastRequest() this.cancelLastRequest()
this.$bus.$off('colorChange', this.handleColorChange)
this.$bus.$off('gammaRefresh', this.handleRefresh) this.$bus.$off('gammaRefresh', this.handleRefresh)
this.$bus.$off('accept', this.handleAccept) this.$bus.$off('accept', this.handleAccept)
document.removeEventListener('keydown', this.handleKeyboardEvent)
}, },
mounted() { mounted() {
this.option.brush = { toolbox: [] } this.option.brush = { toolbox: [] }
@ -534,7 +530,7 @@ export default {
this.$store.commit('ADD_SAMPLE_DATA', { this.$store.commit('ADD_SAMPLE_DATA', {
inputFileName, inputFileName,
data: result, data: Object.assign(result, { BaseCtrls: baseCtrlJson }),
from: flag, from: flag,
}) })
@ -867,6 +863,7 @@ export default {
// 线 // 线
handleChartClick(param) { handleChartClick(param) {
this.$refs.chartContainerRef.focus()
const { offsetX, offsetY } = param const { offsetX, offsetY } = param
const point = getXAxisAndYAxisByPosition(this.getChart(), offsetX, offsetY) const point = getXAxisAndYAxisByPosition(this.getChart(), offsetX, offsetY)
if (point) { if (point) {
@ -883,50 +880,13 @@ export default {
// //
setChartBottomTitle(channel, energy, counts) { setChartBottomTitle(channel, energy, counts) {
const { index, find } = this.findNearPeak(channel) const { index, find } = findNearPeak(channel, this.peakList)
this.option.title.text = `{a|Channel:${channel}} {a|Energy:${energy || '0.00'}} {a|Counts:${ this.option.title.text = `{a|Channel:${channel}} {a|Energy:${energy || '0.00'}} {a|Counts:${
counts || '0.0' counts || '0.0'
}} {a|Significance:${find ? this.peakList[index].significance.toFixed(2) : '0.00'}}` }} {a|Significance:${find ? this.peakList[index].significance.toFixed(2) : '0.00'}}`
}, },
// (C++)
findNearPeak(channel) {
let t_bFind = false,
i = 0,
peakNum = this.peakList.length
for (; i < peakNum; ++i) {
const peak = this.peakList[i]
if (channel >= peak.left && channel <= peak.right) {
// channel
if (peak.multiIndex > 0 && channel > peak.peakCentroid) {
// channel
let j = i
let temp = channel - peak.peakCentroid
while (++j < peakNum && this.peakList[j].multiIndex == peak.multiIndex) {
if (Math.abs(this.peakList[j].peakCentroid - channel) < temp) {
// channel
temp = Math.abs(this.peakList[j].peakCentroid - channel)
i = j
}
}
}
// channel (i)
t_bFind = true
break
} else if (peak.left > channel) {
// channel
if (i > 0 && channel - this.peakList[i - 1].peakCentroid < peak.peakCentroid - channel) i -= 1
break
}
}
if (i >= peakNum) i -= 1
return {
index: i,
find: t_bFind,
}
},
// xAixschannelenergycounts // xAixschannelenergycounts
getEnergyAndCountsByXAxis(xAxis) { getEnergyAndCountsByXAxis(xAxis) {
let channel, energy, counts let channel, energy, counts
@ -1342,6 +1302,7 @@ export default {
// //
handleRefresh(data) { handleRefresh(data) {
data.DetailedInformation = this.detailedInfomation data.DetailedInformation = this.detailedInfomation
data.QCFlag = this.qcFlags
this.clearCompareLine() this.clearCompareLine()
this.redrawPeakLine() this.redrawPeakLine()
this.dataProcess(data) this.dataProcess(data)
@ -1349,36 +1310,29 @@ export default {
// Accept // Accept
handleAccept(data) { handleAccept(data) {
console.log('%c [ data ]-1166', 'font-size:13px; background:pink; color:#bf2c9f;', data)
const { const {
allData, allData,
barChart,
channelBaseLineChart,
peakSet, peakSet,
shadowChannelChart, shadowChannelChart,
shadowEnergyChart, shadowEnergyChart,
shapeChannelData, shapeChannelData,
shapeData,
shapeEnergyData, shapeEnergyData,
} = data } = data
const result = {
DetailedInformation: this.detailedInfomation,
QCFlag: this.qcFlags,
allData,
shadowChannelChart,
shadowEnergyChart,
shapeChannelData,
shapeEnergyData,
peak: peakSet,
}
this.clearCompareLine() this.clearCompareLine()
this.channelData.peakGroup = this.getLineData(allData, 'Peak', 'channel', true)
this.energyData.peakGroup = this.getLineData(allData, 'Peak', 'energy', true)
this.redrawPeakLine() this.redrawPeakLine()
this.dataProcess(result)
this.channelData.baseLine = this.getLineData(allData, 'BaseLine', 'channel')
this.energyData.baseLine = this.getLineData(allData, 'BaseLine', 'energy')
this.redrawLineBySeriesName(
'BaseLine',
this.energyData.baseLine,
this.channelData.baseLine,
this.graphAssistance.Baseline
)
this.channelData.baseLineCP = shapeChannelData
this.energyData.baseLineCP = shapeEnergyData
this.redrawCtrlPointBySeriesName()
}, },
// //
@ -1771,6 +1725,7 @@ export default {
height: 100%; height: 100%;
position: relative; position: relative;
overflow: hidden; overflow: hidden;
outline: none;
} }
&-thumbnail { &-thumbnail {

View File

@ -91,7 +91,11 @@
<!-- 分析-设置弹窗结束 --> <!-- 分析-设置弹窗结束 -->
<!-- 分析工具弹窗开始 --> <!-- 分析工具弹窗开始 -->
<analyze-interactive-tool-modal v-model="analyzeInteractiveToolModalVisible" :sampleId="sampleData.sampleId" /> <analyze-interactive-tool-modal
v-model="analyzeInteractiveToolModalVisible"
:sampleId="sampleData.sampleId"
:colorConfig="colorConfig"
/>
<!-- 分析工具弹窗结束 --> <!-- 分析工具弹窗结束 -->
<!-- Korsum 弹窗开始 --> <!-- Korsum 弹窗开始 -->
@ -119,7 +123,7 @@
<!-- SpectrumComments 弹窗结束 --> <!-- SpectrumComments 弹窗结束 -->
<!-- Color Config 弹窗开始 --> <!-- Color Config 弹窗开始 -->
<color-config-modal v-model="colorConfigModalVisible" /> <color-config-modal v-model="colorConfigModalVisible" :colorConfig="colorConfig" @colorChange="handleColorChange" />
<!-- Color Config 弹窗结束 --> <!-- Color Config 弹窗结束 -->
<!-- Data Processing Log 弹窗开始 --> <!-- Data Processing Log 弹窗开始 -->
@ -397,6 +401,8 @@ export default {
isReAnalyed_beta: false, isReAnalyed_beta: false,
isSaving: false, isSaving: false,
colorConfig: {}, //
} }
}, },
created() { created() {
@ -407,6 +413,7 @@ export default {
// dbName: 'auto', // dbName: 'auto',
// inputFileName: 'CAX05_001-20230731_1528_S_FULL_37563.6.PHD', // inputFileName: 'CAX05_001-20230731_1528_S_FULL_37563.6.PHD',
// }) // })
this.getColorConfig()
}, },
destroyed() { destroyed() {
@ -426,10 +433,10 @@ export default {
}, },
getStationName(arg, val, flag) { getStationName(arg, val, flag) {
arg.forEach((item) => { arg.forEach((item) => {
item.conc = Number(item.conc).toFixed(6) item.conc = Number(item.conc).toPrecision(6)
item.concErr = Number(item.concErr).toFixed(6) item.concErr = Number(item.concErr).toPrecision(6)
item.lc = Number(item.lc).toFixed(6) item.lc = Number(item.lc).toPrecision(6)
item.mdc = Number(item.mdc).toFixed(6) item.mdc = Number(item.mdc).toPrecision(6)
}) })
this.resultDisplayFlag = arg this.resultDisplayFlag = arg
this.params_toDB.stationName = val this.params_toDB.stationName = val
@ -718,10 +725,10 @@ export default {
this.analyseCurrentSpectrumData = res.result this.analyseCurrentSpectrumData = res.result
this.resultDisplayFlag = res.result.XeData this.resultDisplayFlag = res.result.XeData
this.resultDisplayFlag.forEach((item) => { this.resultDisplayFlag.forEach((item) => {
item.conc = item.conc.toFixed(6) item.conc = item.conc.toPrecision(6)
item.concErr = item.concErr.toFixed(6) item.concErr = item.concErr.toPrecision(6)
item.lc = item.lc.toFixed(6) item.lc = item.lc.toPrecision(6)
item.mdc = item.mdc.toFixed(6) item.mdc = item.mdc.toPrecision(6)
}) })
} else { } else {
this.$message.warning(res.message) this.$message.warning(res.message)
@ -743,10 +750,10 @@ export default {
this.analyseCurrentSpectrumData = res.result this.analyseCurrentSpectrumData = res.result
this.resultDisplayFlag = res.result.XeData this.resultDisplayFlag = res.result.XeData
this.resultDisplayFlag.forEach((item) => { this.resultDisplayFlag.forEach((item) => {
item.conc = item.conc.toFixed(6) item.conc = item.conc.toPrecision(6)
item.concErr = item.concErr.toFixed(6) item.concErr = item.concErr.toPrecision(6)
item.lc = item.lc.toFixed(6) item.lc = item.lc.toPrecision(6)
item.mdc = item.mdc.toFixed(6) item.mdc = item.mdc.toPrecision(6)
}) })
} else { } else {
this.$message.warning(res.message) this.$message.warning(res.message)
@ -764,6 +771,26 @@ export default {
} }
} }
}, },
//
async getColorConfig() {
try {
const { success, result, message } = await getAction('/gamma/viewColorConfig')
if (success) {
this.colorConfig = result
} else {
this.$message.error(message)
}
} catch (error) {
console.error(error)
}
},
//
handleColorChange(colorConfig) {
this.colorConfig = colorConfig
this.$refs.gammaAnalysisRef.handleColorChange(colorConfig)
},
}, },
computed: { computed: {
// //

View File

@ -3,6 +3,7 @@
:title="title" :title="title"
:width="800" :width="800"
:visible="visible" :visible="visible"
:maskClosable="false"
:confirmLoading="confirmLoading" :confirmLoading="confirmLoading"
@ok="handleOk" @ok="handleOk"
@cancel="handleCancel" @cancel="handleCancel"
@ -10,178 +11,159 @@
> >
<a-spin :spinning="confirmLoading"> <a-spin :spinning="confirmLoading">
<a-form-model ref="form" :model="model" :rules="validatorRules"> <a-form-model ref="form" :model="model" :rules="validatorRules">
<a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="itemText" label="Name">
<a-form-model-item <a-input placeholder="Please Enter Name" v-model="model.itemText" />
:labelCol="labelCol"
:wrapperCol="wrapperCol"
prop="itemText"
label="Name">
<a-input placeholder="Please Enter Name" v-model="model.itemText"/>
</a-form-model-item> </a-form-model-item>
<a-form-model-item <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="itemValue" label="Item Value">
:labelCol="labelCol"
:wrapperCol="wrapperCol"
prop="itemValue"
label="Item Value">
<a-input placeholder="Please Enter Item Value" v-model="model.itemValue" /> <a-input placeholder="Please Enter Item Value" v-model="model.itemValue" />
</a-form-model-item> </a-form-model-item>
<a-form-model-item <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="Description">
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label="Description">
<a-input v-model="model.description" /> <a-input v-model="model.description" />
</a-form-model-item> </a-form-model-item>
<a-form-model-item <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="Sort">
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label="Sort">
<a-input-number :min="1" v-model="model.sortOrder" /> <a-input-number :min="1" v-model="model.sortOrder" />
The Smaller The Value, the More Advanced The Smaller The Value, the More Advanced
</a-form-model-item> </a-form-model-item>
<a-form-model-item <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="Enable" hasFeedback>
:labelCol="labelCol" <a-switch checkedChildren="Enable" unCheckedChildren="Disable" @change="onChose" v-model="visibleCheck" />
:wrapperCol="wrapperCol"
label="Enable"
hasFeedback>
<a-switch checkedChildren="Enable" unCheckedChildren="Disable" @change="onChose" v-model="visibleCheck"/>
</a-form-model-item> </a-form-model-item>
</a-form-model> </a-form-model>
</a-spin> </a-spin>
</a-modal> </a-modal>
</template> </template>
<script> <script>
import pick from 'lodash.pick' import pick from 'lodash.pick'
import {addDictItem, editDictItem} from '@/api/api' import { addDictItem, editDictItem } from '@/api/api'
import { getAction } from '@api/manage' import { getAction } from '@api/manage'
export default { export default {
name: "DictItemModal", name: 'DictItemModal',
data() { data() {
return { return {
title: "操作", title: '操作',
visible: false, visible: false,
visibleCheck: true, visibleCheck: true,
model: {}, model: {},
dictId: "", dictId: '',
status: 1, status: 1,
labelCol: { labelCol: {
xs: {span: 24}, xs: { span: 24 },
sm: {span: 5}, sm: { span: 5 },
}, },
wrapperCol: { wrapperCol: {
xs: {span: 24}, xs: { span: 24 },
sm: {span: 16}, sm: { span: 16 },
}, },
confirmLoading: false, confirmLoading: false,
validatorRules: { validatorRules: {
itemText: [{required: true, message: 'Please Enter Name'}], itemText: [{ required: true, message: 'Please Enter Name' }],
itemValue: [{required: true, message: 'Please Enter Item Value'},{validator: this.validateItemValue}], itemValue: [{ required: true, message: 'Please Enter Item Value' }, { validator: this.validateItemValue }],
}, },
} }
}, },
created() { created() {},
},
methods: { methods: {
add(dictId) { add(dictId) {
this.dictId = dictId; this.dictId = dictId
// //
this.edit({sortOrder:1,status:1}); this.edit({ sortOrder: 1, status: 1 })
}, },
edit(record) { edit(record) {
if (record.id) { if (record.id) {
this.dictId = record.dictId; this.dictId = record.dictId
} }
this.status = record.status; this.status = record.status
this.visibleCheck = (record.status == 1) ? true : false; this.visibleCheck = record.status == 1 ? true : false
this.model = Object.assign({}, record); this.model = Object.assign({}, record)
this.model.dictId = this.dictId; this.model.dictId = this.dictId
this.model.status = this.status; this.model.status = this.status
this.visible = true; this.visible = true
}, },
onChose(checked) { onChose(checked) {
if (checked) { if (checked) {
this.status = 1; this.status = 1
this.visibleCheck = true; this.visibleCheck = true
} else { } else {
this.status = 0; this.status = 0
this.visibleCheck = false; this.visibleCheck = false
} }
}, },
// //
handleOk() { handleOk() {
const that = this; const that = this
// //
this.$refs.form.validate(valid => { this.$refs.form.validate((valid) => {
if (valid) { if (valid) {
that.confirmLoading = true; that.confirmLoading = true
this.model.itemText = (this.model.itemText || '').trim() this.model.itemText = (this.model.itemText || '').trim()
this.model.itemValue = (this.model.itemValue || '').trim() this.model.itemValue = (this.model.itemValue || '').trim()
this.model.description = (this.model.description || '').trim() this.model.description = (this.model.description || '').trim()
this.model.status = this.status; this.model.status = this.status
let obj; let obj
if (!this.model.id) { if (!this.model.id) {
obj = addDictItem(this.model); obj = addDictItem(this.model)
} else { } else {
obj = editDictItem(this.model); obj = editDictItem(this.model)
} }
obj.then((res) => { obj
.then((res) => {
if (res.success) { if (res.success) {
that.$message.success(res.message); that.$message.success(res.message)
that.$emit('ok'); that.$emit('ok')
} else { } else {
that.$message.warning(res.message); that.$message.warning(res.message)
} }
}).finally(() => {
that.confirmLoading = false;
that.close();
}) })
}else{ .finally(() => {
return false; that.confirmLoading = false
that.close()
})
} else {
return false
} }
}) })
}, },
// //
handleCancel() { handleCancel() {
this.close(); this.close()
}, },
close() { close() {
this.$emit('close'); this.$emit('close')
this.visible = false; this.visible = false
this.$refs.form.resetFields(); this.$refs.form.resetFields()
}, },
validateItemValue(rule, value, callback){ validateItemValue(rule, value, callback) {
let param = { let param = {
itemValue:value, itemValue: value,
dictId:this.dictId, dictId: this.dictId,
} }
if(this.model.id){ if (this.model.id) {
param.id = this.model.id param.id = this.model.id
} }
if(value){ if (value) {
let reg=new RegExp("[`~!@#$^&*()=|{}'.<>《》/?!¥()—【】‘;:”“。,、?]") let reg = new RegExp("[`~!@#$^&*()=|{}'.<>《》/?!¥()—【】‘;:”“。,、?]")
if(reg.test(value)){ if (reg.test(value)) {
callback("Cannot Have Special Charactors") callback('Cannot Have Special Charactors')
}else{ } else {
//update--begin--autor:lvdandan-----date:20201203------forJT-27 - //update--begin--autor:lvdandan-----date:20201203------forJT-27 -
getAction("/sys/dictItem/dictItemCheck",param).then((res)=>{ getAction('/sys/dictItem/dictItemCheck', param).then((res) => {
if(res.success){ if (res.success) {
callback() callback()
}else{ } else {
callback(res.message); callback(res.message)
} }
}); })
//update--end--autor:lvdandan-----date:20201203------forJT-27 - //update--end--autor:lvdandan-----date:20201203------forJT-27 -
} }
}else{ } else {
callback() callback()
} }
} },
} },
} }
</script> </script>

View File

@ -3,6 +3,7 @@
:title="title" :title="title"
:width="600" :width="600"
:visible="visible" :visible="visible"
:maskClosable="false"
:confirmLoading="confirmLoading" :confirmLoading="confirmLoading"
@ok="handleOk" @ok="handleOk"
@cancel="handleCancel" @cancel="handleCancel"
@ -10,42 +11,27 @@
> >
<a-spin :spinning="confirmLoading"> <a-spin :spinning="confirmLoading">
<a-form-model ref="form" :model="model" :rules="validatorRules"> <a-form-model ref="form" :model="model" :rules="validatorRules">
<a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dictName" required label="Dict Name">
<a-form-model-item <a-input placeholder="Please Enter Dict Name" v-model="model.dictName" />
:labelCol="labelCol"
:wrapperCol="wrapperCol"
prop="dictName"
required
label="Dict Name">
<a-input placeholder="Please Enter Dict Name" v-model="model.dictName"/>
</a-form-model-item> </a-form-model-item>
<a-form-model-item <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="dictCode" required label="Dict Code">
:labelCol="labelCol" <a-input placeholder="Please Enter Dict Code" v-model="model.dictCode" />
:wrapperCol="wrapperCol"
prop="dictCode"
required
label="Dict Code">
<a-input placeholder="Please Enter Dict Code" v-model="model.dictCode"/>
</a-form-model-item> </a-form-model-item>
<a-form-model-item <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="Description">
:labelCol="labelCol" <a-input v-model="model.description" />
:wrapperCol="wrapperCol"
label="Description">
<a-input v-model="model.description"/>
</a-form-model-item> </a-form-model-item>
</a-form-model> </a-form-model>
</a-spin> </a-spin>
</a-modal> </a-modal>
</template> </template>
<script> <script>
import pick from 'lodash.pick' import pick from 'lodash.pick'
import { addDict, editDict, duplicateCheck } from '@/api/api' import { addDict, editDict, duplicateCheck } from '@/api/api'
export default { export default {
name: 'DictModal', name: 'DictModal',
data() { data() {
return { return {
@ -55,23 +41,20 @@
model: {}, model: {},
labelCol: { labelCol: {
xs: { span: 24 }, xs: { span: 24 },
sm: { span: 5 } sm: { span: 5 },
}, },
wrapperCol: { wrapperCol: {
xs: { span: 24 }, xs: { span: 24 },
sm: { span: 16 } sm: { span: 16 },
}, },
confirmLoading: false, confirmLoading: false,
validatorRules: { validatorRules: {
dictName: [{ required: true, message: 'Please Enter Dict Name' }], dictName: [{ required: true, message: 'Please Enter Dict Name' }],
dictCode: [ dictCode: [{ required: true, message: 'Please Enter Dict Code' }, { validator: this.validateDictCode }],
{ required: true, message: 'Please Enter Dict Code' }, },
{ validator: this.validateDictCode }]
}
} }
}, },
created() { created() {},
},
methods: { methods: {
validateDictCode(rule, value, callback) { validateDictCode(rule, value, callback) {
// //
@ -79,7 +62,7 @@
tableName: 'sys_dict', tableName: 'sys_dict',
fieldName: 'dict_code', fieldName: 'dict_code',
fieldVal: value, fieldVal: value,
dataId: this.model.id dataId: this.model.id,
} }
duplicateCheck(params).then((res) => { duplicateCheck(params).then((res) => {
if (res.success) { if (res.success) {
@ -108,7 +91,7 @@
handleOk() { handleOk() {
const that = this const that = this
// //
this.$refs.form.validate(valid => { this.$refs.form.validate((valid) => {
if (valid) { if (valid) {
that.confirmLoading = true that.confirmLoading = true
this.model.dictName = (this.model.dictName || '').trim() this.model.dictName = (this.model.dictName || '').trim()
@ -120,19 +103,21 @@
} else { } else {
obj = editDict(this.model) obj = editDict(this.model)
} }
obj.then((res) => { obj
.then((res) => {
if (res.success) { if (res.success) {
that.$message.success(res.message) that.$message.success(res.message)
that.$emit('ok') that.$emit('ok')
} else { } else {
that.$message.warning(res.message) that.$message.warning(res.message)
} }
}).finally(() => { })
.finally(() => {
that.confirmLoading = false that.confirmLoading = false
that.close() that.close()
}) })
}else{ } else {
return false; return false
} }
}) })
}, },
@ -143,8 +128,8 @@
close() { close() {
this.$emit('close') this.$emit('close')
this.visible = false this.visible = false
this.$refs.form.resetFields(); this.$refs.form.resetFields()
} },
} },
} }
</script> </script>

View File

@ -3,63 +3,53 @@
:title="title" :title="title"
:width="1000" :width="1000"
:visible="visible" :visible="visible"
:maskClosable="false"
:confirmLoading="confirmLoading" :confirmLoading="confirmLoading"
@ok="handleOk" @ok="handleOk"
@cancel="handleCancel" @cancel="handleCancel"
:cancelButtonProps="{ props: { type: 'warn' } }" :cancelButtonProps="{ props: { type: 'warn' } }"
cancelText="Cancel"> cancelText="Cancel"
>
<a-spin :spinning="confirmLoading"> <a-spin :spinning="confirmLoading">
<a-form-model ref="form" :model="model" :rules="validatorRules"> <a-form-model ref="form" :model="model" :rules="validatorRules">
<a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ruleName" label="Rule Name">
<a-form-model-item <a-input placeholder="Please Enter Rule Name" v-model="model.ruleName" />
:labelCol="labelCol"
:wrapperCol="wrapperCol"
prop="ruleName"
label="Rule Name">
<a-input placeholder="Please Enter Rule Name" v-model="model.ruleName"/>
</a-form-model-item> </a-form-model-item>
<a-form-model-item <a-form-model-item
v-show="showRuleColumn" v-show="showRuleColumn"
:labelCol="labelCol" :labelCol="labelCol"
:wrapperCol="wrapperCol" :wrapperCol="wrapperCol"
prop="ruleColumn" prop="ruleColumn"
label="Rule Column"> label="Rule Column"
<a-input placeholder="Please Enter Rule Column" v-model.trim="model.ruleColumn"/> >
<a-input placeholder="Please Enter Rule Column" v-model.trim="model.ruleColumn" />
</a-form-model-item> </a-form-model-item>
<a-form-model-item <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ruleConditions" label="Rule Conditions">
:labelCol="labelCol" <j-dict-select-tag
:wrapperCol="wrapperCol" @input="handleChangeRuleCondition"
prop="ruleConditions" v-model="model.ruleConditions"
label="Rule Conditions"> placeholder="Please Enter Rule Conditions"
<j-dict-select-tag @input="handleChangeRuleCondition" v-model="model.ruleConditions" placeholder="Please Enter Rule Conditions" dictCode="rule_conditions"/> dictCode="rule_conditions"
/>
</a-form-model-item> </a-form-model-item>
<a-form-model-item <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="ruleValue" label="Rule Value">
:labelCol="labelCol" <a-input placeholder="Please Enter Rule Value" v-model="model.ruleValue" />
:wrapperCol="wrapperCol"
prop="ruleValue"
label="Rule Value">
<a-input placeholder="Please Enter Rule Value" v-model="model.ruleValue"/>
</a-form-model-item> </a-form-model-item>
<a-form-model-item <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="Status">
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label="Status">
<a-radio-group buttonStyle="solid" v-model="model.status"> <a-radio-group buttonStyle="solid" v-model="model.status">
<a-radio-button value="1">Valid</a-radio-button> <a-radio-button value="1">Valid</a-radio-button>
<a-radio-button value="0">Invalid</a-radio-button> <a-radio-button value="0">Invalid</a-radio-button>
</a-radio-group> </a-radio-group>
</a-form-model-item> </a-form-model-item>
</a-form-model> </a-form-model>
</a-spin> </a-spin>
</a-modal> </a-modal>
</template> </template>
<script> <script>
import { httpAction } from '@/api/manage' import { httpAction } from '@/api/manage'
export default { export default {
name: 'PermissionDataRuleModal', name: 'PermissionDataRuleModal',
data() { data() {
return { return {
@ -69,36 +59,35 @@
model: {}, model: {},
ruleConditionList: [], ruleConditionList: [],
labelCol: { labelCol: {
xs: {span: 24}, xs: { span: 24 },
sm: {span: 5} sm: { span: 5 },
}, },
wrapperCol: { wrapperCol: {
xs: {span: 24}, xs: { span: 24 },
sm: {span: 16} sm: { span: 16 },
}, },
confirmLoading: false, confirmLoading: false,
permissionId: '', permissionId: '',
validatorRules: { validatorRules: {
ruleConditions: [{required: true, message: '请选择条件!'}], ruleConditions: [{ required: true, message: '请选择条件!' }],
ruleName:[{required: true, message: '请输入规则名称!'}], ruleName: [{ required: true, message: '请输入规则名称!' }],
ruleValue: [{required: true, message: '请输入规则值!'}], ruleValue: [{ required: true, message: '请输入规则值!' }],
ruleColumn: [] ruleColumn: [],
}, },
url: { url: {
list: '/sys/dictItem/list', list: '/sys/dictItem/list',
add: '/sys/permission/addPermissionRule', add: '/sys/permission/addPermissionRule',
edit: '/sys/permission/editPermissionRule' edit: '/sys/permission/editPermissionRule',
}, },
showRuleColumn:true showRuleColumn: true,
} }
}, },
created() { created() {},
},
methods: { methods: {
add(permId) { add(permId) {
this.permissionId = permId this.permissionId = permId
// //
this.edit({status:'1'}) this.edit({ status: '1' })
}, },
edit(record) { edit(record) {
this.model = Object.assign({}, record) this.model = Object.assign({}, record)
@ -118,7 +107,7 @@
handleOk() { handleOk() {
const that = this const that = this
// //
this.$refs.form.validate(valid => { this.$refs.form.validate((valid) => {
if (valid) { if (valid) {
that.confirmLoading = true that.confirmLoading = true
let httpurl = '' let httpurl = ''
@ -130,44 +119,45 @@
httpurl += this.url.edit httpurl += this.url.edit
method = 'put' method = 'put'
} }
httpAction(httpurl, this.model, method).then((res) => { httpAction(httpurl, this.model, method)
.then((res) => {
if (res.success) { if (res.success) {
that.$message.success(res.message) that.$message.success(res.message)
that.$emit('ok') that.$emit('ok')
} else { } else {
that.$message.warning(res.message) that.$message.warning(res.message)
} }
}).finally(() => { })
.finally(() => {
that.confirmLoading = false that.confirmLoading = false
that.close() that.close()
}) })
}else{ } else {
return false; return false
} }
}) })
}, },
handleCancel() { handleCancel() {
this.close() this.close()
}, },
initRuleCondition(){ initRuleCondition() {
if(this.model.ruleConditions && this.model.ruleConditions=='USE_SQL_RULES'){ if (this.model.ruleConditions && this.model.ruleConditions == 'USE_SQL_RULES') {
this.showRuleColumn = false this.showRuleColumn = false
}else{ } else {
this.showRuleColumn = true this.showRuleColumn = true
} }
}, },
handleChangeRuleCondition(val){ handleChangeRuleCondition(val) {
if(val=='USE_SQL_RULES'){ if (val == 'USE_SQL_RULES') {
this.model.ruleColumn='' this.model.ruleColumn = ''
this.showRuleColumn = false this.showRuleColumn = false
}else{ } else {
this.showRuleColumn = true this.showRuleColumn = true
} }
} },
} },
} }
</script> </script>
<style scoped> <style scoped>
</style> </style>

View File

@ -5,29 +5,27 @@
:title="title" :title="title"
:width="1000" :width="1000"
:visible="visible" :visible="visible"
:maskClosable="false"
@ok="handleOk" @ok="handleOk"
@cancel="handleCancel" @cancel="handleCancel"
:cancelButtonProps="{ props: { type: 'warn' } }" :cancelButtonProps="{ props: { type: 'warn' } }"
cancelText="Cancel"> cancelText="Cancel"
>
<!-- 查询区域 --> <!-- 查询区域 -->
<div class="table-page-search-wrapper"> <div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery"> <a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24"> <a-row :gutter="24">
<a-col :span="10"> <a-col :span="10">
<a-form-item label="User Name"> <a-form-item label="User Name">
<a-input v-model="queryParam.username"></a-input> <a-input v-model="queryParam.username"></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="8"> <a-col :span="8">
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
<a-button type="primary" @click="searchQuery" icon="search">Search</a-button> <a-button type="primary" @click="searchQuery" icon="search">Search</a-button>
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">Reset</a-button> <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">Reset</a-button>
</span> </span>
</a-col> </a-col>
</a-row> </a-row>
</a-form> </a-form>
</div> </div>
@ -42,27 +40,30 @@
:pagination="ipagination" :pagination="ipagination"
:loading="loading" :loading="loading"
:scroll="{ y: 240 }" :scroll="{ y: 240 }"
:rowSelection="{selectedRowKeys: selectedRowKeys,onSelectAll:onSelectAll,onSelect:onSelect,onChange: onSelectChange}" :rowSelection="{
@change="handleTableChange"> selectedRowKeys: selectedRowKeys,
onSelectAll: onSelectAll,
onSelect: onSelect,
onChange: onSelectChange,
}"
@change="handleTableChange"
>
</a-table> </a-table>
</div> </div>
<!-- table区域-end --> <!-- table区域-end -->
</a-modal> </a-modal>
</div> </div>
</template> </template>
<script> <script>
import {filterObj} from '@/utils/util' import { filterObj } from '@/utils/util'
import {getAction} from '@/api/manage' import { getAction } from '@/api/manage'
export default { export default {
name: "SelectUserModal", name: 'SelectUserModal',
data() { data() {
return { return {
title: "Add From List", title: 'Add From List',
names: [], names: [],
visible: false, visible: false,
placement: 'right', placement: 'right',
@ -76,61 +77,60 @@
dataIndex: '', dataIndex: '',
key: 'rowIndex', key: 'rowIndex',
width: 50, width: 50,
align: "center", align: 'center',
customRender: function (t, r, index) { customRender: function (t, r, index) {
return parseInt(index) + 1; return parseInt(index) + 1
} },
}, },
{ {
title: 'User Name', title: 'User Name',
align: "center", align: 'center',
width: 100, width: 100,
dataIndex: 'username' dataIndex: 'username',
}, },
{ {
title: 'Real Name', title: 'Real Name',
align: "center", align: 'center',
width: 100, width: 100,
dataIndex: 'realname' dataIndex: 'realname',
}, },
{ {
title: 'Gender', title: 'Gender',
align: "center", align: 'center',
width: 100, width: 100,
dataIndex: 'sex_dictText' dataIndex: 'sex_dictText',
}, },
{ {
title: 'Phone', title: 'Phone',
align: "center", align: 'center',
width: 100, width: 100,
dataIndex: 'phone' dataIndex: 'phone',
}, },
{ {
title: 'Org', title: 'Org',
align: "center", align: 'center',
width: 150, width: 150,
dataIndex: 'orgCode' dataIndex: 'orgCode',
} },
], ],
columns2: [ columns2: [
{ {
title: 'User Name', title: 'User Name',
align: "center", align: 'center',
dataIndex: 'username', dataIndex: 'username',
}, },
{ {
title: 'Real Name', title: 'Real Name',
align: "center", align: 'center',
dataIndex: 'realname', dataIndex: 'realname',
}, },
{ {
title: 'Action', title: 'Action',
dataIndex: 'action', dataIndex: 'action',
align: "center", align: 'center',
width: 100, width: 100,
scopedSlots: {customRender: 'action'}, scopedSlots: { customRender: 'action' },
} },
], ],
// //
dataSource1: [], dataSource1: [],
@ -146,7 +146,7 @@
}, },
showQuickJumper: true, showQuickJumper: true,
showSizeChanger: true, showSizeChanger: true,
total: 0 total: 0,
}, },
isorter: { isorter: {
column: 'createTime', column: 'createTime',
@ -156,52 +156,52 @@
selectedRowKeys: [], selectedRowKeys: [],
selectedRows: [], selectedRows: [],
url: { url: {
list: "/sys/user/list", list: '/sys/user/list',
} },
} }
}, },
created() { created() {
this.loadData(); this.loadData()
}, },
methods: { methods: {
searchQuery() { searchQuery() {
this.loadData(1); this.loadData(1)
}, },
searchReset() { searchReset() {
this.queryParam = {}; this.queryParam = {}
this.loadData(1); this.loadData(1)
}, },
handleCancel() { handleCancel() {
this.visible = false; this.visible = false
}, },
handleOk() { handleOk() {
this.dataSource2 = this.selectedRowKeys; this.dataSource2 = this.selectedRowKeys
console.log("data:" + this.dataSource2); console.log('data:' + this.dataSource2)
this.$emit("selectFinished", this.dataSource2); this.$emit('selectFinished', this.dataSource2)
this.visible = false; this.visible = false
}, },
add() { add() {
this.visible = true; this.visible = true
}, },
loadData(arg) { loadData(arg) {
// 1 // 1
if (arg === 1) { if (arg === 1) {
this.ipagination.current = 1; this.ipagination.current = 1
} }
var params = this.getQueryParams();// var params = this.getQueryParams() //
getAction(this.url.list, params).then((res) => { getAction(this.url.list, params).then((res) => {
if (res.success) { if (res.success) {
this.dataSource1 = res.result.records; this.dataSource1 = res.result.records
this.ipagination.total = res.result.total; this.ipagination.total = res.result.total
} }
}) })
}, },
getQueryParams() { getQueryParams() {
var param = Object.assign({}, this.queryParam, this.isorter); var param = Object.assign({}, this.queryParam, this.isorter)
param.field = this.getQueryField(); param.field = this.getQueryField()
param.pageNo = this.ipagination.current; param.pageNo = this.ipagination.current
param.pageSize = this.ipagination.pageSize; param.pageSize = this.ipagination.pageSize
return filterObj(param); return filterObj(param)
}, },
getQueryField() { getQueryField() {
//TODO //TODO
@ -209,81 +209,80 @@
onSelectAll(selected, selectedRows, changeRows) { onSelectAll(selected, selectedRows, changeRows) {
if (selected === true) { if (selected === true) {
for (var a = 0; a < changeRows.length; a++) { for (var a = 0; a < changeRows.length; a++) {
this.dataSource2.push(changeRows[a]); this.dataSource2.push(changeRows[a])
} }
} else { } else {
for (var b = 0; b < changeRows.length; b++) { for (var b = 0; b < changeRows.length; b++) {
this.dataSource2.splice(this.dataSource2.indexOf(changeRows[b]), 1); this.dataSource2.splice(this.dataSource2.indexOf(changeRows[b]), 1)
} }
} }
// console.log(selected, selectedRows, changeRows); // console.log(selected, selectedRows, changeRows);
}, },
onSelect(record, selected) { onSelect(record, selected) {
if (selected === true) { if (selected === true) {
this.dataSource2.push(record); this.dataSource2.push(record)
} else { } else {
var index = this.dataSource2.indexOf(record); var index = this.dataSource2.indexOf(record)
//console.log(); //console.log();
if (index >= 0) { if (index >= 0) {
this.dataSource2.splice(this.dataSource2.indexOf(record), 1); this.dataSource2.splice(this.dataSource2.indexOf(record), 1)
} }
} }
}, },
onSelectChange(selectedRowKeys, selectedRows) { onSelectChange(selectedRowKeys, selectedRows) {
this.selectedRowKeys = selectedRowKeys; this.selectedRowKeys = selectedRowKeys
this.selectionRows = selectedRows; this.selectionRows = selectedRows
}, },
onClearSelected() { onClearSelected() {
this.selectedRowKeys = []; this.selectedRowKeys = []
this.selectionRows = []; this.selectionRows = []
}, },
handleDelete: function (record) { handleDelete: function (record) {
this.dataSource2.splice(this.dataSource2.indexOf(record), 1); this.dataSource2.splice(this.dataSource2.indexOf(record), 1)
}, },
handleTableChange(pagination, filters, sorter) { handleTableChange(pagination, filters, sorter) {
// //
console.log(sorter); console.log(sorter)
//TODO //TODO
if (Object.keys(sorter).length > 0) { if (Object.keys(sorter).length > 0) {
this.isorter.column = sorter.field; this.isorter.column = sorter.field
this.isorter.order = "ascend" == sorter.order ? "asc" : "desc" this.isorter.order = 'ascend' == sorter.order ? 'asc' : 'desc'
}
this.ipagination = pagination;
this.loadData();
}
}
} }
this.ipagination = pagination
this.loadData()
},
},
}
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.ant-card-body .table-operator { .ant-card-body .table-operator {
margin-bottom: 18px; margin-bottom: 18px;
} }
.ant-table-tbody .ant-table-row td { .ant-table-tbody .ant-table-row td {
padding-top: 15px; padding-top: 15px;
padding-bottom: 15px; padding-bottom: 15px;
} }
.anty-row-operator button { .anty-row-operator button {
margin: 0 5px margin: 0 5px;
} }
.ant-btn-danger { .ant-btn-danger {
background-color: #ffffff background-color: #ffffff;
} }
.ant-modal-cust-warp { .ant-modal-cust-warp {
height: 100% height: 100%;
} }
.ant-modal-cust-warp .ant-modal-body { .ant-modal-cust-warp .ant-modal-body {
height: calc(100% - 110px) !important; height: calc(100% - 110px) !important;
overflow-y: auto overflow-y: auto;
} }
.ant-modal-cust-warp .ant-modal-content { .ant-modal-cust-warp .ant-modal-content {
height: 90% !important; height: 90% !important;
overflow-y: hidden overflow-y: hidden;
} }
</style> </style>