2025-02-04 09:24:12 +00:00
|
|
|
<template>
|
|
|
|
<div class="app-container">
|
2025-02-24 15:58:53 +00:00
|
|
|
<el-form label-position="top" size="small" :inline="true" class="component-form">
|
|
|
|
<!-- <el-row> -->
|
|
|
|
<!-- 常用组分选择框 -->
|
|
|
|
<!-- <el-col :span="10"> -->
|
|
|
|
<el-form-item label="常用组分">
|
|
|
|
<el-select v-model="selectedComponent" @change="handleComponentChange" placeholder="请选择常用组分" clearable
|
|
|
|
filterable>
|
|
|
|
<el-option v-for="dict in dict.type.ngtools_cyzf" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
|
</el-select>
|
|
|
|
</el-form-item>
|
|
|
|
<!-- </el-col> -->
|
|
|
|
<!-- 合计输入框 -->
|
|
|
|
<!-- <el-col :span="6"> -->
|
|
|
|
<el-form-item label="合计">
|
|
|
|
<el-input :value="totalPercentage" readonly class="total-input" />
|
|
|
|
</el-form-item>
|
|
|
|
<!-- </el-col> -->
|
|
|
|
<!-- </el-row> -->
|
2025-02-04 09:24:12 +00:00
|
|
|
</el-form>
|
|
|
|
|
|
|
|
<el-form :model="formData" label-position="top" size="small" :inline="true" class="component-form">
|
|
|
|
<el-form-item v-for="field in componentFields" :key="field.prop" :label="field.label" :prop="field.prop">
|
2025-02-24 15:58:53 +00:00
|
|
|
<el-input v-model="formData[field.prop]" controls-position="right" @change="handleValueChange"
|
|
|
|
@focus="selectAllText" />
|
2025-02-04 09:24:12 +00:00
|
|
|
</el-form-item>
|
|
|
|
</el-form>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
2025-02-24 15:58:53 +00:00
|
|
|
import {
|
|
|
|
listComponents,
|
|
|
|
getComponents,
|
|
|
|
delComponents,
|
|
|
|
addComponents,
|
|
|
|
updateComponents
|
|
|
|
} from '@/api/ngtools/components';
|
2025-02-04 09:24:12 +00:00
|
|
|
|
2025-02-24 15:58:53 +00:00
|
|
|
// 字段配置元数据
|
|
|
|
const COMPONENT_FIELDS = [{
|
|
|
|
prop: 'ngC1',
|
|
|
|
label: '甲烷C1'
|
2025-02-04 09:24:12 +00:00
|
|
|
},
|
2025-02-24 15:58:53 +00:00
|
|
|
{
|
|
|
|
prop: 'ngN2',
|
|
|
|
label: '氮气N2'
|
2025-02-04 09:24:12 +00:00
|
|
|
},
|
2025-02-24 15:58:53 +00:00
|
|
|
{
|
|
|
|
prop: 'ngCo2',
|
|
|
|
label: '二氧化碳CO2'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngC2',
|
|
|
|
label: '乙烷C2'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngC3',
|
|
|
|
label: '丙烷C3'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngH2o',
|
|
|
|
label: '水H2O'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngH2s',
|
|
|
|
label: '硫化氢H2S'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngH2',
|
|
|
|
label: '氢气H2'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngCo',
|
|
|
|
label: '一氧化碳CO'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngO2',
|
|
|
|
label: '氧气O2'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngIc4',
|
|
|
|
label: '异丁烷iC4'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngNc4',
|
|
|
|
label: '正丁烷nC4'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngIc5',
|
|
|
|
label: '异戊烷iC5'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngNc5',
|
|
|
|
label: '正戊烷nC5'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngC6',
|
|
|
|
label: '己烷C6'
|
2025-02-04 09:24:12 +00:00
|
|
|
},
|
2025-02-24 15:58:53 +00:00
|
|
|
{
|
|
|
|
prop: 'ngC7',
|
|
|
|
label: '庚烷C7'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngC8',
|
|
|
|
label: '辛烷C8'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngC9',
|
|
|
|
label: '壬烷C9'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngC10',
|
|
|
|
label: '癸烷C10'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngHe',
|
|
|
|
label: '氦气He'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
prop: 'ngAr',
|
|
|
|
label: '氩气Ar'
|
|
|
|
}
|
|
|
|
];
|
2025-02-04 09:24:12 +00:00
|
|
|
|
2025-02-24 15:58:53 +00:00
|
|
|
export default {
|
|
|
|
name: 'NgComponentsForm',
|
|
|
|
props: {
|
|
|
|
value: {
|
|
|
|
type: String,
|
|
|
|
default: ''
|
2025-02-04 09:24:12 +00:00
|
|
|
}
|
|
|
|
},
|
2025-02-24 15:58:53 +00:00
|
|
|
dicts: ['ngtools_cyzf'],
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
selectedComponent: null,
|
|
|
|
formData: this.initFormData(),
|
|
|
|
componentFields: COMPONENT_FIELDS
|
|
|
|
};
|
2025-02-04 09:24:12 +00:00
|
|
|
},
|
2025-02-24 15:58:53 +00:00
|
|
|
computed: {
|
|
|
|
totalPercentage() {
|
|
|
|
return Object.values(this.formData)
|
|
|
|
.reduce((sum, val) => sum + (parseFloat(val) || 0), 0)
|
|
|
|
.toFixed(4);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
watch: {
|
|
|
|
value: {
|
|
|
|
immediate: true,
|
|
|
|
handler(newVal) {
|
|
|
|
this.parseValueString(newVal);
|
|
|
|
}
|
2025-02-04 09:24:12 +00:00
|
|
|
}
|
|
|
|
},
|
2025-02-24 15:58:53 +00:00
|
|
|
methods: {
|
|
|
|
initFormData() {
|
|
|
|
return COMPONENT_FIELDS.reduce((acc, field) => {
|
|
|
|
acc[field.prop] = 0;
|
|
|
|
return acc;
|
|
|
|
}, {});
|
|
|
|
},
|
|
|
|
selectAllText(event) {
|
|
|
|
// 通过 event.target 获取原生 DOM 元素
|
|
|
|
const inputElement = event.target;
|
|
|
|
// 调用 select() 方法全选文本
|
|
|
|
inputElement.select();
|
|
|
|
},
|
2025-02-04 09:24:12 +00:00
|
|
|
|
2025-02-24 15:58:53 +00:00
|
|
|
parseValueString(valueStr) {
|
|
|
|
const values = (valueStr || '').split('_');
|
|
|
|
this.componentFields.forEach((field, index) => {
|
|
|
|
const value = parseFloat(values[index]) || 0;
|
|
|
|
this.$set(this.formData, field.prop, value);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
generateValueString() {
|
|
|
|
return Object.values(this.formData)
|
|
|
|
.map((v) => v.toFixed(4))
|
|
|
|
.join('_');
|
|
|
|
},
|
|
|
|
|
|
|
|
async handleComponentChange(value) {
|
|
|
|
if (!value) return;
|
|
|
|
console.log(value);
|
|
|
|
try {
|
|
|
|
const temp = value.replace(/\\'"/g, '"').replace(/'/g, '"'); // 替换剩余单引号;
|
|
|
|
const componentData = Object.assign({}, this.formData, JSON.parse(temp));
|
|
|
|
Object.keys(this.formData).forEach((key) => {
|
|
|
|
this.formData[key] = parseFloat(componentData[key]) || 0;
|
|
|
|
});
|
|
|
|
this.emitUpdate();
|
|
|
|
} catch (error) {
|
|
|
|
this.$message.error('获取标准组分失败');
|
|
|
|
console.error(error);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
handleValueChange() {
|
|
|
|
this.$nextTick(() => {
|
|
|
|
this.emitUpdate();
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
emitUpdate() {
|
|
|
|
if (Math.abs(this.totalPercentage - 100) > 0.0001) {
|
|
|
|
this.$message.warning('组分合计不等于100%,请检查输入');
|
|
|
|
}
|
|
|
|
this.$emit('input', this.generateValueString());
|
|
|
|
},
|
|
|
|
|
|
|
|
async fetchComponentData(params) {
|
|
|
|
try {
|
|
|
|
const {
|
|
|
|
data
|
|
|
|
} = await getComponents(params);
|
|
|
|
this.parseValueString(data.componentStr);
|
|
|
|
} catch (error) {
|
|
|
|
console.error('获取组分数据失败:', error);
|
|
|
|
}
|
2025-02-04 09:24:12 +00:00
|
|
|
}
|
|
|
|
}
|
2025-02-24 15:58:53 +00:00
|
|
|
};
|
2025-02-04 09:24:12 +00:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped>
|
2025-02-24 15:58:53 +00:00
|
|
|
.component-form {
|
|
|
|
display: grid;
|
|
|
|
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
|
|
|
|
gap: 16px;
|
|
|
|
/* margin-top: 20px; */
|
|
|
|
}
|
2025-02-04 09:24:12 +00:00
|
|
|
|
2025-02-24 15:58:53 +00:00
|
|
|
.total-input>>>.el-input__inner {
|
|
|
|
font-weight: bold;
|
|
|
|
color: #409eff;
|
|
|
|
}
|
2025-02-04 09:24:12 +00:00
|
|
|
</style>
|