Files
xgy-oa/klp-ui/src/views/wms/processSpec/index.vue
王文昊 f501994da6 feat(wms): 增加版本管理功能和操作按钮
在规程主表的操作列中新增“版本与方案”按钮,点击后可跳转至版本管理页面。更新了操作列的宽度以适应新按钮。同时,在后端服务中添加了对规程版本存在性的校验,确保在删除规程时不会影响相关版本数据。
2026-04-20 19:14:50 +08:00

323 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
<el-form-item label="规程编号" prop="specCode">
<el-input v-model="queryParams.specCode" placeholder="规程编号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="规程名称" prop="specName">
<el-input v-model="queryParams.specName" placeholder="规程名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="规程类型" prop="specType">
<el-select v-model="queryParams.specType" placeholder="全部" clearable>
<el-option v-for="item in specTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="产线" prop="lineId">
<el-select v-model="queryParams.lineId" placeholder="全部" clearable filterable>
<el-option
v-for="line in lineOptions"
:key="line.lineId"
:label="formatLineOption(line)"
:value="line.lineId"
/>
</el-select>
</el-form-item>
<el-form-item label="产品类型" prop="productType">
<el-input v-model="queryParams.productType" placeholder="产品类型" clearable />
</el-form-item>
<el-form-item label="是否启用" prop="isEnabled">
<el-select v-model="queryParams.isEnabled" placeholder="全部" clearable>
<el-option label="启用" :value="1" />
<el-option label="禁用" :value="0" />
</el-select>
</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">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<KLPTable v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="规程编号" align="center" prop="specCode" min-width="120" show-overflow-tooltip />
<el-table-column label="规程名称" align="center" prop="specName" min-width="140" show-overflow-tooltip />
<el-table-column label="规程类型" align="center" prop="specType" width="100">
<template slot-scope="scope">
<span>{{ formatSpecType(scope.row.specType) }}</span>
</template>
</el-table-column>
<el-table-column label="产线" align="center" min-width="160" show-overflow-tooltip>
<template slot-scope="scope">
{{ getLineName(scope.row.lineId) }}
</template>
</el-table-column>
<el-table-column label="产品类型" align="center" prop="productType" min-width="100" show-overflow-tooltip />
<el-table-column label="是否启用" align="center" prop="isEnabled" width="90">
<template slot-scope="scope">
<dict-tag :options="dict.type.common_swicth" :value="scope.row.isEnabled" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="160" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="220">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-document" @click="goVersionManage(scope.row)">版本与方案</el-button>
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</KLPTable>
<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="560px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="规程编号" prop="specCode">
<el-input v-model="form.specCode" placeholder="唯一编号" maxlength="64" show-word-limit />
</el-form-item>
<el-form-item label="规程名称" prop="specName">
<el-input v-model="form.specName" placeholder="规程名称" maxlength="200" show-word-limit />
</el-form-item>
<el-form-item label="规程类型" prop="specType">
<el-select v-model="form.specType" placeholder="请选择">
<el-option v-for="item in specTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="产线" prop="lineId">
<el-select v-model="form.lineId" placeholder="请选择产线" filterable style="width: 100%">
<el-option
v-for="line in lineOptions"
:key="line.lineId"
:label="formatLineOption(line)"
:value="line.lineId"
/>
</el-select>
</el-form-item>
<el-form-item label="产品类型" prop="productType">
<el-input v-model="form.productType" placeholder="可选" maxlength="100" />
</el-form-item>
<el-form-item label="是否启用" prop="isEnabled">
<el-radio-group v-model="form.isEnabled">
<el-radio :label="1">启用</el-radio>
<el-radio :label="0">禁用</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="备注" maxlength="500" show-word-limit rows="2" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listProcessSpec, getProcessSpec, delProcessSpec, updateProcessSpec, addProcessSpec } from '@/api/wms/processSpec'
import { listProductionLine } from '@/api/wms/productionLine'
export default {
name: 'ProcessSpec',
dicts: ['common_swicth'],
data() {
return {
buttonLoading: false,
loading: true,
ids: [],
single: true,
multiple: true,
showSearch: true,
total: 0,
dataList: [],
title: '',
open: false,
lineOptions: [],
specTypeOptions: [
{ label: '工艺规程', value: 'PROCESS' },
{ label: '标准', value: 'STANDARD' }
],
queryParams: {
pageNum: 1,
pageSize: 20,
specCode: undefined,
specName: undefined,
specType: undefined,
lineId: undefined,
productType: undefined,
isEnabled: undefined
},
form: {},
rules: {
specCode: [{ required: true, message: '规程编号不能为空', trigger: 'blur' }],
specName: [{ required: true, message: '规程名称不能为空', trigger: 'blur' }],
specType: [{ required: true, message: '规程类型不能为空', trigger: 'change' }],
lineId: [{ required: true, message: '产线不能为空', trigger: 'change' }]
}
}
},
created() {
this.loadLineOptions()
this.getList()
},
methods: {
formatSpecType(value) {
const hit = this.specTypeOptions.find((x) => x.value === value)
return hit ? hit.label : value
},
formatLineOption(line) {
if (!line) {
return ''
}
return line.lineCode ? `${line.lineName}${line.lineCode}` : line.lineName
},
getLineName(lineId) {
if (lineId == null) {
return ''
}
const hit = this.lineOptions.find((o) => o.lineId === lineId)
return hit ? this.formatLineOption(hit) : lineId
},
loadLineOptions() {
listProductionLine({ pageNum: 1, pageSize: 500 }).then((res) => {
this.lineOptions = res.rows || []
}).catch((err) => {
console.error('加载产线列表失败', err)
})
},
getList() {
this.loading = true
listProcessSpec(this.queryParams).then((response) => {
this.dataList = response.rows
this.total = response.total
this.loading = false
}).catch((err) => {
console.error('加载规程列表失败', err)
this.loading = false
})
},
cancel() {
this.open = false
this.reset()
},
reset() {
this.form = {
specId: undefined,
specCode: undefined,
specName: undefined,
specType: 'PROCESS',
lineId: undefined,
productType: undefined,
isEnabled: 1,
remark: undefined
}
this.resetForm('form')
},
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
resetQuery() {
this.resetForm('queryForm')
this.handleQuery()
},
handleSelectionChange(selection) {
this.ids = selection.map((item) => item.specId)
this.single = selection.length !== 1
this.multiple = !selection.length
},
handleAdd() {
this.reset()
this.open = true
this.title = '添加规程'
},
handleUpdate(row) {
this.loading = true
this.reset()
const specId = row.specId || this.ids
getProcessSpec(specId).then((response) => {
this.loading = false
this.form = response.data
this.open = true
this.title = '修改规程'
}).catch((err) => {
console.error('获取规程详情失败', err)
this.loading = false
})
},
submitForm() {
this.$refs.form.validate((valid) => {
if (!valid) {
return
}
this.buttonLoading = true
const req = this.form.specId != null ? updateProcessSpec(this.form) : addProcessSpec(this.form)
req.then(() => {
this.$modal.msgSuccess(this.form.specId != null ? '修改成功' : '新增成功')
this.open = false
this.getList()
}).catch((err) => {
console.error('保存规程失败', err)
}).finally(() => {
this.buttonLoading = false
})
})
},
handleDelete(row) {
const specIds = row.specId || this.ids
this.$modal.confirm('是否确认删除选中的规程数据?').then(() => {
this.loading = true
return delProcessSpec(specIds)
}).then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
}).catch(() => {}).finally(() => {
this.loading = false
})
},
handleExport() {
this.download('wms/processSpec/export', {
...this.queryParams
}, `processSpec_${new Date().getTime()}.xlsx`)
},
goVersionManage(row) {
const specId = row.specId
if (specId == null || specId === '') {
this.$modal.msgWarning('无法获取规程ID请刷新列表后重试')
return
}
// 固定落在「…/processSpec/version」避免列表为 …/processSpec/list 时拼成 …/list/version 导致路由不匹配、query 丢失
const pathCurrent = this.$route.path.replace(/\/$/, '')
const m = pathCurrent.match(/^(.*\/processSpec)(?:\/.*)?$/)
const base = m ? m[1] : pathCurrent
this.$router.push({
path: `${base}/version`,
query: { specId: String(specId) }
})
}
}
}
</script>