staffSelection.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. <template>
  2. <div class="container">
  3. <!-- 单据弹窗 -->
  4. <el-dialog
  5. title="员工"
  6. :before-close="handleClose"
  7. :visible.sync="dialogVisible"
  8. :close-on-click-modal="false"
  9. :append-to-body="true"
  10. width="80%"
  11. >
  12. <el-row class="zw-page">
  13. <el-col :span="6" class="zw-page-left">
  14. <el-card>
  15. <div class="zw-card-header" slot="header">
  16. <span class="zw-header-title details-title">部门</span>
  17. </div>
  18. <div class="zw-page-left-tree">
  19. <el-container class="zw-container">
  20. <el-tree
  21. ref="tree"
  22. :data="treeList"
  23. highlight-current
  24. node-key="id"
  25. :props="{ label: 'name' }"
  26. :expand-on-click-node="false"
  27. :default-expand-all="true"
  28. @node-click="handleNodeClick"
  29. >
  30. </el-tree>
  31. </el-container>
  32. </div>
  33. </el-card>
  34. </el-col>
  35. <el-col :span="9" class="zw-page-main">
  36. <el-card>
  37. <div class="zw-card-header" slot="header">
  38. <span class="zw-header-title details-title">员工明细 </span>
  39. </div>
  40. <div class="zw-page-main-list">
  41. <el-container class="zw-container">
  42. <el-table
  43. :data="staffList"
  44. tooltip-effect="dark"
  45. style="width: 100%;"
  46. max-height="500"
  47. :header-cell-style="{
  48. background: '#F0F3F3',
  49. border: 'none'
  50. }"
  51. >
  52. <el-table-column prop="code" label="姓名">
  53. <template slot-scope="{ row }">
  54. <div>{{ row.name }}</div>
  55. </template>
  56. </el-table-column>
  57. <el-table-column label="工号">
  58. <template slot-scope="{ row }">
  59. <div>{{ row.jobNumber }}</div>
  60. </template>
  61. </el-table-column>
  62. <el-table-column width="80" label="操作">
  63. <template slot-scope="{ row }">
  64. <el-button
  65. size="mini"
  66. type="primary"
  67. @click="choiceAsset(row)"
  68. :disabled="row.disabled"
  69. icon="el-icon-arrow-right"
  70. circle
  71. >
  72. </el-button>
  73. </template>
  74. </el-table-column>
  75. </el-table>
  76. <div
  77. v-if="staffList.length !== 0 && isMore"
  78. class="zw-page-list-more"
  79. >
  80. <el-link @click="getMore(page)" type="primary"
  81. >更多<i class="el-icon-caret-bottom"></i>
  82. </el-link>
  83. </div>
  84. </el-container>
  85. </div>
  86. </el-card>
  87. </el-col>
  88. <el-col :span="9" class="zw-page-right">
  89. <el-card>
  90. <div class="zw-card-header" slot="header">
  91. <span class="zw-header-title">已选员工</span>
  92. </div>
  93. <div class="zw-page-right-list">
  94. <el-container class="zw-container">
  95. <el-table
  96. :data="selectStafflist"
  97. tooltip-effect="dark"
  98. style="width: 100%"
  99. max-height="500"
  100. :header-cell-style="{
  101. background: '#F0F3F3',
  102. border: 'none'
  103. }"
  104. >
  105. <el-table-column prop="code" label="姓名">
  106. <template slot-scope="{ row }">
  107. <div>{{ row.name }}</div>
  108. </template>
  109. </el-table-column>
  110. <el-table-column label="工号">
  111. <template slot-scope="{ row }">
  112. <div>{{ row.jobNumber }}</div>
  113. </template>
  114. </el-table-column>
  115. <el-table-column width="80" label="操作">
  116. <template slot-scope="scope">
  117. <el-button
  118. @click="deleteSelectStaff(scope.row, scope.$index)"
  119. size="mini"
  120. type="danger"
  121. >删除
  122. </el-button>
  123. </template>
  124. </el-table-column>
  125. </el-table>
  126. </el-container>
  127. </div>
  128. </el-card>
  129. </el-col>
  130. </el-row>
  131. <div slot="footer" class="dialog-footer">
  132. <el-button size="small" @click="handleClose">关 闭</el-button>
  133. <el-button size="small" @click="sumbit" type="primary">确 认</el-button>
  134. </div>
  135. </el-dialog>
  136. </div>
  137. </template>
  138. <script>
  139. import { listOrganizations, getUserPage } from '@/api/system/organization';
  140. export default {
  141. data() {
  142. return {
  143. form: {
  144. groupId: null
  145. },
  146. treeList: [],
  147. staffList: [],
  148. selectStafflist: [], //已选员工
  149. defaultProps: {
  150. children: 'children',
  151. label: 'name',
  152. value: 'code'
  153. },
  154. pageNum: 1, //设备当前页数
  155. size: 10,
  156. isMore: false,
  157. dialogVisible: false
  158. };
  159. },
  160. created() {},
  161. methods: {
  162. open(selectedList) {
  163. this.dialogVisible = true;
  164. this.selectStafflist = selectedList;
  165. this.getInfo();
  166. },
  167. //初始数据
  168. async getInfo() {
  169. let list = await listOrganizations();
  170. this.treeList = this.$util.toTreeData({
  171. data: list,
  172. idField: 'id',
  173. parentIdField: 'parentId'
  174. });
  175. //this.treeList = res.data;
  176. },
  177. //选择分类
  178. handleNodeClick(data) {
  179. this.staffList = [];
  180. this.form.groupId = data.id;
  181. let params = {
  182. pageNum: 1,
  183. size: this.size,
  184. groupId: this.form.groupId
  185. };
  186. this.getStaffList(params);
  187. },
  188. //获取员工列表
  189. async getStaffList(params) {
  190. let res = await getUserPage(params);
  191. let list = res.list;
  192. if (list.length < res.count) {
  193. this.isMore = true;
  194. } else {
  195. this.isMore = false;
  196. }
  197. list.forEach((el) => {
  198. let _index = this.selectStafflist.findIndex((n) => n.id == el.id);
  199. if (_index !== -1) {
  200. el.disabled = true;
  201. } else {
  202. el.disabled = false;
  203. }
  204. });
  205. this.staffList = [...this.staffList, ...list];
  206. // this.pageNum = res.pageNum;
  207. },
  208. //查询更多员工
  209. async getMore() {
  210. this.pageNum = this.pageNum + 1;
  211. let params = {
  212. pageNum:this.pageNum,
  213. size: this.size,
  214. groupId: this.form.groupId
  215. };
  216. this.getStaffList(params);
  217. },
  218. //选择员工
  219. choiceAsset(info) {
  220. let data = JSON.parse(JSON.stringify(info));
  221. if (info.teamId) {
  222. this.$confirm('当前员工已有所属班组, 是否继续?', '提示', {
  223. confirmButtonText: '确定',
  224. cancelButtonText: '取消',
  225. type: 'warning'
  226. })
  227. .then(() => {
  228. this.selectStafflist.push(data);
  229. info.disabled = true;
  230. })
  231. .catch(() => {});
  232. } else {
  233. this.selectStafflist.push(data);
  234. info.disabled = true;
  235. }
  236. },
  237. //删除已选员工
  238. deleteSelectStaff(info, index) {
  239. this.staffList.forEach((el) => {
  240. if (el.id == info.id) {
  241. el.disabled = false;
  242. }
  243. });
  244. this.selectStafflist.splice(index, 1);
  245. },
  246. //保存
  247. sumbit() {
  248. if (this.selectStafflist.length === 0) {
  249. this.$message.warning('请选择员工');
  250. } else {
  251. this.$emit('confirm', JSON.parse(JSON.stringify(this.selectStafflist)));
  252. this.handleClose();
  253. }
  254. },
  255. handleClose() {
  256. this.staffList = [];
  257. this.selectStafflist = [];
  258. this.dialogVisible = false;
  259. }
  260. }
  261. };
  262. </script>
  263. <style lang='scss' scoped>
  264. .container {
  265. padding: 10px 0;
  266. }
  267. .zw-container {
  268. height: 500px;
  269. overflow-y: auto;
  270. }
  271. .zw-header-title {
  272. display: inline-block;
  273. margin-right: 10px;
  274. font-weight: 600;
  275. }
  276. .details-title {
  277. line-height: 32px;
  278. height: 32px;
  279. }
  280. .zw-page-list-p {
  281. font-size: 14px;
  282. margin-bottom: 18px;
  283. display: flex;
  284. justify-content: space-between;
  285. // align-items: center;
  286. .zw-page-list-right {
  287. display: flex;
  288. }
  289. }
  290. .zw-page {
  291. background: #fff;
  292. //padding: 20px 0;
  293. height:600px;
  294. .zw-page-left {
  295. padding: 0 10px;
  296. }
  297. .zw-page-main {
  298. padding: 0 10px;
  299. .zw-page-main-list {
  300. span {
  301. margin-right: 10px;
  302. }
  303. .zw-page-span-num {
  304. font-size: 12px;
  305. color: #157a2c;
  306. }
  307. .zw-page-p-operation {
  308. text-align: right;
  309. // width: 200px;
  310. }
  311. .zw-page-operation-num {
  312. width: 100px;
  313. margin: 0 10px;
  314. }
  315. }
  316. .zw-page-list-more {
  317. text-align: center;
  318. }
  319. }
  320. .zw-page-right {
  321. .zw-card-header {
  322. display: flex;
  323. justify-content: space-between;
  324. align-items: center;
  325. height: 32px;
  326. }
  327. span {
  328. margin-right: 10px;
  329. }
  330. .zw-page-span-num {
  331. font-size: 12px;
  332. color: #157a2c;
  333. }
  334. }
  335. }
  336. .notes {
  337. font-size: 12px;
  338. color: #909090;
  339. }
  340. </style>