ClubAssociated.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <div>
  3. <el-form ref="form" label-width="100px" :model="formData" :rules="rules">
  4. <el-form-item label="">
  5. <!-- <el-button size="mini" type="primary" @click="onChooseAssClub">关联机构</el-button> -->
  6. <div class="filter-container">
  7. <div class="filter-control">
  8. <span>机构名称:</span>
  9. <el-input v-model="listQuery.authParty" placeholder="机构名称" size="mini" @keyup.enter.native="onFilterSelectAssClubList" />
  10. </div>
  11. <div class="filter-control">
  12. <el-button size="mini" type="primary" @click="onFilterSelectAssClubList">查询</el-button>
  13. </div>
  14. </div>
  15. </el-form-item>
  16. <el-form-item>
  17. <associated-club-list
  18. :selection="false"
  19. :control="true"
  20. :list="filterSelectAssClubList"
  21. @filter="onFilterSelectAssClubList"
  22. >
  23. <template #control="{ row }">
  24. <el-button size="mini" type="danger" @click="onAssClubListRemove(row)">删除</el-button>
  25. </template>
  26. </associated-club-list>
  27. </el-form-item>
  28. </el-form>
  29. <!-- 关联机构 -->
  30. <el-dialog title="添加关联机构" :visible.sync="assClubListVisible" width="30%" :show-close="false">
  31. <associated-club-list
  32. v-if="assClubListVisible"
  33. :selection="true"
  34. :control="false"
  35. height="280"
  36. :list="assClubList"
  37. :show-ass-filter="true"
  38. :show-filter="false"
  39. @filter="onFilterAssClubList"
  40. @selected="onAssClubListChange"
  41. />
  42. <div slot="footer" class="dialog-footer">
  43. <el-button type="primary" size="mini" @click="onAssClubListCancel">取 消</el-button>
  44. <el-button type="primary" size="mini" @click="onAssClubListConfirm">确 定</el-button>
  45. </div>
  46. </el-dialog>
  47. </div>
  48. </template>
  49. <script>
  50. import { AssociatedClubList } from '@/views/components/index'
  51. import { mapGetters } from 'vuex'
  52. import { fecthAuthList } from '@/api/auth'
  53. export default {
  54. name: 'ClubAssociated',
  55. components: {
  56. AssociatedClubList
  57. },
  58. data() {
  59. return {
  60. formData: {},
  61. rules: {},
  62. assClubListVisible: false,
  63. // 关联机构相关
  64. assClubQuery: {
  65. pageNum: 1,
  66. pageSize: 1000,
  67. authParty: ''
  68. },
  69. assClubList: [], // 关联机构列表
  70. selectAssClubList: [], // 当前选中关联机构列表
  71. selectAssClubListAll: [], // 全部选中关联机构列表
  72. filterSelectAssClubList: [], // 筛选后的关联机构列表
  73. listQuery: { // 搜索
  74. authParty: ''
  75. }
  76. }
  77. },
  78. computed: {
  79. ...mapGetters(['authUserId'])
  80. },
  81. methods: {
  82. // 初始化表单
  83. initForm(data) {
  84. // 关联机构列表
  85. if (data.releationClubList) {
  86. this.selectAssClubListAll = data.releationClubList
  87. this.filterSelectAssClubList = this.selectAssClubListAll
  88. }
  89. },
  90. // 验证表单
  91. async validateForm() {
  92. try {
  93. await this.$refs.form.validate()
  94. return { selectAssClubListAll: this.selectAssClubListAll }
  95. } catch (error) {
  96. return Promise.reject(error)
  97. }
  98. },
  99. // 关联机构选择
  100. onChooseAssClub() {
  101. this.fetchAssClubList()
  102. this.assClubListVisible = true
  103. },
  104. // 获取关联机构列表
  105. async fetchAssClubList() {
  106. try {
  107. const excludeId = this.selectAssClubListAll.map((item) => item.authId)
  108. if (this.authId) {
  109. excludeId.push(parseInt(this.authId))
  110. }
  111. const res = await fecthAuthList(this.assClubQuery)
  112. this.assClubList = res.data.list.filter((item) => !excludeId.includes(item.authId))
  113. } catch (error) {
  114. console.log(error)
  115. }
  116. },
  117. // 关联机构列表筛选
  118. onFilterAssClubList(query) {
  119. this.assClubQuery.authParty = query.authParty
  120. this.fetchAssClubList()
  121. },
  122. // 关联机构列表选中
  123. onAssClubListChange(value) {
  124. this.selectAssClubList = value
  125. },
  126. // 关联机构选中列表确认
  127. onAssClubListConfirm() {
  128. this.selectAssClubListAll = [...this.selectAssClubListAll, ...this.selectAssClubList]
  129. this.filterSelectAssClubList = this.selectAssClubListAll
  130. this.assClubQuery.authParty = ''
  131. this.assClubList = []
  132. this.assClubListVisible = false
  133. },
  134. // 关联机构选中列表取消
  135. onAssClubListCancel() {
  136. this.selectAssClubList = []
  137. this.filterSelectAssClubList = this.selectAssClubListAll
  138. this.assClubQuery.authParty = ''
  139. this.assClubList = []
  140. this.assClubListVisible = false
  141. },
  142. // 已关联机构列表筛选
  143. onFilterSelectAssClubList() {
  144. const query = this.listQuery
  145. if (query.authParty) {
  146. this.filterSelectAssClubList = this.selectAssClubListAll.filter((item) =>
  147. new RegExp(query.authParty, 'ig').test(item.authParty)
  148. )
  149. } else {
  150. this.filterSelectAssClubList = this.selectAssClubListAll
  151. }
  152. },
  153. // 已关联机构列表删除
  154. onAssClubListRemove(row) {
  155. this.selectAssClubListAll = this.selectAssClubListAll.filter((item) => item.authId !== row.authId)
  156. this.filterSelectAssClubList = this.selectAssClubListAll
  157. }
  158. }
  159. }
  160. </script>