vueGantt.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. <template>
  2. <div>
  3. <el-table :data="treeDataList" height="490px" row-key="id" :key="'1'" show-overflow-tooltip :cell-style="TableCellStyle" size="mini" :span-method="arraySpanMethod" style="width: 100%;margin-bottom: 20px;" border default-expand-all :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
  4. <el-table-column prop="text" label="姓名" width="240" fixed="left" v-if="stafforpro != '按项目查看'">
  5. <template slot-scope="scope">
  6. <!-- user.userNameNeedTranslate == 1 -->
  7. <span v-if="user.userNameNeedTranslate == 1 && scope.row.translationType == 'department'"><ww-open-data type='departmentName' :openid='scope.row.text'></ww-open-data></span>
  8. <span v-if="user.userNameNeedTranslate == 1 && scope.row.translationType == 'user'"><ww-open-data type='userName' :openid='scope.row.text'></ww-open-data></span>
  9. <span v-if="user.userNameNeedTranslate == 1 && (scope.row.translationType == 'null' || scope.row.translationType == null)">{{scope.row.text}}</span>
  10. <span v-if="user.userNameNeedTranslate != 1">{{scope.row.text}}</span>
  11. </template>
  12. </el-table-column>
  13. <el-table-column prop="text" label="项目" width="240" fixed="left" v-if="stafforpro == '按项目查看'">
  14. <template slot-scope="scope">
  15. <span v-if="user.userNameNeedTranslate == 1 && scope.row.translationType == 'user'">
  16. <span v-for="(item, index) in scope.row.userNameList" :key="index">
  17. <!-- <ww-open-data type='userName' :openid='scope.row.text'></ww-open-data> -->
  18. <ww-open-data type='userName' :openid='item'></ww-open-data>
  19. <span v-if="index < scope.row.userNameList.length - 1">,</span>
  20. </span>
  21. </span>
  22. <span v-if="user.userNameNeedTranslate == 1 && scope.row.translationType == 'user'">{{scope.row.proNameText}}</span>
  23. <span v-if="user.userNameNeedTranslate == 1 && (scope.row.translationType == 'null' || scope.row.translationType == null)"> {{scope.row.text}}</span>
  24. <span v-if="user.userNameNeedTranslate != 1">{{scope.row.text}}</span>
  25. </template>
  26. </el-table-column>
  27. <el-table-column :label="item.name" v-for="(item, index) in headerData" :key="index">
  28. <el-table-column :label="items" v-for="items, idx in item.children" :key="idx" width="120px" align="center">
  29. <template slot-scope="scope">
  30. <div>
  31. <!-- <span v-if="scope.row.translationType == 'user' && scope.column.label.indexof(scope.row.end_date) != '-1'">
  32. <ww-open-data type='userName' :openid='scope.row.text'></ww-open-data>
  33. </span> -->
  34. <span v-if="scope.row.translationType != 'user' && stafforpro != '按项目查看'">
  35. {{scope.row.end_date | dataValue(scope.column, scope.row)}}
  36. </span>
  37. <span v-if="stafforpro == '按项目查看'">
  38. {{scope.row.end_date | dataValue(scope.column, scope.row)}}
  39. </span>
  40. </div>
  41. </template>
  42. </el-table-column>
  43. </el-table-column>
  44. </el-table>
  45. </div>
  46. </template>
  47. <script>
  48. export default {
  49. props: {
  50. stafforpro: {
  51. type: [String, Array, Object],
  52. default: false
  53. },
  54. valueDate:{
  55. type: [String, Array, Object],
  56. default: false
  57. },
  58. updatakey1:{
  59. type: [String, Array, Object],
  60. default: false
  61. },
  62. tasks: {
  63. type: Array,
  64. default: []
  65. }
  66. },
  67. components: {},
  68. data() {
  69. return {
  70. initialMonth: '', // 开始月份
  71. headerData: [], // 表头数据
  72. treeDataList: [],
  73. num: 0,
  74. mergeList: [],
  75. valueDateList: [],
  76. user: JSON.parse(sessionStorage.getItem("user")),
  77. };
  78. },
  79. filters: {
  80. dataValue: function (endDate, item, value) {
  81. if(endDate) {
  82. let biaoto = item.label.split(' ')[0]
  83. if(biaoto == value.end_date) {
  84. if(value.text.indexOf('/') != '-1') {
  85. return value.text.split('/')[1]
  86. } else {
  87. return value.text
  88. }
  89. }
  90. }
  91. }
  92. },
  93. computed: {},
  94. watch: {},
  95. created() {},
  96. mounted() {
  97. console.log(this.stafforpro,'值')
  98. // 重置两个属性值
  99. this.num = 0,
  100. this.mergeList = []
  101. let dataList = []
  102. let allDataList = []
  103. this.valueDateList = this.valueDate
  104. let star = this.valueDate[0].split('-')
  105. let end = this.valueDate[1].split('-')
  106. this.initialMonth = star[0] + '-' + star[1]
  107. dataList = this.getYearAndMonth(star[0] + '-' + star[1], end[0] + '-' + end[1])
  108. allDataList = this.getdiffdate(this.valueDate[0], this.valueDate[1])
  109. this.combination(dataList, allDataList)
  110. // 递归加颜色
  111. console.log(this.tasks.data, '芜湖')
  112. this.treeDataList = this.recursive(this.tasks.data);
  113. // this.treeDataList = this.integrationTree(this.tasks.data)
  114. console.log(this.mergeList, '合并数据')
  115. console.log(this.treeDataList, '合并完全的数据')
  116. },
  117. methods: {
  118. // 递归加颜色以及存储需要合并的数据
  119. recursive(data) {
  120. for (let i in data) {
  121. if(this.stafforpro == '按项目查看') {
  122. data[i].color = '#409EFF'
  123. // if(data[i].type == 'user' && data[i].text) {
  124. // let arr = []
  125. // if(data[i].text.indexOf('/') != '-1') {
  126. // let str = data[i].text.split('/')[0]
  127. // if(str.indexOf(',') != '-1') {
  128. // let arrList = str.split(',')
  129. // data[i].userNameList = arrList
  130. // } else {
  131. // arr.push(str)
  132. // data[i].userNameList = arr
  133. // }
  134. // data[i].proNameText = data[i].text.split('/')[1]
  135. // }
  136. // }
  137. if(data[i].translationType == 'user' && data[i].text) {
  138. let arr = []
  139. arr = data[i].text.split(',')
  140. for(var j in arr) {
  141. if(arr[j].indexOf('/') != '-1') {
  142. arr[j] = arr[j].split('/')[0]
  143. }
  144. }
  145. data[i].userNameList = arr
  146. }
  147. }
  148. this.num++
  149. let obj = {
  150. ins: this.num,
  151. numDay: 1,
  152. column: 1
  153. }
  154. if(data[i].end_date) {
  155. let day = this.dayjs(data[i].end_date).diff(data[i].start_date, 'day') // 和并多少行
  156. let column = +this.dayjs(data[i].end_date).diff(this.valueDateList[0], 'day') + 1 // 从多少列开始
  157. if(day >= 1) {
  158. if(day >= 3) {
  159. if(this.valueDateList[0] > data[i].start_date) {
  160. obj.column = 1
  161. day >= column ? obj.numDay = column : obj.numDay = day
  162. } else {
  163. let num = this.dayjs(data[i].start_date).diff(this.valueDateList[0], 'day')
  164. obj.column = +num + 1
  165. day >= column ? obj.numDay = column : obj.numDay = day
  166. }
  167. } else {
  168. day >= column ? obj.numDay = column : obj.numDay = day
  169. obj.column = column
  170. }
  171. }
  172. }
  173. if(data[i].end_date != data[i].start_date && data[i].end_date != this.valueDateList[0]) {
  174. data[i].end_date = this.dayjs(this.valueDateList[0]).add('1','day').format('YYYY-MM-DD')
  175. }
  176. this.mergeList.push(obj)
  177. if(data[i].id.indexOf(this.$t('chu-cha')) != '-1') {
  178. data[i].color = '#E6A23C'
  179. }
  180. if(data[i].id.indexOf(this.$t('other.AskForLeave')) != '-1') {
  181. data[i].color = '#F56C6C'
  182. }
  183. if(data[i].id.indexOf('任务') != '-1') {
  184. if(data[i].level == 0) {
  185. data[i].color = '#409EFF'
  186. }
  187. if(data[i].level == 1) {
  188. data[i].color = '#F56C6C'
  189. }
  190. if(data[i].level == 2) {
  191. data[i].color = '#E6A23C'
  192. }
  193. }
  194. if (data[i].children) {
  195. this.recursive(data[i].children);
  196. }
  197. }
  198. return data
  199. },
  200. // 截取两个日期的月份数
  201. getYearAndMonth(start, end) {
  202. console.log(start, end)
  203. let monthList = [];
  204. let starts = start.split('-');
  205. let ends = end.split('-');
  206. let staYear = parseInt(starts[0]);
  207. let staMon = parseInt(starts[1]);
  208. let endYear = parseInt(ends[0]);
  209. let endMon = parseInt(ends[1]);
  210. while (staYear <= endYear) {
  211. if (staYear === endYear) {
  212. while (staMon < endMon) {
  213. staMon++;
  214. var str = staYear + '-'+(staMon >= 10 ? staMon : '0' + staMon);
  215. monthList.push(str);
  216. }
  217. staYear++;
  218. } else {
  219. staMon++;
  220. if (staMon > 12) {
  221. staMon = 1;
  222. staYear++;
  223. }
  224. let str = staYear + '-'+(staMon >= 10 ? staMon : '0' + staMon);
  225. monthList.push(str);
  226. }
  227. }
  228. return monthList;
  229. },
  230. // 获取所有期间的日期
  231. getdiffdate(stime,etime){
  232. var diffdate = new Array();
  233. var i=0;
  234. while(stime<=etime){
  235. diffdate[i] = stime;
  236. var stime_ts = new Date(stime).getTime();
  237. var next_date = stime_ts + (24*60*60*1000);
  238. var next_dates_y = new Date(next_date).getFullYear()+'-';
  239. var next_dates_m = (new Date(next_date).getMonth()+1 < 10)?'0'+(new Date(next_date).getMonth()+1)+'-':(new Date(next_date).getMonth()+1)+'-';
  240. var next_dates_d = (new Date(next_date).getDate() < 10)?'0'+new Date(next_date).getDate():new Date(next_date).getDate();
  241. stime = next_dates_y+next_dates_m+next_dates_d;
  242. i++;
  243. }
  244. return diffdate
  245. },
  246. // 计算组合月份和日期
  247. combination(month, data) {
  248. let monthStr = [this.initialMonth, ...month]
  249. let arrList = []
  250. let weekArrayList = ['周日', '周一', '周二', '周三', '周四', '周五', '周六',]
  251. for(let i in monthStr) {
  252. let obj = {}
  253. obj.name = monthStr[i]
  254. obj.children = []
  255. for(let j in data) {
  256. let index = new Date(data[j]).getDay()
  257. if(data[j].indexOf(monthStr[i]) != '-1') {
  258. obj.children.push(data[j] + ' (' + weekArrayList[index] + ')')
  259. }
  260. }
  261. arrList.push(obj)
  262. }
  263. this.headerData = arrList
  264. console.log(this.headerData)
  265. },
  266. // 接收的数据整合成树形结构
  267. integrationTree(data) {
  268. let treeData = []
  269. if(!Array.isArray(data)) {
  270. return treeData
  271. }
  272. data.forEach(item => {
  273. delete item.children;
  274. });
  275. let map = {};
  276. data.forEach(item => {
  277. if(item.text == '杨峰') {
  278. console.log(item)
  279. }
  280. map[item.id] = item;
  281. });
  282. data.forEach(item => {
  283. let parent = map[item.parent];
  284. if(parent) {
  285. (parent.children || (parent.children = [])).push(item);
  286. } else {
  287. treeData.push(item);
  288. }
  289. });
  290. return treeData;
  291. },
  292. arraySpanMethod({ row, column, rowIndex, columnIndex }) {
  293. if (rowIndex == +this.mergeList[rowIndex].ins -1) {
  294. if(this.mergeList[rowIndex].numDay > 1) {
  295. if (columnIndex == +this.mergeList[rowIndex].column + 1) {
  296. return [1, +this.mergeList[rowIndex].numDay];
  297. } else if(columnIndex == 1){
  298. return [0, 0];
  299. }
  300. }
  301. }
  302. },
  303. // 设置每一个单元格的样式
  304. TableCellStyle(row) {
  305. if(row.row.color) {
  306. let biaoto = row.column.label.split(' ')[0]
  307. // if(biaoto >= row.row.start_date && biaoto <= row.row.end_date) {
  308. if(biaoto == row.row.end_date) {
  309. if(row.row.color) {
  310. return 'background-color: '+ row.row.color +' !important;color: #fff'
  311. }
  312. }
  313. }
  314. }
  315. },
  316. };
  317. </script>
  318. <style>
  319. </style>