<template>
|
<ContentWrap>
|
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="88px">
|
<el-form-item label="供应商" prop="supplierId">
|
<el-select v-model="queryParams.supplierId" placeholder="请选择" clearable class="!w-200px" filterable>
|
<el-option v-for="s in supplierList" :key="s.id" :label="s.name" :value="s.id" />
|
</el-select>
|
</el-form-item>
|
<el-form-item label="评价周期" prop="evaluationPeriod">
|
<el-input v-model="queryParams.evaluationPeriod" placeholder="如:2026-Q1" clearable class="!w-160px" />
|
</el-form-item>
|
<el-form-item>
|
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
|
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
<el-button type="primary" plain @click="openForm()" v-hasPermi="['srm:supplier-evaluation:create']">
|
<Icon icon="ep:plus" class="mr-5px" /> 新增评价
|
</el-button>
|
</el-form-item>
|
</el-form>
|
</ContentWrap>
|
|
<ContentWrap>
|
<el-table v-loading="loading" :data="list" stripe>
|
<el-table-column label="供应商ID" align="center" prop="supplierId" min-width="100" />
|
<el-table-column label="评价周期" align="center" prop="evaluationPeriod" min-width="120" />
|
<el-table-column label="质量评分" align="center" prop="qualityScore" min-width="100" />
|
<el-table-column label="合格率(%)" align="center" prop="qualityPassRate" min-width="100" />
|
<el-table-column label="不良次数" align="center" prop="qualityDefectCount" min-width="90" />
|
<el-table-column label="交付评分" align="center" prop="deliveryScore" min-width="100" />
|
<el-table-column label="准时率(%)" align="center" prop="deliveryOnTimeRate" min-width="100" />
|
<el-table-column label="延迟次数" align="center" prop="deliveryDelayCount" min-width="90" />
|
<el-table-column label="价格评分" align="center" prop="priceScore" min-width="100" />
|
<el-table-column label="服务评分" align="center" prop="serviceScore" min-width="100" />
|
<el-table-column label="综合评分" align="center" prop="compositeScore" min-width="100">
|
<template #default="scope">
|
<el-tag v-if="scope.row.evaluationLevel === 'A'" type="success">{{ scope.row.compositeScore }}</el-tag>
|
<el-tag v-else-if="scope.row.evaluationLevel === 'B'" type="primary">{{ scope.row.compositeScore }}</el-tag>
|
<el-tag v-else-if="scope.row.evaluationLevel === 'C'" type="warning">{{ scope.row.compositeScore }}</el-tag>
|
<el-tag v-else type="danger">{{ scope.row.compositeScore }}</el-tag>
|
</template>
|
</el-table-column>
|
<el-table-column label="等级" align="center" prop="evaluationLevel" min-width="80">
|
<template #default="scope">
|
<el-tag v-if="scope.row.evaluationLevel === 'A'" type="success">A</el-tag>
|
<el-tag v-else-if="scope.row.evaluationLevel === 'B'" type="primary">B</el-tag>
|
<el-tag v-else-if="scope.row.evaluationLevel === 'C'" type="warning">C</el-tag>
|
<el-tag v-else type="danger">D</el-tag>
|
</template>
|
</el-table-column>
|
<el-table-column label="评价时间" align="center" prop="evaluationTime" :formatter="dateFormatter" width="160px" />
|
<el-table-column label="操作" align="center" width="160" fixed="right">
|
<template #default="scope">
|
<el-button link type="primary" @click="openDetail(scope.row.id)" v-hasPermi="['srm:supplier-evaluation:query']">详情</el-button>
|
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['srm:supplier-evaluation:delete']">删除</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
</ContentWrap>
|
|
<!-- 新增/编辑对话框 -->
|
<el-dialog :title="'新增评价'" v-model="dialogVisible" width="650px" @close="resetForm">
|
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="110px">
|
<el-row :gutter="20">
|
<el-col :span="12">
|
<el-form-item label="供应商" prop="supplierId">
|
<el-select v-model="formData.supplierId" placeholder="请选择" class="!w-full" filterable>
|
<el-option v-for="s in supplierList" :key="s.id" :label="s.name" :value="s.id" />
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="评价周期" prop="evaluationPeriod">
|
<el-input v-model="formData.evaluationPeriod" placeholder="如:2026-Q1" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="质量评分" prop="qualityScore">
|
<el-input-number v-model="formData.qualityScore" :min="0" :max="100" :precision="1" controls-position="right" class="!w-full" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="合格率(%)" prop="qualityPassRate">
|
<el-input-number v-model="formData.qualityPassRate" :min="0" :max="100" :precision="1" controls-position="right" class="!w-full" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="不良次数" prop="qualityDefectCount">
|
<el-input-number v-model="formData.qualityDefectCount" :min="0" controls-position="right" class="!w-full" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="交付评分" prop="deliveryScore">
|
<el-input-number v-model="formData.deliveryScore" :min="0" :max="100" :precision="1" controls-position="right" class="!w-full" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="准时率(%)" prop="deliveryOnTimeRate">
|
<el-input-number v-model="formData.deliveryOnTimeRate" :min="0" :max="100" :precision="1" controls-position="right" class="!w-full" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="延迟次数" prop="deliveryDelayCount">
|
<el-input-number v-model="formData.deliveryDelayCount" :min="0" controls-position="right" class="!w-full" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="价格评分" prop="priceScore">
|
<el-input-number v-model="formData.priceScore" :min="0" :max="100" :precision="1" controls-position="right" class="!w-full" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="服务评分" prop="serviceScore">
|
<el-input-number v-model="formData.serviceScore" :min="0" :max="100" :precision="1" controls-position="right" class="!w-full" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="24">
|
<el-form-item label="备注" prop="remark">
|
<el-input v-model="formData.remark" type="textarea" :rows="2" placeholder="请输入备注" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
</el-form>
|
<template #footer>
|
<el-button @click="dialogVisible = false">取消</el-button>
|
<el-button type="primary" @click="submitForm" :loading="formLoading">确定</el-button>
|
</template>
|
</el-dialog>
|
|
<!-- 详情对话框 -->
|
<el-dialog :title="'评价详情'" v-model="detailVisible" width="650px">
|
<el-descriptions :column="2" border>
|
<el-descriptions-item label="评价周期">{{ detailData.evaluationPeriod }}</el-descriptions-item>
|
<el-descriptions-item label="评价等级">
|
<el-tag v-if="detailData.evaluationLevel === 'A'" type="success">A</el-tag>
|
<el-tag v-else-if="detailData.evaluationLevel === 'B'" type="primary">B</el-tag>
|
<el-tag v-else-if="detailData.evaluationLevel === 'C'" type="warning">C</el-tag>
|
<el-tag v-else type="danger">D</el-tag>
|
</el-descriptions-item>
|
<el-descriptions-item label="质量评分">{{ detailData.qualityScore }}</el-descriptions-item>
|
<el-descriptions-item label="合格率">{{ detailData.qualityPassRate }}%</el-descriptions-item>
|
<el-descriptions-item label="不良次数">{{ detailData.qualityDefectCount }}</el-descriptions-item>
|
<el-descriptions-item label="交付评分">{{ detailData.deliveryScore }}</el-descriptions-item>
|
<el-descriptions-item label="准时率">{{ detailData.deliveryOnTimeRate }}%</el-descriptions-item>
|
<el-descriptions-item label="延迟次数">{{ detailData.deliveryDelayCount }}</el-descriptions-item>
|
<el-descriptions-item label="价格评分">{{ detailData.priceScore }}</el-descriptions-item>
|
<el-descriptions-item label="服务评分">{{ detailData.serviceScore }}</el-descriptions-item>
|
<el-descriptions-item label="综合评分">{{ detailData.compositeScore }}</el-descriptions-item>
|
<el-descriptions-item label="评价时间">{{ detailData.evaluationTime }}</el-descriptions-item>
|
<el-descriptions-item label="备注" :span="2">{{ detailData.remark || '-' }}</el-descriptions-item>
|
</el-descriptions>
|
</el-dialog>
|
</template>
|
|
<script setup lang="ts">
|
import { dateFormatter } from '@/utils/formatTime'
|
import { SrmSupplierEvaluationApi, SrmSupplierEvaluationVO } from '@/api/srm/supplierEvaluation'
|
import { SrmSupplierApi } from '@/api/srm/supplier'
|
|
defineOptions({ name: 'SrmSupplierEvaluation' })
|
|
const message = useMessage()
|
|
const loading = ref(true)
|
const list = ref<SrmSupplierEvaluationVO[]>([])
|
const total = ref(0)
|
const supplierList = ref<any[]>([])
|
const queryParams = reactive({
|
pageNo: 1,
|
pageSize: 10,
|
supplierId: undefined,
|
evaluationPeriod: undefined
|
})
|
const queryFormRef = ref()
|
|
const getList = async () => {
|
loading.value = true
|
try {
|
const data = await SrmSupplierEvaluationApi.getEvaluationPage(queryParams)
|
list.value = data.list
|
total.value = data.total
|
} finally {
|
loading.value = false
|
}
|
}
|
|
const handleQuery = () => { queryParams.pageNo = 1; getList() }
|
const resetQuery = () => { queryFormRef.value.resetFields(); handleQuery() }
|
|
// 新增/编辑
|
const dialogVisible = ref(false)
|
const formLoading = ref(false)
|
const formData = ref<any>({})
|
const formRules = reactive({
|
supplierId: [{ required: true, message: '供应商不能为空', trigger: 'change' }],
|
evaluationPeriod: [{ required: true, message: '评价周期不能为空', trigger: 'blur' }]
|
})
|
const formRef = ref()
|
|
const openForm = async () => {
|
formData.value = { qualityDefectCount: 0, deliveryDelayCount: 0 }
|
dialogVisible.value = true
|
}
|
|
const resetForm = () => { formData.value = {}; formRef.value?.resetFields() }
|
|
const submitForm = async () => {
|
await formRef.value.validate()
|
formLoading.value = true
|
try {
|
await SrmSupplierEvaluationApi.createEvaluation(formData.value)
|
message.success('创建成功')
|
dialogVisible.value = false
|
await getList()
|
} finally {
|
formLoading.value = false
|
}
|
}
|
|
const handleDelete = async (id: number) => {
|
try {
|
await message.delConfirm()
|
await SrmSupplierEvaluationApi.deleteEvaluation(id)
|
message.success('删除成功')
|
await getList()
|
} catch {}
|
}
|
|
// 详情
|
const detailVisible = ref(false)
|
const detailData = ref<any>({})
|
|
const openDetail = async (id: number) => {
|
detailData.value = await SrmSupplierEvaluationApi.getEvaluation(id)
|
detailVisible.value = true
|
}
|
|
const loadSuppliers = async () => {
|
try {
|
const data = await SrmSupplierApi.getSupplierSimpleList()
|
supplierList.value = data || []
|
} catch {}
|
}
|
|
onMounted(() => { getList(); loadSuppliers() })
|
</script>
|