1
0

index.vue 19 KB

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