|
|
@@ -34,8 +34,38 @@
|
|
|
</el-col>
|
|
|
<el-col :span="9" class="zw-page-main">
|
|
|
<el-card>
|
|
|
- <div class="zw-card-header" slot="header">
|
|
|
+ <div class="zw-card-header staff-header" slot="header">
|
|
|
<span class="zw-header-title details-title">员工明细 </span>
|
|
|
+ <div class="staff-search">
|
|
|
+ <el-input
|
|
|
+ v-model.trim="userName"
|
|
|
+ :placeholder="form.groupId ? '请输入员工姓名' : '请先选择部门'"
|
|
|
+ clearable
|
|
|
+ size="small"
|
|
|
+ prefix-icon="el-icon-search"
|
|
|
+ class="staff-search-input"
|
|
|
+ :disabled="!form.groupId"
|
|
|
+ @keyup.enter.native="searchStaff"
|
|
|
+ @clear="searchStaff(false)"
|
|
|
+ />
|
|
|
+ <el-button
|
|
|
+ size="small"
|
|
|
+ type="primary"
|
|
|
+ icon="el-icon-search"
|
|
|
+ :disabled="!form.groupId"
|
|
|
+ @click="searchStaff"
|
|
|
+ >
|
|
|
+ 查询
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ size="small"
|
|
|
+ icon="el-icon-refresh"
|
|
|
+ :disabled="!form.groupId && !userName"
|
|
|
+ @click="resetStaffSearch"
|
|
|
+ >
|
|
|
+ 重置
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<div class="zw-page-main-list">
|
|
|
<el-container class="zw-container">
|
|
|
@@ -56,7 +86,7 @@
|
|
|
</el-table-column>
|
|
|
<el-table-column label="工号">
|
|
|
<template slot-scope="{ row }">
|
|
|
- <div>{{ row.jobNumber }}</div>
|
|
|
+ <div>{{ getStaffJobNumber(row) }}</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column width="80" label="操作">
|
|
|
@@ -109,7 +139,7 @@
|
|
|
</el-table-column>
|
|
|
<el-table-column label="工号">
|
|
|
<template slot-scope="{ row }">
|
|
|
- <div>{{ row.jobNumber }}</div>
|
|
|
+ <div>{{ getStaffJobNumber(row) }}</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column width="80" label="操作">
|
|
|
@@ -136,7 +166,11 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
<script>
|
|
|
-import { listOrganizations, getUserPage } from '@/api/system/organization';
|
|
|
+import {
|
|
|
+ listOrganizations,
|
|
|
+ getUserPage,
|
|
|
+ getUserDetail
|
|
|
+} from '@/api/system/organization';
|
|
|
export default {
|
|
|
data() {
|
|
|
return {
|
|
|
@@ -154,16 +188,55 @@ export default {
|
|
|
pageNum: 1, //设备当前页数
|
|
|
size: 10,
|
|
|
isMore: false,
|
|
|
+ userName: '',
|
|
|
dialogVisible: false
|
|
|
};
|
|
|
},
|
|
|
created() {},
|
|
|
methods: {
|
|
|
- open(selectedList) {
|
|
|
+ async open(selectedList) {
|
|
|
this.dialogVisible = true;
|
|
|
- this.selectStafflist = selectedList;
|
|
|
+ this.selectStafflist = await this.normalizeSelectedStaffList(
|
|
|
+ selectedList
|
|
|
+ );
|
|
|
this.getInfo();
|
|
|
},
|
|
|
+ getStaffJobNumber(row) {
|
|
|
+ return (
|
|
|
+ row.jobNumber ||
|
|
|
+ row.approverJobNumber ||
|
|
|
+ row.userCode ||
|
|
|
+ row.code ||
|
|
|
+ ''
|
|
|
+ );
|
|
|
+ },
|
|
|
+ async normalizeSelectedStaffList(selectedList) {
|
|
|
+ const list = Array.isArray(selectedList) ? selectedList : [];
|
|
|
+ return Promise.all(
|
|
|
+ list.map(async (item) => {
|
|
|
+ const normalized = {
|
|
|
+ ...item,
|
|
|
+ id: item.id || item.approverId,
|
|
|
+ name: item.name || item.approverName,
|
|
|
+ jobNumber: this.getStaffJobNumber(item)
|
|
|
+ };
|
|
|
+ if (normalized.jobNumber || !normalized.id) {
|
|
|
+ return normalized;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ const detail = await getUserDetail(normalized.id);
|
|
|
+ return {
|
|
|
+ ...detail,
|
|
|
+ ...normalized,
|
|
|
+ name: normalized.name || detail.name,
|
|
|
+ jobNumber: detail.jobNumber || this.getStaffJobNumber(detail)
|
|
|
+ };
|
|
|
+ } catch (error) {
|
|
|
+ return normalized;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ );
|
|
|
+ },
|
|
|
//初始数据
|
|
|
async getInfo() {
|
|
|
let list = await listOrganizations();
|
|
|
@@ -172,19 +245,53 @@ export default {
|
|
|
idField: 'id',
|
|
|
parentIdField: 'parentId'
|
|
|
});
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.selectDefaultDepartment();
|
|
|
+ });
|
|
|
//this.treeList = res.data;
|
|
|
},
|
|
|
+ selectDefaultDepartment() {
|
|
|
+ const defaultDepartment = this.treeList && this.treeList[0];
|
|
|
+ if (!defaultDepartment) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (this.$refs.tree) {
|
|
|
+ this.$refs.tree.setCurrentKey(defaultDepartment.id);
|
|
|
+ }
|
|
|
+ this.handleNodeClick(defaultDepartment);
|
|
|
+ },
|
|
|
//选择分类
|
|
|
handleNodeClick(data) {
|
|
|
this.staffList = [];
|
|
|
this.pageNum = 1;
|
|
|
this.form.groupId = data.id;
|
|
|
- let params = {
|
|
|
- pageNum: 1,
|
|
|
+ this.getStaffList(this.buildStaffParams());
|
|
|
+ },
|
|
|
+ buildStaffParams(pageNum = 1) {
|
|
|
+ return {
|
|
|
+ pageNum,
|
|
|
size: this.size,
|
|
|
- groupId: this.form.groupId
|
|
|
+ groupId: this.form.groupId,
|
|
|
+ name: this.userName
|
|
|
};
|
|
|
- this.getStaffList(params);
|
|
|
+ },
|
|
|
+ searchStaff(showTip = true) {
|
|
|
+ if (!this.form.groupId) {
|
|
|
+ this.staffList = [];
|
|
|
+ this.pageNum = 1;
|
|
|
+ this.isMore = false;
|
|
|
+ if (showTip) {
|
|
|
+ this.$message.warning('请先选择部门');
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.staffList = [];
|
|
|
+ this.pageNum = 1;
|
|
|
+ this.getStaffList(this.buildStaffParams());
|
|
|
+ },
|
|
|
+ resetStaffSearch() {
|
|
|
+ this.userName = '';
|
|
|
+ this.searchStaff();
|
|
|
},
|
|
|
//获取员工列表
|
|
|
async getStaffList(params) {
|
|
|
@@ -210,12 +317,7 @@ export default {
|
|
|
//查询更多员工
|
|
|
async getMore() {
|
|
|
this.pageNum = this.pageNum + 1;
|
|
|
- let params = {
|
|
|
- pageNum: this.pageNum,
|
|
|
- size: this.size,
|
|
|
- groupId: this.form.groupId
|
|
|
- };
|
|
|
- this.getStaffList(params);
|
|
|
+ this.getStaffList(this.buildStaffParams(this.pageNum));
|
|
|
},
|
|
|
//选择员工
|
|
|
choiceAsset(info) {
|
|
|
@@ -241,6 +343,10 @@ export default {
|
|
|
handleClose() {
|
|
|
this.staffList = [];
|
|
|
this.selectStafflist = [];
|
|
|
+ this.userName = '';
|
|
|
+ this.form.groupId = null;
|
|
|
+ this.pageNum = 1;
|
|
|
+ this.isMore = false;
|
|
|
this.dialogVisible = false;
|
|
|
}
|
|
|
}
|
|
|
@@ -264,6 +370,20 @@ export default {
|
|
|
line-height: 32px;
|
|
|
height: 32px;
|
|
|
}
|
|
|
+.staff-header {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ height: 32px;
|
|
|
+}
|
|
|
+.staff-search {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+.staff-search-input {
|
|
|
+ width: 180px;
|
|
|
+}
|
|
|
.zw-page-list-p {
|
|
|
font-size: 14px;
|
|
|
margin-bottom: 18px;
|