vueGantt.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. <template>
  2. <div>
  3. <el-table :data="treeDataList" height="80vh" 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="$t('lable.name')" width="240" fixed="left" v-if="stafforpro != $t('an-xiang-mu-cha-kan')">
  5. <template slot-scope="scope">
  6. <!-- user.userNameNeedTranslate == 1 -->
  7. <span v-if="user.userNameNeedTranslate == 1 && scope.row.translationType == 'department'"><TranslationOpenDataText type='departmentName' :openid='scope.row.text'></TranslationOpenDataText></span>
  8. <span v-if="user.userNameNeedTranslate == 1 && scope.row.translationType == 'user'"><TranslationOpenDataText type='userName' :openid='scope.row.text'></TranslationOpenDataText></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="$t('other.project')" width="240" fixed="left" v-if="stafforpro == $t('an-xiang-mu-cha-kan')">
  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. <!-- <TranslationOpenDataText type='userName' :openid='scope.row.text'></TranslationOpenDataText> -->
  18. <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
  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. <TranslationOpenDataText type='userName' :openid='scope.row.text'></TranslationOpenDataText>
  33. </span> -->
  34. <span v-if="scope.row.translationType != 'user' && stafforpro != $t('an-xiang-mu-cha-kan')">
  35. <!-- {{scope.row.end_date | dataValue(scope.column, scope.row)}} -->
  36. <!-- {{scope.row.start_date | dataValue(scope.column, scope.row)}} -->
  37. {{scope.row.con_data | dataValue(scope.column, scope.row)}}
  38. </span>
  39. <span v-if="stafforpro == $t('an-xiang-mu-cha-kan')">
  40. <!-- {{scope.row.end_date | dataValue(scope.column, scope.row)}} -->
  41. <!-- {{scope.row.start_date | dataValue(scope.column, scope.row)}} -->
  42. {{scope.row.con_data | dataValue(scope.column, scope.row)}}
  43. </span>
  44. </div>
  45. </template>
  46. </el-table-column>
  47. </el-table-column>
  48. </el-table>
  49. </div>
  50. </template>
  51. <script>
  52. export default {
  53. props: {
  54. stafforpro: {
  55. type: [String, Array, Object],
  56. default: false
  57. },
  58. valueDate:{
  59. type: [String, Array, Object],
  60. default: false
  61. },
  62. updatakey1:{
  63. type: [String, Array, Object],
  64. default: false
  65. },
  66. tasks: {
  67. type: Array,
  68. default: []
  69. }
  70. },
  71. components: {},
  72. data() {
  73. return {
  74. that: this,
  75. initialMonth: '', // 开始月份
  76. headerData: [], // 表头数据
  77. treeDataList: [],
  78. num: 0,
  79. mergeList: [],
  80. valueDateList: [],
  81. user: JSON.parse(sessionStorage.getItem("user")),
  82. };
  83. },
  84. filters: {
  85. // dataValue: function (endDate, item, value) {
  86. // if(endDate) {
  87. // let biaoto = item.label.split(' ')[0]
  88. // if(biaoto == value.end_date) {
  89. // if(value.text.indexOf('/') != '-1') {
  90. // return value.text.split('/')[1]
  91. // } else {
  92. // return value.text
  93. // }
  94. // }
  95. // }
  96. // }
  97. dataValue: function (endDate, item, value) {
  98. if(endDate) {
  99. let biaoto = item.label.split(' ')[0]
  100. let maxData = value.numData
  101. let str = ''
  102. if(value.text.indexOf('/') != '-1') {
  103. str = value.text.split('/')[1]
  104. } else {
  105. str = value.text
  106. }
  107. if(maxData == 2 && biaoto == value.end_date) {
  108. return str
  109. } else if(maxData != 2 && biaoto == value.con_data){
  110. return str
  111. }
  112. // if(biaoto == endDate) {
  113. // if(value.text.indexOf('/') != '-1') {
  114. // return value.text.split('/')[1]
  115. // } else {
  116. // return value.text
  117. // }
  118. // }
  119. }
  120. }
  121. },
  122. computed: {},
  123. watch: {},
  124. created() {},
  125. mounted() {
  126. console.log(this.dayjs('2023-04-14').diff('2023-04-12', 'day'), '值差异')
  127. console.log(this.dayjs('2023-04-14').add(Math.ceil((3/2)),'day').format('YYYY-MM-DD'))
  128. console.log(this.stafforpro,'值')
  129. // 重置两个属性值
  130. this.num = 0,
  131. this.mergeList = []
  132. let dataList = []
  133. let allDataList = []
  134. this.valueDateList = this.valueDate
  135. let star = this.valueDate[0].split('-')
  136. let end = this.valueDate[1].split('-')
  137. this.initialMonth = star[0] + '-' + star[1]
  138. dataList = this.getYearAndMonth(star[0] + '-' + star[1], end[0] + '-' + end[1])
  139. allDataList = this.getdiffdate(this.valueDate[0], this.valueDate[1])
  140. this.combination(dataList, allDataList)
  141. // 递归加颜色
  142. console.log(this.tasks.data, '芜湖')
  143. this.treeDataList = this.recursive(this.tasks.data);
  144. console.log(this.mergeList, '合并数据')
  145. console.log(this.treeDataList, '合并完全的数据')
  146. },
  147. methods: {
  148. // 递归加颜色以及存储需要合并的数据
  149. recursive(data) {
  150. for (let i in data) {
  151. if(this.stafforpro == this.$t('an-xiang-mu-cha-kan')) {
  152. data[i].color = '#409EFF'
  153. if(data[i].translationType == 'user' && data[i].text) {
  154. let arr = []
  155. arr = data[i].text.split(',')
  156. for(var j in arr) {
  157. if(arr[j].indexOf('/') != '-1') {
  158. arr[j] = arr[j].split('/')[0]
  159. }
  160. }
  161. data[i].userNameList = arr
  162. }
  163. }
  164. this.num++
  165. let obj = {
  166. ins: this.num,
  167. numDay: 1,
  168. column: 1
  169. }
  170. if(data[i].end_date) {
  171. var endData = ''
  172. var starData = ''
  173. if(data[i].end_date < this.valueDateList[1]) {
  174. endData = data[i].end_date
  175. } else {
  176. endData = this.valueDateList[1]
  177. }
  178. if(data[i].start_date < this.valueDateList[0]) {
  179. starData = this.valueDateList[0]
  180. } else {
  181. starData = data[i].start_date
  182. }
  183. obj.numDay = +this.dayjs(endData).diff(starData, 'day') + 1
  184. obj.column = +this.dayjs(starData).diff(this.valueDateList[0], 'day') + 1
  185. if(data[i].text == '209') {
  186. console.log(obj, '看看数据')
  187. }
  188. if(obj.numDay > 2) {
  189. data[i].con_data = this.dayjs(starData).add(1,'day').format('YYYY-MM-DD')
  190. } else {
  191. data[i].con_data = starData
  192. }
  193. data[i].numData = obj.numDay
  194. }
  195. // if(data[i].end_date) {
  196. // let day = this.dayjs(data[i].end_date).diff(data[i].start_date, 'day') // 和并多少行
  197. // let column = +this.dayjs(data[i].end_date).diff(this.valueDateList[0], 'day') + 1 // 从多少列开始
  198. // if(day >= 1) {
  199. // if(day >= 3) {
  200. // if(this.valueDateList[0] > data[i].start_date) {
  201. // obj.column = 1
  202. // day >= column ? obj.numDay = column : obj.numDay = day
  203. // } else {
  204. // let num = this.dayjs(data[i].start_date).diff(this.valueDateList[0], 'day')
  205. // obj.column = +num + 1
  206. // day >= column ? obj.numDay = column : obj.numDay = day
  207. // }
  208. // } else {
  209. // day >= column ? obj.numDay = column : obj.numDay = day
  210. // obj.column = column
  211. // }
  212. // }
  213. // }
  214. // if(data[i].end_date != data[i].start_date && data[i].end_date != this.valueDateList[0]) {
  215. // data[i].end_date = this.dayjs(this.valueDateList[0]).add('1','day').format('YYYY-MM-DD')
  216. // if(data[i].end_date < data[i].start_date) {
  217. // data[i].end_date = this.dayjs(data[i].start_date).add('1','day').format('YYYY-MM-DD')
  218. // }
  219. // }
  220. this.mergeList.push(obj)
  221. if(data[i].id.indexOf(this.$t('chu-cha')) != '-1') {
  222. data[i].color = '#E6A23C'
  223. }
  224. if(data[i].id.indexOf(this.$t('other.AskForLeave')) != '-1') {
  225. data[i].color = '#F56C6C'
  226. }
  227. if(data[i].id.indexOf(this.$t('other.task')) != '-1') {
  228. if(data[i].level == 0) {
  229. data[i].color = '#409EFF'
  230. }
  231. if(data[i].level == 1) {
  232. data[i].color = '#F56C6C'
  233. }
  234. if(data[i].level == 2) {
  235. data[i].color = '#E6A23C'
  236. }
  237. }
  238. if (data[i].children) {
  239. this.recursive(data[i].children);
  240. }
  241. }
  242. return data
  243. },
  244. // 截取两个日期的月份数
  245. getYearAndMonth(start, end) {
  246. console.log(start, end)
  247. let monthList = [];
  248. let starts = start.split('-');
  249. let ends = end.split('-');
  250. let staYear = parseInt(starts[0]);
  251. let staMon = parseInt(starts[1]);
  252. let endYear = parseInt(ends[0]);
  253. let endMon = parseInt(ends[1]);
  254. while (staYear <= endYear) {
  255. if (staYear === endYear) {
  256. while (staMon < endMon) {
  257. staMon++;
  258. var str = staYear + '-'+(staMon >= 10 ? staMon : '0' + staMon);
  259. monthList.push(str);
  260. }
  261. staYear++;
  262. } else {
  263. staMon++;
  264. if (staMon > 12) {
  265. staMon = 1;
  266. staYear++;
  267. }
  268. let str = staYear + '-'+(staMon >= 10 ? staMon : '0' + staMon);
  269. monthList.push(str);
  270. }
  271. }
  272. return monthList;
  273. },
  274. // 获取所有期间的日期
  275. getdiffdate(stime,etime){
  276. var diffdate = new Array();
  277. var i=0;
  278. while(stime<=etime){
  279. diffdate[i] = stime;
  280. var stime_ts = new Date(stime).getTime();
  281. var next_date = stime_ts + (24*60*60*1000);
  282. var next_dates_y = new Date(next_date).getFullYear()+'-';
  283. var next_dates_m = (new Date(next_date).getMonth()+1 < 10)?'0'+(new Date(next_date).getMonth()+1)+'-':(new Date(next_date).getMonth()+1)+'-';
  284. var next_dates_d = (new Date(next_date).getDate() < 10)?'0'+new Date(next_date).getDate():new Date(next_date).getDate();
  285. stime = next_dates_y+next_dates_m+next_dates_d;
  286. i++;
  287. }
  288. return diffdate
  289. },
  290. // 计算组合月份和日期
  291. combination(month, data) {
  292. let monthStr = [this.initialMonth, ...month]
  293. let arrList = []
  294. let weekArrayList = [this.$t('weekDay.sunday'), this.$t('weekDay.monday'), this.$t('weekDay.tuesday'), this.$t('weekDay.wednesday'), this.$t('weekDay.thursday'), this.$t('weekDay.friday'), this.$t('weekDay.saturday'),]
  295. for(let i in monthStr) {
  296. let obj = {}
  297. obj.name = monthStr[i]
  298. obj.children = []
  299. for(let j in data) {
  300. let index = new Date(data[j]).getDay()
  301. if(data[j].indexOf(monthStr[i]) != '-1') {
  302. obj.children.push(data[j] + ' (' + weekArrayList[index] + ')')
  303. }
  304. }
  305. arrList.push(obj)
  306. }
  307. this.headerData = arrList
  308. console.log(this.headerData)
  309. },
  310. // 接收的数据整合成树形结构
  311. integrationTree(data) {
  312. let treeData = []
  313. if(!Array.isArray(data)) {
  314. return treeData
  315. }
  316. data.forEach(item => {
  317. delete item.children;
  318. });
  319. let map = {};
  320. data.forEach(item => {
  321. if(item.text == '杨峰') {
  322. console.log(item)
  323. }
  324. map[item.id] = item;
  325. });
  326. data.forEach(item => {
  327. let parent = map[item.parent];
  328. if(parent) {
  329. (parent.children || (parent.children = [])).push(item);
  330. } else {
  331. treeData.push(item);
  332. }
  333. });
  334. return treeData;
  335. },
  336. arraySpanMethod({ row, column, rowIndex, columnIndex }) {
  337. if (rowIndex == +this.mergeList[rowIndex].ins -1) {
  338. if(this.mergeList[rowIndex].numDay > 1) {
  339. if (columnIndex == +this.mergeList[rowIndex].column + 1) {
  340. return [1, +this.mergeList[rowIndex].numDay];
  341. } else if(columnIndex == 1){
  342. return [0, 0];
  343. }
  344. }
  345. }
  346. },
  347. // 设置每一个单元格的样式
  348. TableCellStyle(row) {
  349. let maxData = +this.dayjs(row.row.end_date).diff(row.row.start_date, 'day') + 1
  350. if(row.row.color && maxData < 3) {
  351. let biaoto = row.column.label.split(' ')[0]
  352. if(biaoto == row.row.end_date) {
  353. if(row.row.color) {
  354. return 'background-color: '+ row.row.color +' !important;color: #fff'
  355. }
  356. }
  357. } else {
  358. let biaoto = row.column.label.split(' ')[0]
  359. if(biaoto == row.row.con_data) {
  360. return 'background-color: '+ row.row.color +' !important;color: #fff'
  361. }
  362. }
  363. // if(row.row.color) {
  364. // let biaoto = row.column.label.split(' ')[0]
  365. // if(biaoto == row.row.con_data) {
  366. // if(row.row.color) {
  367. // return 'background-color: '+ row.row.color +' !important;color: #fff'
  368. // }
  369. // }
  370. // }
  371. }
  372. },
  373. };
  374. </script>
  375. <style>
  376. </style>