TechnicianAssign 组件功能说明与使用指南
一、 功能概述
TechnicianAssign 是一个用于从技术员列表中选择并分配技术员的下拉选择框组件。它不仅提供了一个简单的选择功能,还集成了丰富的信息展示,帮助用户在分配任务时做出更明智的决策。
核心功能点:
- 技术员列表展示:以下拉列表形式展示所有可用的在职技术员。
- 丰富信息展示:在下拉选项中,直观地展示每位技术员的关键信息,包括:
- 头像、姓名、工号
- 技能等级(如:初级、中级、高级)
- 当前工作状态(如:空闲、忙碌、休假)
- 专业技能/特长
- 任务负载:通过进度条实时显示当前任务数与最大任务数,并标记出负载状态(低、中、高、满载)。
- 客户评分(可选)。
- 智能排序与过滤:
- 默认按任务负载从低到高排序,优先推荐较空闲的技术员。
- 自动过滤掉任务已满载的技术员(使其不可选)。
- 支持通过外部参数进行二次过滤。
- 详情卡片:选中技术员后,可以(可选)在下方显示一个详细的信息卡片,提供更全面的数据,如联系电话、部门、职位以及累计完成任务数等统计信息。
- 表单集成:组件本身被封装为
el-form-item,可以无缝集成到el-form表单中,支持表单校验。 - 动态加载:仅在用户点击下拉框时才加载技术员列表,优化了初始性能。
二、 使用方法
1. 基本用法
在父组件中直接引入并使用。通过 v-model 来绑定选中的技术员ID。
<template>
<el-form :model="form" ref="formRef">
<TechnicianAssign v-model="form.technicianId" />
</el-form>
</template>
<script setup>
import { ref } from 'vue';
import TechnicianAssign from '@/components/TechnicianAssign/index.vue';
const form = ref({
technicianId: null
});
</script>
2. Props (属性)
你可以通过传递不同的 props 来定制组件的行为和显示。
| Prop | 类型 | 默认值 | 说明 |
|---|---|---|---|
modelValue |
Number, String |
null |
必需。用于 v-model 双向绑定,值为选中技术员的ID。 |
label |
String |
'分配技术员' |
表单项的标签文本。 |
prop |
String |
'' |
用于 el-form 表单校验的字段名。 |
rules |
Object, Array |
null |
el-form-item 的校验规则。 |
placeholder |
String |
'请选择技术员' |
下拉框的占位文本。 |
disabled |
Boolean |
false |
是否禁用选择器。 |
showCard |
Boolean |
false |
是否在选中技术员后,在下方显示其详细信息卡片。 |
showRating |
Boolean |
true |
是否在下拉选项中显示客户评分。 |
showStats |
Boolean |
true |
是否在详情卡片中显示统计数据(如累计完成任务)。 |
filterParams |
Object |
{} |
额外的查询参数,会合并到获取技术员列表的API请求中,用于自定义过滤。例如 { skillLevel: '高级' }。 |
excludeTechnicianId |
Number, String |
null |
需要从列表中排除的某个技术员的ID。 |
3. Events (事件)
组件会触发以下事件,方便父组件进行交互。
| 事件名 | 参数 | 说明 |
|---|---|---|
update:modelValue |
(technicianId) |
v-model 语法糖,当选中项改变时触发。 |
change |
(technicianId, technicianObject) |
选中项改变时触发,返回技术员ID和完整的技术员对象。 |
technician-selected |
(technicianObject) |
选中项改变时触发,返回完整的技术员对象。 |
4. Expose (暴露的方法)
父组件可以通过 ref 调用组件内部暴露的方法。
| 方法名 | 参数 | 说明 |
|---|---|---|
refresh() |
- | 手动重新加载和刷新技术员列表。 |
technicians |
- | (响应式引用) 返回当前组件加载的完整技术员列表数据。 |
5. 示例:高级用法
下面的例子展示了如何使用大部分功能:显示详情卡片、传递表单校验规则、并在选择后获取完整的技术员信息。
<template>
<el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
<TechnicianAssign
ref="assignRef"
v-model="form.technicianId"
prop="technicianId"
:showCard="true"
@change="handleTechChange"
/>
<el-button @click="submitForm">提交</el-button>
<el-button @click="refreshList">手动刷新</el-button>
</el-form>
</template>
<script setup>
import { ref } from 'vue';
import TechnicianAssign from '@/components/TechnicianAssign/index.vue';
const formRef = ref(null);
const assignRef = ref(null); // 用于调用组件暴露的方法
const form = ref({
technicianId: null
});
const rules = {
technicianId: [
{ required: true, message: '请必须选择一位技术员', trigger: 'change' }
]
};
// 监听选择变化
function handleTechChange(id, technician) {
if (technician) {
console.log('选中的技术员姓名:', technician.technicianName);
console.log('他当前的任务数:', technician.currentTasks);
}
}
// 手动刷新列表
function refreshList() {
assignRef.value?.refresh();
}
// 提交表单
function submitForm() {
formRef.value.validate((valid) => {
if (valid) {
console.log('表单验证通过,提交的ID是:', form.value.technicianId);
// ...提交逻辑
} else {
console.log('表单验证失败');
}
});
}
</script>作者:聂盼盼 创建时间:2025-10-16 11:15
最后编辑:聂盼盼 更新时间:2025-10-28 19:53
最后编辑:聂盼盼 更新时间:2025-10-28 19:53