带单位输入组件inputUnit,天然气参数meterPar、组分NGCom、结果组件NGResult MeterResult,修改本地预存单位数据的存储器unitdata.js

This commit is contained in:
廖德云 2026-01-17 15:31:04 +08:00
parent 4080f1171b
commit 6bb827e955
13 changed files with 7846 additions and 1147 deletions

View File

@ -21,6 +21,7 @@
"@vueuse/core": "14.1.0",
"axios": "1.13.2",
"clipboard": "2.0.11",
"cnpm": "^9.4.0",
"echarts": "5.6.0",
"element-plus": "2.13.1",
"file-saver": "2.0.5",
@ -30,11 +31,13 @@
"jsencrypt": "3.3.2",
"nprogress": "0.2.0",
"pinia": "3.0.4",
"sortablejs": "^1.15.6",
"splitpanes": "4.0.4",
"vue": "3.5.26",
"vue-cropper": "1.1.1",
"vue-router": "4.6.4",
"vuedraggable": "4.1.0"
"vuedraggable": "4.1.0",
"yarn": "^1.22.22"
},
"devDependencies": {
"@vitejs/plugin-vue": "5.2.4",

4849
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load Diff

44
src/api/system/convert.js Normal file
View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询【请填写功能名称】列表
export function listConvert(query) {
return request({
url: '/system/convert/list',
method: 'get',
params: query
})
}
// 查询【请填写功能名称】详细
export function getConvert(id) {
return request({
url: '/system/convert/' + id,
method: 'get'
})
}
// 新增【请填写功能名称】
export function addConvert(data) {
return request({
url: '/system/convert',
method: 'post',
data: data
})
}
// 修改【请填写功能名称】
export function updateConvert(data) {
return request({
url: '/system/convert',
method: 'put',
data: data
})
}
// 删除【请填写功能名称】
export function delConvert(id) {
return request({
url: '/system/convert/' + id,
method: 'delete'
})
}

View File

@ -0,0 +1,265 @@
<template>
<div class="app-container">
<el-form label-position="top" size="small" :inline="true" label-width="160px" class="component-form">
<!-- <el-row> -->
<!-- 常用组分选择框 -->
<!-- <el-col :span="10"> -->
<el-form-item label="常用组分" :style="{ width: selectWidth + 'px' }">
<el-select v-model="selectedComponent" @change="handleComponentChange" placeholder="请选择常用组分" clearable filterable>
<el-option v-for="dict in 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="合计" :style="{ width: selectWidth + 'px' }">
<el-input :value="totalPercentage" readonly class="total-input" />
</el-form-item>
<!-- </el-col> -->
<!-- </el-row> -->
</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" :style="{ width: selectWidth + 'px' }">
<el-input v-model="formData[field.prop]" controls-position="right" @change="handleValueChange" @focus="selectAllText" />
</el-form-item>
</el-form>
</div>
</template>
<script setup>
import { ref, watch, onMounted, computed,getCurrentInstance } from 'vue';
import { listComponents, getComponents, delComponents, addComponents, updateComponents } from '@/api/ngtools/components';
const { proxy } = getCurrentInstance();
const { ngtools_cyzf } = proxy.useDict('ngtools_cyzf');
//
const COMPONENT_FIELDS = [
{
prop: 'ngC1',
label: '甲烷C1'
},
{
prop: 'ngN2',
label: '氮气N2'
},
{
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'
},
{
prop: 'ngC7',
label: '庚烷C7'
},
{
prop: 'ngC8',
label: '辛烷C8'
},
{
prop: 'ngC9',
label: '壬烷C9'
},
{
prop: 'ngC10',
label: '癸烷C10'
},
{
prop: 'ngHe',
label: '氦气He'
},
{
prop: 'ngAr',
label: '氩气Ar'
}
];
// props
const props = defineProps({
modelValue: {
type: String,
default: ''
},
elFormWidth: {
type: Number,
default: 180
}
});
// emits
const emits = defineEmits(['update:modelValue']);
//
const selectWidth = ref(0);
const selectedComponent = ref(null);
const formData = ref(initFormData());
const componentFields = ref(COMPONENT_FIELDS);
//
const totalPercentage = computed(() => {
return Object.values(formData.value)
.reduce((sum, val) => sum + (parseFloat(val) || 0), 0)
.toFixed(4);
});
//
function initFormData() {
return COMPONENT_FIELDS.reduce((acc, field) => {
acc[field.prop] = 0;
return acc;
}, {});
}
//
function selectAllText(event) {
const inputElement = event.target;
inputElement.select();
}
//
function parseValueString(valueStr) {
const values = (valueStr || '').split('_');
componentFields.value.forEach((field, index) => {
const value = parseFloat(values[index]) || 0;
formData.value[field.prop] = value;
});
}
//
function generateValueString() {
return Object.values(formData.value)
.map((v) => v.toFixed(4))
.join('_');
}
//
async function handleComponentChange(value) {
if (!value) return;
console.log(value);
try {
const temp = value.replace(/\\'"/g, '"').replace(/'/g, '"');
const componentData = Object.assign({}, formData.value, JSON.parse(temp));
Object.keys(formData.value).forEach((key) => {
formData.value[key] = parseFloat(componentData[key]) || 0;
});
emitUpdate();
} catch (error) {
// 使 ElementPlus
ElMessage.error('获取标准组分失败');
console.error(error);
}
}
//
function handleValueChange() {
nextTick(() => {
emitUpdate();
});
}
//
function emitUpdate() {
if (Math.abs(parseFloat(totalPercentage.value) - 100) > 0.0001) {
// 使 ElementPlus
ElMessage.warning('组分合计不等于100%,请检查输入');
}
console.log(generateValueString());
emits('update:modelValue', generateValueString());
}
//
async function fetchComponentData(params) {
try {
const { data } = await getComponents(params);
parseValueString(data.componentStr);
} catch (error) {
console.error('获取组分数据失败:', error);
}
}
// elFormWidth
watch(
() => props.elFormWidth,
(newVal) => {
selectWidth.value = newVal;
},
{ deep: true }
);
// value
watch(
() => props.modelValue,
(newVal) => {
parseValueString(newVal);
},
{ immediate: true }
);
// selectWidth
onMounted(() => {
selectWidth.value = props.elFormWidth;
});
</script>
<style scoped>
.component-form {
display: grid;
/* 优化后的自适应规则 */
grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));
gap: 5px;
}
.app-container {
height: 100%;
}
/* 在 Vue 3 中使用 :deep() 替代 >>> */
/* :deep(.total-input .el-input__inner) {
font-weight: bold;
color: #409eff;
} */
</style>

View File

@ -0,0 +1,356 @@
<template>
<div class="app-container">
<!-- <div>当前 dMeterType 的值: {{ dMeterType }}</div>
<div>NGResult 数据: {{ NGResult }}</div> -->
<h3 v-if="dMeterType === '4'">GB/T 17747</h3>
<el-form v-if="dMeterType === '4'" :model="NGResult" label-position="top" ref="queryRef" size="small"
:inline="false" label-width="160px" class="flex-form">
<el-form-item :style="{ width: selectWidth + 'px' }" label="分子量" prop="dMrx">
<el-input readonly v-model="NGResult.dMrx" placeholder="请输入分子量" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="标况压缩因子" prop="dZb">
<el-input readonly v-model="NGResult.dZb" placeholder="请输入标况压缩因子" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="工况压缩因子" prop="dZf">
<el-input readonly v-model="NGResult.dZf" placeholder="请输入工况压缩因子" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="超压缩系数" prop="dFpv">
<el-input readonly v-model="NGResult.dFpv" placeholder="请输入超压缩系数" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="标况摩尔密度" prop="dDb">
<el-input readonly v-model="NGResult.dDb" placeholder="请输入标况摩尔密度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="工况摩尔密度" prop="dDf">
<el-input readonly v-model="NGResult.dDf" placeholder="请输入工况摩尔密度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="标况质量密度" prop="dRhob">
<el-input readonly v-model="NGResult.dRhob" placeholder="请输入标况质量密度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="工况质量密度" prop="dRhof">
<el-input readonly v-model="NGResult.dRhof" placeholder="请输入工况质量密度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="理想气体的相对密度" prop="dRD_Ideal">
<el-input readonly v-model="NGResult.dRD_Ideal" placeholder="请输入理想气体的相对密度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="真实气体的相对密度" prop="dRD_Real">
<el-input readonly v-model="NGResult.dRD_Real" placeholder="请输入真实气体的相对密度" />
</el-form-item>
</el-form>
<h3 v-if="dMeterType === '5'">AGA No10</h3>
<el-form v-if="dMeterType === '5'" :model="NGResult" label-position="top" ref="queryRef" size="small"
:inline="false" label-width="160px" class="flex-form">
<el-form-item :style="{ width: selectWidth + 'px' }" label="理想气体的比焓" prop="dHo">
<el-input readonly v-model="NGResult.dHo" placeholder="请输入理想气体的比焓" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="真实气体的焓" prop="dH">
<el-input readonly v-model="NGResult.dH" placeholder="请输入真实气体的焓" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="真实气体的熵" prop="dS">
<el-input readonly v-model="NGResult.dS" placeholder="请输入真实气体的熵" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="理想气体定压热容" prop="dCpi">
<el-input readonly v-model="NGResult.dCpi" placeholder="请输入理想气体定压热容" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="定压热容" prop="dCp">
<el-input readonly v-model="NGResult.dCp" placeholder="请输入定压热容" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="定容积热容" prop="dCv">
<el-input readonly v-model="NGResult.dCv" placeholder="请输入定容积热容" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="比热比" prop="dk">
<el-input readonly v-model="NGResult.dk" placeholder="请输入比热比" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="等熵指数" prop="dKappa">
<el-input readonly v-model="NGResult.dKappa" placeholder="请输入等熵指数" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="声速" prop="dSOS">
<unit-converter v-model="NGResult.dSOS" :unit-type="'speed'" v-model:unit-order="NGResult.dSOSUnit"
:show-english-only="true" :decimal-places="5" :input-disable="true" :width="selectWidth" />
<!-- <el-input readonly v-model="NGResult.dSOS" placeholder="请输入声速" /> -->
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="临界流函数" prop="dCstar">
<el-input readonly v-model="NGResult.dCstar" placeholder="请输入临界流函数" />
</el-form-item>
</el-form>
<h3 v-if="dMeterType === '6'">GB/T 11062</h3>
<el-form v-if="dMeterType === '6'" :model="NGResult" label-position="top" ref="queryRef" size="small"
:inline="false" label-width="160px" class="flex-form">
<el-form-item :style="{ width: selectWidth + 'px' }" label="摩尔高位发热量" prop="dHhvMol">
<el-input readonly v-model="NGResult.dHhvMol" placeholder="请输入摩尔高位发热量" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="摩尔低位发热量" prop="dLhvMol">
<el-input readonly v-model="NGResult.dLhvMol" placeholder="请输入摩尔低位发热量" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="体积高位发热量" prop="dHhvv">
<el-input readonly v-model="NGResult.dHhvv" placeholder="请输入体积高位发热量" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="体积低位发热量" prop="dLhvv">
<el-input readonly v-model="NGResult.dLhvv" placeholder="请输入体积低位发热量" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="质量高位发热量" prop="dHhvm">
<el-input readonly v-model="NGResult.dHhvm" placeholder="请输入质量高位发热量" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="质量地位发热量" prop="dLhvm">
<el-input readonly v-model="NGResult.dLhvm" placeholder="请输入质量地位发热量" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="标况压缩因子" prop="dZb11062">
<el-input readonly v-model="NGResult.dZb11062" placeholder="请输入标况压缩因子" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="标况质量密度" prop="dRhob11062">
<el-input readonly v-model="NGResult.dRhob11062" placeholder="请输入标况质量密度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="工况质量密度" prop="dRhof11062">
<el-input readonly v-model="NGResult.dRhof11062" placeholder="请输入工况质量密度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="理想气体的相对密度" prop="dRD_Ideal11062">
<el-input readonly v-model="NGResult.dRD_Ideal11062" placeholder="请输入理想气体的相对密度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="真实气体的相对密度" prop="dRD_Real11062">
<el-input readonly v-model="NGResult.dRD_Real11062" placeholder="请输入真实气体的相对密度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="真实气体的沃泊指数" prop="dWobbeIndex">
<el-input readonly v-model="NGResult.dWobbeIndex" placeholder="请输入真实气体的沃泊指数" />
</el-form-item>
</el-form>
<h3 v-if="dMeterType === '7'">其他</h3>
<el-form v-if="dMeterType === '7'" :model="NGResult" label-position="top" ref="queryRef" size="small"
:inline="false" label-width="160px" class="flex-form">
<el-form-item :style="{ width: selectWidth + 'px' }" label="临界压力" prop="dPc">
<el-input readonly v-model="NGResult.dPc" placeholder="请输入临界压力" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="临界温度" prop="dTC">
<el-input readonly v-model="NGResult.dTC" placeholder="请输入临界温度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="爆炸上限" prop="dBzsx">
<el-input readonly v-model="NGResult.dBzsx" placeholder="请输入爆炸上限" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="爆炸下限" prop="dBzxx">
<el-input readonly v-model="NGResult.dBzxx" placeholder="请输入爆炸下限" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="总炭含量(kg/m3)" prop="dTotalC">
<el-input readonly v-model="NGResult.dTotalC" placeholder="请输入总炭含量(kg/m3)" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="C2组分含量(kg/m3)" prop="dC2">
<el-input readonly v-model="NGResult.dC2" placeholder="请输入C2组分含量(kg/m3)" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="C2以上组分含量(kg/m3)" prop="dC2j">
<el-input readonly v-model="NGResult.dC2j" placeholder="请输入C2以上组分含量(kg/m3)" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="C3以上组分含量(kg/m3)" prop="dC3j">
<el-input readonly v-model="NGResult.dC3j" placeholder="请输入C3以上组分含量(kg/m3)" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="C4以上组分含量(kg/m3)" prop="dC4j">
<el-input readonly v-model="NGResult.dC4j" placeholder="请输入C4以上组分含量(kg/m3)" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="C5以上组分含量(kg/m3)" prop="dC5j">
<el-input readonly v-model="NGResult.dC5j" placeholder="请输入C5以上组分含量(kg/m3)" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="C6以上组分含量(kg/m3)" prop="dC6j">
<el-input readonly v-model="NGResult.dC6j" placeholder="请输入C6以上组分含量(kg/m3)" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="C3C4组分含量(kg/m3)" prop="dC3C4">
<el-input readonly v-model="NGResult.dC3C4" placeholder="请输入C3C4组分含量(kg/m3)" />
</el-form-item>
</el-form>
<h3 v-if="dMeterType === '20'">井下液面深度</h3>
<el-form v-if="dMeterType === '20'" :model="NGResult" label-position="top" ref="queryRef" size="small"
:inline="false" label-width="160px" class="flex-form">
<el-form-item :style="{ width: selectWidth + 'px' }" label="井口声速(m/s)" prop="dPc">
<el-input readonly v-model="NGResult.initialSOS" placeholder="井口声速" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="粗算深度(m)" prop="dPc">
<el-input readonly v-model="NGResult.initialEstimate" placeholder="粗算深度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="修正深度(m)" prop="dTC">
<el-input readonly v-model="NGResult.correctedDepth" placeholder="修正深度" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="迭代次数" prop="dBzsx">
<el-input readonly v-model="NGResult.iterations" placeholder="迭代次数" />
</el-form-item>
</el-form>
<ul>
<view v-for="item,index in NGResult.dataSegment" style="width: 100%;">
<li>{{item}}</li>
</view>
</ul>
</div>
</template>
<script setup>
import {
ref,
watch,
onMounted
} from 'vue';
import unitConverter from '@/components/inputValueUnit/index';
// props
const props = defineProps({
elFormWidth: {
type: Number,
default: 180
},
dMeterType: {
type: String,
default: '0'
},
modelValue: {
type: Object,
default: () => ({
dMrx: 0,
dZb: 0,
dZf: 0,
dFpv: 0,
dDb: 0,
dDf: 0,
dRhob: 0,
dRhof: 0,
dRD_Ideal: 0,
dRD_Real: 0,
dHo: 0,
dH: 0,
dS: 0,
dCpi: 0,
dCp: 0,
dCv: 0,
dk: 0,
dKappa: 0,
dSOS: 0,
dCstar: 0,
dHhvMol: 0,
dLhvMol: 0,
dHhvv: 0,
dLhvv: 0,
dHhvm: 0,
dLhvm: 0,
dZb11062: 0,
dRhob11062: 0,
dRhof11062: 0,
dRD_Ideal11062: 0,
dRD_Real11062: 0,
dWobbeIndex: 0,
dPc: 0,
dTC: 0,
dBzsx: 0,
dBzxx: 0,
dTotalC: 0,
dC2: 0,
dC2j: 0,
dC3j: 0,
dC4j: 0,
dC5j: 0,
dC6j: 0,
dC3C4: 0
})
}
});
//
const NGResult = ref({
dMrx: 0,
dZb: 0,
dZf: 0,
dFpv: 0,
dDb: 0,
dDf: 0,
dRhob: 0,
dRhof: 0,
dRD_Ideal: 0,
dRD_Real: 0,
dHo: 0,
dH: 0,
dS: 0,
dCpi: 0,
dCp: 0,
dCv: 0,
dk: 0,
dKappa: 0,
dSOS: 0,
dSOSUnit: 0,
dCstar: 0,
dHhvMol: 0,
dLhvMol: 0,
dHhvv: 0,
dLhvv: 0,
dHhvm: 0,
dLhvm: 0,
dZb11062: 0,
dRhob11062: 0,
dRhof11062: 0,
dRD_Ideal11062: 0,
dRD_Real11062: 0,
dWobbeIndex: 0,
dPc: 0,
dTC: 0,
dBzsx: 0,
dBzxx: 0,
dTotalC: 0,
dC2: 0,
dC2j: 0,
dC3j: 0,
dC4j: 0,
dC5j: 0,
dC6j: 0,
dC3C4: 0
});
const selectWidth = ref(180);
// elFormWidth
watch(
() => props.elFormWidth,
(newVal) => {
selectWidth.value = newVal;
}, {
deep: true
}
);
// value
watch(
() => props.modelValue,
(newVal) => {
console.log(newVal);
const processedValue = {
...newVal
};
for (const key in processedValue) {
if (processedValue.hasOwnProperty(key)) {
const value = processedValue[key];
//
if (typeof value === 'number' && !isNaN(value) && isFinite(value)) {
// 使 toFixed
processedValue[key] = parseFloat(value.toFixed(6));
}
}
}
NGResult.value = JSON.parse(JSON.stringify(processedValue));
}, {
deep: true
}
);
// selectWidth
onMounted(() => {
selectWidth.value = props.elFormWidth;
});
</script>
<style scoped>
/* 可按需添加样式 */
.app-container {
height: 100%;
}
.flex-form {
display: grid;
/* 优化后的自适应规则 */
grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));
gap: 5px;
}
</style>

View File

@ -0,0 +1,447 @@
<template>
<div class="app-container">
<el-form :model="meterPar" ref="dataForm" label-position="top" size="small" :inline="true" label-width="160px"
class="flex-form">
<el-form-item v-if="['0', '1', '2', '3'].includes(meterPar.dMeterType)"
:style="{ width: selectWidth + 'px' }" label="流量计类别" prop="dMeterType">
<el-select :key="'meter-type-' + meterPar.dMeterType" v-model="meterPar.dMeterType"
placeholder="请选择流量计类别 " clearable>
<el-option v-for="dict in ngtools_lljlx" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="计算标准"
prop="dFlowCalbz">
<el-select v-model="meterPar.dFlowCalbz" placeholder="请选择计算标准 " clearable>
<el-option v-for="dict in ngtools_lljsbz" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="压缩因子计算标准" prop="dZcalbz">
<el-select v-model="meterPar.dZcalbz" placeholder="请选择压缩因子计算标准 " clearable>
<el-option v-for="dict in ngtools_ysyzjsbz" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="计量参比条件压力" prop="dCbtj">
<el-select v-model="meterPar.dCbtj" placeholder="请选择计量参比条件压力 " clearable>
<el-option v-for="dict in ngtools_cbtj" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="节流装置类型"
prop="dCoreType">
<el-select v-model="meterPar.dCoreType" placeholder="请选择节流装置类型 " clearable>
<el-option v-for="dict in ngtools_jlzzlx" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="取压方式"
prop="dPtmode">
<el-select v-model="meterPar.dPtmode" placeholder="请选择取压方式 " clearable>
<el-option v-for="dict in ngtools_qyfs" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="管道类型"
prop="dPipeType">
<el-select v-model="meterPar.dPipeType" placeholder="请选择管道类型 " clearable>
<el-option v-for="dict in ngtools_gdlx" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="管道材料"
prop="dPipeMaterial">
<el-select v-model="meterPar.dPipeMaterial" placeholder="请选择管道材料 " clearable>
<el-option v-for="dict in ngtools_gdcz" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="孔板材料"
prop="dOrificeMaterial">
<el-select v-model="meterPar.dOrificeMaterial" placeholder="请选择孔板材料 " clearable>
<el-option v-for="dict in ngtools_gdcz" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '0' || meterPar.dMeterType === '3'"
:style="{ width: selectWidth + 'px' }" label="管道内径" prop="dPipeD">
<unit-converter v-model="meterPar.dPipeD" :unit-type="'length'" v-model:unit-order="meterPar.dLenUnit"
:show-english-only="false" :decimal-places="5" :width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="孔板孔径"
prop="dOrificeD">
<unit-converter v-model="meterPar.dOrificeD" :unit-type="'length'"
v-model:unit-order="meterPar.dOrificeUnit" :show-english-only="false" :decimal-places="5"
:width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '3'" :style="{ width: selectWidth + 'px' }" label="喉部直径"
prop="dOrificeD">
<unit-converter v-model="meterPar.dOrificeD" :unit-type="'length'"
v-model:unit-order="meterPar.dOrificeUnit" :show-english-only="false" :decimal-places="5"
:width="selectWidth" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="压力类型" prop="dPfType">
<el-select v-model="meterPar.dPfType" placeholder="请选择压力类型 " clearable>
<el-option v-for="dict in ngtools_yllx" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item v-if="meterPar.dPfType === '0'" :style="{ width: selectWidth + 'px' }" label="当地大气压"
prop="dPatm">
<unit-converter v-model="meterPar.dPatm" :unit-type="'pressure'" v-model:unit-order="meterPar.dPatmUnit"
:show-english-only="false" :decimal-places="6" :width="selectWidth" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="输入压力" prop="dPf">
<unit-converter v-model="meterPar.dPf" :unit-type="'pressure'" v-model:unit-order="meterPar.dPfUnit"
:show-english-only="false" :decimal-places="5" :width="selectWidth" />
</el-form-item>
<el-form-item :style="{ width: selectWidth + 'px' }" label="输入温度" prop="dTf">
<unit-converter v-model="meterPar.dTf" :unit-type="'temperature'" v-model:unit-order="meterPar.dTfUnit"
:show-english-only="false" :decimal-places="5" :width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="输入差压"
prop="dDp">
<unit-converter v-model="meterPar.dDp" :unit-type="'pressure'" v-model:unit-order="meterPar.dDpUnit"
:show-english-only="false" :decimal-places="5" :width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '3'" :style="{ width: selectWidth + 'px' }" label="流出系数"
prop="dCd">
<el-input v-model="meterPar.dCd" placeholder="请输入流出系数 " clearable />
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '1' || meterPar.dMeterType === '2'"
:style="{ width: selectWidth + 'px' }" label="仪表系数" prop="dMeterFactor">
<el-input v-model="meterPar.dMeterFactor" placeholder="请输入仪表系数 " clearable />
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '1' || meterPar.dMeterType === '2'"
:style="{ width: selectWidth + 'px' }" label="脉冲数" prop="dPulseNum">
<unit-converter v-model="meterPar.dPulseNum" :unit-type="'user'" v-model:unit-order="meterPar.dVGscUnit"
:show-english-only="false" :decimal-places="5" :user-defined="true" :user-definedunit-name="'个'"
:enable-convert="false" :width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '8'" :style="{ width: selectWidth + 'px' }" label="管束车容积"
prop="dVGsc">
<unit-converter v-model="meterPar.dVGsc" :unit-type="'volume'" v-model:unit-order="meterPar.dVGscUnit"
:show-english-only="false" :decimal-places="5" :width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dBqdd === '1'" :style="{ width: selectWidth + 'px' }" label="最大体积流量"
prop="dVFlowMax">
<unit-converter v-model="meterPar.dVFlowMax" :unit-type="'volumeflow'"
v-model:unit-order="meterPar.dVFlowUnit" :show-english-only="false" :decimal-places="5"
:width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dBqdd === '1'" :style="{ width: selectWidth + 'px' }" label="最小体积流量"
prop="dVFlowMin">
<unit-converter v-model="meterPar.dVFlowMin" :unit-type="'volumeflow'"
v-model:unit-order="meterPar.dVFlowUnit" :show-english-only="false" :decimal-places="5"
:width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dBqdd === '1'" :style="{ width: selectWidth + 'px' }" label="常用流量"
prop="dVFlowCon">
<unit-converter v-model="meterPar.dVFlowCon" :unit-type="'volumeflow'"
v-model:unit-order="meterPar.dVFlowUnit" :show-english-only="false" :decimal-places="5"
:enable-convert="true" :width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dBqdd === '1'" :style="{ width: selectWidth + 'px' }" label="压力量程下限"
prop="dPfRangeMin">
<unit-converter v-model="meterPar.dPfRangeMin" :unit-type="'pressure'"
v-model:unit-order="meterPar.dPfUnit" :show-english-only="false" :decimal-places="5"
:width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dBqdd === '1'" :style="{ width: selectWidth + 'px' }" label="压力量程上限"
prop="dPfRangeMax">
<unit-converter v-model="meterPar.dPfRangeMax" :unit-type="'pressure'"
v-model:unit-order="meterPar.dPfUnit" :show-english-only="false" :decimal-places="5"
:width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dBqdd === '1'" :style="{ width: selectWidth + 'px' }" label="差压量程下限"
prop="dDpRangeMin">
<unit-converter v-model="meterPar.dDpRangeMin" :unit-type="'pressure'"
v-model:unit-order="meterPar.dDpUnit" :show-english-only="false" :decimal-places="5"
:width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dBqdd === '1'" :style="{ width: selectWidth + 'px' }" label="差压量程上限"
prop="dDpRangeMax">
<unit-converter v-model="meterPar.dDpRangeMax" :unit-type="'pressure'"
v-model:unit-order="meterPar.dDpUnit" :show-english-only="false" :decimal-places="5"
:width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dBqdd === '1'" :style="{ width: selectWidth + 'px' }" label="温度计量程下限"
prop="dTfRangeMin">
<unit-converter v-model="meterPar.dTfRangeMin" :unit-type="'temperature'"
v-model:unit-order="meterPar.dTfUnit" :show-english-only="false" :decimal-places="5"
:width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dBqdd === '1'" :style="{ width: selectWidth + 'px' }" label="温度计量程上限"
prop="dTfRangeMax">
<unit-converter v-model="meterPar.dTfRangeMax" :unit-type="'temperature'"
v-model:unit-order="meterPar.dTfUnit" :show-english-only="false" :decimal-places="5"
:width="selectWidth" />
</el-form-item>
<!-- 液面深度计算 -->
<el-form-item v-if="meterPar.dMeterType === '20'" :style="{ width: selectWidth + 'px' }" label="常温层深度"
prop="dVFlowMax">
<unit-converter v-model="meterPar.dVFlowMax" :unit-type="'user'" v-model:unit-order="meterPar.dVGscUnit"
:show-english-only="false" :decimal-places="5" :user-defined="true" :user-definedunit-name="'米'"
:enable-convert="false" :width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '20'" :style="{ width: selectWidth + 'px' }" label="测量时间"
prop="dVFlowMin">
<unit-converter v-model="meterPar.dVFlowMin" :unit-type="'user'" v-model:unit-order="meterPar.dVGscUnit"
:show-english-only="false" :decimal-places="5" :user-defined="true" :user-definedunit-name="'秒'"
:enable-convert="false" :width="selectWidth" />
</el-form-item>
<el-form-item v-if="meterPar.dMeterType === '20'" :style="{ width: selectWidth + 'px' }" label="地温梯度"
prop="dVFlowCon">
<unit-converter v-model="meterPar.dVFlowCon" :unit-type="'user'" v-model:unit-order="meterPar.dVGscUnit"
:show-english-only="false" :decimal-places="5" :user-defined="true" :user-definedunit-name="'度/米'"
:enable-convert="false" :width="selectWidth" />
</el-form-item>
</el-form>
</div>
</template>
<script setup>
import {
ref,
watch,
onMounted,
inject
} from 'vue';
import unitConverter from '@/components/inputValueUnit/index';
//
const __name = 'meterParComponents';
// 1. useDict
import {
useDict
} from '@/utils/dict';
// 2. useDict Ref
const dictRefs = useDict(
'ngtools_cbtj',
'ngtools_jlzzlx',
'ngtools_lljlx',
'ngtools_qyfs',
'ngtools_gdcz',
'ngtools_lcxsjsff',
'ngtools_gdlx',
'ngtools_yllx',
'ngtools_lljsbz',
'ngtools_ysyzjsbz'
);
// 3. Ref computed .value
import {
computed
} from 'vue';
const ngtools_cbtj = computed(() => dictRefs.ngtools_cbtj.value || []);
const ngtools_jlzzlx = computed(() => dictRefs.ngtools_jlzzlx.value || []);
const ngtools_lljlx = computed(() => dictRefs.ngtools_lljlx.value || []);
const ngtools_qyfs = computed(() => dictRefs.ngtools_qyfs.value || []);
const ngtools_gdcz = computed(() => dictRefs.ngtools_gdcz.value || []);
const ngtools_lcxsjsff = computed(() => dictRefs.ngtools_lcxsjsff.value || []);
const ngtools_gdlx = computed(() => dictRefs.ngtools_gdlx.value || []);
const ngtools_yllx = computed(() => dictRefs.ngtools_yllx.value || []);
const ngtools_lljsbz = computed(() => dictRefs.ngtools_lljsbz.value || []);
const ngtools_ysyzjsbz = computed(() => dictRefs.ngtools_ysyzjsbz.value || []);
// 4.
const dictLoaded = computed(() => {
//
return ngtools_lljlx.value.length > 0 && ngtools_jlzzlx.value.length > 0;
});
// lodash.cloneDeep
const deepClone = (obj) => {
if (obj === null || typeof obj !== 'object') {
return obj;
}
let clone = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
};
// lodash.isEqual
const isObjectEqual = (obj1, obj2) => {
//
if (obj1 === obj2) return true;
//
if (typeof obj1 !== typeof obj2) return false;
//
if (typeof obj1 !== 'object' || obj1 === null || obj2 === null) return false;
//
if (Array.isArray(obj1) && Array.isArray(obj2)) {
if (obj1.length !== obj2.length) return false;
for (let i = 0; i < obj1.length; i++) {
if (!isObjectEqual(obj1[i], obj2[i])) return false;
}
return true;
}
//
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) return false;
for (let key of keys1) {
if (!keys2.includes(key) || !isObjectEqual(obj1[key], obj2[key])) {
return false;
}
}
return true;
};
// props
const props = defineProps({
modelValue: {
type: Object,
default: () => ({
dFlowCalbz: null,
dZcalbz: null,
dCbtj: null,
dpbM: null,
dtbM: null,
dpbE: null,
dtbE: null,
dPatm: null,
dPatmUnit: null,
dngCompents: null,
dMeterType: null,
dCoreType: null,
dPtmode: null,
dPipeType: null,
dPipeD: null,
dLenUnit: null,
dPipeDtemp: null,
dPileDtempU: null,
dPipeMaterial: null,
dOrificeD: null,
dOrificeUnit: null,
dOrificeDtemp: null,
dOrificeDtempUnit: null,
dOrificeMaterial: null,
dOrificeSharpness: null,
dOrificeRk: null,
dOrificeRkLenU: null,
dPf: null,
dPfUnit: null,
dPfType: null,
dTf: null,
dTfUnit: null,
dDp: null,
dDpUnit: null,
dVFlowUnit: 0,
dVFlowWorkUnit: 0,
dMFlowUnit: 0,
dEFlowUnit: 6,
dCd: null,
dCdCalMethod: null,
dMeterFactor: null,
dPulseNum: null,
dVFlowMax: null,
dVFlowMin: null,
dVFlowCon: null,
dPfRangeMin: null,
dPfRangeMax: null,
dDpRangeMin: null,
dDpRangeMax: null,
dTfRangeMin: null,
dTfRangeMax: null,
dVGsc: null,
dCalcType: 0, // 0 1 3
dBqdd: 0 // 0 1
})
},
elFormWidth: {
type: Number,
default: 180
}
});
// emits
const emits = defineEmits(['update:modelValue']);
//
const selectWidth = ref(0);
const meterPar = ref(deepClone(props.modelValue));
const isUpdating = ref(false);
// selectWidth
onMounted(() => {
selectWidth.value = props.elFormWidth;
});
// meterPar
watch(
meterPar,
(newVal) => {
if (!isObjectEqual(newVal, props.modelValue)) {
console.log('Emit to parent', newVal);
emits('update:modelValue', deepClone(newVal));
}
}, {
deep: true
}
);
// elFormWidth
watch(
() => props.elFormWidth,
(newVal) => {
selectWidth.value = newVal;
}, {
deep: true
}
);
// value
watch(
() => props.modelValue,
(newVal) => {
if (!isObjectEqual(newVal, meterPar.value)) {
console.log('Update from parent', newVal);
meterPar.value = deepClone({
...newVal,
dMeterType: String(newVal.dMeterType) //
});
}
}, {
deep: true,
immediate: true
}
);
</script>
<style scoped>
.app-container {
height: 100%;
}
.flex-form {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));
gap: 5px;
}
</style>

View File

@ -0,0 +1,231 @@
<template>
<div class="app-container">
<el-form :model="meterResult" label-position="top" ref="queryRef" size="small" :inline="false" label-width="160px" class="flex-form">
<el-form-item :style="{ width: selectWidth + 'px' }" label="标况体积流量m³/s" prop="dVFlowb">
<unit-converter
v-model="meterResult.dVFlowb"
:unit-type="'volumeflow'"
v-model:unit-order="meterResult.dVFlowUnit"
:show-english-only="true"
:decimal-places="6"
:width="selectWidth"
:input-disable="true"
/>
</el-form-item>
<el-form-item label="工况体积流量" prop="dVFlowf">
<unit-converter
v-model="meterResult.dVFlowf"
:unit-type="'volumeflow'"
v-model:unit-order="meterResult.dVFlowWorkUnit"
:show-english-only="true"
:decimal-places="5"
:input-disable="true"
:width="selectWidth"
/>
</el-form-item>
<el-form-item label="标况质量流量" prop="dMFlowb">
<unit-converter
v-model="meterResult.dMFlowb"
:unit-type="'massflow'"
v-model:unit-order="meterResult.dMFlowUnit"
:input-disable="true"
:show-english-only="true"
:decimal-places="6"
:width="selectWidth"
/>
</el-form-item>
<el-form-item label="标况能量流量" prop="dEFlowb">
<unit-converter
v-model="meterResult.dEFlowb"
:unit-type="'energyflow'"
v-model:unit-order="meterResult.dEFlowUnit"
:show-english-only="true"
:decimal-places="6"
:width="selectWidth"
:input-disable="true"
/>
</el-form-item>
<el-form-item v-if="dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="求渐近速度系数 E" prop="dE">
<el-input class="el-input" readonly v-model="meterResult.dE" placeholder=" " />
</el-form-item>
<el-form-item v-if="dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="求相对密度系数 FG" prop="dFG">
<el-input readonly v-model="meterResult.dFG" placeholder=" " />
</el-form-item>
<el-form-item v-if="dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="求流动温度系数 FT" prop="dFT">
<el-input readonly v-model="meterResult.dFT" placeholder="" />
</el-form-item>
<el-form-item v-if="dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="求动力粘度dlnd" prop="dDViscosity">
<el-input readonly v-model="meterResult.dDViscosity" placeholder="" />
</el-form-item>
<el-form-item v-if="dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="求可膨胀系数" prop="dDExpCoefficient">
<el-input readonly v-model="meterResult.dDExpCoefficient" placeholder="" />
</el-form-item>
<el-form-item v-if="dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="管道雷诺数" prop="dRnPipe">
<el-input readonly v-model="meterResult.dRnPipe" placeholder="" />
</el-form-item>
<el-form-item v-if="dMeterType === '3'" :style="{ width: selectWidth + 'px' }" label="修正后的流出系数" prop="dCdCorrect">
<el-input readonly v-model="meterResult.dCdCorrect" placeholder="" />
</el-form-item>
<el-form-item v-if="dMeterType === '3'" :style="{ width: selectWidth + 'px' }" label="喷嘴的流出系数" prop="dCdNozell">
<el-input readonly v-model="meterResult.dCdNozell" placeholder="" />
</el-form-item>
<el-form-item v-if="dMeterType === '0'" label="管道内天然气流速" prop="dVelocityFlow">
<unit-converter
v-model="meterResult.dVelocityFlow"
:unit-type="'speed'"
v-model:unit-order="meterResult.dVelocityUnit"
:show-english-only="true"
:decimal-places="5"
:input-disable="true"
:width="selectWidth"
/>
</el-form-item>
<el-form-item v-if="dMeterType === '0'" label="压力损失" prop="dPressLost">
<unit-converter
v-model="meterResult.dPressLost"
:unit-type="'pressure'"
v-model:unit-order="meterResult.dPressLostUnit"
:show-english-only="true"
:decimal-places="5"
:input-disable="true"
:width="selectWidth"
/>
</el-form-item>
<el-form-item v-if="dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="直径比" prop="dBeta">
<el-input readonly v-model="meterResult.dBeta" placeholder="" />
</el-form-item>
<el-form-item v-if="dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="等熵指数" prop="dKappa">
<el-input readonly v-model="meterResult.dKappa" placeholder="" />
</el-form-item>
<!-- <el-form-item v-if="dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="孔板锐利度系数Bk" prop="dBk">
<el-input readonly v-model="meterResult.dBk" placeholder="" />
</el-form-item>
<el-form-item v-if="dMeterType === '0'" :style="{ width: selectWidth + 'px' }" label="管道粗糙度系数 Gme" prop="dRoughNessPipe">
<el-input readonly v-model="meterResult.dRoughNessPipe" placeholder="" />
</el-form-item> -->
</el-form>
</div>
</template>
<script setup>
import { ref, watch, onMounted } from 'vue';
import unitConverter from '@/components/inputValueUnit/index';
// props
const props = defineProps({
modelValue: {
type: Object,
default: () => ({
dE: 0,
dFG: 0,
dFT: 0,
dDViscosity: 0,
dDExpCoefficient: 0,
dRnPipe: 0,
dBk: 0,
dRoughNessPipe: 0,
dCdCorrect: 0,
dCdNozell: 0,
dVFlowb: 0,
dVFlowf: 0,
dVFlowUnit: 0,
dMFlowb: 0,
dMFlowUnit: 0,
dEFlowb: 0,
dEFlowUnit: 0,
dVelocityFlow: 0,
dVelocityUnit: 0,
dPressLost: 0,
dPressLostUnit: 0,
dBeta: 0,
dKappa: 0
})
},
elFormWidth: {
type: Number,
default: 180
},
dMeterType: {
type: String,
default: '0'
}
});
//
const meterResult = ref({
dE: 0,
dFG: 0,
dFT: 0,
dDViscosity: 0,
dDExpCoefficient: 0,
dRnPipe: 0,
dBk: 0,
dRoughNessPipe: 0,
dCdCorrect: 0,
dCdNozell: 0,
dVFlowb: 0,
dVFlowf: 0,
dVFlowUnit: 0,
dMFlowb: 0,
dMFlowUnit: 0,
dEFlowb: 0,
dEFlowUnit: 0,
dVelocityFlow: 0,
dVelocityUnit: 0,
dPressLost: 0,
dPressLostUnit: 0,
dBeta: 0,
dKappa: 0
});
const selectWidth = ref(0);
// elFormWidth
watch(
() => props.elFormWidth,
(newVal) => {
selectWidth.value = newVal;
},
{ deep: true }
);
// value
watch(
() => props.modelValue,
(newVal) => {
console.log(newVal);
const processedValue = { ...newVal };
for (const key in processedValue) {
if (processedValue.hasOwnProperty(key)) {
const value = processedValue[key];
//
if (typeof value === 'number' && !isNaN(value) && isFinite(value)) {
// 使 toFixed
processedValue[key] = parseFloat(value.toFixed(6));
}
}
}
meterResult.value = JSON.parse(JSON.stringify(processedValue));
},
{ deep: true }
);
// selectWidth
onMounted(() => {
// DOM
selectWidth.value = props.elFormWidth;
});
</script>
<style scoped>
/* 可按需添加样式 */
.app-container {
height: 100%;
}
.flex-form {
display: grid;
/* 优化后的自适应规则 */
grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));
gap: 10px;
}
</style>

View File

@ -0,0 +1,492 @@
<template>
<div class="unit-converter" :style="{ width: width + 'px' }">
<!-- 数值输入框 -->
<input
v-model.number="inputValue"
:disabled="inputDisable"
class="input-field"
type="number"
ref="inputRef"
:style="{ width: inputWidth + 'px', height: height + 'px' }"
@change="handleInputChange"
@focus="selectAllText"
/>
<!-- 单位标签 -->
<span v-if="enableConvert" ref="unitLabel" @click="cycleUnit" @dblclick="toggleUnitSelector" class="unit-label" :style="{ color: 'blue', height: height + 'px' }">
{{ ' ' + textUnitName + ' ' }}
</span>
<span v-else ref="unitLabel" class="unit-label" :style="{ color: 'blue', height: height + 'px' }">
{{ ' ' + textUnitName + ' ' }}
</span>
<!-- 单位选择弹出窗口 -->
<div v-if="showUnitSelector" class="unit-selector" ref="unitSelector" :style="{ left: unitSelectorLeft + 'px', top: unitSelectorTop + 'px' }">
<div v-for="unit in sortedUnits" :key="unit.id" @click="selectUnit(unit)" class="unit-option">
{{ showEnglishOnly ? unit.unitName.split('(')[0] : unit.unitName }}
</div>
</div>
</div>
</template>
<script setup>
import { ref, watch, onMounted, onBeforeUnmount, computed, nextTick } from 'vue';
import { listConvert } from '@/api/system/convert.js';
// props
const props = defineProps({
unitType: {
// (required)
type: String,
required: true
},
unitOrder: {
// (sync)
type: Number,
default: 0
},
modelValue: {
// (sync)
type: Number,
required: true
},
showEnglishOnly: {
//
type: Boolean,
default: false
},
decimalPlaces: {
//
type: Number,
default: 5,
validator: (v) => v >= 0 && v <= 10
},
width: {
type: Number,
required: false,
default: 180
},
height: {
type: Number,
required: false,
default: 24
},
enableConvert: {
//
type: Boolean,
default: true
},
userDefined: {
//
type: Boolean,
default: false
},
userDefinedunitName: {
//
type: String,
default: ''
},
inputDisable: {
type: Boolean,
required: false,
default: false
}
});
// emits
// 2emits
const emits = defineEmits([
'update:modelValue', // update:value
'update:unitOrder', //
'conversion'
]);
//
// 3value
const inputValue = ref(props.modelValue); // 使modelValue
const unitData = ref([]); //
const showUnitSelector = ref(false); //
const currentUnit = ref(null); //
const baseUnit = ref(null); //
const inputWidth = ref(120); //
const textUnitName = ref('');
const unitSelectorLeft = ref(0);
const unitSelectorTop = ref(0);
//
const originalValue = ref(props.value); //
const originalUnit = ref(null); //
const isInternalUpdate = ref(false); //
// ref
const inputRef = ref(null);
const unitLabel = ref(null);
const unitSelector = ref(null);
//
const displayUnitText = computed(() => {
if (!currentUnit.value) return '';
return props.showEnglishOnly ? currentUnit.value.unitName.split('(')[0].trim() : currentUnit.value.unitName;
});
const sortedUnits = computed(() => {
return unitData.value.filter((u) => u.unitType === props.unitType).sort((a, b) => a.unitOrder - b.unitOrder);
});
const popupPosition = computed(() => {
if (!unitLabel.value) return {};
const rect = unitLabel.value.getBoundingClientRect();
return {
top: `${rect.bottom + window.scrollY}px`,
left: `${rect.left + window.scrollX}px`
};
});
//
const safeUpdateWidth = () => {
if (unitLabel.value) {
updateInputWidth();
}
};
const selectAllText = (event) => {
// event.target input
const input = event.target;
// select()
input.select();
};
const handleMouseMove = (event) => {
if (showUnitSelector.value) {
//
const offsetX = 10;
const offsetY = 10;
unitSelectorLeft.value = event.clientX;
unitSelectorTop.value = event.clientY + offsetY - 100;
//
if (unitSelector.value) {
//
if (unitSelectorLeft.value + unitSelector.value.offsetWidth > window.innerWidth) {
unitSelectorLeft.value = window.innerWidth - unitSelector.value.offsetWidth;
}
//
if (unitSelectorTop.value + unitSelector.value.offsetHeight > window.innerHeight) {
unitSelectorTop.value = window.innerHeight - unitSelector.value.offsetHeight;
}
}
}
};
const updateInputWidth = () => {
// 访
if (!unitLabel.value) {
console.warn('Unit label ref not available');
return;
}
const spanWidth = unitLabel.value.offsetWidth + 10;
inputWidth.value = Math.max(50, props.width - spanWidth); //
};
//
const handleClickOutside = (event) => {
if (unitSelector.value && !unitSelector.value.contains(event.target)) {
showUnitSelector.value = false;
}
};
//
const toggleUnitSelector = () => {
showUnitSelector.value = !showUnitSelector.value;
};
//
const loadUnits = async (unitType) => {
try {
var unitDatalist =JSON.parse( localStorage.getItem("unitData"));
unitData.value = unitDatalist[unitType];
baseUnit.value = unitData.value.find((u) => u.baseUnit === 'Y');
console.log(baseUnit.value);
// const res = await listConvert({
// unitType: unitType,
// status: 'Y'
// });
// console.log(111,res)
// unitData.value = res.rows;
// baseUnit.value = unitData.value.find((u) => u.baseUnit === 'Y');
} catch (e) {
console.error('单位数据加载失败:', e);
}
};
//
const initCurrentUnit = () => {
const target = sortedUnits.value.find((u) => u.unitOrder === props.unitOrder);
currentUnit.value = target || baseUnit.value || sortedUnits.value[0];
//
originalUnit.value = currentUnit.value;
//
textUnitName.value = currentUnit.value ? (props.showEnglishOnly ? currentUnit.value.unitName.split('(')[0].trim() : currentUnit.value.unitName) : '';
nextTick(() => {
updateInputWidth();
});
};
//
const handleInputChange = () => {
//
originalValue.value = inputValue.value;
originalUnit.value = currentUnit.value;
emits('update:modelValue', inputValue.value); // modelValue
};
//
const cycleUnit = () => {
const index = sortedUnits.value.findIndex((u) => u === currentUnit.value);
const newUnit = sortedUnits.value[(index + 1) % sortedUnits.value.length];
currentUnit.value = newUnit;
console.log(index, newUnit, currentUnit.value);
textUnitName.value = props.showEnglishOnly ? newUnit.unitName.split('(')[0].trim() : newUnit.unitName;
nextTick(() => {
if (unitLabel.value) {
updateInputWidth();
convertAndEmit();
}
});
};
//
const selectUnit = (unit) => {
currentUnit.value = unit;
showUnitSelector.value = false;
nextTick(() => {
updateInputWidth();
convertAndEmit(); //
});
};
//
const convertAndEmit = () => {
//
if (!currentUnit.value || !baseUnit.value || !originalUnit.value) {
return;
}
let newValue = 0;
if (props.unitType === 'temperature') {
newValue = handleTemperatureConversion(originalUnit.value, currentUnit.value);
} else {
//
const baseValue = originalValue.value / originalUnit.value.conversionFactor;
newValue = baseValue * currentUnit.value.conversionFactor;
}
const roundedValue = roundValue(newValue);
isInternalUpdate.value = true; //
inputValue.value = roundedValue;
//
emits('update:modelValue', roundedValue);
emits('update:unitOrder', currentUnit.value.unitOrder);
emits('conversion', {
initialValue: originalValue.value,
newValue: roundedValue,
oldUnit: originalUnit.value.unitName,
newUnit: currentUnit.value.unitName,
oldOrder: originalUnit.value.unitOrder,
newOrder: currentUnit.value.unitOrder
});
};
//
const handleTemperatureConversion = (oldUnit, newUnit) => {
const oldOrder = oldUnit.unitOrder;
const newOrder = newUnit.unitOrder;
let celsius;
switch (oldOrder) {
case 0:
celsius = originalValue.value;
break;
case 1:
celsius = ((originalValue.value - 32) * 5) / 9;
break;
case 2:
celsius = originalValue.value - 273.15;
break;
default:
throw new Error('无效温度单位');
}
switch (newOrder) {
case 0:
return celsius;
case 1:
return (celsius * 9) / 5 + 32;
case 2:
return celsius + 273.15;
default:
throw new Error('无效温度单位');
}
};
//
const roundValue = (value) => {
const multiplier = Math.pow(10, props.decimalPlaces);
const val = value * multiplier;
const intVal = Math.trunc(val);
const decimalPart = val - intVal;
if (decimalPart < 0.5) {
return intVal / multiplier;
} else if (decimalPart > 0.5) {
return (intVal + 1) / multiplier;
} else {
return intVal % 2 === 0 ? intVal / multiplier : (intVal + 1) / multiplier;
}
};
//
watch(
() => props.unitType,
async (newType) => {
if (props.userDefined) {
textUnitName.value = props.userDefinedunitName;
nextTick(() => {
safeUpdateWidth();
});
} else {
let temp = JSON.parse(localStorage.getItem('unitData'));
unitData.value = temp ? temp[newType] : [];
if (!unitData.value) {
await loadUnits(newType);
}
nextTick(() => {
baseUnit.value = unitData.value.find((u) => u.baseUnit === 'Y');
safeUpdateWidth();
initCurrentUnit();
});
}
},
{ immediate: true }
);
//
watch(
() => props.unitOrder,
(newOrder) => {
if (props.userDefined) {
textUnitName.value = props.userDefinedunitName;
nextTick(safeUpdateWidth);
return;
}
//
const target = sortedUnits.value.find((u) => u.unitOrder === newOrder);
if (!target) {
console.warn(`单位序号 ${newOrder} 未找到,使用基准单位`);
currentUnit.value = baseUnit.value || sortedUnits.value[0];
textUnitName.value = currentUnit.value ? (props.showEnglishOnly ? currentUnit.value.unitName?.split('(')[0]?.trim() : currentUnit.value.unitName) : '';
return;
}
currentUnit.value = target;
textUnitName.value = props.showEnglishOnly ? target.unitName?.split('(')[0]?.trim() : target.unitName;
nextTick(safeUpdateWidth);
}
);
//
watch(
() => props.modelValue,
(newVal) => {
console.log('收到父组件值更新:', newVal);
if (!isInternalUpdate.value && !isNaN(newVal)) {
originalValue.value = Number(newVal);
inputValue.value = originalValue.value;
console.log('外部更新处理:', {
original: originalValue.value,
input: inputValue.value
});
}
isInternalUpdate.value = false;
},
{ immediate: true, deep: true }
);
onMounted(() => {
nextTick(() => {
safeUpdateWidth();
});
//
document.addEventListener('click', handleClickOutside);
});
onBeforeUnmount(() => {
//
showUnitSelector.value = false;
document.removeEventListener('click', handleClickOutside);
//
inputRef.value = null;
unitLabel.value = null;
unitSelector.value = null;
});
</script>
<style scoped>
.unit-converter {
display: flex;
align-items: center;
position: relative;
}
.input-field {
border: 1px solid #d6d5d5;
border-radius: 4px;
font-size: 14px;
}
.unit-label {
cursor: pointer;
font-weight: bold;
border: 1px solid #d6d5d5;
border-radius: 4px;
font-size: 12px;
white-space: nowrap;
padding: 0 8px; /* 可根据需要调整左右内边距 */
}
.unit-label:hover {
background: #f0f8ff;
}
.unit-selector {
/* 设置容器的最大高度,当内容超出这个高度时会出现滚动条 */
max-height: 100px;
/* 超出内容时显示纵向滚动条 */
overflow-y: auto;
/* 横向内容不溢出,隐藏多余部分 */
overflow-x: hidden;
/* 其他样式保持不变 */
position: absolute;
z-index: 9999;
background-color: white;
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
padding: 2px 0;
min-width: 180px;
list-style-type: none;
margin-left: 100px;
}
.unit-option {
padding: 2px 10px;
cursor: pointer;
font-size: 14px;
}
.unit-option:hover {
background-color: #f0f0f0;
}
</style>

View File

@ -0,0 +1,171 @@
import { listConvert } from '@/api/system/convert.js'
// 创建一个简单的单位数据管理器
const UnitStore = {
// 状态数据
data: {
unitData: [],
groupedUnitData: {},
queryParams: {
pageNum: 1,
pageSize: 1000,
unitType: null,
unitName: null,
baseUnit: null,
conversionFactor: null,
unitTypeName: null,
status: null,
unitOrder: null
},
loading: false,
total: 0
},
// 按单位类型分组
groupByUnitType(data) {
return data.reduce((acc, unit) => {
const type = unit.unitType
if (!acc[type]) {
acc[type] = []
}
acc[type].push({
id: unit.id,
unitType: unit.unitType,
unitName: unit.unitName,
conversionFactor: unit.conversionFactor,
unitOrder: unit.unitOrder,
baseUnit: unit.baseUnit,
status: unit.status,
unitTypeName: unit.unitTypeName
})
// 按单位排序
acc[type].sort((a, b) => (a.unitOrder || 0) - (b.unitOrder || 0))
return acc
}, {})
},
// 设置查询参数
setQueryParams(params) {
Object.assign(this.data.queryParams, params)
},
// 重置查询参数
resetQueryParams() {
this.data.queryParams = {
pageNum: 1,
pageSize: 1000,
unitType: null,
unitName: null,
baseUnit: null,
conversionFactor: null,
unitTypeName: null,
status: null,
unitOrder: null
}
},
// 获取单位列表
async getList() {
this.data.loading = true
try {
const res = await listConvert(this.data.queryParams)
this.data.unitData = res.rows || []
this.data.total = res.total || 0
this.data.groupedUnitData = this.groupByUnitType(this.data.unitData)
// 保存到localStorage
localStorage.setItem('unitData', JSON.stringify(this.data.groupedUnitData))
return res
} catch (error) {
console.error('获取单位数据失败:', error)
throw error
} finally {
this.data.loading = false
}
},
// 从localStorage加载缓存的单位数据
loadFromLocalStorage() {
try {
const storedData = localStorage.getItem('unitData')
if (storedData) {
this.data.groupedUnitData = JSON.parse(storedData)
// 从分组数据中提取所有单位
this.data.unitData = Object.values(this.data.groupedUnitData).flat()
return true
}
} catch (error) {
console.error('从localStorage加载单位数据失败:', error)
}
return false
},
// 清除localStorage中的单位数据
clearLocalStorage() {
localStorage.removeItem('unitData')
},
// 单位转换方法
convertUnit(value, fromUnit, toUnit) {
if (fromUnit.unitType !== toUnit.unitType) {
throw new Error('单位类型不匹配,无法转换')
}
const valueInBaseUnit = value * (fromUnit.conversionFactor || 1)
return valueInBaseUnit / (toUnit.conversionFactor || 1)
},
// 根据单位名称查找单位
findUnitByName(unitName) {
return this.data.unitData.find(unit => unit.unitName === unitName)
},
// 根据ID查找单位
findUnitById(id) {
return this.data.unitData.find(unit => unit.id === id)
},
// 刷新单位数据
async refresh() {
return await this.getList()
},
// 获取有效的单位列表
getActiveUnits(unitType) {
const units = unitType
? (this.data.groupedUnitData[unitType] || [])
: this.data.unitData
return units.filter(unit => unit.status === '0')
},
// 根据类型和名称模糊查询单位
searchUnits(type, keyword) {
const units = this.data.groupedUnitData[type] || []
return units.filter(unit =>
unit.unitName.includes(keyword) ||
(unit.unitTypeName && unit.unitTypeName.includes(keyword))
)
},
// getter 方法
getUnitTypes() {
return Object.keys(this.data.groupedUnitData)
},
getUnitsByType(unitType) {
return this.data.groupedUnitData[unitType] || []
},
getBaseUnit(unitType) {
const units = this.data.groupedUnitData[unitType] || []
return units.find(unit => unit.baseUnit === '1') || units[0]
},
getSortedUnitTypes() {
return Object.keys(this.data.groupedUnitData).sort()
}
}
export default UnitStore

File diff suppressed because it is too large Load Diff

View File

@ -61,6 +61,8 @@
<div class="el-login-footer">
<span>{{ footerContent }}</span>
</div>
</div>
</template>

View File

@ -374,12 +374,17 @@
</div>
</template>
</el-dialog>
<meterPar v-model="parentMeterPar" :el-form-width="elFormItemWidth" />
</div>
</template>
<script setup name="Flowresult">
import { listFlowresult, getFlowresult, delFlowresult, addFlowresult, updateFlowresult } from "@/api/production/plc/flowresult/flowresult"
import meterPar from '@/components/NGTools/meterPar';
const { proxy } = getCurrentInstance()
const flowresultList = ref([])
@ -391,7 +396,64 @@ const single = ref(true)
const multiple = ref(true)
const total = ref(0)
const title = ref("")
const elFormItemWidth = ref(160);
const parentMeterPar = ref({
dFlowCalbz: '0',
dZcalbz: '0',
dCbtj: '0',
dpbM: 0,
dtbM: 0,
dpbE: 0,
dtbE: 0,
dPatm: 0.0981,
dPatmUnit: 2,
dngComponents: '',
dMeterType: '0',
dCoreType: '0',
dPtmode: '0',
dPipeType: '0',
dPipeD: 259.38,
dLenUnit: 3,
dPipeDtemp: 20,
dPileDtempU: 0,
dPipeMaterial: '11.16',
dOrificeD: 150.25,
dOrificeUnit: 3,
dOrificeDtemp: 0,
dOrificeDtempUnit: 0,
dOrificeMaterial: '16.6',
dOrificeSharpness: 0,
dOrificeRk: 0,
dOrificeRkLenU: 0,
dPf: 1.48,
dPfUnit: 2,
dPfType: '0',
dTf: 15,
dTfUnit: 0,
dDp: 12.5,
dDpUnit: 1,
dVFlowUnit: 0,
dVFlowWorkUnit: 0,
dMFlowUnit: 0,
dEFlowUnit: 6,
dCd: 0.9957,
dCdCalMethod: 0,
dMeterFactor: 2354,
dPulseNum: 12000,
dVFlowMax: 30,
dVFlowMin: 12,
dVFlowCon: 0.03,
dPfRangeMin: 0,
dPfRangeMax: 0,
dDpRangeMin: 0,
dDpRangeMax: 0,
dTfRangeMin: 0,
dTfRangeMax: 0,
dVGsc: 300,
dVGscUnit: 0,
dCalcType: 0, //0 1 3
dBqdd: 0 //0 1
});
const data = reactive({
form: {},
queryParams: {

View File

@ -0,0 +1,316 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="单位名称" prop="unitName">
<el-input
v-model="queryParams.unitName"
placeholder="请输入单位名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="是否基准" prop="baseUnit">
<el-input
v-model="queryParams.baseUnit"
placeholder="请输入是否基准"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="换算因子" prop="conversionFactor">
<el-input
v-model="queryParams.conversionFactor"
placeholder="请输入换算因子"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="类型名称" prop="unitTypeName">
<el-input
v-model="queryParams.unitTypeName"
placeholder="请输入类型名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="单位序号" prop="unitOrder">
<el-input
v-model="queryParams.unitOrder"
placeholder="请输入单位序号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:convert:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:convert:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:convert:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:convert:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="convertList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="${comment}" align="center" prop="id" />
<el-table-column label="单位类型" align="center" prop="unitType" />
<el-table-column label="单位名称" align="center" prop="unitName" />
<el-table-column label="是否基准" align="center" prop="baseUnit" />
<el-table-column label="换算因子" align="center" prop="conversionFactor" />
<el-table-column label="类型名称" align="center" prop="unitTypeName" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="单位序号" align="center" prop="unitOrder" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:convert:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:convert:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改请填写功能名称对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="单位名称" prop="unitName">
<el-input v-model="form.unitName" placeholder="请输入单位名称" />
</el-form-item>
<el-form-item label="是否基准" prop="baseUnit">
<el-input v-model="form.baseUnit" placeholder="请输入是否基准" />
</el-form-item>
<el-form-item label="换算因子" prop="conversionFactor">
<el-input v-model="form.conversionFactor" placeholder="请输入换算因子" />
</el-form-item>
<el-form-item label="类型名称" prop="unitTypeName">
<el-input v-model="form.unitTypeName" placeholder="请输入类型名称" />
</el-form-item>
<el-form-item label="单位序号" prop="unitOrder">
<el-input v-model="form.unitOrder" placeholder="请输入单位序号" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listConvert, getConvert, delConvert, addConvert, updateConvert } from "@/api/system/convert"
export default {
name: "Convert",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
convertList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
unitType: null,
unitName: null,
baseUnit: null,
conversionFactor: null,
unitTypeName: null,
status: null,
unitOrder: null
},
//
form: {},
//
rules: {
unitType: [
{ required: true, message: "单位类型不能为空", trigger: "change" }
],
unitName: [
{ required: true, message: "单位名称不能为空", trigger: "blur" }
],
unitTypeName: [
{ required: true, message: "类型名称不能为空", trigger: "blur" }
],
}
}
},
created() {
this.getList()
},
methods: {
/** 查询【请填写功能名称】列表 */
getList() {
this.loading = true
listConvert(this.queryParams).then(response => {
this.convertList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
unitType: null,
unitName: null,
baseUnit: null,
conversionFactor: null,
unitTypeName: null,
status: null,
unitOrder: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加【请填写功能名称】"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getConvert(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改【请填写功能名称】"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateConvert(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addConvert(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除【请填写功能名称】编号为"' + ids + '"的数据项?').then(function() {
return delConvert(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/convert/export', {
...this.queryParams
}, `convert_${new Date().getTime()}.xlsx`)
}
}
}
</script>