Files
mes-ui-d2/src/views/production-master-data/process-model/process-step/components/non-standard-setting-plugin.vue
sheng 561e0413e8
Some checks failed
Release pipeline / publish (push) Has been cancelled
Release pipeline / Always run job (push) Has been cancelled
修复工序单元预设设定值运行时模板错误
2026-06-26 14:23:33 +08:00

238 lines
8.1 KiB
Vue

<template>
<el-tabs v-model="activeTab" type="card">
<el-tab-pane label="设定值" name="process">
<div class="non-standard-setting">
<div class="setting-search-card">
<el-card class="box-card" style="height:550px">
<div slot="header">
<span>查询</span>
</div>
<el-form label-position="top" :model="searchForm" size="mini">
<el-form-item label="名称">
<el-input v-model.trim="searchForm.name" placeholder="请输入名称" clearable />
</el-form-item>
<el-form-item label="参数">
<el-input v-model.trim="searchForm.code" placeholder="请输入参数" clearable />
</el-form-item>
</el-form>
</el-card>
</div>
<div class="setting-table">
<el-table :data="filteredRows" border height="550" style="width:100%">
<el-table-column prop="name" label="名称" width="220" show-overflow-tooltip />
<el-table-column prop="code" label="参数" width="180" show-overflow-tooltip />
<el-table-column prop="value" label="默认值" min-width="140" show-overflow-tooltip />
<el-table-column label="单位" width="140" show-overflow-tooltip>
<template slot-scope="{ row }">{{ unitMap[row.unit] || row.unit }}</template>
</el-table-column>
<el-table-column prop="remark" label="备注" min-width="160" show-overflow-tooltip />
<el-table-column label="操作" width="100" fixed="right" align="center">
<template slot-scope="{ row }">
<el-button type="text" icon="el-icon-edit" @click="openEdit(row)" />
<el-button type="text" icon="el-icon-delete" style="color:#F56C6C" @click="removeRow(row)" />
</template>
</el-table-column>
</el-table>
<div class="setting-actions">
<el-button type="primary" size="small" @click="openAdd">新增一行</el-button>
</div>
</div>
</div>
<el-dialog
:title="editIndex >= 0 ? '编辑' : '新增'"
:visible.sync="dialogVisible"
append-to-body
width="800px"
>
<el-form ref="form" :model="form" :rules="rules" label-width="100px" size="mini">
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="参数" prop="code">
<el-input v-model="form.code" placeholder="请输入参数" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="默认值" prop="value">
<el-input v-model="form.value" placeholder="请输入默认值" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位" prop="unit">
<el-select v-model="form.unit" placeholder="请选择单位" filterable clearable style="width:100%">
<el-option
v-for="item in unitOptions"
:key="item.code"
:label="item.name"
:value="item.code"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="form.remark" placeholder="请输入备注" clearable />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitRow">确定</el-button>
</div>
</el-dialog>
</el-tab-pane>
<el-tab-pane label="json" name="json">
<tree-view :data="json" />
</el-tab-pane>
</el-tabs>
</template>
<script>
import { getUnitAll } from '@/api/production-master-data/material-unit'
function isJson (value) {
if (typeof value !== 'string') return false
try {
JSON.parse(value)
return true
} catch (e) {
return false
}
}
function parseSetting (value, fallback = { process: [] }) {
if (value === undefined || value === null || value === '') return JSON.parse(JSON.stringify(fallback))
if (typeof value === 'object') return JSON.parse(JSON.stringify(value))
if (isJson(value)) return JSON.parse(value)
return JSON.parse(JSON.stringify(fallback))
}
export default {
name: 'ProcessStepNonStandardSettingPlugin',
props: { settingJson: { default: '' } },
data () {
return {
activeTab: 'process',
json: { process: [] },
rows: [],
searchForm: { name: '', code: '' },
dialogVisible: false,
editIndex: -1,
form: { code: '', name: '', value: '', unit: '', remark: '' },
rules: {
code: [{ required: true, message: '请输入参数', trigger: 'blur' }],
name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
value: [{ required: true, message: '请输入默认值', trigger: 'blur' }],
unit: [{ required: true, message: '请选择单位', trigger: 'change' }]
},
unitOptions: [],
unitMap: {}
}
},
computed: {
filteredRows () {
const name = (this.searchForm.name || '').trim()
const code = (this.searchForm.code || '').trim()
return this.rows.filter(row => {
const matchName = !name || String(row.name || '').includes(name)
const matchCode = !code || String(row.code || '').includes(code)
return matchName && matchCode
})
}
},
watch: {
settingJson: {
handler (val) {
const parsed = parseSetting(val, { process: [] })
const process = Array.isArray(parsed.process) ? parsed.process : []
this.json = { ...parsed, process }
this.rows = process.map(item => ({ ...item }))
},
immediate: true
},
rows: {
handler (val) {
this.json = { ...this.json, process: val.map(item => ({ ...item })) }
},
deep: true
}
},
created () {
getUnitAll().then(res => {
const list = (res && res.data && (res.data.data || res.data.list || res.data)) || []
this.unitOptions = Array.isArray(list) ? list : []
this.unitMap = this.unitOptions.reduce((map, item) => {
map[item.code] = item.name
return map
}, {})
}).catch(() => {
this.unitOptions = []
this.unitMap = {}
})
},
methods: {
openAdd () {
this.editIndex = -1
this.form = { code: '', name: '', value: '', unit: '', remark: '' }
this.dialogVisible = true
this.$nextTick(() => this.$refs.form && this.$refs.form.clearValidate())
},
openEdit (row) {
this.editIndex = this.rows.indexOf(row)
this.form = { ...row }
this.dialogVisible = true
this.$nextTick(() => this.$refs.form && this.$refs.form.clearValidate())
},
removeRow (row) {
const index = this.rows.indexOf(row)
if (index !== -1) this.rows.splice(index, 1)
},
submitRow () {
this.$refs.form.validate(valid => {
if (!valid) return
const duplicate = this.rows.some((item, index) => {
return index !== this.editIndex && (item.name === this.form.name || item.code === this.form.code)
})
if (duplicate) {
this.$message.error('名称或参数已存在')
return
}
if (this.editIndex >= 0) {
this.$set(this.rows, this.editIndex, { ...this.form })
} else {
this.rows.push({ ...this.form })
}
this.dialogVisible = false
})
},
handleFormSubmit () {
this.$emit('submit', this.json)
}
}
}
</script>
<style scoped>
.non-standard-setting {
display: flex;
flex-direction: row;
justify-content: center;
}
.setting-search-card {
width: 20%;
margin-right: 20px;
}
.setting-table {
width: 80%;
}
.setting-actions {
margin-top: 10px;
text-align: right;
}
</style>