增加代码检测,和映射

This commit is contained in:
wuweihua
2026-10-13 13:39:15 +08:00
parent b40033f424
commit 52816ad618
22 changed files with 1573 additions and 0 deletions
@@ -0,0 +1,177 @@
<template>
<div class="app-container">
<basic-table
ref="tableRef"
:columns="columns"
:search-columns="searchColumns"
:query="queryList"
row-key="mapId"
selection
>
<template #toolbar="{ ids }">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['data:productCodeMap:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="!ids.length" @click="handleDelete(ids)" v-hasPermi="['data:productCodeMap:remove']">删除</el-button>
</el-col>
</template>
<template #col-status="{ row }">
<el-tag size="small" :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag>
</template>
<template #col-action="{ row }">
<el-button link type="primary" icon="Edit" @click="handleUpdate(row)" v-hasPermi="['data:productCodeMap:edit']">修改</el-button>
<el-button link type="danger" icon="Delete" @click="handleDelete([row.mapId])" v-hasPermi="['data:productCodeMap:remove']">删除</el-button>
</template>
</basic-table>
<el-dialog :title="title" v-model="open" width="520px" append-to-body destroy-on-close>
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="上游产品代码" prop="upstreamCode">
<el-input v-model="form.upstreamCode" placeholder="上游/渠道产品代码" maxlength="64" />
</el-form-item>
<el-form-item label="BMS产品代码" prop="bmsProductCode">
<el-select
v-model="form.bmsProductCode"
filterable
remote
clearable
reserve-keyword
placeholder="请输入产品代码或名称"
:remote-method="searchProduct"
:loading="productLoading"
style="width: 100%"
>
<el-option
v-for="p in productOptions"
:key="p.productCode"
:label="(p.productName || '') + ' (' + p.productCode + ')'"
:value="p.productCode"
/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio value="0">正常</el-radio>
<el-radio value="1">停用</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" :rows="2" maxlength="500" />
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="submitForm">确定</el-button>
<el-button @click="open = false">取消</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup name="ProductCodeMap">
import { listProductCodeMap, getProductCodeMap, addProductCodeMap, updateProductCodeMap, delProductCodeMap } from '@/api/data/productCodeMap'
import { listProductOptions } from '@/api/price/product'
const { proxy } = getCurrentInstance()
const tableRef = ref()
const formRef = ref()
const open = ref(false)
const title = ref('')
const productLoading = ref(false)
const productOptions = ref([])
const statusOptions = [
{ label: '正常', value: '0' },
{ label: '停用', value: '1' }
]
const searchColumns = [
{ label: '上游代码', prop: 'upstreamCode', component: 'input', placeholder: '上游产品代码', width: '180px' },
{ label: 'BMS代码', prop: 'bmsProductCode', component: 'input', placeholder: 'BMS产品代码', width: '180px' },
{ label: '状态', prop: 'status', component: 'select', options: statusOptions, placeholder: '请选择', width: '140px', props: { clearable: true } }
]
const columns = [
{ label: '上游产品代码', prop: 'upstreamCode', minWidth: 160, showOverflowTooltip: true },
{ label: 'BMS产品代码', prop: 'bmsProductCode', minWidth: 160, showOverflowTooltip: true },
{ label: '状态', prop: 'status', align: 'center', width: 90, slot: 'status' },
{ label: '备注', prop: 'remark', minWidth: 160, showOverflowTooltip: true },
{ label: '创建时间', prop: 'createTime', align: 'center', width: 170 },
{ label: '操作', prop: 'action', align: 'center', width: 150, fixed: 'right', slot: 'action', showInToolbar: false }
]
const data = reactive({
form: {},
rules: {
upstreamCode: [{ required: true, message: '请输入上游产品代码', trigger: 'blur' }],
bmsProductCode: [{ required: true, message: '请选择BMS产品代码', trigger: 'change' }],
status: [{ required: true, message: '请选择状态', trigger: 'change' }]
}
})
const { form, rules } = toRefs(data)
function queryList(params) {
return listProductCodeMap(params)
}
function resetForm() {
form.value = {
mapId: undefined,
upstreamCode: '',
bmsProductCode: '',
status: '0',
remark: ''
}
productOptions.value = []
}
function handleAdd() {
resetForm()
title.value = '新增代码映射'
open.value = true
}
function handleUpdate(row) {
resetForm()
getProductCodeMap(row.mapId).then(res => {
form.value = Object.assign({}, res.data || {})
if (form.value.bmsProductCode) {
productOptions.value = [{ productCode: form.value.bmsProductCode, productName: form.value.bmsProductCode }]
searchProduct(form.value.bmsProductCode)
}
title.value = '修改代码映射'
open.value = true
})
}
function submitForm() {
formRef.value.validate(valid => {
if (!valid) return
const req = form.value.mapId ? updateProductCodeMap(form.value) : addProductCodeMap(form.value)
req.then(() => {
proxy.$modal.msgSuccess('保存成功')
open.value = false
tableRef.value?.refresh()
})
})
}
function handleDelete(ids) {
if (!ids || !ids.length) return
proxy.$modal.confirm('确认删除选中的 ' + ids.length + ' 条映射?').then(() => {
return delProductCodeMap(ids.join(','))
}).then(() => {
proxy.$modal.msgSuccess('删除成功')
tableRef.value?.refresh()
}).catch(() => {})
}
function searchProduct(keyword) {
productLoading.value = true
listProductOptions({ productCode: keyword || undefined, status: '1' }).then(res => {
productOptions.value = res.data || res.rows || []
}).finally(() => {
productLoading.value = false
})
}
</script>