liyong
2026-07-31 450bcae3cfffe9923dc09dea2a4e89312bb373d7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
<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>