vueGantt.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <template>
  2. <div>
  3. <el-table :data="treeDataList" height="490px" row-key="id" show-overflow-tooltip :cell-style="TableCellStyle" size="mini" :span-method="arraySpanMethod" style="width: 100%;margin-bottom: 20px;" border default-expand-all :tree-config="{children: 'children', expandAll: true}" :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
  4. <el-table-column prop="text" label="姓名" width="240" fixed="left"></el-table-column>
  5. <el-table-column :label="item.name" v-for="(item, index) in headerData" :key="index">
  6. <el-table-column :label="items" v-for="items, idx in item.children" :key="idx" width="160px">
  7. <template slot-scope="scope">
  8. <div>
  9. {{scope.row.end_date | dataValue(scope.column, scope.row)}}
  10. </div>
  11. </template>
  12. </el-table-column>
  13. </el-table-column>
  14. </el-table>
  15. </div>
  16. </template>
  17. <script>
  18. export default {
  19. props: {
  20. stafforpro: {
  21. type: [String, Array, Object],
  22. default: false
  23. },
  24. valueDate:{
  25. type: [String, Array, Object],
  26. default: false
  27. },
  28. updatakey1:{
  29. type: [String, Array, Object],
  30. default: false
  31. },
  32. tasks: {
  33. type: Array,
  34. default: []
  35. }
  36. },
  37. components: {},
  38. data() {
  39. return {
  40. tableData: [{
  41. id: 1,
  42. date: '2016-05-02',
  43. name: '王小虎',
  44. address: '上海市普陀区金沙江路 1518 弄'
  45. }, {
  46. id: 2,
  47. date: '2016-05-04',
  48. name: '王小虎',
  49. address: '上海市普陀区金沙江路 1517 弄'
  50. }, {
  51. id: 3,
  52. date: '2016-05-01',
  53. name: '王小虎',
  54. address: '上海市普陀区金沙江路 1519 弄',
  55. children: [{
  56. id: 31,
  57. date: '2016-05-01',
  58. name: '王小虎',
  59. address: '上海市普陀区金沙江路 1519 弄'
  60. }, {
  61. id: 32,
  62. date: '2016-05-01',
  63. name: '王小虎',
  64. address: '上海市普陀区金沙江路 1519 弄'
  65. }]
  66. }, {
  67. id: 4,
  68. date: '2016-05-03',
  69. name: '王小虎',
  70. address: '上海市普陀区金沙江路 1516 弄'
  71. }],
  72. tableData1: [{
  73. id: 1,
  74. date: '2016-05-02',
  75. name: '王小虎',
  76. address: '上海市普陀区金沙江路 1518 弄'
  77. }, {
  78. id: 2,
  79. date: '2016-05-04',
  80. name: '王小虎',
  81. address: '上海市普陀区金沙江路 1517 弄'
  82. }, {
  83. id: 3,
  84. date: '2016-05-01',
  85. name: '王小虎',
  86. address: '上海市普陀区金沙江路 1519 弄',
  87. hasChildren: true
  88. }, {
  89. id: 4,
  90. date: '2016-05-03',
  91. name: '王小虎',
  92. address: '上海市普陀区金沙江路 1516 弄'
  93. }],
  94. initialMonth: '', // 开始月份
  95. headerData: [], // 表头数据
  96. treeDataList: []
  97. };
  98. },
  99. filters: {
  100. dataValue: function (endDate, item, value) {
  101. if(endDate) {
  102. let biaoto = item.label
  103. if(biaoto >= value.start_date && biaoto < endDate) {
  104. return value.text
  105. }
  106. }
  107. }
  108. },
  109. computed: {},
  110. watch: {},
  111. created() {},
  112. mounted() {
  113. console.log(this.stafforpro)
  114. console.log(this.valueDate)
  115. console.log(this.updatakey1)
  116. console.log(this.tasks)
  117. let dataList = []
  118. let allDataList = []
  119. let star = this.valueDate[0].split('-')
  120. let end = this.valueDate[1].split('-')
  121. this.initialMonth = star[0] + '-' + star[1]
  122. dataList = this.getYearAndMonth(star[0] + '-' + star[1], end[0] + '-' + end[1])
  123. allDataList = this.getdiffdate(this.valueDate[0], this.valueDate[1])
  124. this.combination(dataList, allDataList)
  125. this.treeDataList = this.integrationTree(this.tasks.data)
  126. },
  127. methods: {
  128. // 截取两个日期的月份数
  129. getYearAndMonth(start, end) {
  130. console.log(start, end)
  131. let monthList = [];
  132. let starts = start.split('-');
  133. let ends = end.split('-');
  134. let staYear = parseInt(starts[0]);
  135. let staMon = parseInt(starts[1]);
  136. let endYear = parseInt(ends[0]);
  137. let endMon = parseInt(ends[1]);
  138. while (staYear <= endYear) {
  139. if (staYear === endYear) {
  140. while (staMon < endMon) {
  141. staMon++;
  142. var str = staYear + '-'+(staMon >= 10 ? staMon : '0' + staMon);
  143. monthList.push(str);
  144. }
  145. staYear++;
  146. } else {
  147. staMon++;
  148. if (staMon > 12) {
  149. staMon = 1;
  150. staYear++;
  151. }
  152. let str = staYear + '-'+(staMon >= 10 ? staMon : '0' + staMon);
  153. monthList.push(str);
  154. }
  155. }
  156. return monthList;
  157. },
  158. // 获取所有期间的日期
  159. getdiffdate(stime,etime){
  160. var diffdate = new Array();
  161. var i=0;
  162. while(stime<=etime){
  163. diffdate[i] = stime;
  164. var stime_ts = new Date(stime).getTime();
  165. var next_date = stime_ts + (24*60*60*1000);
  166. var next_dates_y = new Date(next_date).getFullYear()+'-';
  167. var next_dates_m = (new Date(next_date).getMonth()+1 < 10)?'0'+(new Date(next_date).getMonth()+1)+'-':(new Date(next_date).getMonth()+1)+'-';
  168. var next_dates_d = (new Date(next_date).getDate() < 10)?'0'+new Date(next_date).getDate():new Date(next_date).getDate();
  169. stime = next_dates_y+next_dates_m+next_dates_d;
  170. i++;
  171. }
  172. return diffdate
  173. },
  174. // 计算组合月份和日期
  175. combination(month, data) {
  176. let monthStr = [this.initialMonth, ...month]
  177. let arrList = []
  178. for(let i in monthStr) {
  179. let obj = {}
  180. obj.name = monthStr[i]
  181. obj.children = []
  182. for(let j in data) {
  183. if(data[j].indexOf(monthStr[i]) != '-1') {
  184. obj.children.push(data[j])
  185. }
  186. }
  187. arrList.push(obj)
  188. }
  189. this.headerData = arrList
  190. console.log(this.headerData)
  191. },
  192. // 接收的数据整合成树形结构
  193. integrationTree(data) {
  194. let treeData = []
  195. if(!Array.isArray(data)) {
  196. return treeData
  197. }
  198. data.forEach(item => {
  199. delete item.children;
  200. });
  201. let map = {};
  202. data.forEach(item => {
  203. if(item.text == '杨峰') {
  204. console.log(item)
  205. }
  206. map[item.id] = item;
  207. });
  208. data.forEach(item => {
  209. let parent = map[item.parent];
  210. if(parent) {
  211. (parent.children || (parent.children = [])).push(item);
  212. } else {
  213. treeData.push(item);
  214. }
  215. });
  216. return treeData;
  217. },
  218. arraySpanMethod({ row, column, rowIndex, columnIndex }) {
  219. if (rowIndex == 4) {
  220. if (columnIndex == 4) {
  221. return [1, 5];
  222. } else if (columnIndex === 1) {
  223. return [0, 0];
  224. }
  225. }
  226. },
  227. // 设置每一个单元格的样式
  228. TableCellStyle(row) {
  229. if(row.row.color) {
  230. let biaoto = row.column.label
  231. if(biaoto >= row.row.start_date && biaoto < row.row.end_date) {
  232. console.log('进来了')
  233. return 'background-color: '+ row.row.color +' !important;'
  234. }
  235. }
  236. }
  237. },
  238. };
  239. </script>
  240. <style>
  241. </style>