app-func-form.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <!--
  2. 应用功能独有表单
  3. @Author: linqian
  4. @Date: 2021-07-11 15:03
  5. -->
  6. <template>
  7. <div>
  8. <transfer-tree
  9. ref="transferTree"
  10. filterable
  11. :titles="['可选资源', '已选资源']"
  12. v-model="selectedValue"
  13. :data="data"
  14. children-name="child"
  15. :open-all="false"
  16. :transfer-open-node="true"
  17. :filter-node-from="handleSearch"
  18. value-name="id"
  19. >
  20. </transfer-tree>
  21. <div v-footer>
  22. <dg-button @click="handleCancel">取消</dg-button>
  23. <dg-button type="primary" @click="handleSubmit">确定</dg-button>
  24. </div>
  25. </div>
  26. </template>
  27. <script>
  28. import transferTree from '@/pages/common/transfer-tree';
  29. import { allAppFuncTree, userHasAuthFunIds } from '@/api/permission-selfhelp-manage';
  30. export default {
  31. props: {
  32. selectKeys: [Array],
  33. // 是否需要过滤父节点
  34. needFilter: {
  35. type: Boolean,
  36. default: false
  37. },
  38. type: String,
  39. // 审批单编号
  40. applicantOrdNo: String
  41. },
  42. components: { transferTree },
  43. data() {
  44. return {
  45. approveContent: this.value,
  46. selectedValue: [],
  47. havefunIdsOnlyChild: [],
  48. havefunIds: [],
  49. data: []
  50. };
  51. },
  52. computed: {},
  53. methods: {
  54. findIndexArray(data, id, indexArray) {
  55. let arr = Array.from(indexArray);
  56. for (let i = 0, len = data.length; i < len; i++) {
  57. arr.push(data[i].label);
  58. if (data[i].id === id) {
  59. return arr;
  60. }
  61. let children = data[i].child;
  62. if (children && children.length) {
  63. let result = this.findIndexArray(children, id, arr);
  64. if (result) return result;
  65. }
  66. arr.pop();
  67. }
  68. return false;
  69. },
  70. // 树节点转成文字
  71. nodeTransferLabel(keys, tree) {
  72. const funcAttr = keys.map((item) => {
  73. return this.findIndexArray(tree, item, []);
  74. });
  75. let attr = [];
  76. for (let i = 0; i < funcAttr.length; i++) {
  77. const element = funcAttr[i].join('/');
  78. attr.push(element);
  79. }
  80. return attr.join('、');
  81. },
  82. handleCancel() {
  83. this.$emit('close');
  84. },
  85. async handleSubmit() {
  86. // 申请访问的资源,剔除已经申请过的资源
  87. const applyKeys = this.selectedValue.filter((item) => !this.havefunIdsOnlyChild.includes(item));
  88. const approveContent = this.nodeTransferLabel(applyKeys, this.$refs.transferTree.targetData);
  89. // 撤销的资源, 已有资源与已选资源作比对
  90. const cancelKeys = this.havefunIdsOnlyChild.filter((item) => !this.selectedValue.includes(item));
  91. const cancelContent = this.nodeTransferLabel(cancelKeys, this.data);
  92. // 获取目标树所有的key,包含父节点
  93. const allKeys = this.$refs.transferTree.allKeyValue(false, this.$refs.transferTree.targetData);
  94. // 剔除该用户已经拥有的资源
  95. // const validRepeatNode = resourceInfos
  96. // .filter((item) => !this.havefunIds.includes(item.funId))
  97. // .map((item) => item.funId);
  98. // 实际保存的节点,剔除应用节点
  99. const resourceInfos = allKeys
  100. .map((item) => this.$refs.transferTree.$refs['to-tree'].getNode(item).data)
  101. .map((item) => {
  102. return {
  103. appId: item.appId,
  104. funId: item.id
  105. };
  106. })
  107. .filter((item) => item.appId);
  108. // 已选资源有变更,则可以直接保存,无变更,则需要至少选中一条
  109. // 判断有无变更的标准:resourceInfos的funId 与getSetFunIdsByUser方法返回的已选资源id作匹配
  110. if (applyKeys.length == 0 && cancelKeys.length == 0) {
  111. this.$message.warning('已选资源无变更。');
  112. } else {
  113. this.$emit('success', approveContent, cancelContent, this.selectedValue, resourceInfos);
  114. }
  115. },
  116. handleSearch(value, data) {
  117. if (!value) return true;
  118. return data.label.indexOf(value) !== -1;
  119. },
  120. // 获取申请人已被授权得功能id
  121. getSetFunIdsByUser() {
  122. return new Promise((resolve) => {
  123. const params = {
  124. userId: this.$store.getters.user.id
  125. };
  126. userHasAuthFunIds(params)
  127. .then((res) => {
  128. resolve(res.data.content);
  129. })
  130. .catch(() => resolve([]));
  131. });
  132. },
  133. // 获取全量的菜单树
  134. getAllTree() {
  135. return new Promise((resolve) => {
  136. allAppFuncTree().then((res) => {
  137. resolve(res.data.content);
  138. });
  139. });
  140. },
  141. // 获取子节点,去除父节点key
  142. getChildKeys(data, val) {
  143. let keys = [];
  144. function filterParentKey(_data, key) {
  145. _data.filter((item) => {
  146. if (item.id == key && !item.isTreeNode) {
  147. keys.push(key);
  148. return;
  149. } else {
  150. if (item.child && item.child.length > 0) {
  151. filterParentKey(item.child, key);
  152. } else {
  153. return;
  154. }
  155. }
  156. });
  157. }
  158. for (let i = 0; i < val.length; i++) {
  159. const key = val[i];
  160. filterParentKey(data, key);
  161. }
  162. return keys;
  163. }
  164. },
  165. async created() {
  166. this.data = await this.getAllTree();
  167. // 已有资源,包含了父节点
  168. this.havefunIds = await this.getSetFunIdsByUser();
  169. // 已有资源,只是子节点
  170. this.havefunIdsOnlyChild = this.getChildKeys(this.data, this.havefunIds);
  171. const keys = this.selectKeys;
  172. if (this.needFilter && this.havefunIds.length > 0) {
  173. this.selectedValue = [...this.getChildKeys(this.data, keys)];
  174. if (this.type == 'add') {
  175. this.selectedValue = [...this.selectedValue, ...this.havefunIdsOnlyChild];
  176. }
  177. } else {
  178. this.selectedValue = keys;
  179. }
  180. },
  181. mounted() {}
  182. };
  183. </script>
  184. <style lang='scss' scoped>
  185. @import url('../index.scss');
  186. </style>