iam-audit-tree-mixins.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. import auditTreeService from './audit-tree-service'
  2. import axios from '@/common/services/axios-instance'
  3. import { getUserInfo } from '@/common/store-mixin'
  4. // 判断是否已经选择
  5. function isChecked(selectedKeys, eventKey) {
  6. return selectedKeys.indexOf(eventKey) === -1
  7. }
  8. const iamAuditTreeMixins = {
  9. created() {
  10. // 判断单选多选
  11. if (!this.single) {
  12. this.checkedKeys = {
  13. checked: [],
  14. halfChecked: [],
  15. }
  16. }
  17. // 如果有默认展开节点,则赋值
  18. if (this.defaultExpandedKeys) {
  19. this.defaultTreeExpandedKeys = [...this.defaultExpandedKeys]
  20. }
  21. // 如果有传根节点名称,则赋值
  22. if (this.topNodeText) {
  23. this.defaultTopNodeText = this.topNodeText
  24. }
  25. // 如果有传根节点ID,则赋值
  26. if (this.topNodeId) {
  27. this.defaultTopNodeId = this.topNodeId
  28. }
  29. // 如果有传默认选中节点,则赋值
  30. if (this.selectedKeys.length > 0) {
  31. this.defaultSelectedKeys = [...this.selectedKeys]
  32. }
  33. // this.userRoles =
  34. },
  35. methods: {
  36. // 初始化部门下拉 分级授权获取部门下拉列表 维护权限
  37. initDeptList(formId) {
  38. auditTreeService.getManagedHierarchyOrg(formId).then((res) => {
  39. res.data.editNodes.forEach((item) => {
  40. this.depOptions.push({
  41. label: item.text,
  42. value: item.id,
  43. text: item.text,
  44. edit: true,
  45. })
  46. })
  47. if (this.managerType !== 'manager') {
  48. // 取编辑和查看节点并集
  49. res.data.viewNodes.forEach((item, index) => {
  50. const node = this.depOptions.find((nodeinfo) => {
  51. return nodeinfo.value === item.id
  52. })
  53. if (!node) {
  54. this.depOptions.push({
  55. label: item.text,
  56. value: item.id,
  57. text: item.text,
  58. edit: false,
  59. })
  60. }
  61. })
  62. }
  63. // 部门下拉框列表值赋值
  64. if (this.depOptions.length > 0) {
  65. let userInfo = getUserInfo()
  66. const params = {
  67. orgId: userInfo.deptId,
  68. }
  69. axios({
  70. url: 'api/xcoa-mobile/v1/iamorg/getCurrentUserGroup',
  71. method: 'get',
  72. }).then((res) => {
  73. userInfo = res.data
  74. params.orgId = res.data.id
  75. axios({
  76. url: 'api/xcoa-mobile/v1/iamorg/findIamOrgId',
  77. method: 'post',
  78. params,
  79. }).then((res) => {
  80. const obj = this.depOptions.find((i) => i.value === res.data)
  81. if (obj) {
  82. this.depvalue = obj.value
  83. this.defaultTopNodeId = obj.value
  84. this.defaultTopNodeText = obj.text + this.topNodeText
  85. this.defaultTreeExpandedKeys = [obj.value]
  86. this.defaultSelectedKeys = [obj.value]
  87. this.edit = obj.edit
  88. this.initTreeData(obj.value)
  89. this.emitTreeSelect(obj.value, {
  90. selectedNodes: [
  91. {
  92. data: {
  93. props: {
  94. id: obj.value,
  95. text: obj.text + this.topNodeText,
  96. edit: obj.edit,
  97. },
  98. },
  99. },
  100. ],
  101. })
  102. } else {
  103. this.depvalue = this.depOptions[0].value
  104. // 加载默认值
  105. this.defaultTopNodeId = this.depOptions[0].value
  106. this.defaultTopNodeText = this.depOptions[0].text + this.topNodeText
  107. this.defaultTreeExpandedKeys = [this.depOptions[0].value]
  108. this.defaultSelectedKeys = [this.depOptions[0].value]
  109. this.edit = this.depOptions[0].edit
  110. this.initTreeData(this.depOptions[0].value)
  111. this.emitTreeSelect(this.depOptions[0].value, {
  112. selectedNodes: [
  113. {
  114. data: {
  115. props: {
  116. id: this.depOptions[0].value,
  117. text: this.depOptions[0].text + this.topNodeText,
  118. edit: this.depOptions[0].edit,
  119. },
  120. },
  121. },
  122. ],
  123. })
  124. }
  125. })
  126. })
  127. } else {
  128. this.defaultTopNodeId = null
  129. this.defaultTopNodeText = null
  130. this.defaultTreeExpandedKeys = []
  131. this.defaultSelectedKeys = []
  132. this.emitTreeSelect(9999999, {
  133. selectedNodes: [],
  134. })
  135. this.spinning = false
  136. this.empty = true
  137. }
  138. })
  139. },
  140. /**
  141. * 显示分类负责人
  142. */
  143. showUser(item) {
  144. this.$emit('showUser', item)
  145. },
  146. // 判断当前树需要展示的节点信息
  147. bindTree(nodeinfo) {
  148. const checklist = this.checkedKeys.checked
  149. if (nodeinfo.children) {
  150. this.bindTree(nodeinfo.children)
  151. const hiddenItem = nodeinfo.children.find((item, index) => {
  152. return item.hidden !== true
  153. })
  154. // 判断当前进节点是否隐藏
  155. if (!hiddenItem && checklist.indexOf(nodeinfo.id) === -1) {
  156. nodeinfo.hidden = true
  157. }
  158. // 如果显示但是没有在选择列表,则不可选中
  159. if (!nodeinfo.hidden && checklist.indexOf(nodeinfo.id) === -1) {
  160. nodeinfo.disabled = true
  161. }
  162. } else {
  163. nodeinfo.forEach((node, nodeindex) => {
  164. if (node.children) {
  165. // 判断子节点是否有选中的节点
  166. this.bindTree(node.children)
  167. const hiddenItem = node.children.find((item, index) => {
  168. return item.hidden !== true
  169. })
  170. // 判断当前进节点是否隐藏
  171. if (!hiddenItem && checklist.indexOf(node.id) === -1) {
  172. node.hidden = true
  173. }
  174. // 如果显示但是没有在选择列表,则不可选中
  175. if (!node.hidden && checklist.indexOf(node.id) === -1) {
  176. node.disabled = true
  177. }
  178. } else {
  179. if (checklist.indexOf(node.id) === -1) {
  180. node.hidden = true
  181. }
  182. // 如果显示但是没有在选择列表,则不可选中
  183. if (!node.hidden && checklist.indexOf(node.id) === -1) {
  184. node.disabled = true
  185. }
  186. }
  187. })
  188. }
  189. },
  190. /***
  191. * 选中复选框时的事件
  192. */
  193. treeCheck(allKeys, echecked) {
  194. // echecked.checkedNodes 选中的所有节点信息为数组 .data.props 获取详细信息
  195. // echecked.node.dataRef 当前选中的节点信息
  196. if (this.single) {
  197. this.checkedKeys.checked = []
  198. this.checkedKeys.checked = [echecked.node.dataRef.id]
  199. }
  200. this.$emit('checkedKeys', echecked.node.dataRef, echecked.checkedNodes)
  201. },
  202. getTree(node) {
  203. const removeIndex = []
  204. node.children.forEach((item, index) => {
  205. if (item.hidden === true) {
  206. removeIndex.push(index)
  207. } else {
  208. if (item.children) {
  209. this.getTree(item)
  210. }
  211. }
  212. })
  213. // 删除元素
  214. removeIndex.forEach((oneindex, index) => {
  215. node.children.splice(oneindex - index, 1)
  216. })
  217. },
  218. // 点击树
  219. treeSelect(selectedKeys, info) {
  220. // 点击树不会取消选中
  221. if (info.selectedNodes.length === 0) {
  222. info.selectedNodes = [
  223. {
  224. data: {
  225. props: info.node.dataRef,
  226. },
  227. },
  228. ]
  229. info.selectedNodes[0].data.props.props.id = info.node.dataRef.id
  230. info.selectedNodes[0].data.props.props.edit = info.node.dataRef.edit
  231. }
  232. // 点击树不会取消选中
  233. this.defaultSelectedKeys = [info.node.dataRef.id]
  234. if (this.single) {
  235. this.checkedKeys = []
  236. this.checkedKeys = [info.node.dataRef.id]
  237. } else {
  238. if (isChecked(this.checkedKeys.checked, info.node.dataRef.id)) {
  239. this.checkedKeys.checked.push(info.node.dataRef.id)
  240. } else {
  241. this.checkedKeys.checked.splice(this.checkedKeys.checked.indexOf(info.node.dataRef.id), 1)
  242. }
  243. this.checkedKeys.checked = [...new Set(this.checkedKeys.checked)]
  244. }
  245. this.emitTreeSelect(info.node.dataRef.id, info)
  246. },
  247. // 筛选树
  248. onSearchChange(e) {
  249. const value = e.target.value
  250. const expandedKeys = this.dataList
  251. .map((item) => {
  252. if (item.title.indexOf(value) > -1) {
  253. return this.getParentKey(item.key, this.treeData)
  254. }
  255. return null
  256. })
  257. .filter((item, i, self) => item && self.indexOf(item) === i)
  258. expandedKeys.unshift('0') // 顶结点永远展开
  259. Object.assign(this, {
  260. expandedKeys,
  261. searchValue: value,
  262. autoExpandParent: true,
  263. })
  264. },
  265. getParentKey(key, tree) {
  266. let parentKey
  267. for (let i = 0; i < tree.length; i++) {
  268. const node = tree[i]
  269. if (node.children) {
  270. if (node.children.some((item) => item.id === key)) {
  271. parentKey = node.id
  272. } else if (this.getParentKey(key, node.children)) {
  273. parentKey = this.getParentKey(key, node.children)
  274. }
  275. }
  276. }
  277. return parentKey
  278. },
  279. transformData(data, nodeEdit) {
  280. return data.map((d) => {
  281. let isEdit
  282. const { children, ...rest } = d
  283. rest.edit = this.edit
  284. // 如果需要检查节点属性,且此节点不存在属性,则添加,否则直接赋值
  285. if (this.checkNodeEdit && !this.userRoles) {
  286. const nodeinfo = this.depOptions.find((item) => {
  287. return item.value === rest.id
  288. })
  289. if (nodeEdit === undefined) {
  290. if (nodeinfo) {
  291. rest.edit = nodeinfo.edit
  292. isEdit = nodeinfo.edit
  293. } else {
  294. rest.edit = false
  295. }
  296. } else {
  297. rest.edit = nodeEdit
  298. isEdit = nodeEdit
  299. if (nodeinfo) {
  300. rest.edit = nodeinfo.edit
  301. isEdit = nodeinfo.edit
  302. }
  303. }
  304. // 如果不是根节点且没有编辑权限,则设置不可点击
  305. if (isEdit === undefined && rest.props.isroot !== true) {
  306. rest.disabled = true
  307. }
  308. }
  309. return {
  310. ...rest,
  311. children: children && this.transformData(children),
  312. scopedSlots: { title: 'title' },
  313. }
  314. })
  315. },
  316. // 处理搜索用的dataList
  317. generateList(data) {
  318. for (let i = 0; i < data.length; i++) {
  319. const node = data[i]
  320. const key = node.id
  321. const title = node.text
  322. const props = node.props
  323. // 用来判断此几点是否已经配置了用户,需要后台返回标识位进行判断
  324. if (props.showuser) {
  325. data[i].scopedSlots.icon = 'hasuser'
  326. }
  327. this.dataList.push({ key, id: key, title: title, props })
  328. if (node.children) {
  329. this.generateList(node.children)
  330. }
  331. }
  332. },
  333. onExpand(expandedKeys) {
  334. // 用户点击展开时,取消自动展开效果
  335. this.expandedKeys = expandedKeys
  336. this.autoExpandParent = false
  337. },
  338. // 小箭头点击事件
  339. foldClick() {
  340. this.fold = !this.fold
  341. if (this.fold) {
  342. this.icontype = 'right'
  343. } else {
  344. this.icontype = 'left'
  345. }
  346. },
  347. // 组织下拉框change时触发
  348. changedep(value, option) {
  349. this.key++
  350. if (!value) {
  351. this.defaultTreeExpandedKeys = ['0']
  352. this.defaultSelectedKeys = ['0']
  353. this.defaultTopNodeId = '0'
  354. this.defaultTopNodeText = this.topNodeText
  355. } else {
  356. this.defaultTreeExpandedKeys = [value]
  357. this.defaultSelectedKeys = [value]
  358. this.defaultTopNodeId = value
  359. this.defaultTopNodeText = option.data.props.text + this.topNodeText
  360. this.edit = option.data.props.edit
  361. }
  362. this.initTreeData(value)
  363. this.$emit('depChanged', value, option)
  364. this.emitTreeSelect(value, {
  365. selectedNodes: [
  366. {
  367. data: {
  368. props: {
  369. id: value,
  370. text: option.data.props.text + this.topNodeText,
  371. edit: option.data.props.edit,
  372. },
  373. },
  374. },
  375. ],
  376. })
  377. },
  378. // 刷新树方法
  379. refreshTree() {
  380. this.key++
  381. },
  382. // 发布点击事件
  383. emitTreeSelect(value, info) {
  384. this.$emit('treeSelect', value, info)
  385. },
  386. },
  387. }
  388. export default iamAuditTreeMixins