e2b0b573f4df06580d80f776266bbda413f91a5e.svn-base 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <template>
  2. <div class="tree" :style="{'height':height + 'px','width':width == 0 ? 250 : width + 'px'}">
  3. <div class="left_tree_title">年度:
  4. <el-select v-model="year" placeholder="请选择">
  5. <el-option
  6. v-for="item in yearList"
  7. :key="item.id"
  8. :label="item.year"
  9. :value="item.year">
  10. </el-option>
  11. </el-select>
  12. </div>
  13. <div style="margin-top:5px;margin-bottom:5px;display: flex;align-items: center;justify-content: center;height:30px;">
  14. <el-button type="primary" @click="checkAll">全选</el-button>
  15. <el-button type="warning" @click="inverse">反选</el-button>
  16. </div>
  17. <el-tree
  18. :data="treeData"
  19. show-checkbox
  20. ref="tree"
  21. @check-change="handleCheckChange"
  22. :props="treeProps"
  23. :expand-on-click-node="false"
  24. @node-click="nodeClick"
  25. node-key="id"
  26. :default-expanded-keys="tableDefaultExpandedKeys"
  27. ></el-tree>
  28. </div>
  29. </template>
  30. <script>
  31. import request from '../../utils/gw_ajax_request.js';
  32. import {dateFormat} from "../../utils/gw_date";
  33. import {getTrees} from '@util/gw_formatTree'
  34. import {getYearList} from '@api/jcOneMapApi'
  35. export default {
  36. components: {},
  37. props: ['pid','type','pidNodes','height','width'],
  38. data() {
  39. return {
  40. treeData: [],
  41. code:'45',
  42. tableDefaultExpandedKeys: ['001','002','003','006'],
  43. treeProps: {
  44. label: "pnm",
  45. children: "children",
  46. // disabled: false,
  47. expandOnClickNode: false,
  48. first: true,
  49. },
  50. checkedData: [],
  51. changedData: [],
  52. yearList: [],
  53. year: ''
  54. };
  55. },
  56. mounted: function () {
  57. if(this.width == undefined){
  58. this.width = '250';
  59. }
  60. if(this.height == undefined){
  61. this.height = '550';
  62. }
  63. this.getYearlists();
  64. },
  65. computed: {
  66. userId: function () {
  67. return localStorage.getItem("userid")
  68. ? localStorage.getItem("userid")
  69. : "1098101939614724096";
  70. }
  71. },
  72. methods: {
  73. checkAll(){
  74. this.$refs.tree.setCheckedNodes(this.treeData); // 全选
  75. },
  76. inverse(){
  77. this.$refs.tree.setCheckedNodes([]); // 取消全选
  78. },
  79. getYearlists(){
  80. getYearList().then(res=>{
  81. this.yearList = res.data;
  82. let lastItemIndex = this.yearList.length - 1
  83. this.year = this.yearList[lastItemIndex].year
  84. })
  85. },
  86. // 节点点击事件
  87. nodeClick: function (data) {
  88. // alert(data.id);
  89. },
  90. // 递归获取选中的元素id
  91. getCheckedNode:function(data){
  92. if(data.children == null || data.disabled || data.children.length === 0){
  93. return;
  94. }
  95. data.children.forEach((element,index) => {
  96. this.checkedData.push({
  97. 'id': element.id,
  98. 'pnm': element.pnm,
  99. });
  100. this.getCheckedNode(element);
  101. });
  102. },
  103. // 递归获取改变的元素id
  104. getChangedNode:function(data){
  105. if(data.children == null || data.disabled || data.children.length === 0){
  106. return;
  107. }
  108. data.children.forEach((element,index) => {
  109. this.changedData.push({
  110. 'id': element.id,
  111. 'pnm': element.pnm,
  112. });
  113. this.getChangedNode(element);
  114. });
  115. },
  116. // 选中或取消事件
  117. handleCheckChange: function (data, checked, indeterminate) {
  118. let _self = this;
  119. // 如果是选中
  120. if (checked) {
  121. // 如果没有被禁用
  122. if(!data.disabled){
  123. _self.checkedData.push({
  124. 'id': data.id,
  125. 'pnm': data.pnm
  126. });
  127. _self.getCheckedNode(data);
  128. }
  129. } else {
  130. // 取消选中
  131. let newCheckedData = [];
  132. _self.checkedData.forEach((element, index) => {
  133. if (element.id == data.id || element.engId == data.engId) {
  134. // 不做操作
  135. } else {
  136. newCheckedData.push(element);
  137. }
  138. });
  139. _self.checkedData = newCheckedData;
  140. // 被改变的元素,先清空一下
  141. _self.changedData = [];
  142. // 只获取明确被取消的元素id和下级id
  143. if(!indeterminate){
  144. _self.changedData.push({
  145. 'id': data.id,
  146. 'pnm': data.pnm,
  147. });
  148. _self.getChangedNode(data)
  149. }else{
  150. _self.changedData.push({
  151. 'id': data.id,
  152. 'pnm': data.pnm,
  153. });
  154. }
  155. }
  156. this.$emit('treeCheckedDataChange', {
  157. 'newCheckedArray': _self.checkedData,
  158. 'changedItem': _self.changedData,
  159. 'newStatus': checked
  160. });
  161. },
  162. //根据用户id获取左侧树
  163. getLeftTreeData(){
  164. var _self = this;
  165. request.get('/dc/organization/base/getAllNode',{params:{'userId':this.userId,'orgType':this.type, 'year': this.year}}).then((res)=>{
  166. let data = res.data
  167. data.forEach(ele => {
  168. if(ele.pid == null || ele.pid == ''){
  169. ele.pid = '001'
  170. }if(ele.sttm==null || ele.sttm == ''){
  171. ele.sttm = ''
  172. }else{
  173. ele.sttm = dateFormat(ele.sttm,'yy-MM-dd');
  174. }if(ele.entm==null || ele.entm == ''){
  175. ele.entm = ''
  176. }else{
  177. ele.entm = dateFormat(ele.entm,'yy-MM-dd');
  178. }
  179. });
  180. // 处理最低节点增加上层节点
  181. _self.addUpNode(data);
  182. // 使用新的格式化树方法
  183. // _self.treeData = _self.getTreesNew(data);
  184. })
  185. },
  186. //处理最低节点增加上层节点
  187. async addUpNode(data){
  188. // 1.先获取所有id组成的数组并满足id的长度小于12的(12是最低节点)
  189. // 2.如果都是最低节点,那么就加上上层节点
  190. let arr = data.map(v => {
  191. return v.id
  192. }).filter(
  193. (v,i) => v.length<12
  194. );
  195. let ids = data.map(v => {
  196. return v.pid
  197. }).join();
  198. if(arr.length == 0 && ids.length != 0){
  199. await request.get('/dc/organization/base/getAllNodeById',{params:{'id':ids, 'year': this.year}}).then((res)=>{
  200. let dataUp = res.data;
  201. dataUp.forEach((item,index)=>{
  202. item.disabled = true
  203. })
  204. data = data.concat(dataUp)
  205. }).catch((err)=>{})
  206. }
  207. this.treeData = await getTrees(data)
  208. // console.log(JSON.stringify(this.treeData))
  209. },
  210. },
  211. watch:{
  212. type(val){
  213. if(val){
  214. this.getLeftTreeData()
  215. }
  216. },
  217. year(val){
  218. if(val){
  219. this.getLeftTreeData();
  220. this.$emit('changeYear',val);
  221. }
  222. }
  223. }
  224. };
  225. </script>
  226. <style scoped>
  227. .tree{
  228. overflow-y: auto;
  229. overflow-x: auto;
  230. }
  231. .el-tree {
  232. min-width: 100%;
  233. display:inline-block !important;
  234. }
  235. /*滚动条样式*/
  236. .tree::-webkit-scrollbar {
  237. width: 8px;
  238. height: 8px;
  239. }
  240. /*正常情况下滑块的样式*/
  241. .tree::-webkit-scrollbar-thumb {
  242. background-color: rgba(0, 0, 0, .05);
  243. border-radius: 10px;
  244. -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1);
  245. }
  246. /*鼠标悬浮在该类指向的控件上时滑块的样式*/
  247. .tree:hover::-webkit-scrollbar-thumb {
  248. background-color: rgba(0, 0, 0, .2);
  249. border-radius: 10px;
  250. -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1);
  251. }
  252. /*鼠标悬浮在滑块上时滑块的样式*/
  253. .tree::-webkit-scrollbar-thumb:hover {
  254. background-color: rgba(0, 0, 0, .4);
  255. -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1);
  256. }
  257. /*正常时候的主干部分*/
  258. .tree::-webkit-scrollbar-track {
  259. border-radius: 10px;
  260. -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0);
  261. background-color: white;
  262. }
  263. /*鼠标悬浮在滚动条上的主干部分*/
  264. .tree::-webkit-scrollbar-track:hover {
  265. -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .4);
  266. background-color: rgba(0, 0, 0, .01);
  267. }
  268. </style>