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-10-25 08:55:24 +08:00
commit cdfb4d828e
7 changed files with 214 additions and 105 deletions

View File

@ -57,6 +57,7 @@
"vxe-table": "2.9.13", "vxe-table": "2.9.13",
"vxe-table-plugin-antd": "1.8.10", "vxe-table-plugin-antd": "1.8.10",
"xe-utils": "2.4.8", "xe-utils": "2.4.8",
"xlsx": "^0.18.5",
"xss": "^1.0.13" "xss": "^1.0.13"
}, },
"devDependencies": { "devDependencies": {

View File

@ -104,21 +104,28 @@ export function getFileNameByHeaderContentDisposition(contentDisposition) {
return fileName return fileName
} }
export const fetchAndDownload = async (url, data) => { export const fetchAndDownload = async (url, data, method='post') => {
const apiBaseUrl = window._CONFIG['domianURL'] || '/jeecg-boot' const apiBaseUrl = window._CONFIG['domianURL'] || '/jeecg-boot'
const sign = signMd5Utils.getSign(url, data) const sign = signMd5Utils.getSign(url, data)
const response = await Axios({
const config = {
baseURL: apiBaseUrl, baseURL: apiBaseUrl,
method: 'post', method,
url, url,
data: data, data,
headers: { headers: {
'X-Sign': sign, 'X-Sign': sign,
'X-TIMESTAMP': signMd5Utils.getTimestamp(), 'X-TIMESTAMP': signMd5Utils.getTimestamp(),
'X-Access-Token': Vue.ls.get(ACCESS_TOKEN), 'X-Access-Token': Vue.ls.get(ACCESS_TOKEN),
'tenant-id': Vue.ls.get(TENANT_ID) 'tenant-id': Vue.ls.get(TENANT_ID)
} }
}) }
if(method == 'get') {
config.params = data
}
const response = await Axios(config)
const { status, headers, data: responseData } = response const { status, headers, data: responseData } = response
if (status == 200) { if (status == 200) {
if (typeof responseData == 'object') { if (typeof responseData == 'object') {

View File

@ -80,7 +80,7 @@ export default {
const params = this.getQueryParams() // const params = this.getQueryParams() //
const searchName = this.queryParam.searchName const searchName = this.queryParam.searchName
params.name = `${searchName ? `${searchName},` : ''}_S_` params.name = searchName
this.loading = true this.loading = true
getAction('/spectrumFile/get', params) getAction('/spectrumFile/get', params)
.then(res => { .then(res => {

View File

@ -0,0 +1,49 @@
<template>
<div class="editable-cell">
<div v-if="editable" class="editable-cell-input-wrapper">
<a-input ref="myInput" :value="value" @change="handleChange" @blur="handleBlur" />
</div>
<div v-else class="editable-cell-text-wrapper" @dblclick="handleCellClick">
{{ value || ' ' }}
</div>
</div>
</template>
<script>
export default {
props: {
text: Number,
},
data() {
return {
value: this.text,
editable: false,
}
},
methods: {
handleCellClick() {
this.editable = true
this.$nextTick(() => {
this.$refs.myInput.focus()
})
},
handleChange(e) {
this.value = e.target.value
},
handleBlur() {
this.editable = false
this.$emit('change', this.value)
},
},
}
</script>
<style lang="less" scoped>
/deep/.ant-input {
padding: 0;
}
.editable-cell-text-wrapper {
min-height: 32px;
line-height: 32px;
}
</style>

View File

@ -10,8 +10,8 @@
class="korsum-input-formula" class="korsum-input-formula"
:labelCol="{ :labelCol="{
style: { style: {
width: '110px' width: '110px',
} },
}" }"
> >
<a-form-model-item label="Total Effi = exp("> <a-form-model-item label="Total Effi = exp(">
@ -64,9 +64,7 @@
<!-- 公式结束 --> <!-- 公式结束 -->
<!-- 标题 --> <!-- 标题 -->
<a-button type="primary" class="korsum-input-title" @click="handleInput"> <a-button type="primary" class="korsum-input-title" @click="handleInput"> Input </a-button>
Input
</a-button>
<!-- 标题结束 --> <!-- 标题结束 -->
<!-- 表格开始 --> <!-- 表格开始 -->
@ -125,7 +123,15 @@
:class="outputTableList.length ? 'has-data' : ''" :class="outputTableList.length ? 'has-data' : ''"
:scroll="{ y: 584 }" :scroll="{ y: 584 }"
:pagination="false" :pagination="false"
></a-table> >
<template v-for="(col, i) in outputColumns" :slot="col.dataIndex" slot-scope="text, record, index">
<edit-cell
:text="parseFloat(Number(text).toPrecision(6))"
:key="i"
@change="onCellChange(index, col.dataIndex, $event)"
/>
</template>
</a-table>
</div> </div>
<div class="korsum-output-operation"> <div class="korsum-output-operation">
@ -148,58 +154,62 @@
import ModalMixin from '@/mixins/ModalMixin' import ModalMixin from '@/mixins/ModalMixin'
import TitleOverBorder from '../TitleOverBorder.vue' import TitleOverBorder from '../TitleOverBorder.vue'
import { getAction, postAction } from '@/api/manage' import { getAction, postAction } from '@/api/manage'
import * as XLSX from 'xlsx'; import * as XLSX from 'xlsx'
import EditCell from './EditCell.vue'
const columns = [ const columns = [
{ {
title: 'Energy', title: 'Energy',
dataIndex: 'energy', dataIndex: 'energy',
scopedSlots: { scopedSlots: {
customRender: 'energy' customRender: 'energy',
} },
}, },
{ {
title: 'Total Efficiency', title: 'Total Efficiency',
dataIndex: 'totalEffi', dataIndex: 'totalEffi',
scopedSlots: { scopedSlots: {
customRender: 'totalEffi' customRender: 'totalEffi',
} },
}, },
{ {
title: 'Peak Efficiency', title: 'Peak Efficiency',
dataIndex: 'peakEffi', dataIndex: 'peakEffi',
scopedSlots: { scopedSlots: {
customRender: 'peakEffi' customRender: 'peakEffi',
} },
}, },
{ {
title: 'Uncertainty(%)', title: 'Uncertainty(%)',
dataIndex: 'uncertain', dataIndex: 'uncertain',
scopedSlots: { scopedSlots: {
customRender: 'uncertain' customRender: 'uncertain',
} },
} },
] ]
const outputColumns = [ const outputColumns = [
{ {
title: 'Energy', title: 'Energy',
dataIndex: 'energy', dataIndex: 'energy',
customRender: (text) => parseFloat(Number(text).toPrecision(6)) scopedSlots: { customRender: 'energy' },
// customRender: (text) => parseFloat(Number(text).toPrecision(6))
}, },
{ {
title: 'Correct Factor', title: 'Correct Factor',
dataIndex: 'correctFactor', dataIndex: 'correctFactor',
customRender: (text) => parseFloat(Number(text).toPrecision(6)) scopedSlots: { customRender: 'correctFactor' },
// customRender: (text) => parseFloat(Number(text).toPrecision(6)),
}, },
{ {
title: 'Uncertainty(%)', title: 'Uncertainty(%)',
dataIndex: 'uncertainty', dataIndex: 'uncertainty',
customRender: (text) => parseFloat(Number(text).toPrecision(6)) scopedSlots: { customRender: 'uncertainty' },
} // customRender: (text) => parseFloat(Number(text).toPrecision(6)),
},
] ]
export default { export default {
components: { TitleOverBorder }, components: { TitleOverBorder, EditCell },
mixins: [ModalMixin], mixins: [ModalMixin],
data() { data() {
this.columns = columns this.columns = columns
@ -217,7 +227,7 @@ export default {
filterWord: '', // filterWord: '', //
fileName: '', // save excel name fileName: '', // save excel name
analyseData: {} // analyseData: {}, //
} }
}, },
methods: { methods: {
@ -245,7 +255,7 @@ export default {
totalEf3: 0.111096, totalEf3: 0.111096,
totalEf4: -0.003896, totalEf4: -0.003896,
totalEf5: -0.000345, totalEf5: -0.000345,
totalEf6: 0.000017 totalEf6: 0.000017,
} }
this.efficiency = { this.efficiency = {
@ -254,7 +264,7 @@ export default {
effciency3: 0.583265, effciency3: 0.583265,
effciency4: -0.065884, effciency4: -0.065884,
effciency5: 0.003255, effciency5: 0.003255,
effciency6: -0.000059 effciency6: -0.000059,
} }
this.getInfo() this.getInfo()
@ -269,9 +279,9 @@ export default {
const { success, result, message } = await postAction('/gamma/KorSumInput', { const { success, result, message } = await postAction('/gamma/KorSumInput', {
...this.totalEffi, ...this.totalEffi,
...this.efficiency, ...this.efficiency,
energys: this.list.map(item => item.energy) energys: this.list.map((item) => item.energy),
}) })
console.log(success); console.log(success)
if (success) { if (success) {
this.list = result this.list = result
} else { } else {
@ -291,12 +301,12 @@ export default {
this.isLoading = false this.isLoading = false
if (success) { if (success) {
this.analyseData = result this.analyseData = result
console.log(result); console.log(result)
} else { } else {
this.$message.error(message) this.$message.error(message)
} }
} catch (error) { } catch (error) {
this.isLoading = false; this.isLoading = false
console.error(error) console.error(error)
} }
}, },
@ -308,32 +318,43 @@ export default {
// output // output
handleOutputItemClick(item) { handleOutputItemClick(item) {
if(!this.analyseData) { if (!this.analyseData) {
this.$message.error("Analyse Fail!") this.$message.error('Analyse Fail!')
return false; return false
} }
this.selectedItem = item this.selectedItem = item
this.outputTableList = []; this.outputTableList = []
// //
let data = this.analyseData[this.selectedItem] let data = this.analyseData[this.selectedItem]
if(!data || data.energy.length < 1) { if (!data || data.energy.length < 1) {
this.$message.error("Analyse Fail!") this.$message.error('Analyse Fail!')
return false; return false
} }
let result = []; let result = []
for(let i = 0; i < data.energy.length; i++ ) { for (let i = 0; i < data.energy.length; i++) {
// //
let obj = { let obj = {
"energy": data.energy[i], energy: data.energy[i],
"correctFactor" : data.factor[i], correctFactor: data.factor[i],
"uncertainty" : (data.factor[i] - 1) / 10 * 100 uncertainty: ((data.factor[i] - 1) / 10) * 100,
} }
result.push(obj); result.push(obj)
} }
this.outputTableList = result; this.outputTableList = result
},
onCellChange(idx, label, value) {
console.log(this.outputTableList)
console.log(value)
const dataSource = [...this.outputTableList]
const target = dataSource.find((item, index) => index == idx)
if (target) {
target[label] = value
this.outputTableList = dataSource
}
console.log(this.outputTableList)
}, },
// excel // excel
@ -351,30 +372,30 @@ export default {
console.log('Cancel') console.log('Cancel')
}, },
onCancel() { onCancel() {
console.log(_this.fileName); console.log(_this.fileName)
if (_this.fileName) { if (_this.fileName) {
// saveAs(blob, `${_this.fileName}`) // saveAs(blob, `${_this.fileName}`)
// 簿 // 簿
const workbook = XLSX.utils.book_new(); const workbook = XLSX.utils.book_new()
// //
const worksheet = XLSX.utils.json_to_sheet(_this.outputTableList); const worksheet = XLSX.utils.json_to_sheet(_this.outputTableList)
// 簿 // 簿
XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')
// Excel // Excel
XLSX.writeFile(workbook, _this.fileName + ".xlsx"); XLSX.writeFile(workbook, _this.fileName + '.xlsx')
} }
}, },
}) })
} },
}, },
computed: { computed: {
outputList() { outputList() {
return this.nuclideList.filter(item => item.toLowerCase().includes(this.filterWord.toLowerCase())) return this.nuclideList.filter((item) => item.toLowerCase().includes(this.filterWord.toLowerCase()))
} },
} },
} }
</script> </script>

View File

@ -138,6 +138,8 @@ import store from '@/store/'
import Vue from 'vue' import Vue from 'vue'
import { ACCESS_TOKEN } from '@/store/mutation-types' 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 { zipFile } from '@/utils/file'
export default { export default {
props: { props: {
@ -470,21 +472,21 @@ export default {
// BaseLine // BaseLine
series.push( series.push(
buildLineSeries('BaseLine', this.transformPointListData(channelBaseLine.pointlist), channelBaseLine.color, { buildLineSeries('BaseLine', this.transformPointListData(channelBaseLine.pointlist), channelBaseLine.color, {
zlevel: 2, z: 2,
}) })
) )
// LcLine线 // LcLine线
series.push( series.push(
buildLineSeries('LcLine', this.transformPointListData(channelLcLine.pointlist), channelLcLine.color, { buildLineSeries('LcLine', this.transformPointListData(channelLcLine.pointlist), channelLcLine.color, {
zlevel: 3, z: 3,
}) })
) )
// Scac线 // Scac线
series.push( series.push(
buildLineSeries('ScacLine', this.transformPointListData(channelScacLine.pointlist), channelScacLine.color, { buildLineSeries('ScacLine', this.transformPointListData(channelScacLine.pointlist), channelScacLine.color, {
zlevel: 4, z: 4,
}) })
) )
@ -506,7 +508,7 @@ export default {
disabled: true, disabled: true,
}, },
animation: false, animation: false,
zlevel: 5, z: 5,
}) })
// Peak Line // Peak Line
@ -514,7 +516,7 @@ export default {
channelPeakGroup.forEach((item, index) => { channelPeakGroup.forEach((item, index) => {
peakLines.push( peakLines.push(
buildLineSeries(`Peak_${index}`, this.transformPointListData(item.pointlist), item.color, { buildLineSeries(`Peak_${index}`, this.transformPointListData(item.pointlist), item.color, {
zlevel: 6, z: 6,
}) })
) )
}) })
@ -524,6 +526,7 @@ export default {
series.push( series.push(
buildLineSeries('Compare', [], '#fff', { buildLineSeries('Compare', [], '#fff', {
symbolSize: 2, symbolSize: 2,
z: 7,
}) })
) )
@ -576,6 +579,11 @@ export default {
break break
case 'Channel': case 'Channel':
case 'Energy': case 'Energy':
// Energy
if (!this.energyData.all.pointlist) {
return
}
this.graphAssistance.axisType = label this.graphAssistance.axisType = label
this.option.xAxis.name = label this.option.xAxis.name = label
@ -713,7 +721,7 @@ export default {
data.forEach((item, index) => { data.forEach((item, index) => {
peakLines.push( peakLines.push(
buildLineSeries(`Peak_${index}`, this.transformPointListData(item.pointlist), item.color, { buildLineSeries(`Peak_${index}`, this.transformPointListData(item.pointlist), item.color, {
zlevel: 6, z: 6,
}) })
) )
}) })
@ -1219,15 +1227,42 @@ export default {
} }
this.handleResetChart() this.handleResetChart()
this.clearCompareLine() this.clearCompareLine()
this.compareFileListModalVisible = true
this.isStrip = isStrip this.isStrip = isStrip
if (FilePicker.canUse()) {
this.chooseFileFromFS()
} else {
this.compareFileListModalVisible = true
}
},
//
async chooseFileFromFS() {
try {
const [fileHandle] = await FilePicker.chooseFile(false, [{ accept: { 'text/phd': ['.phd'] } }])
const file = await fileHandle.getFile()
const zipedFiles = await zipFile([file], 'test.zip')
try {
const formData = new FormData()
formData.append('file', zipedFiles)
const { success, message } = await postAction('/spectrumFile/upload', formData)
if (success) {
this.handleFileSelect(file.name)
} else {
this.$message.error(message)
}
} catch (error) {
console.error(error)
}
} catch (error) {
console.error(error)
}
}, },
// //
async handleFileSelect(selectedFileName) { async handleFileSelect(selectedFileName) {
const { inputFileName: fileName } = this.sample const { inputFileName: fileName } = this.sample
const hide = this.$message.loading(this.isStrip ? 'Stripping...' : 'Comparing...', 0)
try { try {
let param = { let param = {
fileName, fileName,
@ -1246,7 +1281,6 @@ export default {
url = '/gamma/Strip' url = '/gamma/Strip'
} }
this.isLoading = true
const { success, result, message } = await getAction(url, param) const { success, result, message } = await getAction(url, param)
if (success) { if (success) {
const [channelData, energyData] = result const [channelData, energyData] = result
@ -1254,10 +1288,6 @@ export default {
this.energyCompareLine = energyData this.energyCompareLine = energyData
this.redrawLineBySeriesName('Compare', energyData, channelData, true, channelData.color) this.redrawLineBySeriesName('Compare', energyData, channelData, true, channelData.color)
if (this.isScatter()) {
lineSeries.type = 'scatterGL'
}
this.$nextTick(() => { this.$nextTick(() => {
this.thumbnailOption.yAxis.max = getAxisMax(this.getChart(), 'yAxis') this.thumbnailOption.yAxis.max = getAxisMax(this.getChart(), 'yAxis')
}) })
@ -1267,7 +1297,7 @@ export default {
} catch (error) { } catch (error) {
console.error(error) console.error(error)
} finally { } finally {
this.isLoading = false hide()
} }
}, },
@ -1305,7 +1335,7 @@ export default {
this.dataProcess(result) this.dataProcess(result)
} else { } else {
this.isLoading = false this.isLoading = false
if(showMessage) { if (showMessage) {
const arr = message.split('\n') const arr = message.split('\n')
this.$warning({ this.$warning({
title: 'Warning', title: 'Warning',

View File

@ -198,7 +198,7 @@
</div> </div>
</template> </template>
<script> <script>
import { downloadFile, postAction } from '@/api/manage' import { postAction } from '@/api/manage'
import GammaAnalysis from './gamma-analysis.vue' import GammaAnalysis from './gamma-analysis.vue'
import BetaGammaAnalysis from './beta-gamma-analysis.vue' import BetaGammaAnalysis from './beta-gamma-analysis.vue'
import SpectraListInMenu from './components/SpectraListInMenu.vue' import SpectraListInMenu from './components/SpectraListInMenu.vue'
@ -237,6 +237,7 @@ import AutomaticAnalysisLogModal from './components/Modals/BetaGammaModals/Autom
import BetaGammaExtrapolationModal from './components/Modals/BetaGammaModals/BetaGammaExtrapolationModal.vue' import BetaGammaExtrapolationModal from './components/Modals/BetaGammaModals/BetaGammaExtrapolationModal.vue'
import { getAction } from '@/api/manage' import { getAction } from '@/api/manage'
import { clearSampleCache } from './clearSampleCache' import { clearSampleCache } from './clearSampleCache'
import { fetchAndDownload } from '@/utils/file'
// //
const ANALYZE_TYPE = { const ANALYZE_TYPE = {
@ -494,7 +495,7 @@ export default {
let params = { let params = {
fileName: this.newSampleData.inputFileName, fileName: this.newSampleData.inputFileName,
} }
downloadFile(url, `result.${saveFormat}`, params, 'get') fetchAndDownload(url, params, 'get')
} }
if (this.isBetaGamma) { if (this.isBetaGamma) {
const url = const url =
@ -520,7 +521,7 @@ export default {
this.params_toDB.qcFileName = this.newSampleData.qcFileName this.params_toDB.qcFileName = this.newSampleData.qcFileName
this.params_toDB.dbName = this.newSampleData.dbName this.params_toDB.dbName = this.newSampleData.dbName
downloadFile(url, `result.${saveFormat}`, this.params_toDB, 'post') fetchAndDownload(url, this.params_toDB)
} }
}, },
@ -594,7 +595,7 @@ export default {
let params = { let params = {
fileName: this.newSampleData.inputFileName, fileName: this.newSampleData.inputFileName,
} }
downloadFile(url, `result.PHD`, params, 'get') fetchAndDownload(url, params, 'get')
} }
}, },