Explorar o código

Merge branch 'wangzi_dev' of git.xiaojukeji.com:jacklijiajia/thoth-frontend into http_test

PrinceLee %!s(int64=5) %!d(string=hai) anos
pai
achega
614ca7d970

BIN=BIN
node_modules.zip


+ 18 - 3
src/api/workSchedule.js

@@ -72,8 +72,23 @@ export function queryWorkListByTime(data) {
     data
   })
 }
-
-// 获取团队用户空闲信息
+// 获取团队人员
+export function queryTeamMember(data) {
+  return request({
+    url: TeamManagement + `/workbench/team/queryTeamMember`,
+    method: 'post',
+    data
+  })
+}
+// 获取团队日历日程信息
+export function queryTeamWorkListByTime(data) {
+  return request({
+    url: TeamManagement + `/workbench/team/queryTeamWorkListByTime`,
+    method: 'post',
+    data
+  })
+}
+// 获取团队用户空闲信息-甘特图
 export function queryTeamIdleList(data) {
   return request({
     url: TeamManagement + `/workbench/team/queryTeamIdleList`,
@@ -81,7 +96,7 @@ export function queryTeamIdleList(data) {
     data
   })
 }
-// 获取团队用户忙碌信息
+// 获取团队用户忙碌信息-甘特图
 export function queryTeamWorkList(data) {
   return request({
     url: TeamManagement + `/workbench/team/queryTeamWorkList`,

+ 0 - 47
src/views/workbench/person/bigCalendarDialog.vue

@@ -1,47 +0,0 @@
-<template>
-  <el-dialog :visible.sync="isVisible">
-    <template v-slot:footer>
-      <el-button @click="cancel">取 消</el-button>
-      <el-button type="primary" @click="confirm">确 认</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script>
-export default {
-  props: {
-    visible: {
-      type: Boolean,
-      default: false
-    },
-    data: {
-      type: Object,
-      default() {
-        return null
-      }
-    }
-  },
-  data() {
-    return {
-      isVisible: false
-    }
-  },
-  watch: {
-    visible(newVal, olfVal) {
-      this.isVisible = newVal
-    }
-  },
-  methods: {
-    cancel() {
-      this.$emit('cancel', false)
-    },
-    confirm() {
-      this.$emit('confirm', false)
-    }
-  }
-}
-</script>
-
-<style>
-
-</style>

+ 3 - 0
src/views/workbench/person/calendarFormDialog.vue → src/views/workbench/person/components/calendarFormDialog.vue

@@ -36,6 +36,9 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-form-item label="参与人" prop="people">
+          {{ form.people }}
+        </el-form-item>
         <el-form-item label="时间" prop="dayList">
           <div v-show="form.dayList.length > 0 ">{{ schedule }}(用时<span class="blue">{{ detailDayList.length }}</span>天)</div>
           <div v-show="form.dayList.length <= 0 " class="empty-schedule">添加排期</div>

+ 181 - 0
src/views/workbench/person/components/calenderDetail.vue

@@ -0,0 +1,181 @@
+<template>
+  <article v-if="showDetail" ref="show-schedule-detail" class="show-schedule-detail">
+    <template v-if="nowDetailData && nowDetailData.origin === 0">
+      <div class="detail-title">【任务排期】{{ nowDetailData.name }}</div>
+      <div class="detail-time item">
+        <div class="label">排期:</div>
+        <div>{{ nowDetailData.seperateDaysHasHoliday }}(用时<span>{{ nowDetailData.needDays }}</span>天)</div>
+      </div>
+      <div class="detail-people item"><div class="label">参与人:</div>{{ nowDetailData.peopleObject.name }}</div>
+      <div class="detail-needs item"><div class="label">所属需求:</div>{{ nowDetailData.requireNames | arrToString }}</div>
+      <div class="detail-tasks item"><div class="label">关联任务:</div>{{ nowDetailData.taskNames | arrToString }}</div>
+      <div class="footer">
+        <div class="cancel" @click="deleteSchedule">删除</div>
+        <div class="edit" @click="editSchedule">编辑</div>
+      </div>
+    </template>
+    <template v-if="nowDetailData && nowDetailData.origin === 1">
+      <div class="detail-title">【日程】{{ nowDetailData.name }}</div>
+      <div class="detail-time item">
+        <div class="label">排期:</div>
+        <div>{{ nowDetailData.seperateDaysHasHoliday }}(用时<span>{{ nowDetailData.needDays }}</span>天)</div>
+      </div>
+      <div class="detail-people item"><div class="label">参与人:</div>{{ nowDetailData.peopleObject.name }}</div>
+      <div class="detail-needs item"><div class="label">同步到团队:</div>{{ nowDetailData.syncTeam === 0?'否':'是' }}</div>
+      <div class="detail-tasks item"><div class="label">日程描述:</div>{{ nowDetailData.desc }}</div>
+      <div class="footer">
+        <div class="cancel" @click="deleteSchedule">删除</div>
+        <div class="edit" @click="editSchedule">编辑</div>
+      </div>
+    </template>
+  </article>
+</template>
+<script>
+export default {
+  filters: {
+    arrToString(val) {
+      return Array.isArray(val) ? val.join(',') : val
+    }
+  },
+  props: {
+    show: {
+      type: Boolean,
+      default: false,
+      required: true
+    },
+    data: {
+      type: Object,
+      default: () => null,
+      required: true
+    },
+    position: {
+      type: Array,
+      default: () => [0, 0],
+      required: true
+    }
+  },
+  data() {
+    return {
+      showDetail: this.show,
+      nowDetailData: this.data
+    }
+  },
+  watch: {
+    show(newV) {
+      this.showDetail = newV
+    },
+    data: {
+      handler(newV) {
+        this.nowDetailData = newV
+      },
+      deep: true
+    },
+    position: {
+      handler(newV) {
+        this.$nextTick(() => {
+          this.$refs['show-schedule-detail'].style.left = newV[0] || 0
+          this.$refs['show-schedule-detail'].style.top = newV[1] || 0
+        })
+      },
+      deep: true
+    }
+  },
+  mounted() {
+    document.body.addEventListener('click', e => { // 日历弹出层操作
+      const event = document.querySelector('.show-schedule-detail')
+      const isIn = e.target.className === 'fc-content' || e.target.className === 'fc-time' || e.target.className === 'fc-title'
+      if (!event || isIn) {
+        return false
+      }
+      const isContain = event.contains(e.target)
+      if (!isContain) {
+        this.showDetail = false
+        this.$emit('update:show', this.showDetail)
+      }
+    })
+  },
+  methods: {
+    editSchedule() {
+      this.$emit('edit', this.nowDetailData)
+      this.$emit('update:show', this.showDetail)
+    },
+    deleteSchedule() {
+      this.$emit('delete', this.nowDetailData)
+      this.$emit('update:show', this.showDetail)
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.show-schedule-detail::before {
+  content: '';
+  position: absolute;
+  top: -30px;
+  left: 50%;
+  transform: translateX(-50%);
+  width: 0;
+  height: 0;
+  border: 20px solid;
+  border-color: transparent transparent #FFFFFF;
+}
+.show-schedule-detail {
+  overflow: scroll;
+  max-height: 326px;
+  width: 400px;
+  position: fixed;
+  z-index: 2000;
+  top: 0;
+  left: 0;
+  background-color: #FFFFFF;
+  box-shadow:0px 0px 12px rgba(0,0,0,0.1);
+  padding: 20px;
+  color: #333333;
+  font-size: 12px;
+  border-radius: 8px;
+  .item {
+    display: flex;
+    align-items: center;
+    margin-bottom: 15px;
+    .label {
+      width: 25%;
+      min-width: 80px;
+      text-align: right;
+      color: #666666;
+      padding-right: 10px;
+    }
+  }
+  .detail-title {
+    color: #0C77E5;
+    font-size: 14px;
+    margin-bottom: 20px;
+  }
+  span {
+    color: #0C77E5
+  }
+  .footer {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    .cancel,.edit {
+      cursor: pointer;
+      width:63px;
+      height:31px;
+      border-radius:4px;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+    .cancel {
+      color: #6F7C93;
+      background-color:rgba(249,249,250,1);
+      border:1px solid rgba(191,198,220,1);
+
+    }
+    .edit {
+      margin-left: 20px;
+      color: #409EFF;
+      border:1px solid rgba(64,158,255,1);
+    }
+  }
+}
+</style>

+ 18 - 3
src/views/workbench/person/components/calenderList.vue

@@ -68,12 +68,12 @@
         <template slot-scope="scope">
           <el-button
             size="mini"
-            @click="control.update=scope.row"
+            @click="handleEdit(scope.row)"
           >编辑</el-button>
           <el-button
             size="mini"
             type="danger"
-            @click="control.delete=scope.row"
+            @click="handleDelete(scope.row)"
           >删除</el-button>
         </template>
       </el-table-column>
@@ -108,7 +108,10 @@ export default {
     }
   },
   inject: {
-    control: {
+    controlUp: {
+      default: () => ({})
+    },
+    controlDe: {
       default: () => ({})
     }
   },
@@ -170,6 +173,11 @@ export default {
   created() {
     this.queryWorkList()
   },
+  mounted() {
+    this.$on('bridge', (val) => {
+      this.queryWorkList()
+    })
+  },
   methods: {
     handleSizeChange(e) {
       this.pageSize = e
@@ -198,6 +206,13 @@ export default {
     },
     add() {
       this.$emit('add')
+    },
+    handleEdit(data) { // 日程列表中的编辑
+      this.$emit('edit', data)
+    },
+    handleDelete(data) { // 日程列表中的删除
+      console.log(data)
+      this.$emit('delete', data)
     }
   }
 }

+ 3 - 13
src/views/workbench/person/myFullCalendar.vue → src/views/workbench/person/components/myFullCalendar.vue

@@ -1,11 +1,7 @@
 <template>
   <div :style="type+'-calendar-container'">
     <div :class="type+ '-calendar-header'">
-      <el-tabs v-model="activeName" class="tabs-change">
-        <el-tab-pane label="日历视图" name="1" />
-        <el-tab-pane label="列表视图" name="2" />
-      </el-tabs>
-      <article v-show="activeName === '1'" class="calender-top">
+      <article class="calender-top">
         <div class="calender-top-control">
           <el-button-group>
             <el-button icon="el-icon-arrow-left" size="small" @click="callCalendarApi('prev')" />
@@ -21,9 +17,8 @@
           </el-button-group>
         </div>
         <div class="calender-top-title">{{ calendarTitle }}</div>
-        <div><el-button type="primary" size="small" @click="add()">添加日程</el-button></div>
+        <slot />
       </article>
-      <calender-list v-show="activeName === '2'" @add="add" />
     </div>
     <FullCalendar
       v-show="activeName === '1'"
@@ -79,14 +74,12 @@ import '@fullcalendar/daygrid/main.css'
 import '@fullcalendar/timegrid/main.css'
 import '@fullcalendar/bootstrap/main.css'
 import '@fullcalendar/list/main.css'
-import calenderList from './components/calenderList'
 // import CalendarDialog from './calendarFormDialog'
 // import DeleteDialog from '@/components/dialog/delete.vue'
 
 export default {
   components: {
-    FullCalendar,
-    calenderList
+    FullCalendar
     // CalendarDialog,
     // DeleteDialog
   },
@@ -205,9 +198,6 @@ export default {
       // info.el.style.borderColor = 'red'
       // info.el.style.backgroundColor = 'red'
       // this.deleteDialogVisible = true
-    },
-    add() {
-      this.$emit('add')
     }
   }
 }

+ 50 - 172
src/views/workbench/person/index.vue

@@ -96,48 +96,35 @@
       <!-- 日程 -->
       <el-container>
         <section class="main-section">
+          <el-tabs v-model="activeSchedule" class="tabs-change">
+            <el-tab-pane label="日历视图" name="1" />
+            <el-tab-pane label="列表视图" name="2" />
+          </el-tabs>
           <MyFullCalendar
-            ref="my-FullCalendar"
+            v-show="activeSchedule === '1'"
             :events="calendarEvents"
             @dateClick="dateClick"
             @change="queryWorkListByTime"
             @select="select"
             @eventClick="showSchedule"
+          >
+            <el-button type="primary" size="small" @click="dateClick()">添加日程</el-button>
+          </MyFullCalendar>
+          <calender-list
+            v-show="activeSchedule === '2'"
+            ref="calender-list"
             @add="dateClick"
             @edit="handleEdit"
             @delete="handleDelete"
           />
         </section>
-        <article v-show="showDetail" ref="show-schedule-detail" class="show-schedule-detail">
-          <template v-if="nowDetailData && nowDetailData.origin === 0">
-            <div class="detail-title">【任务排期】{{ nowDetailData.name }}</div>
-            <div class="detail-time item">
-              <div class="label">排期:</div>
-              <div>{{ nowDetailData.seperateDaysHasHoliday }}(用时<span>{{ nowDetailData.needDays }}</span>天)</div>
-            </div>
-            <div class="detail-people item"><div class="label">参与人:</div>{{ nowDetailData.peopleObject.name }}</div>
-            <div class="detail-needs item"><div class="label">所属需求:</div>{{ nowDetailData.requireNames | arrToString }}</div>
-            <div class="detail-tasks item"><div class="label">关联任务:</div>{{ nowDetailData.taskNames | arrToString }}</div>
-            <div class="footer">
-              <div class="cancel" @click="deleteSchedule">删除</div>
-              <div class="edit" @click="editSchedule">编辑</div>
-            </div>
-          </template>
-          <template v-if="nowDetailData && nowDetailData.origin === 1">
-            <div class="detail-title">【日程】{{ nowDetailData.name }}</div>
-            <div class="detail-time item">
-              <div class="label">排期:</div>
-              <div>{{ nowDetailData.seperateDaysHasHoliday }}(用时<span>{{ nowDetailData.needDays }}</span>天)</div>
-            </div>
-            <div class="detail-people item"><div class="label">参与人:</div>{{ nowDetailData.peopleObject.name }}</div>
-            <div class="detail-needs item"><div class="label">同步到团队:</div>{{ nowDetailData.syncTeam === 0?'否':'是' }}</div>
-            <div class="detail-tasks item"><div class="label">日程描述:</div>{{ nowDetailData.desc }}</div>
-            <div class="footer">
-              <div class="cancel" @click="deleteSchedule">删除</div>
-              <div class="edit" @click="editSchedule">编辑</div>
-            </div>
-          </template>
-        </article>
+        <calender-detail
+          :show.sync="showDetail"
+          :data="nowDetailData"
+          :position="detailXY"
+          @edit="editSchedule"
+          @delete="deleteSchedule"
+        />
       </el-container>
       <!-- 日程 -->
       <!-- 日程操作弹框 -->
@@ -145,7 +132,7 @@
         :title="'编辑日程'"
         :visible.sync="updateSchedule.visible"
         :data="updateSchedule.data"
-        @confirm="queryWorkListByTime(calendarView);changeSuccess('update')"
+        @confirm="queryWorkListByTime(calendarView)"
       />
       <calendar-dialog
         :title="'新建日程'"
@@ -160,18 +147,16 @@
         :visible.sync="visibleSchedule"
         :detail-data="updateSchedule.data"
         :title="'修改排期'"
-        @update="queryWorkListByTime(calendarView);changeSuccess('update')"
+        @update="queryWorkListByTime(calendarView)"
       />
-    <!-- 排期操作弹框 -->
+      <!-- 排期操作弹框 -->
     </el-container>
   </div>
 </template>
 
 <script>
 // const _ = require('lodash')
-import MyFullCalendar from './myFullCalendar'
 import moment from 'moment'
-import CalendarDialog from './calendarFormDialog'
 import {
   queryTeamInfoList,
   showTeamAndMemberEnum,
@@ -180,26 +165,28 @@ import {
 } from '@/api/workSchedule.js'
 import { scheduleDelete } from '@/api/projectViewDetails'
 import modifySchedule from '@/views/projectManage/projectList/components/modifySchedule'
+import calenderList from './components/calenderList'
+import MyFullCalendar from '@/views/workbench/person/components/myFullCalendar'
+import calenderDetail from '@/views/workbench/person/components/calenderDetail'
+import calendarDialog from '@/views/workbench/person/components/calendarFormDialog'
 
 export default {
   components: {
     MyFullCalendar,
-    CalendarDialog,
-    modifySchedule
-  },
-  filters: {
-    arrToString(val) {
-      return Array.isArray(val) ? val.join(',') : val
-    }
+    calendarDialog,
+    modifySchedule,
+    calenderList,
+    calenderDetail
   },
   provide() {
     return {
-      control: this.control
+      controlUp: () => this.controlUp,
+      controlDe: () => this.controlDe
     }
   },
   data() {
     return {
-      activeName: '1',
+      activeName: '1', // 顶部导航栏
       calendarView: null,
       chirdrenClass: -1,
       myTeamTableData: [],
@@ -208,6 +195,7 @@ export default {
         // initial event data
         { title: 'Event Now', start: new Date(), end: new Date().setDate(16) }
       ],
+      activeSchedule: '1', // 日程表和列表切换
       deleteDialogVisible: false,
       createSchedule: { // 新建日程
         visible: false,
@@ -223,25 +211,10 @@ export default {
       userInfo: {},
       username: localStorage.getItem('username'),
       realname: localStorage.getItem('realname'),
-      nowDetailData: null, // 当前日程详情
+      nowDetailData: {}, // 当前日程详情
       showDetail: false,
       visibleSchedule: false, // 排期任务弹框
-      control: {
-        update: null,
-        delete: null
-      }
-    }
-  },
-  watch: {
-    control: {
-      handler(newV, oldV) {
-        if (newV.update) {
-          this.handleEdit(newV.update)
-        } else if (newV.delete) {
-          this.handleDelete(newV.delete)
-        }
-      },
-      deep: true
+      detailXY: [0, 0] // 详情弹框位置
     }
   },
   created() {
@@ -249,35 +222,13 @@ export default {
   },
   mounted() {
     this.$store.state.data.status = false
-    document.body.addEventListener('click', e => { // 日历弹出层操作
-      const event = document.querySelector('.show-schedule-detail')
-      const isIn = e.target.className === 'fc-content' || e.target.className === 'fc-time' || e.target.className === 'fc-title'
-      if (!event || isIn) {
-        return false
-      }
-      const isContain = event.contains(e.target)
-      if (!isContain) {
-        this.showDetail = false
-      }
-    })
   },
   methods: {
-    getName(scope) {
-      const type = scope.row.origin ? '日程' : '任务'
-      let ret = '【' + type + '】' + scope.row.name
-      if (scope.row.type) {
-        ret = ret + '-' + scope.row.type
-      } else if (scope.row.desc) {
-        ret = ret + '-' + scope.row.desc
-      }
-      return ret
-    },
     showSchedule(e) { // 查看日程详情
       const res = this.calendarEvents.find(item => item.id === Number(e.event.id))
       this.nowDetailData = res.detailData
       this.showDetail = true
-      this.$refs['show-schedule-detail'].style.left = `${e.jsEvent.clientX - 200}px`
-      this.$refs['show-schedule-detail'].style.top = `${e.jsEvent.clientY + 20}px`
+      this.detailXY = [`${e.jsEvent.clientX - 200}px`, `${e.jsEvent.clientY + 20}px`]
     },
     dateClick(arg) { // 新建日程弹框
       this.createSchedule.data = arg
@@ -290,10 +241,10 @@ export default {
       }
       this.createSchedule.visible = true
     },
-    openUpdateTeamInfoDialog(row) {
-
-    },
-    editSchedule() { // 编辑日程弹框
+    editSchedule(data) { // 编辑日程弹框
+      if (data) {
+        this.nowDetailData = data
+      }
       const dayArr = this.nowDetailData.theDays.split(',')
       const form = {
         detailDayList: dayArr,
@@ -314,14 +265,17 @@ export default {
         this.visibleSchedule = true
       }
     },
-    deleteSchedule() { // 确认删除日程或者排期任务
+    deleteSchedule(data) { // 确认删除日程或者排期任务
+      if (data) {
+        this.nowDetailData = data
+      }
       this.$confirm('是否删除此日程', '提示', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
         this.nowDetailData.origin === 0 ? this.deleteSchedule_0() : this.deleteSchedule_1()
-      })
+      }).catch(() => {})
     },
     async deleteSchedule_1() { // 删除日程
       const res = await deleteSelfSchedule(this.nowDetailData.id)
@@ -329,7 +283,6 @@ export default {
         this.showDetail = false
         this.queryWorkListByTime(this.calendarView)
         this.$message({ type: 'success', message: '删除成功!' })
-        this.changeSuccess('delete')
       }
     },
     async deleteSchedule_0() { // 删除排期
@@ -337,8 +290,7 @@ export default {
       if (res.code === 200) {
         this.showDetail = false
         this.queryWorkListByTime(this.calendarView)
-        this.$message({ message: '删除成功', type: 'success', duration: 1000, offset: 150 })
-        this.changeSuccess('delete')
+        this.$message({ type: 'success', message: '删除成功!' })
       }
     },
     async queryWorkListByTime(view) { // 获取指定时间段用户日程信息
@@ -363,6 +315,7 @@ export default {
           }
         })
       }
+      this.$refs['calender-list'].queryWorkList()// 更新子组件列表
     },
     handleTabsClick() {}, // 标签页切换
     async showTeamAndMemberEnum() { // 获取角色信息枚举类
@@ -385,7 +338,7 @@ export default {
       }
     },
     async queryTeamInfoList(type) { // 获取用户团队列表
-      const data = { memberIDAP: this.username, curIndex: 1, pageSize: 2 }
+      const data = { memberIDAP: this.username, curIndex: 1, pageSize: 9999 }
       const res = await queryTeamInfoList(data)
       if (res.code === 200 && res.data) {
         this.teamInfo = res.data.list
@@ -413,13 +366,6 @@ export default {
     handleDelete(data) { // 日程列表中的删除
       this.nowDetailData = data
       this.deleteSchedule()
-    },
-    changeSuccess(control) {
-      if (control === 'update') {
-        this.control.update = null
-      } else if (control === 'delete') {
-        this.control.delete = null
-      }
     }
   }
 }
@@ -482,76 +428,8 @@ export default {
       display: inline-block;
     }
   }
-}
-.show-schedule-detail::before {
-  content: '';
-  position: absolute;
-  top: -30px;
-  left: 50%;
-  transform: translateX(-50%);
-  width: 0;
-  height: 0;
-  border: 20px solid;
-  border-color: transparent transparent #FFFFFF;
-}
-.show-schedule-detail {
-  overflow: scroll;
-  max-height: 326px;
-  width: 400px;
-  position: fixed;
-  z-index: 2000;
-  top: 0;
-  left: 0;
-  background-color: #FFFFFF;
-  box-shadow:0px 0px 12px rgba(0,0,0,0.1);
-  padding: 20px;
-  color: #333333;
-  font-size: 12px;
-  border-radius: 8px;
-  .item {
-    display: flex;
-    align-items: center;
-    margin-bottom: 15px;
-    .label {
-      width: 25%;
-      min-width: 80px;
-      text-align: right;
-      color: #666666;
-      padding-right: 10px;
-    }
-  }
-  .detail-title {
-    color: #0C77E5;
-    font-size: 14px;
-    margin-bottom: 20px;
-  }
-  span {
-    color: #0C77E5
-  }
-  .footer {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    .cancel,.edit {
-      cursor: pointer;
-      width:63px;
-      height:31px;
-      border-radius:4px;
-      display: flex;
-      justify-content: center;
-      align-items: center;
-    }
-    .cancel {
-      color: #6F7C93;
-      background-color:rgba(249,249,250,1);
-      border:1px solid rgba(191,198,220,1);
-
-    }
-    .edit {
-      margin-left: 20px;
-      color: #409EFF;
-      border:1px solid rgba(64,158,255,1);
-    }
+  .tabs-change {
+    margin: 10px 35px 0 35px;
   }
 }
 </style>

+ 249 - 0
src/views/workbench/team/components/ganntViews.vue

@@ -0,0 +1,249 @@
+<template>
+  <div>
+    <el-row style="margin-bottom: 20px" class="gantt-view-header">
+      <div class="table-top">
+        <div class="table-top-left">
+          <el-radio-group v-model="radio1" size="small" @change="radioChange">
+            <el-radio-button label="忙碌" />
+            <el-radio-button label="空闲" />
+          </el-radio-group>
+          <template v-if="radio1 === '空闲'">
+            <el-date-picker
+              v-model="timeSelectVal"
+              type="daterange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              value-format="yyyy.MM.dd"
+              size="small"
+              class="range-time"
+              @change="queryTeamIdleList()"
+            />
+          </template>
+          <template v-if="radio1 === '忙碌'">
+            <el-select v-model="ganntStatus" placeholder="请选择" size="small" class="status" @change="queryTeamWorkList()">
+              <el-option
+                v-for="item in statusOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+            <el-checkbox-group v-model="ganntOrigin" class="origin">
+              <el-checkbox :label="0" @change="queryTeamWorkList()">任务排期</el-checkbox>
+              <el-checkbox :label="1" @change="queryTeamWorkList()">日程</el-checkbox>
+            </el-checkbox-group>
+          </template>
+        </div>
+        <div class="table-top-right">
+          <div v-if="radio1 === '忙碌'" @click="radio2 = ''">
+            <el-radio-group v-model="radio2" size="small" @change="toToday">
+              <el-radio-button label="今天" />
+            </el-radio-group>
+          </div>
+          <el-radio-group v-model="radio3" size="small" style="margin-left: 20px" @change="changeDateLength">
+            <el-radio-button label="日" />
+            <el-radio-button label="周" />
+            <el-radio-button label="月" />
+          </el-radio-group>
+        </div>
+      </div>
+    </el-row>
+    <gantt-elastic
+      v-if="ganttShow"
+      ref="ganttElastic"
+      :tasks="tasks"
+      :options="options"
+    >
+      <gantt-elastic-header v-show="false" slot="header" ref="ganttHeader" />
+    </gantt-elastic>
+  </div>
+</template>
+<script>
+import GanttElastic from 'gantt-elastic'
+import GanttHeader from 'gantt-elastic-header'
+import moment from 'moment'
+import teamGanttOptions from '@/views/workbench/ganttOptions/teamGantt'
+import { queryTeamIdleList, queryTeamWorkList } from '@/api/workSchedule'
+export default {
+  components: {
+    ganttElasticHeader: GanttHeader,
+    ganttElastic: GanttElastic
+  },
+  data() {
+    return {
+      timeSelectVal: [moment().format('YYYY.MM.DD'), moment().add(1, 'month').format('YYYY.MM.DD')],
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() < Date.now() - 24 * 60 * 60 * 1000
+        }
+      },
+      searchForm: {
+        teamId: null,
+        bizId: null
+      },
+      idleSearchForm: {
+        startTime: null,
+        endTime: null
+      },
+      tasks: [], // 甘特图任务
+      options: teamGanttOptions,
+      radio1: '忙碌',
+      radio2: '今天',
+      radio3: '日',
+      ganttShow: false,
+      statusOptions: [{ // 状态列表
+        value: 0,
+        label: '进行中'
+      }, {
+        value: 1,
+        label: '未开始'
+      }, {
+        value: 2,
+        label: '过去的'
+      }],
+      ganntStatus: 0, // 进行中 0、未开始 1、过去的 2
+      ganntOrigin: [0, 1] // 任务排期 0、个人日程1
+    }
+  },
+  mounted() {
+    this.queryTeamWorkList()
+  },
+  methods: {
+    radioChange(val) {
+      if (val === '忙碌') {
+        this.queryTeamWorkList()
+      } else if (val === '空闲') {
+        this.queryTeamIdleList()
+      }
+    },
+    toToday() {
+      this.$refs.ganttHeader.recenterPosition()
+    },
+    changeDateLength(val) {
+      if (val === '月' && this.$refs.ganttHeader) {
+        this.$refs.ganttHeader.scale = 21
+      } else if (val === '周' && this.$refs.ganttHeader) {
+        this.$refs.ganttHeader.scale = 19
+      } else if (val === '日' && this.$refs.ganttHeader) {
+        this.$refs.ganttHeader.scale = 17
+      }
+    },
+    async queryTeamWorkList() { // 获取忙碌日程
+      const params = {
+        teamSearchInfo: this.searchForm,
+        searchScheduleInfo: { status: this.ganntStatus, origin: this.ganntOrigin }
+      }
+      const res = await queryTeamWorkList(params)
+      if (res.code === 200 && res.data) {
+        this.createTasks(res.data, '忙碌')
+        this.changeDateLength(this.radio3)
+      }
+    },
+    updateGannt(searchForm) { // 更新甘特图
+      this.searchForm = searchForm
+      this.queryTeamWorkList()
+    },
+    async queryTeamIdleList() { // 获取空闲日程
+      this.idleSearchForm.startTime = moment(this.timeSelectVal[0]).format('YYYY.MM.DD')
+      this.idleSearchForm.endTime = moment(this.timeSelectVal[1]).format('YYYY.MM.DD')
+      const res = await queryTeamIdleList({
+        timeInfo: this.idleSearchForm,
+        teamSearchInfo: this.searchForm
+      })
+      if (res.code === 200 && res.data) {
+        this.createTasks(res.data, '空闲')
+        this.changeDateLength(this.radio3)
+      }
+    },
+    createTasks(data, mode) {
+      const today = new Date()
+      const colorlist = ['#A1DEFF', '#FAB5B5', '#BCED86', '#FFA87F', '#8E44AD', '#1EBC61', '#0287D0']
+      this.ganttShow = false
+      this.tasks = []
+      let count = 0
+      for (const i in data) {
+        let label = ''
+        if (mode === '忙碌') {
+          label = data[i].workNum.taskWorkNum + '个任务、' + data[i].workNum.selfWorkNum + '个日程'
+        } else {
+          label = data[i].workNum.taskWorkNum + '个空闲时段'
+        }
+        const color = colorlist[count % colorlist.length]
+        const parentItem = {
+          id: count++,
+          labelName: label,
+          label: data[i].workNum.startTime && data[i].workNum.endTime ? label : '',
+          user: data[i].userInfo.ldapName,
+          collapsed: true,
+          progress: 0,
+          needLegalAllDays: data[i].workNum.needDays + '/' + data[i].workNum.legalDays + '/' + data[i].workNum.allDays,
+          start: data[i].workNum.startTime ? moment(data[i].workNum.startTime).toDate().getTime() : today.getTime(),
+          duration: data[i].workNum.endTime ? moment(data[i].workNum.endTime).toDate().getTime() - moment(data[i].workNum.startTime).toDate().getTime() : 0,
+          startDate: data[i].workNum.startTime ? moment(data[i].workNum.startTime).format('YYYY-MM-DD') : '',
+          endDate: data[i].workNum.endTime ? moment(data[i].workNum.endTime).format('YYYY-MM-DD') : '',
+          type: 'task',
+          style: {
+            base: {
+              fill: color
+            }
+          }
+        }
+        this.tasks.push(parentItem)
+        for (const j in data[i].workData) {
+          const labelNameType = data[i].workData[j].origin ? '日程' : '任务'
+          let labelName = '【' + labelNameType + '】' + data[i].workData[j].name
+          if (data[i].workData[j].type) {
+            labelName = labelName + '-' + data[i].workData[j].type
+          }
+          if (data[i].workData[j].desc) {
+            labelName = labelName + '-' + data[i].workData[j].desc
+          }
+          const item = {
+            id: count++,
+            parentId: parentItem.id,
+            labelName: labelName,
+            label: data[i].workData[j].name,
+            user: parentItem.user,
+            progress: 0,
+            needLegalAllDays: data[i].workData[j].needDays + '/' + data[i].workData[j].legalDays + '/' + data[i].workData[j].allDays,
+            start: moment(data[i].workData[j].startTime).toDate().getTime(),
+            duration: moment(data[i].workData[j].endTime).toDate().getTime() - moment(data[i].workData[j].startTime).toDate().getTime(),
+            startDate: moment(data[i].workData[j].startTime).format('YYYY-MM-DD'),
+            endDate: moment(data[i].workData[j].endTime).format('YYYY-MM-DD'),
+            type: 'task',
+            style: {
+              base: {
+                fill: color
+              }
+            }
+          }
+          this.tasks.push(item)
+        }
+        this.ganttShow = true
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.table-top {
+  margin-bottom: 10px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  position: relative;
+  width: 100%;
+  .table-top-right,.table-top-left {
+    display: flex;
+    align-items: center;
+  }
+  .origin,.range-time {
+    margin-left: 20px;
+  }
+  .status {
+    margin-left: 20px;
+    width: 100px;
+  }
+}
+</style>

+ 308 - 270
src/views/workbench/team/index.vue

@@ -1,329 +1,367 @@
 <template>
-  <el-container direction="vertical" class="workbench_team">
-    <el-main class="layout_main">
-      <div>
-        <div style="display: inline-block">团队</div>
-        <el-select
-          v-model="searchForm.teamId"
-          style="margin-left: 20px"
-          @change="queryTeamWorkList()"
-        >
-          <el-option
-            v-for="item in searchEnum.teams"
-            :key="item.teamId"
-            :label="item.teamName"
-            :value="item.teamId"
-          />
-        </el-select>
-        <div style="display: inline-block;margin-left: 20px">业务线</div>
-        <el-select
-          v-model="searchForm.bizId"
-          style="margin-left: 20px"
-          @change="queryTeamWorkList()"
-        >
-          <el-option
-            v-for="item in searchEnum.businesslines"
-            :key="item.code"
-            :label="item.name"
-            :value="item.code"
-          />
-        </el-select>
+  <el-container class="bg-team">
+    <!-- 顶部导航栏 -->
+    <el-header class="main-header">
+      <div class="select-group">
+        <el-dropdown size="small" @command="handleTeams">
+          <span class="el-dropdown-link">
+            团队<i class="el-icon-arrow-down el-icon--right" />
+          </span>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item
+              v-for="item in searchEnum.teams"
+              :key="item.teamId"
+              :command="item.teamId"
+            >{{ item.teamName }}</el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
+        <el-dropdown size="small" style="margin-left: 20px" @command="handleBizId">
+          <span class="el-dropdown-link">
+            业务线<i class="el-icon-arrow-down el-icon--right" />
+          </span>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item
+              v-for="item in searchEnum.businesslines"
+              :key="item.code"
+              :command="item.code"
+            >{{ item.name }}</el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
       </div>
-    </el-main>
-    <el-main class="layout_main" style="margin-top: 10px">
-      <div class="module_title">
-        <div class="module_title__sign" />
-        <div class="module_title__caption">团队日程</div>
+      <div class="top-tabs">
+        <el-tabs v-model="activeName">
+          <el-tab-pane label="团队日程" name="1" />
+          <el-tab-pane label="概览" name="2" />
+          <el-tab-pane label="需求" name="3" />
+          <el-tab-pane label="任务" name="4" />
+          <el-tab-pane label="缺陷" name="5" />
+        </el-tabs>
       </div>
-      <el-row style="margin-bottom: 20px" class="gantt-view-header">
-        <el-col :span="12">
-          <el-radio-group v-model="radio1" size="small" @change="radioChange">
-            <el-radio-button label="忙碌" />
-            <el-radio-button label="空闲" />
-          </el-radio-group>
-          <div v-if="radio1 === '空闲'" style="display: inline-block">
-            <div style="display: inline-block;margin-left: 20px">选择时间:</div>
-            <el-date-picker
-              v-model="timeSelectVal"
-              type="daterange"
-              range-separator="-"
-              start-placeholder="开始日期"
-              end-placeholder="结束日期"
-              :picker-options="pickerOptions"
-              :clearable="false"
-              @change="queryTeamIdleList()"
-            />
+    </el-header>
+    <!-- 顶部导航栏 -->
+    <el-container v-show="activeName === '1'">
+      <section class="main-section">
+        <el-tabs v-model="activeSchedule" class="tabs-change">
+          <el-tab-pane label="日历视图" name="1" />
+          <el-tab-pane label="甘特图" name="2" />
+        </el-tabs>
+        <div class="detail-info">
+          <div class="member-list">
+            <el-checkbox v-model="checkAllMember" style="margin: 0 20px 0 5px" @change="checkAllChange">全选</el-checkbox>
+            <el-checkbox-group v-model="checkedMembers" @change="membersChange">
+              <el-checkbox v-for="item in memberList" :key="item.idap" :label="item.idap">{{ item.name }}</el-checkbox>
+            </el-checkbox-group>
           </div>
-        </el-col>
-        <el-col :span="12" style="text-align: right">
-          <div style="display: inline-block" @click="radio2 = ''">
-            <el-radio-group v-model="radio2" size="small" @change="radioChange">
-              <el-radio-button label="今天" />
-            </el-radio-group>
-          </div>
-          <el-radio-group v-model="radio3" size="small" style="margin-left: 20px" @change="radioChange">
-            <el-radio-button label="日" />
-            <el-radio-button label="周" />
-            <el-radio-button label="月" />
-          </el-radio-group>
-        </el-col>
-      </el-row>
-      <gantt-elastic
-        v-if="ganttShow"
-        ref="ganttElastic"
-        :tasks="tasks"
-        :options="options"
-      >
-        <gantt-elastic-header v-show="false" slot="header" ref="ganttHeader" />
-      </gantt-elastic>
-    </el-main>
+          <MyFullCalendar
+            v-show="activeSchedule === '1'"
+            :events="calendarEvents"
+            :add-button="false"
+            @change="queryTeamWorkListByTime"
+            @dateClick="dateClick"
+            @eventClick="showSchedule"
+            @select="select"
+          >
+            <el-checkbox-group v-model="origin" class="origin">
+              <el-checkbox :label="0" @change="queryTeamWorkListByTime">任务排期</el-checkbox>
+              <el-checkbox :label="1" @change="queryTeamWorkListByTime">日程</el-checkbox>
+            </el-checkbox-group>
+          </MyFullCalendar>
+          <calender-detail
+            :show.sync="showDetail"
+            :data="nowDetailData"
+            :position="detailXY"
+            @edit="editSchedule"
+            @delete="deleteSchedule"
+          />
+          <gannt-views v-show="activeSchedule === '2'" ref="gannt-views" />
+        </div>
+      </section>
+    </el-container>
+    <!-- 日程 -->
+    <!-- 日程操作弹框 -->
+    <calendar-dialog
+      :title="'编辑日程'"
+      :visible.sync="updateSchedule.visible"
+      :data="updateSchedule.data"
+      @confirm="queryTeamWorkListByTime(calendarView)"
+    />
+    <calendar-dialog
+      :title="'新建日程'"
+      :visible.sync="createSchedule.visible"
+      :data="createSchedule.data"
+      @confirm="queryTeamWorkListByTime(calendarView)"
+    />
+    <!-- 日程操作弹框 -->
+    <!-- 排期操作弹框 -->
+    <modify-schedule
+      v-if="visibleSchedule"
+      :visible.sync="visibleSchedule"
+      :detail-data="updateSchedule.data"
+      :title="'修改排期'"
+      @update="queryTeamWorkListByTime(calendarView)"
+    />
+    <!-- 排期操作弹框 -->
   </el-container>
 </template>
 
 <script>
-import workbenchApi from '@/api/workbench.js'
-import { settingGetBizList } from '@/api/defectManage'
-import { queryTeamIdleList, queryTeamWorkList } from '@/api/workSchedule'
-import GanttElastic from 'gantt-elastic'
-import GanttHeader from 'gantt-elastic-header'
 import moment from 'moment'
-import teamGanttOptions from '@/views/workbench/ganttOptions/teamGantt'
+import { settingGetBizList } from '@/api/defectManage'
+import { queryTeamInfoList, queryTeamWorkListByTime, deleteSelfSchedule, queryTeamMember } from '@/api/workSchedule'
+import { scheduleDelete } from '@/api/projectViewDetails'
+import modifySchedule from '@/views/projectManage/projectList/components/modifySchedule'
+import ganntViews from './components/ganntViews'
+import MyFullCalendar from '@/views/workbench/person/components/myFullCalendar'
+import calenderDetail from '@/views/workbench/person/components/calenderDetail'
+import calendarDialog from '@/views/workbench/person/components/calendarFormDialog'
 
 export default {
   components: {
-    ganttElasticHeader: GanttHeader,
-    ganttElastic: GanttElastic
+    ganntViews,
+    MyFullCalendar,
+    calenderDetail,
+    calendarDialog,
+    modifySchedule
   },
   data() {
     return {
-      timeSelectVal: [new Date(), moment(new Date()).add(29, 'day')],
-      pickerOptions: {
-        disabledDate(time) {
-          return time.getTime() < Date.now() - 24 * 60 * 60 * 1000
-        }
-      },
-      tasks: [], // 甘特图任务
-      options: teamGanttOptions,
-      radio1: '忙碌',
-      radio2: '今天',
-      radio3: '日',
+      activeName: '1', // 顶部导航栏
+      activeSchedule: '1', // 日历和甘特图切换
       searchForm: {
         teamId: null,
         bizId: null
       },
-      idleSearchForm: {
-        startTime: null,
-        endTime: null
-      },
       searchEnum: {
         teams: [],
         businesslines: []
       },
-      username: localStorage.getItem('username'),
-      ganttShow: false
+      memberList: [], // 团队成员列表
+      checkAllMember: false, // 选择全部成员
+      checkedMembers: [], // 被选中的成员列表
+      calendarEvents: [
+        // 日程图标数据
+        { title: 'Event Now', start: new Date(), end: new Date().setDate(16) }
+      ],
+      calendarView: null, // 日程图表数据
+      showDetail: false, // 显示详情弹框
+      nowDetailData: {}, // 当前选中日程的数据
+      detailXY: [0, 0], // 详情弹框位置
+      origin: [0, 1],
+      createSchedule: { // 新建日程
+        visible: false,
+        data: null
+      },
+      updateSchedule: { // 更新日程
+        visible: false,
+        data: null
+      },
+      visibleSchedule: false // 排期任务弹框
     }
   },
   mounted() {
-    this.queryTeamInfoList(0)
     this.settingGetBizList()
-    this.queryTeamWorkList()
+    this.queryTeamInfoList()
+    this.queryTeamMember()
   },
   methods: {
-    tasksUpdate(tasks) {
-      this.tasks = tasks
-    },
-    optionsUpdate(options) {
-      this.options = options
-    },
-    styleUpdate(style) {
-      this.dynamicStyle = style
+    async settingGetBizList() { // 获取业务线
+      const res = await settingGetBizList({})
+      if (res.code === 200 && res.data) {
+        this.searchEnum.businesslines = res.data
+        this.searchEnum.businesslines.unshift({ code: null, name: '全部' })
+      }
     },
-    radioChange(val) {
-      if (val === '忙碌') {
-        this.queryTeamWorkList()
-      } else if (val === '空闲') {
-        this.queryTeamIdleList()
-      } else if (val === '今天') {
-        this.$refs.ganttHeader.recenterPosition()
+    async queryTeamInfoList() { // 获取用户团队列表
+      const res = await queryTeamInfoList({ curIndex: 1, pageSize: 9999 })
+      if (res.code === 200 && res.data) {
+        this.searchEnum.teams = res.data.list
+        this.searchEnum.teams.unshift({ teamId: null, teamName: '全部' })
       }
-      this.changeDateLength(val)
     },
-    changeDateLength(val) {
-      if (val === '月') {
-        this.$refs.ganttHeader.scale = 21
-      } else if (val === '周') {
-        this.$refs.ganttHeader.scale = 19
-      } else if (val === '日') {
-        this.$refs.ganttHeader.scale = 17
+    async queryTeamMember() { // 获取团队人员
+      const params = this.searchForm.teamId ? { teamId: this.searchForm.teamId } : {}
+      const res = await queryTeamMember(params)
+      if (res.code === 200) {
+        this.memberList = this.handleMember(res.data)
+        console.log(this.memberList)
       }
     },
-    queryTeamInfoList(type) {
-      const data = { type: type, curIndex: 1, pageSize: 9999 }
-      workbenchApi.queryTeamInfoList(data).then(res => {
-        if (res.data) {
-          this.searchEnum.teams = res.data.list
-          this.searchEnum.teams.unshift({
-            teamId: null,
-            teamName: '全部'
-          })
+    handleMember(arr) {
+      const newMap = new Map()
+      return arr.filter(item => {
+        if (!newMap.has(item.idap)) {
+          newMap.set(item.idap, item)
+          return item
         }
       })
     },
-    settingGetBizList() {
-      settingGetBizList({}).then(res => {
-        if (res.data) {
-          this.searchEnum.businesslines = res.data
-          this.searchEnum.businesslines.unshift({
-            code: null,
-            name: '全部'
-          })
-        }
-      })
+    checkAllChange(val) { // 成员全部选择
+      this.checkedMembers = val ? this.memberList.map(item => item.idap) : []
+      this.membersChange()
     },
-    async queryTeamWorkList() { // 获取忙碌日程
-      const params = {
-        teamSearchInfo: this.searchForm,
-        searchScheduleInfo: { origin: [1] }
+    membersChange() { // 成员变动
+      this.queryTeamWorkListByTime(this.calendarView)
+    },
+    handleTeams(e) { // 团队变动
+      this.searchForm.teamId = e
+      this.updateGannt()
+    },
+    handleBizId(e) { // 业务线变动
+      this.searchForm.bizId = e
+      this.updateGannt()
+    },
+    updateGannt() { // 更新子组件甘特图
+      this.$refs['gannt-views'].updateGannt(this.searchForm)
+    },
+    showSchedule(e) { // 查看日程详情
+      const res = this.calendarEvents.find(item => item.id === Number(e.event.id))
+      this.nowDetailData = res.detailData
+      this.showDetail = true
+      this.detailXY = [`${e.jsEvent.clientX - 200}px`, `${e.jsEvent.clientY + 20}px`]
+    },
+    dateClick(arg) { // 新建日程弹框
+      this.createSchedule.data = arg
+      this.createSchedule.visible = true
+    },
+    select(selectionInfo) { // 多选日期新建日程弹框
+      this.createSchedule.data = {
+        startStr: selectionInfo.startStr,
+        endStr: moment(selectionInfo.endStr).subtract(1, 'day').format('YYYY-MM-DD')
       }
-      const res = await queryTeamWorkList(params)
-      if (res.code === 200 && res.data) {
-        this.createTasks(res, '忙碌')
-        this.changeDateLength(this.radio3)
+      this.createSchedule.visible = true
+    },
+    editSchedule(data) { // 编辑日程弹框
+      if (data) {
+        this.nowDetailData = data
+      }
+      const dayArr = this.nowDetailData.theDays.split(',')
+      const form = {
+        detailDayList: dayArr,
+        id: this.nowDetailData.id,
+        name: this.nowDetailData.name,
+        dayList: Array.from(new Set([dayArr[0], dayArr[dayArr.length - 1]])),
+        isJoin: this.nowDetailData.bizId !== null ? 1 : 0, // 是否关联业务线
+        syncTeam: this.nowDetailData.syncTeam, // 是否同步 0 不同步 1同步
+        bizId: this.nowDetailData.bizId || null,
+        desc: this.nowDetailData.desc,
+        people: this.nowDetailData.peopleObject.name,
+        schedule: this.nowDetailData.seperateDaysHasHoliday
+      }
+      this.updateSchedule.data = form
+      if (this.nowDetailData.origin === 1) {
+        this.updateSchedule.visible = true
+      } else if (this.nowDetailData.origin === 0) {
+        this.visibleSchedule = true
       }
     },
-    async queryTeamIdleList() { // 获取空闲日程
-      this.idleSearchForm.startTime = moment(this.timeSelectVal[0]).format('YYYY.MM.DD')
-      this.idleSearchForm.endTime = moment(this.timeSelectVal[1]).format('YYYY.MM.DD')
-      const res = await queryTeamIdleList({
-        timeInfo: this.idleSearchForm,
-        teamSearchInfo: this.searchForm
-      })
-      if (res.code === 200 && res.data) {
-        this.createTasks(res, '空闲')
-        this.changeDateLength(this.radio3)
+    deleteSchedule(data) { // 确认删除日程或者排期任务
+      if (data) {
+        this.nowDetailData = data
       }
+      this.$confirm('是否删除此日程', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.nowDetailData.origin === 0 ? this.deleteSchedule_0() : this.deleteSchedule_1()
+      }).catch(() => {})
     },
-    createTasks(res, mode) {
-      const today = new Date()
-      const colorlist = ['#A1DEFF', '#FAB5B5', '#BCED86', '#FFA87F', '#8E44AD', '#1EBC61', '#0287D0']
-      this.ganttShow = false
-      this.tasks = []
-      let count = 0
-      for (const i in res.data) {
-        let label = ''
-        if (mode === '忙碌') {
-          label = res.data[i].workNum.taskWorkNum + '个任务、' + res.data[i].workNum.selfWorkNum + '个日程'
-        } else {
-          label = res.data[i].workNum.taskWorkNum + '个空闲时段'
-        }
-        const color = colorlist[count % colorlist.length]
-        const parentItem = {
-          id: count++,
-          labelName: label,
-          label: res.data[i].workNum.startTime && res.data[i].workNum.endTime ? label : '',
-          user: res.data[i].userInfo.ldapName,
-          collapsed: true,
-          progress: 0,
-          needLegalAllDays: res.data[i].workNum.needDays + '/' + res.data[i].workNum.legalDays + '/' + res.data[i].workNum.allDays,
-          start: res.data[i].workNum.startTime ? moment(res.data[i].workNum.startTime).toDate().getTime() : today.getTime(),
-          duration: res.data[i].workNum.endTime ? moment(res.data[i].workNum.endTime).toDate().getTime() - moment(res.data[i].workNum.startTime).toDate().getTime() : 0,
-          startDate: res.data[i].workNum.startTime ? moment(res.data[i].workNum.startTime).format('YYYY-MM-DD') : '',
-          endDate: res.data[i].workNum.endTime ? moment(res.data[i].workNum.endTime).format('YYYY-MM-DD') : '',
-          type: 'task',
-          style: {
-            base: {
-              fill: color
-            }
-          }
-        }
-        this.tasks.push(parentItem)
-        for (const j in res.data[i].workData) {
-          const labelNameType = res.data[i].workData[j].origin ? '日程' : '任务'
-          let labelName = '【' + labelNameType + '】' + res.data[i].workData[j].name
-          if (res.data[i].workData[j].type) {
-            labelName = labelName + '-' + res.data[i].workData[j].type
-          }
-          if (res.data[i].workData[j].desc) {
-            labelName = labelName + '-' + res.data[i].workData[j].desc
-          }
-          const item = {
-            id: count++,
-            parentId: parentItem.id,
-            labelName: labelName,
-            label: res.data[i].workData[j].name,
-            user: parentItem.user,
-            progress: 0,
-            needLegalAllDays: res.data[i].workData[j].needDays + '/' + res.data[i].workData[j].legalDays + '/' + res.data[i].workData[j].allDays,
-            start: moment(res.data[i].workData[j].startTime).toDate().getTime(),
-            duration: moment(res.data[i].workData[j].endTime).toDate().getTime() - moment(res.data[i].workData[j].startTime).toDate().getTime(),
-            startDate: moment(res.data[i].workData[j].startTime).format('YYYY-MM-DD'),
-            endDate: moment(res.data[i].workData[j].endTime).format('YYYY-MM-DD'),
-            type: 'task',
-            style: {
-              base: {
-                fill: color
-              }
-            }
+    async deleteSchedule_1() { // 删除日程
+      const res = await deleteSelfSchedule(this.nowDetailData.id)
+      if (res.code === 200) {
+        this.showDetail = false
+        this.queryTeamWorkListByTime(this.calendarView)
+        this.$message({ type: 'success', message: '删除成功!' })
+      }
+    },
+    async deleteSchedule_0() { // 删除排期
+      const res = await scheduleDelete(this.nowDetailData.id)
+      if (res.code === 200) {
+        this.showDetail = false
+        this.queryTeamWorkListByTime(this.calendarView)
+        this.$message({ type: 'success', message: '删除成功!' })
+      }
+    },
+    async queryTeamWorkListByTime(view) { // 获取指定时间段团队日程信息
+      this.calendarView = view
+      const params = {
+        timeInfo: {
+          startTime: moment(view.activeStart || null).subtract(1, 'month').format('YYYY.MM.DD'),
+          endTime: moment(view.activeEnd || null).add(1, 'month').format('YYYY.MM.DD')
+        },
+        teamSearchInfo: { bizId: localStorage.getItem('bizId') || null },
+        searchScheduleInfo: { origin: this.origin }
+      }
+      if (this.checkedMembers.length > 0) {
+        params.peoples = this.checkedMembers
+      }
+      const res = await queryTeamWorkListByTime(params)
+      if (res.code === 200) {
+        this.calendarEvents = res.data.map(item => {
+          return {
+            id: item.id,
+            cssClass: ['el-icon-s-order'],
+            title: `${item.peopleObject.name}:${item.name}`,
+            start: moment(item.startTime).toDate(),
+            end: moment(item.endTime).add(1, 'day').toDate(),
+            detailData: item
           }
-          this.tasks.push(item)
-        }
-        this.ganttShow = true
+        })
       }
     }
   }
-
 }
 </script>
 
-<style>
-.gantt-view-header .el-date-editor {
-  padding-top: 0;
-  padding-bottom: 0;
-  height: 35px;
-  width: 240px;
+// 布局
+<style scoped lang="scss">
+@import '@/styles/detail-pages.scss';
+.el-container{
+  width: 100%;
 }
-.gantt-view-header .el-date-editor input {
-  height: 32px;
-  width: 90px;
+.hideSidebar .main-header {
+  width: calc(100% - 54px);
 }
-.gantt-view-header .el-date-editor .el-range__close-icon {
-  display: none;
+.openSidebar .main-header {
+  width: calc(100% - 210px);
 }
-</style>
-
-// 布局
-<style scoped>
-.workbench_team {
-  background-color: #f2f3f6;
-  padding: 10px;
+.bg-team {
+  @include bg-project;
+}
+.main-header {
+  @include main-header;
+  .top-tabs {
+    position: absolute;
+    left: 50%;
+    transform: translate(-50%, 0);
+  }
 }
-.workbench_team .layout_main,
-.layout_aside {
-  border-radius: 4px;
-  background-color: #ffffff;
+.main-header::after {
+  @include main-header-after;
 }
-</style>
-
-// 公共部分
-<style scoped>
-.module_title {
-  display: flex;
-  align-items: center;
-  margin-bottom: 20px;
+.main-section {
+  @include main-section;
+  .title-name {
+    font-size:20px;
+    font-family:PingFangSC-Medium;
+    color:rgba(51,59,74,1);
+  }
+  .detail-info {
+    padding: 0 30px 20px 30px;
+  }
+  .member-list {
+    display: flex;
+  }
+  .tabs-change {
+    margin: 10px 35px 0 35px;
+  }
 }
-.module_title__sign {
-  width: 4px;
-  height: 15px;
-  background: #409eff;
-  border-radius: 1px;
+.el-dropdown-link {
+  color: #333B4A;
+  font-weight: 600;
 }
-.module_title__caption {
-  width: 83px;
-  height: 18px;
-  font-size: 16px;
-  font-family: MicrosoftYaHei;
-  color: rgba(51, 59, 74, 1);
-  margin-left: 6px;
-  font-weight: 500;
+>>>.el-dropdown-menu__item {
+  max-width: 20vw;
+  overflow: scroll;
 }
 </style>