mar_auth.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <template>
  2. <div>
  3. <el-row :gutter="20">
  4. <el-col :span="12">
  5. <div class="tree-panel">
  6. <el-tree
  7. ref="tree"
  8. :data="deplist"
  9. node-key="sa_saleareaid"
  10. default-expand-all
  11. highlight-current
  12. :check-strictly="true"
  13. :check-on-click-node="false"
  14. :expand-on-click-node="false"
  15. :show-checkbox="true"
  16. @node-click="nodeClick"
  17. @check="nodeCheck"
  18. @check-change="checkChange">
  19. <span class="custom-tree-node" slot-scope="{ node, data }">
  20. <span>{{ node.label }} &nbsp;<i v-if="data.status === 1" class="el-icon-user-solid"></i></span>
  21. <span>
  22. <slot name="operation" :data="data"></slot>
  23. </span>
  24. </span>
  25. </el-tree>
  26. </div>
  27. </el-col>
  28. <el-col :span="12">
  29. <div class="flex-align-center flex-between normal-margin">
  30. <el-checkbox v-model="checkAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">全 选</el-checkbox>
  31. <el-checkbox v-model="isonlymanager_agent" @change="$emit('onAgentParams',saleareaids,checkedMenbers,isonlymanager_agent)">仅组织负责人可见</el-checkbox>
  32. </div>
  33. <div>
  34. <el-input size="small" v-model="searchValue" class="normal-margin" placeholder="搜索人员" clearable></el-input>
  35. <div :style="{ height: scrollHeight?scrollHeight:'400px'}" style="overflow-y:scroll">
  36. <!-- <el-checkbox-group :disabled="pageOnlyRead" v-model="checkedMenbers" @change="handleCheckedChange">
  37. <div style="margin-bottom:10px" v-for="item in menberData" :key="item.index">
  38. <el-checkbox v-if="searchValue" v-show="item.name === searchValue" :label="item.sa_agentsid">{{item.name}}</el-checkbox>
  39. <el-checkbox v-else :label="item.sa_agentsid">{{item.name}}</el-checkbox>
  40. </div>
  41. </el-checkbox-group> -->
  42. <el-checkbox-group :disabled="pageOnlyRead" v-model="checkedMenbers" @change="handleCheckedChange">
  43. <div style="margin-bottom:10px" v-for="item in menberData" :key="item.index">
  44. <el-checkbox v-if="searchValue" v-show="item.enterprisename === searchValue" :label="item.sa_agentsid">{{item.enterprisename}}</el-checkbox>
  45. <el-checkbox v-else :label="item.sa_agentsid">{{item.enterprisename}}</el-checkbox>
  46. </div>
  47. </el-checkbox-group>
  48. </div>
  49. </div>
  50. </el-col>
  51. </el-row>
  52. </div>
  53. </template>
  54. <script>
  55. import {mapGetters} from 'vuex'
  56. export default {
  57. props:["defaultData",'scrollHeight','obiectName','obiectId'],
  58. components:{
  59. },
  60. computed:{
  61. ...mapGetters({
  62. pageOnlyRead:"pageOnlyRead"
  63. })
  64. },
  65. data () {
  66. return {
  67. deplist:[], // 部门树状结构数据
  68. responseData:[], // 部门信息
  69. menberData:[], // 人员信息
  70. checkedMenbers:[], // 授权人员信息
  71. saleareaids:[], // 选中的部门
  72. onCheckedMenber:[], // 当前查询人员列表选中的人员
  73. searchValue:'', // 搜索人员
  74. clickdepid:'', // 点击的部门id
  75. isonlymanager_agent:false,
  76. checkAll:false,
  77. isIndeterminate:false,
  78. }
  79. },
  80. methods:{
  81. // 查询区域
  82. async department () {
  83. const res = await this.$api.requested({
  84. "classname": "webmanage.sale.salearea.salearea",
  85. "method": "query_area_auth",
  86. "content": {
  87. "obiectId": this.$route.query.id?this.$route.query.id:this.obiectId,
  88. "obiectName": this.obiectName
  89. },
  90. })
  91. // 数据格式转换成elementui-tree所需的格式
  92. this.responseData = res.data
  93. this.deplist = this.createMenu(res.data)
  94. this.$emit('onClick',{data:this.deplist[0],parent:[]})
  95. // 如果存在默认组织数据就执行
  96. },
  97. createMenu (array) {
  98. var that = this
  99. let arr = []
  100. function convertToElementTree(node) {
  101. // 新节点
  102. var elNode = {
  103. label: node["areaname"],
  104. remarks:node["remarks"],
  105. isused:node["isused"],
  106. sa_saleareaid:node['sa_saleareaid'],
  107. parentid:node['parentid'],
  108. status:node['status'],
  109. disabled:that.pageOnlyRead,
  110. children: []
  111. }
  112. if (node.subarea && node.subarea.length > 0) {
  113. // 如果存在子节点
  114. for (var index = 0; index < node.subarea.length; index++) {
  115. // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
  116. elNode.children.push(convertToElementTree(node.subarea[index]));
  117. }
  118. }
  119. return elNode;
  120. }
  121. array.forEach((element) => {
  122. arr.push(convertToElementTree(element))
  123. });
  124. return arr
  125. },
  126. // 根据组织架构范围查询人员
  127. async menberList (val) {
  128. let param = {
  129. "id":20221011144903,
  130. "content": {
  131. "pageNumber": 1,
  132. "pageSize": 10000,
  133. "sa_saleareaids":val,
  134. "containssub":0,
  135. "where": {
  136. "condition": ""
  137. }
  138. }
  139. }
  140. const res = await this.$api.requested(param)
  141. this.menberData = res.data
  142. this.checkedmenber()
  143. },
  144. // 获取当前查询的人员范围选中的人员
  145. checkedmenber () {
  146. let sa_agentsid = this.defaultData.sa_agentsid
  147. let arr = []
  148. sa_agentsid.filter(e=>{
  149. this.menberData.forEach(m=>{
  150. if (e === m.sa_agentsid) {
  151. arr.push(e)
  152. }
  153. })
  154. })
  155. this.onCheckedMenber = arr
  156. },
  157. // 点击部门
  158. nodeClick (row,node,comp) {
  159. this.checkAll = false
  160. this.clickdepid = row.sa_saleareaid
  161. this.menberList([row.sa_saleareaid])
  162. // this.onCheckedMenber.length === this.menberData.length?this.checkAll = true:this.checkAll = false
  163. },
  164. // 勾选部门
  165. nodeCheck (checkedNodes,checkedKeys,halfCheckedNodes,halfCheckedKeys) {
  166. },
  167. // 监听部门勾选变化
  168. checkChange (a,b,c) {
  169. let arr = this.saleareaids.filter((e)=>{
  170. if (e !== a.sa_saleareaid) return e
  171. })
  172. if (b) {
  173. if (this.clickdepid === a.sa_saleareaid) {
  174. let Adata = this.checkedMenbers.filter(itemF=>!this.onCheckedMenber.some(ele=>ele===itemF))
  175. this.checkedMenbers = Adata
  176. }
  177. this.menberData = []
  178. this.saleareaids.push(a.sa_saleareaid)
  179. } else {
  180. this.saleareaids = arr
  181. }
  182. this.saleareaids = [...new Set(this.saleareaids)]
  183. this.$refs.tree.setCheckedKeys(this.saleareaids)
  184. this.$emit('onAgentParams',this.saleareaids,this.checkedMenbers,this.isonlymanager_agent)
  185. },
  186. // 勾选人员
  187. handleCheckedChange (val) {
  188. let arr = this.saleareaids.filter((e)=>{
  189. if (e !== this.clickdepid) return e
  190. })
  191. this.$refs.tree.setCheckedKeys(arr)
  192. this.$emit('onAgentParams',this.saleareaids,this.checkedMenbers,this.isonlymanager_agent)
  193. },
  194. // 执行全选
  195. handleCheckAllChange(val) {
  196. let arr = this.menberData.map(e=>{
  197. return e.sa_agentsid
  198. })
  199. let arr1 = this.saleareaids.filter((e)=>{
  200. if (e !== this.clickdepid) return e
  201. })
  202. this.$refs.tree.setCheckedKeys(arr1)
  203. this.isIndeterminate = false;
  204. if (this.checkAll) {
  205. this.checkedMenbers = this.checkedMenbers.concat(arr)
  206. this.$emit('onAgentParams',this.saleareaids,this.checkedMenbers,this.isonlymanager_agent)
  207. } else {
  208. let Adata = this.checkedMenbers.filter(itemF=>!arr.some(ele=>ele===itemF))
  209. this.checkedMenbers = Adata
  210. this.$emit('onAgentParams',this.saleareaids,this.checkedMenbers,this.isonlymanager_agent)
  211. }
  212. },
  213. },
  214. mounted () {
  215. setTimeout(() => {
  216. this.department()
  217. }, 1000);
  218. },
  219. watch:{
  220. pageOnlyRead () {
  221. },
  222. defaultData: {
  223. handler (val) {
  224. this.$nextTick(() => {
  225. this.saleareaids = val.sa_saleareaid
  226. this.checkedMenbers = val.sa_agentsid
  227. this.isonlymanager_agent = val.isonlymanager_agent
  228. this.$refs.tree.setCheckedKeys(val.sa_saleareaid)
  229. this.department()
  230. })
  231. },
  232. immediate:true,
  233. deep:true
  234. },
  235. pageOnlyRead( val ) {
  236. this.department()
  237. }
  238. }
  239. }
  240. </script>
  241. <style>
  242. .tree-panel .el-tree {
  243. background: none;
  244. }
  245. .custom-tree-node {
  246. flex: 1;
  247. display: flex;
  248. align-items: center;
  249. justify-content: space-between;
  250. font-size: 14px;
  251. padding-right: 8px;
  252. background: none;
  253. }
  254. </style>
  255. <style scoped>
  256. .tree-panel{
  257. padding: 16px;
  258. font-size: 14px;
  259. /* width:300px; */
  260. background: #FAFAFA;
  261. }
  262. </style>