| | |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="职位"> |
| | | <el-select v-model="filters.position" placeholder="请选择" clearable> |
| | | <el-option label="部门负责人" value="LEADER" /> |
| | | <el-option label="员工" value="STAFF" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="状态"> |
| | | <el-select v-model="filters.status" placeholder="请选择" clearable> |
| | | <el-option label="启用" :value="1" /> |
| | |
| | | <el-table-column prop="staffNo" label="员工编号" width="120" show-overflow-tooltip /> |
| | | <el-table-column prop="mobileMasked" label="联系方式" width="130" /> |
| | | <el-table-column prop="deptName" label="所属部门" min-width="120" show-overflow-tooltip /> |
| | | <el-table-column prop="positionLabel" label="所属职位" width="120" /> |
| | | <el-table-column prop="groupDisplay" label="所属分组" min-width="170" show-overflow-tooltip /> |
| | | <el-table-column label="状态" width="92"> |
| | | <template #default="{ row }"> |
| | |
| | | class="fullw" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="职位" required> |
| | | <el-radio-group v-model="form.deptLeader"> |
| | | <el-radio :label="false">员工</el-radio> |
| | | <el-radio :label="true">部门负责人</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item v-if="detailGroupNames.length" label="所属分组"> |
| | | <div class="group-tags"> |
| | | <el-tag v-for="g in detailGroupNames" :key="g" size="small" class="g-tag">{{ g }}</el-tag> |
| | |
| | | import { Refresh, Search } from "@element-plus/icons-vue"; |
| | | import type { UploadRequestOptions } from "element-plus"; |
| | | import http from "../api/http"; |
| | | import { normalizeFormData } from "../utils/formHelper"; |
| | | |
| | | type DeptTree = { id: number; label: string; children?: DeptTree[] }; |
| | | type StaffRow = { |
| | |
| | | realName: "", |
| | | staffNo: "", |
| | | mobile: "", |
| | | position: "" as string, |
| | | status: undefined as number | undefined, |
| | | staffGroupId: undefined as number | undefined, |
| | | }); |
| | |
| | | realName: filters.realName?.trim() || undefined, |
| | | staffNo: filters.staffNo?.trim() || undefined, |
| | | mobile: filters.mobile?.trim() || undefined, |
| | | position: filters.position || undefined, |
| | | status: filters.status, |
| | | staffGroupId: filters.staffGroupId, |
| | | }; |
| | |
| | | filters.realName = ""; |
| | | filters.staffNo = ""; |
| | | filters.mobile = ""; |
| | | filters.position = ""; |
| | | filters.status = undefined; |
| | | filters.staffGroupId = undefined; |
| | | page.value = 1; |
| | |
| | | } |
| | | saving.value = true; |
| | | try { |
| | | const body = { |
| | | const body = normalizeFormData({ |
| | | nickName: form.nickName.trim(), |
| | | staffNo: form.staffNo.trim() || undefined, |
| | | avatarUrl: form.avatarUrl.trim() || undefined, |
| | | mobile: form.mobile.trim(), |
| | | deptId: form.deptId, |
| | | deptLeader: form.deptLeader, |
| | | }; |
| | | deptLeader: false, |
| | | }); |
| | | if (editingId.value == null) { |
| | | await http.post("/sys/staff", body); |
| | | ElMessage.success("已添加"); |
| | |
| | | |
| | | .dept-panel { |
| | | padding: 14px 12px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .content-panel { |
| | |
| | | font-size: 18px; |
| | | font-weight: 700; |
| | | margin-bottom: 14px; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | .dept-search { |
| | | margin-bottom: 14px; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | .dept-tree-wrap { |
| | | min-height: 520px; |
| | | flex: 1; |
| | | overflow-y: auto; |
| | | min-height: 0; |
| | | } |
| | | |
| | | .dept-all { |