index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. <template>
  2. <div class="page-container">
  3. <div class="content-container">
  4. <div class="main">
  5. <div class="table-nav">
  6. <div class="tags">
  7. <div class="tag" :style="isActive(1)" @click="toTab1">级别</div>
  8. <div class="tag" :style="isActive(2)" @click="toTab2">职务</div>
  9. </div>
  10. <div class="actions">
  11. <el-button type="primary" plain size="small " v-show="tabIndex == 1" @click="addLevel" v-hasPermi="['system:levelPosition:addLevel']">添加</el-button>
  12. <el-button type="primary" plain size="small " v-show="tabIndex == 2" @click="addPost" v-hasPermi="['system:levelPosition:addPost']">添加</el-button>
  13. </div>
  14. </div>
  15. <!-- 级别表格 -->
  16. <el-table
  17. v-loading="loading"
  18. :data="levelList"
  19. border
  20. :header-cell-style="{ 'text-align': 'center' }"
  21. :cell-style="{ textAlign: 'center', cursor: 'pointer' }"
  22. highlight-current-row
  23. @current-change="rowClick"
  24. v-show="tabIndex == 1"
  25. >
  26. <el-table-column label="级别" prop="levelName" width="200">
  27. <template slot-scope="scope">
  28. <a href="javascript:void(0);" class="linked" @click="toTab2">{{ scope.row.levelName }}</a>
  29. </template>
  30. </el-table-column>
  31. <el-table-column label="黑星" prop="blackStar" width="100" />
  32. <el-table-column label="红星" prop="redStar" width="100" />
  33. <el-table-column label="描述" prop="remarks" width="1000" />
  34. <el-table-column label="操作" class-name="small-padding fixed-width">
  35. <template slot-scope="scope">
  36. <el-button size="mini" type="text" icon="el-icon-edit" @click="updLevel(scope.row)" v-hasPermi="['system:levelPosition:updLevel']">编辑</el-button>
  37. <el-button size="mini" type="text" icon="el-icon-delete" @click="delLevel(scope.row)" v-hasPermi="['system:levelPosition:delLevel']">删除</el-button>
  38. <el-button size="mini" type="text" icon="el-icon-top" @click="levelUpOrder(scope.row)" v-hasPermi="['system:levelPosition:upLevel']">上升</el-button>
  39. <el-button size="mini" type="text" icon="el-icon-bottom" @click="levelDownOrder(scope.row)" v-hasPermi="['system:levelPosition:downLevel']">下降</el-button>
  40. </template>
  41. </el-table-column>
  42. </el-table>
  43. <!-- 职务表格 -->
  44. <el-table v-loading="loading" :data="postList" border :header-cell-style="{ 'text-align': 'center' }" :cell-style="{ 'text-align': 'center' }" v-show="tabIndex == 2">
  45. <el-table-column label="职务" prop="jobName" width="200" />
  46. <el-table-column label="级别" width="200">
  47. <template slot-scope="scope">
  48. {{ getLevelName(scope.row.levelId) }}
  49. </template>
  50. </el-table-column>
  51. <el-table-column label="部门" width="200">
  52. <template slot-scope="scope">
  53. {{ getDeptName(scope.row.deptId) }}
  54. </template>
  55. </el-table-column>
  56. <el-table-column label="描述" prop="remarks" width="800" />
  57. <el-table-column label="操作" class-name="small-padding fixed-width">
  58. <template slot-scope="scope">
  59. <el-button size="mini" type="text" icon="el-icon-edit" @click="updPost(scope.row)" v-hasPermi="['system:levelPosition:updPost']">编辑</el-button>
  60. <el-button size="mini" type="text" icon="el-icon-delete" @click="delPost(scope.row)" v-hasPermi="['system:levelPosition:delPost']">删除</el-button>
  61. <el-button size="mini" type="text" icon="el-icon-top" @click="postUpOrder(scope.row)" v-hasPermi="['system:levelPosition:upPost']">上升</el-button>
  62. <el-button size="mini" type="text" icon="el-icon-bottom" @click="postDownOrder(scope.row)" v-hasPermi="['system:levelPosition:downPost']">下降</el-button>
  63. </template>
  64. </el-table-column>
  65. </el-table>
  66. <!-- 添加修改级别弹窗 -->
  67. <el-dialog title="编辑级别" :visible.sync="levelShow" width="30%">
  68. <el-form ref="levelForm" :model="levelForm" :rules="levelRules" label-width="100px">
  69. <el-form-item label="级别" prop="levelName">
  70. <div style="width: 200px"><el-input v-model="levelForm.levelName" placeholder="请输入级别" /></div>
  71. </el-form-item>
  72. <el-form-item label="黑星" prop="blackStar">
  73. <el-input-number v-model="levelForm.blackStar" step-strictly :min="0"></el-input-number>
  74. </el-form-item>
  75. <el-form-item label="红星" prop="redStar">
  76. <el-input-number v-model="levelForm.redStar" step-strictly :min="0"></el-input-number>
  77. </el-form-item>
  78. <el-form-item label="描述" prop="remarks">
  79. <div style="width: 300px"><el-input v-model="levelForm.remarks" placeholder="请输入描述" /></div>
  80. </el-form-item>
  81. </el-form>
  82. <div slot="footer" class="dialog-footer">
  83. <el-button type="primary" @click="levelSub">确 定</el-button>
  84. <el-button @click="levelCancel">取 消</el-button>
  85. </div>
  86. </el-dialog>
  87. <!-- 添加修改职务弹窗 -->
  88. <el-dialog title="编辑职务" :visible.sync="postShow" width="30%">
  89. <el-form ref="postForm" :model="postForm" :rules="postRules" label-width="100px">
  90. <el-form-item label="职务" prop="jobName">
  91. <div style="width: 200px"><el-input v-model="postForm.jobName" placeholder="请输入职务" /></div>
  92. </el-form-item>
  93. <el-form-item label="部门" prop="deptId">
  94. <el-cascader
  95. v-model="deptIds"
  96. :options="deptTree"
  97. :props="{ expandTrigger: 'hover', value: 'deptId', label: 'deptName', checkStrictly: true }"
  98. @change="deptChange"
  99. :show-all-levels="false"
  100. ></el-cascader>
  101. </el-form-item>
  102. <el-form-item label="级别" prop="levelName">
  103. <div style="width: 200px"><el-input disabled v-model="postForm.levelName" placeholder="请输入职务" /></div>
  104. </el-form-item>
  105. <el-form-item label="描述" prop="remarks">
  106. <div style="width: 300px"><el-input v-model="postForm.remarks" placeholder="请输入描述" /></div>
  107. </el-form-item>
  108. </el-form>
  109. <div slot="footer" class="dialog-footer">
  110. <el-button type="primary" @click="postSub">确 定</el-button>
  111. <el-button @click="postCancel">取 消</el-button>
  112. </div>
  113. </el-dialog>
  114. </div>
  115. </div>
  116. </div>
  117. </template>
  118. <script>
  119. import { levelAdd, levelList, levelUpd, levelDel, levelOrder, postAdd, postList, postUpd, postDel, postOrder } from '@/api/system/levelPosition.js'
  120. import { listDept } from '@/api/system/dept.js'
  121. import { checkPermi } from '@/utils/permission'
  122. export default {
  123. data() {
  124. return {
  125. loading: false,
  126. //级别职务 选项
  127. tabIndex: 1,
  128. //级别数据
  129. levelList: [],
  130. //级别新增弹窗显示
  131. levelShow: false,
  132. //级别弹窗表单信息
  133. levelForm: {
  134. //黑星
  135. blackStar: 0,
  136. //级别id
  137. levelId: 0,
  138. //级别名称
  139. levelName: '',
  140. //级别排序
  141. levelSort: 0,
  142. //红星
  143. redStar: 0,
  144. //描述
  145. remarks: ''
  146. },
  147. //级别弹窗表单验证
  148. levelRules: {
  149. levelName: [{ required: true, message: '级别名称不能为空', trigger: 'submit' }]
  150. },
  151. //职务数据
  152. postList: [],
  153. //职务新增弹窗显示
  154. postShow: false,
  155. //职务弹窗表单信息
  156. postForm: {
  157. //部门id
  158. deptId: '',
  159. //职务id
  160. jobId: 0,
  161. //职务名称
  162. jobName: '',
  163. //职务排序
  164. jobSort: 0,
  165. //级别id
  166. levelId: 0,
  167. //级别名称
  168. levelName: '',
  169. //描述
  170. remarks: ''
  171. },
  172. //职务弹窗表单验证
  173. postRules: {
  174. jobName: [{ required: true, message: '职务名称不能为空', trigger: 'submit' }],
  175. deptId: [{ required: true, message: '未选择部门', trigger: 'submit' }]
  176. },
  177. //部门数据
  178. deptList: [],
  179. //部门树型数据
  180. deptTree: [],
  181. deptIds: []
  182. }
  183. },
  184. created() {
  185. this.getLevelList()
  186. listDept().then((res) => {
  187. if (res.code == 200) {
  188. this.deptList = res.data
  189. this.deptTree = this.handleTree(res.data, 'deptId')
  190. }
  191. })
  192. },
  193. computed: {
  194. theme() {
  195. return this.$store.state.settings.theme
  196. }
  197. },
  198. methods: {
  199. isActive(index) {
  200. if (this.tabIndex != index) return {}
  201. return {
  202. color: this.theme
  203. }
  204. },
  205. //获取级别数据
  206. getLevelList() {
  207. if (!checkPermi(['system:levelPosition:listLevel'])) {
  208. return
  209. }
  210. levelList().then((res) => {
  211. if (res.code == 200) {
  212. this.levelList = res.data
  213. } else {
  214. this.$msg({ type: 'error', message: res.msg })
  215. }
  216. })
  217. },
  218. //级别表单字段重置
  219. resetLevelForm() {
  220. this.levelForm = {
  221. //黑星
  222. blackStar: 0,
  223. //级别id
  224. levelId: 0,
  225. //级别名称
  226. levelName: '',
  227. //级别排序
  228. levelSort: 0,
  229. //红星
  230. redStar: 0,
  231. //描述
  232. remarks: ''
  233. }
  234. },
  235. //职务表单字段重置
  236. resetPostForm() {
  237. this.postForm = {
  238. //部门id
  239. deptId: '',
  240. //职务id
  241. jobId: 0,
  242. //职务名称
  243. jobName: '',
  244. //职务排序
  245. jobSort: 0,
  246. //描述
  247. remarks: ''
  248. }
  249. },
  250. //新增级别
  251. addLevel() {
  252. this.levelShow = true
  253. },
  254. //级别弹窗取消
  255. levelCancel() {
  256. this.resetLevelForm()
  257. this.levelShow = false
  258. },
  259. //修改级别
  260. updLevel(row) {
  261. this.levelForm = { ...row }
  262. this.levelShow = true
  263. },
  264. //删除级别
  265. delLevel(row) {
  266. this.$modal
  267. .confirm()
  268. .then(() => {
  269. levelDel(row.levelId).then((res) => {
  270. if (res.code == 200) {
  271. this.$msg({ message: '删除成功' })
  272. this.getLevelList()
  273. } else {
  274. this.$msg({ type: 'error', message: res.msg })
  275. }
  276. })
  277. })
  278. .catch(() => {})
  279. },
  280. //级别重名检测
  281. checkLevelName(data) {
  282. let o = this.levelList.find((item) => item.levelName == data.levelName && item.levelId != data.levelId)
  283. if (o) {
  284. return '级别名称重复'
  285. }
  286. return false
  287. },
  288. //职务重名检测
  289. checkPostName(data) {
  290. let o = this.postList.find((item) => item.jobName == data.jobName && item.jobId != data.jobId)
  291. if (o) {
  292. return '职务名称重复'
  293. }
  294. return false
  295. },
  296. //编辑级别提交
  297. levelSub() {
  298. this.$refs.levelForm.validate((valid) => {
  299. if (valid) {
  300. let checkFiled = this.checkLevelName(this.levelForm)
  301. if (checkFiled) {
  302. this.$msg({ type: 'error', message: checkFiled })
  303. return
  304. }
  305. if (this.levelForm.levelId) {
  306. levelUpd(this.levelForm).then((res) => {
  307. if (res.code == 200) {
  308. this.$msg({ message: '修改成功' })
  309. this.getLevelList()
  310. this.levelCancel()
  311. } else {
  312. this.$msg({ type: 'error', message: res.msg })
  313. }
  314. })
  315. } else {
  316. this.levelForm.levelSort = this.levelList.length ? this.levelList[0].levelSort + 1 : 1
  317. levelAdd(this.levelForm).then((res) => {
  318. if (res.code == 200) {
  319. this.$msg({ message: '添加成功' })
  320. this.getLevelList()
  321. this.levelCancel()
  322. } else {
  323. this.$msg({ type: 'error', message: res.msg })
  324. }
  325. })
  326. }
  327. } else {
  328. return false
  329. }
  330. })
  331. },
  332. //级别上升
  333. levelUpOrder(row) {
  334. let prevList = this.levelList.filter((item) => item.levelSort > row.levelSort)
  335. prevList.sort((a, b) => {
  336. return b.levelSort - a.levelSort
  337. })
  338. let prev = prevList[0]
  339. if (!prev) {
  340. this.$msg({ type: 'info', message: '已经是最高级了' })
  341. } else {
  342. let d = [
  343. { levelId: row.levelId, levelSort: prev.levelSort },
  344. { levelId: prev.levelId, levelSort: row.levelSort }
  345. ]
  346. levelOrder(d).then((res) => {
  347. if (res.code == 200) {
  348. this.$msg({ message: '设置成功' })
  349. this.getLevelList()
  350. }
  351. })
  352. }
  353. },
  354. //级别下降
  355. levelDownOrder(row) {
  356. let nextList = this.levelList.filter((item) => item.levelSort < row.levelSort)
  357. nextList.sort((a, b) => {
  358. return b.levelSort - a.levelSort
  359. })
  360. let next = nextList[0]
  361. if (!next) {
  362. this.$msg({ type: 'info', message: '已经是最下级了' })
  363. } else {
  364. let d = [
  365. { levelId: row.levelId, levelSort: next.levelSort },
  366. { levelId: next.levelId, levelSort: row.levelSort }
  367. ]
  368. levelOrder(d).then((res) => {
  369. if (res.code == 200) {
  370. this.$msg({ message: '设置成功' })
  371. this.getLevelList()
  372. }
  373. })
  374. }
  375. },
  376. //跳转到级别
  377. toTab1() {
  378. this.tabIndex = 1
  379. },
  380. //级别行单击
  381. rowClick(e) {
  382. this.postForm.levelId = e.levelId
  383. this.postForm.levelName = e.levelName
  384. this.postList = []
  385. this.getPostList()
  386. },
  387. //跳转到职务
  388. toTab2() {
  389. this.tabIndex = 2
  390. },
  391. //获取职务数据
  392. getPostList() {
  393. if (!checkPermi(['system:levelPosition:listPost'])) {
  394. return
  395. }
  396. postList({ levelId: this.postForm.levelId }).then((res) => {
  397. if (res.code == 200) {
  398. this.postList = res.data
  399. } else {
  400. this.$msg({ type: 'error', message: res.msg })
  401. }
  402. })
  403. },
  404. //添加职务
  405. addPost() {
  406. this.postShow = true
  407. },
  408. //修改职务
  409. updPost(row) {
  410. this.postForm = { ...row }
  411. this.postShow = true
  412. this.deptIds = this.getDeptIds(row.deptId)
  413. },
  414. //查找部门ids
  415. getDeptIds(id) {
  416. let res = [id]
  417. let self = this.deptList.find((item) => item.deptId == id)
  418. let p = this.deptList.find((item) => item.deptId == self.parentId)
  419. while (p) {
  420. res.unshift(p.deptId)
  421. p = this.deptList.find((item) => item.deptId == p.parentId)
  422. }
  423. return res
  424. },
  425. //删除职务
  426. delPost(row) {
  427. this.$modal
  428. .confirm()
  429. .then(() => {
  430. postDel(row.jobId).then((res) => {
  431. if (res.code == 200) {
  432. this.$msg({ message: '删除成功' })
  433. this.getPostList()
  434. } else {
  435. this.$msg({ type: 'error', message: res.msg })
  436. }
  437. })
  438. })
  439. .catch(() => {})
  440. },
  441. //职务提交
  442. postSub() {
  443. this.$refs.postForm.validate((valid) => {
  444. if (valid) {
  445. let checkFiled = this.checkPostName(this.postForm)
  446. if (checkFiled) {
  447. this.$msg({ type: 'error', message: checkFiled })
  448. return
  449. }
  450. if (this.postForm.jobId) {
  451. postUpd(this.postForm).then((res) => {
  452. if (res.code == 200) {
  453. this.$msg({ message: '修改成功' })
  454. this.getPostList()
  455. this.postCancel()
  456. } else {
  457. this.$msg({ type: 'error', message: res.msg })
  458. }
  459. })
  460. } else {
  461. this.postForm.jobSort = this.postList.length ? this.postList[0].jobSort + 1 : 1
  462. postAdd(this.postForm).then((res) => {
  463. if (res.code == 200) {
  464. this.$msg({ message: '添加成功' })
  465. this.getPostList()
  466. this.postCancel()
  467. } else {
  468. this.$msg({ type: 'error', message: res.msg })
  469. }
  470. })
  471. }
  472. } else {
  473. return false
  474. }
  475. })
  476. },
  477. //职务取消
  478. postCancel() {
  479. this.resetPostForm()
  480. this.postShow = false
  481. this.deptIds = []
  482. },
  483. //部门改变
  484. deptChange(e) {
  485. this.postForm.deptId = e[e.length - 1]
  486. },
  487. //获取级别名称
  488. getLevelName(id) {
  489. let o = this.levelList.find((item) => item.levelId == id)
  490. if (o) {
  491. return o.levelName
  492. }
  493. return ''
  494. },
  495. //获取部门名称
  496. getDeptName(id) {
  497. let o = this.deptList.find((item) => item.deptId == id)
  498. if (o) {
  499. return o.deptName
  500. }
  501. return ''
  502. },
  503. //职务上升排序
  504. postUpOrder(row) {
  505. let prevList = this.postList.filter((item) => item.jobSort > row.jobSort)
  506. prevList.sort((a, b) => {
  507. return b.jobSort - a.jobSort
  508. })
  509. let prev = prevList[0]
  510. if (!prev) {
  511. this.$msg({ type: 'info', message: '已经是最高级了' })
  512. } else {
  513. let d = [
  514. { jobId: row.jobId, jobSort: prev.jobSort },
  515. { jobId: prev.jobId, jobSort: row.jobSort }
  516. ]
  517. postOrder(d).then((res) => {
  518. if (res.code == 200) {
  519. this.$msg({ message: '设置成功' })
  520. this.getPostList()
  521. }
  522. })
  523. }
  524. },
  525. //职务下降排序
  526. postDownOrder(row) {
  527. let nextList = this.postList.filter((item) => item.jobSort < row.jobSort)
  528. nextList.sort((a, b) => {
  529. return b.jobSort - a.jobSort
  530. })
  531. let next = nextList[0]
  532. if (!next) {
  533. this.$msg({ type: 'info', message: '已经是最下级了' })
  534. } else {
  535. let d = [
  536. { jobId: row.jobId, jobSort: next.jobSort },
  537. { jobId: next.jobId, jobSort: row.jobSort }
  538. ]
  539. postOrder(d).then((res) => {
  540. if (res.code == 200) {
  541. this.$msg({ message: '设置成功' })
  542. this.getPostList()
  543. }
  544. })
  545. }
  546. }
  547. }
  548. }
  549. </script>
  550. <style scoped lang="scss"></style>