浏览代码

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

PrinceLee 5 年之前
父节点
当前提交
e14903381a

+ 18 - 9
src/api/workSchedule.js

@@ -38,6 +38,24 @@ export function queryIdleList(data) {
   })
 }
 
+// 创建个人日程
+export function createSelfSchedule(data) {
+  return request({
+    url: TeamManagement + '/selfSchedule/create',
+    method: 'post',
+    data
+  })
+}
+
+// 更新个人日程
+export function updateSelfSchedule(data) {
+  return request({
+    url: TeamManagement + '/selfSchedule/update',
+    method: 'post',
+    data
+  })
+}
+
 // 删除个人日程
 export function deleteSelfSchedule(id) {
   return request({
@@ -55,15 +73,6 @@ export function queryWorkListByTime(data) {
   })
 }
 
-// 更新个人日程
-export function updateSelfSchedule(data) {
-  return request({
-    url: TeamManagement + '/selfSchedule/update',
-    method: 'post',
-    data
-  })
-}
-
 // 获取团队用户空闲信息
 export function queryTeamIdleList(data) {
   return request({

+ 2 - 0
src/components/input/textArea.vue

@@ -21,6 +21,7 @@
 import tinymce from 'tinymce/tinymce'
 import Editor from '@tinymce/tinymce-vue'
 import 'tinymce/themes/silver/theme'
+import 'tinymce/icons/default/icons'
 
 export default {
   components: {
@@ -58,6 +59,7 @@ export default {
       inputValue: '',
       edit: false,
       init: {
+        auto_focus: true,
         language_url: '/tinymce/langs/zh_CN.js',
         language: 'zh_CN',
         skin_url: '/tinymce/skins/ui/oxide', // 编辑器需要一个skin才能正常工作,所以要设置一个skin_url指向之前复制出来的skin文件

+ 4 - 5
src/views/projectManage/projectList/components/modifySchedule.vue

@@ -222,26 +222,25 @@ export default {
     async scheduleCreate(params) { // 创建排期
       const res = await scheduleCreate(params)
       if (res.code === 200) {
-        console.log(res.data)
         this.$message({ message: '添加成功', type: 'success', duration: 1000, offset: 150 })
       }
+      this.$emit('update')
+      this.cancel()
     },
     async scheduleUpdate(params) { // 更新排期
       const res = await scheduleUpdate(params)
       if (res.code === 200) {
-        console.log(res.data)
         this.$message({ message: '更新成功', type: 'success', duration: 1000, offset: 150 })
       }
+      this.$emit('update')
+      this.cancel()
     },
     confirmForm() { // 确认提交表单
       this.$refs['form'].validate((valid) => {
-        console.log(this.form)
         if (valid) {
           const params = _.cloneDeep(this.form)
           params.dayList = this.detailDayList
           params.id ? this.scheduleUpdate(params) : this.scheduleCreate(params)
-          this.$emit('update')
-          this.cancel()
         }
       })
     },

+ 2 - 2
src/views/projectManage/projectList/components/scheduleList.vue

@@ -64,7 +64,7 @@
       >
         <template slot-scope="scope">
           <el-button type="text" size="small" @click="editSchedule(scope.row)">编辑</el-button>
-          <el-button type="text" size="small" @click="deteleSchedule(scope.row)">删除</el-button>
+          <el-button type="text" size="small" @click="deleteSchedule(scope.row)">删除</el-button>
         </template>
       </el-table-column>
 
@@ -174,7 +174,7 @@ export default {
       this.DialogTitle = '新建排期'
       this.visibleSchedule = true
     },
-    async deteleSchedule(row) { // 删除排期
+    async deleteSchedule(row) { // 删除排期
       const res = await scheduleDelete(row.id)
       if (res.code === 200) {
         this.listByTask(this.id)

+ 172 - 153
src/views/workbench/person/calendarFormDialog.vue

@@ -1,77 +1,76 @@
 <template>
-  <el-dialog class="workbench_schedule__dialog" :visible.sync="isVisible" width="70%" :close-on-click-modal="false" :append-to-body="true">
-    <template v-slot:title>
-      <div class="module_title">
-        <div class="module_title__sign" />
-        <div class="module_title__caption">{{ title }}</div>
-      </div>
-    </template>
-    <el-form ref="calendarform" :model="form" :rules="rules" label-position="left" label-width="90px">
-      <el-form-item label="日程名称" prop="name">
-        <el-input v-model="form.name" />
-      </el-form-item>
-      <el-container>
-        <el-aside width="60%">
-          <el-form-item label="是否关联业务线" prop="isJoin" label-width="150px">
-            <el-radio-group v-model="form.isJoin" style="margin-bottom: -8px">
-              <el-radio :label="0">否</el-radio>
-              <el-radio :label="1">是</el-radio>
-            </el-radio-group>
-          </el-form-item>
-          <el-form-item label="时间" prop="time">
-            <el-date-picker
-              v-model="form.time"
-              type="datetimerange"
-              range-separator="-"
-              start-placeholder="开始日期"
-              end-placeholder="结束日期"
-            />
-          </el-form-item>
-          <el-form-item prop="syncTeam">
-            <el-checkbox v-model="form.syncTeam" :true-label="1" :false-label="0">同步到团队</el-checkbox>
-          </el-form-item>
-        </el-aside>
-        <el-aside width="40%">
-          <el-form-item v-show="form.isJoin" label="业务线" prop="bizId">
-            <el-select v-model="form.bizId" style="width: 100%">
-              <el-option
-                v-for="item in businesslines"
-                :key="item.code"
-                :label="item.name"
-                :value="item.code"
-              />
-            </el-select>
-          </el-form-item>
-          <el-form-item v-show="!form.isJoin" style="visibility:hidden" label="业务线" />
-          <el-form-item prop="noHoliday">
-            <el-checkbox v-model="form.noHoliday" :true-label="1" :false-label="0">排除周末</el-checkbox>
-          </el-form-item>
-        </el-aside>
-      </el-container>
-      <el-form-item label="描述">
-        <el-input
-          v-model="form.desc"
-          type="textarea"
-          placeholder="请输入描述内容"
-          maxlength="300"
-          show-word-limit
-          :autosize="{ minRows: 3, maxRows: 5}"
-        />
-      </el-form-item>
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="cancel">取 消</el-button>
-      <el-button type="primary" @click="confirm">确 认</el-button>
-    </template>
-  </el-dialog>
+  <normal-dialog v-if="isVisible" :show-dialog.sync="isVisible" :title="title" :is-default-close="false" @confirm="confirmForm()" @cancel="cancel()">
+    <article>
+      <el-form ref="calendarform" :model="form" :rules="rules" label-position="left" label-width="90px">
+        <el-row>
+          <el-col :span="18">
+            <el-form-item label="日程名称" prop="name">
+              <el-input v-model="form.name" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item prop="syncTeam">
+              <el-checkbox v-model="form.syncTeam" :true-label="1" :false-label="0">同步到团队</el-checkbox>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="是否关联业务线" prop="isJoin" label-width="150px">
+              <el-radio-group v-model="form.isJoin" style="margin-bottom: -8px">
+                <el-radio :label="0">否</el-radio>
+                <el-radio :label="1">是</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item v-if="form.isJoin" label="业务线" prop="bizId">
+              <el-select v-model="form.bizId" style="width: 100%">
+                <el-option
+                  v-for="item in businesslines"
+                  :key="item.code"
+                  :label="item.name"
+                  :value="item.code"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <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>
+          <div class="picker-hidden">
+            <sel-date-picker :start-end.sync="form.dayList" :detail-day-list="detailDayList" @getDetailDay="getDetailDay" />
+          </div>
+        </el-form-item>
+        <el-form-item label="描述">
+          <el-input
+            v-model="form.desc"
+            type="textarea"
+            placeholder="请输入描述内容"
+            maxlength="300"
+            show-word-limit
+            :autosize="{ minRows: 3, maxRows: 5}"
+          />
+        </el-form-item>
+      </el-form>
+    </article>
+  </normal-dialog>
 </template>
-
 <script>
-import workbenchApi from '@/api/workbench.js'
+const _ = require('lodash')
+import moment from 'moment'
 import { settingGetBizList } from '@/api/defectManage'
-// import dayjs from 'dayjs'
+import { createSelfSchedule, updateSelfSchedule } from '@/api/workSchedule.js'
+import { getSeprateDayInfo } from '@/api/projectViewDetails'
+import normalDialog from '@/components/dialog/normalDialog'
+import selDatePicker from '@/components/picker/SelDatePicker'
 
 export default {
+  components: {
+    normalDialog,
+    selDatePicker
+  },
   props: {
     title: {
       type: String,
@@ -83,21 +82,25 @@ export default {
     },
     data: {
       type: Object,
-      default() {
-        return null
-      }
+      default: () => null
     }
   },
   data() {
     return {
       refresh: true,
       businesslines: [],
+      isVisible: this.visible,
       form: {
-        isJoin: 0,
-        noHoliday: 1,
-        syncTeam: 1
+        name: '',
+        dayList: [],
+        isJoin: 0, // 是否关联业务线
+        syncTeam: 1, // 是否同步 0 不同步 1同步
+        bizId: null,
+        desc: '',
+        people: localStorage.getItem('realname')
       },
-      isVisible: false,
+      detailDayList: [], // 详细的日期
+      schedule: '',
       rules: {
         name: [
           { required: true, message: '请输入日程名称', trigger: 'blur' }
@@ -105,8 +108,11 @@ export default {
         isJoin: [
           { required: true, message: '请选择是否关联业务线', trigger: 'change' }
         ],
-        time: [
-          { required: true, message: '请选择日程时间', trigger: 'change' }
+        people: [
+          { required: true, message: '请输入负责人', trigger: 'blur' }
+        ],
+        dayList: [
+          { type: 'array', required: true, message: '请选择日程时间', trigger: 'change' }
         ],
         bizId: [
           { required: true, message: '请选择业务线', trigger: 'change' }
@@ -117,83 +123,102 @@ export default {
   watch: {
     visible(newVal, olfVal) {
       this.isVisible = newVal
-    },
-    isVisible(newVal, olfVal) {
-      if (newVal) {
-        if (this.title === '编辑日程') {
-          this.form = JSON.parse(JSON.stringify(this.data))
-        } else {
-          this.form = {
-            time: [this.data.start, this.data.end],
-            isJoin: 0,
-            noHoliday: 1,
-            syncTeam: 1
-          }
-        }
+      if (this.data && this.data.id) {
+        this.isEditData()
       } else {
-        this.$emit('cancel', false)
+        this.isExistDetail()
       }
+    },
+    data(newVal, olfVal) {
+      this.data = newVal
     }
   },
   mounted() {
     this.settingGetBizList()
   },
   methods: {
-    cancel() {
-      this.$emit('cancel', false)
-    },
-    confirm() {
-      this.$refs.calendarform.validate((valid, object) => {
-        let bizIdValid = false
-        if (!valid && !this.form.isJoin) {
-          bizIdValid = true
-          for (const i in object) {
-            if (i !== 'bizId') {
-              bizIdValid = false
-              break
-            }
-          }
-        }
-        if (valid || bizIdValid) {
-          if (this.title === '新建日程') {
-            this.createSelfSchedule()
-              .then(res => {
-                if (res.code === 200) {
-                  this.$emit('confirm', false)
-                }
-              })
+    confirmForm() { // 确认提交表单
+      this.$refs['calendarform'].validate((valid) => {
+        if (valid) {
+          const params = _.cloneDeep(this.form)
+          delete params.people
+          params.dayList = this.detailDayList
+          if (this.data && this.data.id) {
+            this.updateSelfSchedule(params)
           } else {
-            this.updateSelfSchedule()
-              .then(res => {
-                if (res.code === 200) {
-                  this.$emit('confirm', false)
-                }
-              })
+            this.createSelfSchedule(params)
           }
         }
       })
     },
-    dateFomat() {
-      this.form.startTime = this.form.time[0]
-      this.form.endTime = this.form.time[1]
+    isEditData() { // 编辑状态下处理数据
+      this.form = _.cloneDeep(this.data)
+      this.detailDayList = _.cloneDeep(this.form.detailDayList)
+      this.schedule = this.form.schedule
+      this.schedule = `${this.form.dayList[0]}-${this.form.dayList[1]}`
+      delete this.form.detailDayList
+      delete this.form.schedule
+    },
+    isExistDetail() { // 当新建的时候存在详细日期时候的数据处理
+      if (this.data) {
+        this.form.dayList = Array.from(new Set([this.data.startStr, this.data.endStr]))
+      } else {
+        this.form.dayList = []
+      }
+      this.getDetailDayByDayList(this.data.startStr, this.data.endStr)
+      this.schedule = this.data.startStr === this.data.endStr
+        ? `${this.data.startStr}`
+        : `${this.data.startStr}-${this.data.endStr}`
+    },
+    getDetailDay(e) { // 获取详细排期日期
+      this.detailDayList = e
+      this.getSeprateDayInfo(e)
+    },
+    async getSeprateDayInfo(dataArr) { // 获取选中时间中的工作日时间
+      const res = await getSeprateDayInfo(dataArr)
+      if (res.code === 200) {
+        this.schedule = res.data.seperateDaysNoHoliday
+      }
+    },
+    cancel() { // 关闭弹框
+      this.isVisible = false
+      this.$emit('update:visible', this.isVisible)
+      this.$emit('cancel')
     },
     // 新建日程
-    createSelfSchedule() {
-      this.dateFomat()
-      if (this.form.isJoin === 0) {
-        this.form.bizId = null
+    async createSelfSchedule(params) {
+      console.log(params)
+      if (params.isJoin === 0) {
+        params.bizId = null
+      }
+      const res = await createSelfSchedule(params)
+      if (res.code === 200) {
+        this.$emit('confirm')
+        this.cancel()
       }
-      return workbenchApi.createSelfSchedule(this.form)
     },
     // 编辑日程
-    updateSelfSchedule() {
-      this.dateFomat()
-      return workbenchApi.updateSelfSchedule(this.form)
+    async updateSelfSchedule(params) {
+      console.log(params)
+      const res = await updateSelfSchedule(params)
+      if (res.code === 200) {
+        this.$emit('confirm')
+        this.cancel()
+      }
     },
-    settingGetBizList() {
-      settingGetBizList({}).then(res => {
-        this.businesslines = res.data
-      })
+    async settingGetBizList() {
+      const res = await settingGetBizList({})
+      res.code === 200 ? this.businesslines = res.data : this.businesslines = []
+    },
+    getDetailDayByDayList(start, end) {
+      let nextDate = moment(_.cloneDeep(start))
+      end = moment(end).add(1, 'day')
+      const NewArr = []
+      while (nextDate.isBefore(end)) {
+        NewArr.push(nextDate.format('YYYY.MM.DD'))
+        nextDate = nextDate.add(1, 'day')
+      }
+      this.detailDayList = NewArr
     }
   }
 }
@@ -218,25 +243,19 @@ export default {
 }
 </style>
 
-<style scoped>
-.module_title{
-  display:flex;
-  align-items: center;
-  margin-bottom: 20px
+<style scoped lang="scss">
+article{
+  padding: 0 50px;
+}
+.blue {
+  color: #409EFF;
 }
-.module_title__sign {
-  width:4px;
-  height:15px;
-  background:#409EFF;
-  border-radius:1px;
+.empty-schedule {
+  color:rgba(51,51,51,0.45);
 }
-.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;
+.picker-hidden {
+  opacity: 0;
+  position: absolute;
+  top: 0;
 }
 </style>

+ 0 - 0
src/views/workbench/person/components/calender.vue


+ 156 - 0
src/views/workbench/person/components/calenderList.vue

@@ -0,0 +1,156 @@
+<template>
+  <article>
+    <div class="table-top">
+      <el-radio-group v-model="busy" size="small">
+        <el-radio-button :label="Number(0)">忙碌</el-radio-button>
+        <el-radio-button :label="Number(1)">空闲</el-radio-button>
+      </el-radio-group>
+      <el-select v-model="form.searchScheduleInfo.status" placeholder="请选择" size="small" class="status" @change="queryWorkList">
+        <el-option
+          v-for="item in statusOptions"
+          :key="item.value"
+          :label="item.label"
+          :value="item.value"
+        />
+      </el-select>
+      <el-checkbox-group v-model="form.searchScheduleInfo.origin" class="origin">
+        <el-checkbox :label="Number(0)" @change="queryWorkList">任务排期</el-checkbox>
+        <el-checkbox :label="Number(1)" @change="queryWorkList">日程</el-checkbox>
+      </el-checkbox-group>
+      <el-button type="primary" size="small" class="add" @click="add()">添加日程</el-button>
+    </div>
+    <el-table
+      :data="tableData"
+      style="width: 100%"
+      row-key="id"
+      :header-cell-style="{ backgroundColor: 'rgba(240,242,244,0.7)' ,color: '#333B4A', fontSize: '14px', fontWeight: '550', textAlign: 'center' }"
+      show-overflow-tooltip="true"
+      :header-row-style="{height: '61px'}"
+    >
+      <el-table-column label="日程名称" prop="name" width="250" align="center" show-overflow-tooltip />
+      <el-table-column label="日期" width="250" align="center" prop="seperateDaysHasHoliday" />
+      <el-table-column label="参与人" align="center" width="120">
+        <template slot-scope="scope">
+          {{ scope.row.peopleObjectList | peopleListHandler }}
+        </template>
+      </el-table-column>
+      <el-table-column label="业务线" align="center" width="120">
+        <template slot-scope="scope">
+          {{ scope.row.bizName }}
+        </template>
+      </el-table-column>
+      <el-table-column label="使用/工作日/全部" align="center" width="150">
+        <template slot-scope="scope">
+          {{ scope.row.needDays }}/
+          {{ scope.row.legalDays }}/
+          {{ scope.row.allDays }}
+        </template>
+      </el-table-column>
+      <el-table-column label="是否同步团队日程" align="center" width="150">
+        <template slot-scope="scope">
+          {{ scope.row.syncTeam === 1?'是':'否' }}
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="操作" min-width="150">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            @click="handleEdit(scope.row)"
+          >编辑</el-button>
+          <el-button
+            size="mini"
+            type="danger"
+            @click="handleDelete(scope.row)"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </article>
+</template>
+<script>
+import { queryWorkList } from '@/api/workSchedule.js'
+export default {
+  filters: {
+    peopleListHandler(val) {
+      if (!val) {
+        return
+      }
+      const newArr = val.map(item => item.name)
+      return newArr.join(',')
+    }
+  },
+  data() {
+    return {
+      form_busy_1: {
+        searchScheduleInfo: {
+          status: 0, // 进行中 0、未开始 1、过去的 2
+          origin: [0, 1]// 任务排期 0、个人日程1
+        },
+        teamSearchInfo: { bizId: localStorage.getItem('bizId') || null },
+        pageInfoDO: {
+          curIndex: 1,
+          pageSize: 10
+        }
+      },
+      statusOptions: [{
+        value: 0,
+        label: '进行中'
+      }, {
+        value: 1,
+        label: '未开始'
+      }, {
+        value: 2,
+        label: '过去的'
+      }],
+      busy: 0,
+      tableData: []
+    }
+  },
+  created() {
+    this.queryWorkList()
+  },
+  methods: {
+    async queryWorkList() {
+      if (this.busy === 1) {
+        const res = await queryWorkList(this.form)
+        if (res.code === 200) {
+          this.tableData = res.data.list
+        }
+      } else {
+
+      }
+    },
+    handleEdit() {
+
+    },
+    handleDelete() {
+
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+article{
+  margin: 20px 35px;
+  .table-top {
+    margin-bottom: 35px;
+    display: flex;
+    align-items: center;
+    position: relative;
+    width: 100%;
+    .add {
+      position: absolute;
+      top: 50%;
+      right: 0;
+      transform: translateY(-50%);
+    }
+    .origin {
+      margin-left: 20px;
+    }
+    .status {
+      margin-left: 20px;
+      width: 100px;
+    }
+  }
+}
+</style>

+ 215 - 132
src/views/workbench/person/index.vue

@@ -96,70 +96,98 @@
       <!-- 日程 -->
       <el-container>
         <section class="main-section">
-          <MyFullCalendar :events="calendarEvents" @dateClick="dateClick" @expand="calendarDialogVisible = true" @change="queryWorkListByTime" @select="select" @eventDrop="updateSelfSchedule" />
+          <MyFullCalendar
+            :events="calendarEvents"
+            @dateClick="dateClick"
+            @change="queryWorkListByTime"
+            @select="select"
+            @eventClick="showSchedule"
+            @add="dateClick"
+          />
         </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>
       </el-container>
       <!-- 日程 -->
-      <el-dialog
-        class="workbench_fullscreen_dialog"
-        :visible.sync="calendarDialogVisible"
-        :fullscreen="true"
-        style="margin-top: 55px;"
-        :modal="false"
-      >
-        <el-tabs v-model="tabsActiveName" style="margin-right: 20px;" @tab-click="handleTabsClick">
-          <el-tab-pane label="日历视图" name="1" style="padding: 31px 146px">
-            <MyFullCalendar :events="calendarEvents" type="big" @dateClick="dateClick" @change="queryWorkListByTime" @select="select" @eventDrop="updateSelfSchedule" />
-          </el-tab-pane>
-        </el-tabs>
-      </el-dialog>
       <!-- 日程操作弹框 -->
       <calendar-dialog
         :title="'编辑日程'"
-        :visible="updateSelfScheduleDialog.visible"
-        :data="updateSelfScheduleDialog.data"
-        @cancel="updateSelfScheduleDialog.visible = false"
-        @confirm="updateSelfScheduleDialog.visible = false;queryWorkList();queryWorkListByTime(calendarView)"
+        :visible.sync="updateSchedule.visible"
+        :data="updateSchedule.data"
+        @confirm="queryWorkListByTime(calendarView)"
       />
       <calendar-dialog
         :title="'新建日程'"
-        :visible="createSelfScheduleDialog.visible"
-        :data="createSelfScheduleDialog.data"
-        @cancel="createSelfScheduleDialog.visible = false"
-        @confirm="createSelfScheduleDialog.visible = false;queryWorkList();queryWorkListByTime(calendarView)"
-      />
-      <delete-dialog
-        :content="'是否删除当前日程'"
-        :visible="deleteSelfScheduleDialog.visible"
-        @cancel="deleteSelfScheduleDialog.visible = false"
-        @confirm="deleteSelfSchedule();queryWorkListByTime(calendarView)"
+        :visible.sync="createSchedule.visible"
+        :data="createSchedule.data"
+        @confirm="queryWorkListByTime(calendarView)"
       />
       <!-- 日程操作弹框 -->
+      <!-- 排期操作弹框 -->
+      <modify-schedule
+        v-if="visibleSchedule"
+        :visible.sync="visibleSchedule"
+        :detail-data="updateSchedule.data"
+        :title="'修改排期'"
+        @update="queryWorkListByTime(calendarView)"
+      />
+    <!-- 排期操作弹框 -->
     </el-container>
   </div>
 </template>
 
 <script>
-const _ = require('lodash')
+// const _ = require('lodash')
 import MyFullCalendar from './myFullCalendar'
 import moment from 'moment'
 import CalendarDialog from './calendarFormDialog'
-import DeleteDialog from '@/components/dialog/delete.vue'
 import {
   queryTeamInfoList,
   showTeamAndMemberEnum,
-  updateSelfSchedule,
   queryWorkListByTime,
-  queryWorkList,
-  queryIdleList,
   deleteSelfSchedule
 } from '@/api/workSchedule.js'
+import { scheduleDelete } from '@/api/projectViewDetails'
+import modifySchedule from '@/views/projectManage/projectList/components/modifySchedule'
 
 export default {
   components: {
     MyFullCalendar,
     CalendarDialog,
-    DeleteDialog
+    modifySchedule
+  },
+  filters: {
+    arrToString(val) {
+      return Array.isArray(val) ? val.join(',') : val
+    }
   },
   data() {
     return {
@@ -173,63 +201,41 @@ export default {
         { title: 'Event Now', start: new Date(), end: new Date().setDate(16) }
       ],
       deleteDialogVisible: false,
-      createSelfScheduleDialog: { // 新建日程
-        visible: false,
-        data: null
-      },
-      updateSelfScheduleDialog: { // 更新日程
+      createSchedule: { // 新建日程
         visible: false,
         data: null
       },
-      deleteSelfScheduleDialog: { // 删除日程
+      updateSchedule: { // 更新日程
         visible: false,
         data: null
       },
-      selfScheduleStatusEnum: [ // 日程状态列表
-        { name: '进行中', code: 0 },
-        { name: '未开始', code: 1 },
-        { name: '过去的', code: 2 }
-      ],
-      selfScheduleListTotal: 10,
-      selfScheduleForm: {
-        searchScheduleInfo: {
-          status: 0,
-          origin: [0, 1]
-        },
-        teamSearchInfo: { bizId: localStorage.getItem('bizId') || null },
-        pageInfoDO: {
-          curIndex: 1,
-          pageSize: 10
-        },
-        syncTeam: 1
-      },
-      selfScheduleBusyTableData: [],
-      selfScheduleIdleTableData: [],
-      busyClassName: 'selected',
-      idleClassName: 'idle',
-      timeSelectVal: [new Date(), moment(new Date()).add(29, 'day')],
-      tabsActiveName: '1',
-      teamInfoShow: false,
       teamAndMemberEnum: {},
       teamAndMemberMap: {},
       teamInfo: null, // 团队信息数据
       userInfo: {},
       username: localStorage.getItem('username'),
       realname: localStorage.getItem('realname'),
-      calendarDialogVisible: false,
-      pickerOptions: {
-        disabledDate(time) {
-          return time.getTime() < Date.now() - 24 * 60 * 60 * 1000
-        }
-      }
+      nowDetailData: null, // 当前日程详情
+      showDetail: false,
+      visibleSchedule: false // 排期任务弹框
     }
   },
   created() {
     this.showTeamAndMemberEnum()
-    this.queryWorkList()
   },
   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) {
@@ -242,88 +248,94 @@ export default {
       }
       return ret
     },
-    async updateSelfSchedule(info) { // 更新日程
-      const form = {
-        id: info.event.id,
-        startTime: info.event.start,
-        endTime: info.event.end
-      }
-      await updateSelfSchedule(form)
+    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`
+    },
+    dateClick(arg) { // 新建日程弹框
+      this.createSchedule.data = arg
+      this.createSchedule.visible = true
     },
-    dateClick(arg) {
-      console.log(arg)
-      // this.createSelfScheduleDialog.data = arg
-      // this.createSelfScheduleDialog.visible = true
+    select(selectionInfo) { // 多选日期新建日程弹框
+      this.createSchedule.data = {
+        startStr: selectionInfo.startStr,
+        endStr: moment(selectionInfo.endStr).subtract(1, 'day').format('YYYY-MM-DD')
+      }
+      this.createSchedule.visible = true
     },
     openUpdateTeamInfoDialog(row) {
 
     },
-    openUpdateSelfScheduleDialog(val) {
-      const form = _.cloneDeep(val)
-      form.startTime = moment(form.startTime).toDate()
-      form.endTime = moment(form.endTime).toDate()
-      form.time = [form.startTime, form.endTime]
-      if (form.bizId !== null) {
-        form.isJoin = 1
-      } else {
-        form.isJoin = 0
+    editSchedule() { // 编辑日程弹框
+      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.updateSelfScheduleDialog.data = form
-      this.updateSelfScheduleDialog.visible = true
-    },
-    openDeleteSelfScheduleDialog(val) { // 关闭删除日程弹框
-      this.deleteSelfScheduleDialog.data = val
-      this.deleteSelfScheduleDialog.visible = true
-    },
-    select(selectionInfo) {
-      this.createSelfScheduleDialog.data = selectionInfo
-      this.createSelfScheduleDialog.visible = true
-    },
-    async deleteSelfSchedule() { // 删除日程
-      const res = await deleteSelfSchedule(this.deleteSelfScheduleDialog.data.id)
-      if (res.code === 200) {
-        this.deleteSelfScheduleDialog.visible = false
-        this.queryWorkList()
+      this.updateSchedule.data = form
+      if (this.nowDetailData.origin === 1) {
+        this.updateSchedule.visible = true
+      } else if (this.nowDetailData.origin === 0) {
+        this.visibleSchedule = true
       }
     },
-    async queryIdleList() { // 获取个人空闲日程列表
-      const params = {
-        timeInfo: {
-          startTime: moment(this.timeSelectVal[0]).format('YYYY.MM.DD'),
-          endTime: moment(this.timeSelectVal[1]).format('YYYY.MM.DD')
-        },
-        pageInfoDO: this.selfScheduleForm.pageInfoDO
-      }
-      const res = await queryIdleList(params)
+    deleteSchedule() { // 确认删除日程或者排期任务
+      this.$confirm('是否删除此日程', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.nowDetailData.origin === 0 ? this.deleteSchedule_0() : this.deleteSchedule_1()
+      })
+    },
+    async deleteSchedule_1() { // 删除日程
+      const res = await deleteSelfSchedule(this.nowDetailData.id)
       if (res.code === 200) {
-        this.selfScheduleIdleTableData = res.data.list
-        this.selfScheduleListTotal = res.data.total
+        this.showDetail = false
+        this.queryWorkListByTime(this.calendarView)
+        this.$message({ type: 'success', message: '删除成功!' })
       }
     },
-    async queryWorkList() { // 获取用户日程信息列表
-      const res = await queryWorkList(this.selfScheduleForm)
+    async deleteSchedule_0() { // 删除排期
+      const res = await scheduleDelete(this.nowDetailData.id)
       if (res.code === 200) {
-        this.selfScheduleBusyTableData = res.data.list
-        this.selfScheduleListTotal = res.data.total
+        this.showDetail = false
+        this.queryWorkListByTime(this.calendarView)
+        this.$message({ message: '删除成功', type: 'success', duration: 1000, offset: 150 })
       }
     },
     async queryWorkListByTime(view) { // 获取指定时间段用户日程信息
-      console.log('queryWorkListByTime:', view)
       this.calendarView = view
       const params = {
-        startTime: moment(view.activeStart).subtract(1, 'month').format('YYYY.MM.DD'),
-        endTime: moment(view.activeEnd).add(1, 'month').format('YYYY.MM.DD'),
+        timeInfo: {
+          startTime: moment(view.activeStart).subtract(1, 'month').format('YYYY.MM.DD'),
+          endTime: moment(view.activeEnd).add(1, 'month').format('YYYY.MM.DD')
+        },
         teamSearchInfo: { bizId: localStorage.getItem('bizId') || null },
         searchScheduleInfo: { origin: [0, 1] }
       }
       const res = await queryWorkListByTime(params)
       if (res.code === 200) {
-        this.calendarEvents = res.data.map(item => ({
-          id: item.id,
-          title: item.name,
-          start: moment(item.startTime).toDate(),
-          end: moment(item.endTime).toDate()
-        }))
+        this.calendarEvents = res.data.map(item => {
+          return {
+            id: item.id,
+            title: `${item.peopleObject.name}:${item.name}`,
+            start: moment(item.startTime).toDate(),
+            end: moment(item.endTime).add(1, 'day').toDate(),
+            detailData: item
+          }
+        })
       }
     },
     handleTabsClick() {}, // 标签页切换
@@ -430,6 +442,77 @@ export default {
     }
   }
 }
+.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>
 
 <style scoped>

+ 73 - 116
src/views/workbench/person/myFullCalendar.vue

@@ -1,31 +1,32 @@
 <template>
   <div :style="type+'-calendar-container'">
-    <link href="https://use.fontawesome.com/releases/v5.0.6/css/all.css" rel="stylesheet">
-    <link
-      href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
-      rel="stylesheet"
-    >
     <div :class="type+ '-calendar-header'">
-      <el-row style="margin-bottom: 10px;">
-        <el-col :span="type=='small'?7:7" style="display: inline-block;white-space: nowrap;">
-          <button class="prev" @click="callCalendarApi('prev')"><span class="fa fa-chevron-left" /></button>
-          <button class="next" style="margin-left: -4px" @click="callCalendarApi('next')"><span class="fa fa-chevron-right" /></button>
-          <button :class="todayClassName" style="margin-left:3%" @click="callCalendarApi('today')">今天</button>
-        </el-col>
-        <el-col :span="type=='small'?9:10">
-          <div style="display: inline-block;width: 100%;text-align:center;white-space: normal" class="title">{{ calendarTitle }}</div>
-        </el-col>
-        <el-col :span="type=='small'?8:7">
-          <div style="display: inline-block;width: 100%;text-align:right;white-space: nowrap;">
-            <button :class="monthClassName" @click="callCalendarApi('changeView','dayGridMonth');changeClassName('month')">月</button>
-            <button :class="weekClassName" @click="callCalendarApi('changeView','timeGridWeek');changeClassName('week')">周</button>
-            <button :class="dayClassName" @click="callCalendarApi('changeView','timeGridDay');changeClassName('day')">日</button>
-            <button v-if="type =='small'" class="amplify" style="margin-left: 3%" @click="expand()"><span class="fa fa-expand" /></button>
-          </div>
-        </el-col>
-      </el-row>
+      <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">
+        <div class="calender-top-control">
+          <el-button-group>
+            <el-button icon="el-icon-arrow-left" size="small" @click="callCalendarApi('prev')" />
+            <el-button icon="el-icon-arrow-right" size="small" @click="callCalendarApi('next')" />
+          </el-button-group>
+          <el-button-group v-if="weekMonYear">
+            <el-button type="primary" size="small" @click="callCalendarApi('changeView','dayGridMonth')">月</el-button>
+            <el-button type="primary" size="small" @click="callCalendarApi('changeView','timeGridWeek')">周</el-button>
+            <el-button type="primary" size="small" @click="callCalendarApi('changeView','timeGridDay')">日</el-button>
+          </el-button-group>
+          <el-button-group>
+            <el-button type="primary" size="small" :class="todayClassName" @click="callCalendarApi('today')">今天</el-button>
+          </el-button-group>
+        </div>
+        <div class="calender-top-title">{{ calendarTitle }}</div>
+        <div><el-button type="primary" size="small" @click="add()">添加日程</el-button></div>
+      </article>
+      <calender-list v-show="activeName === '2'" />
     </div>
     <FullCalendar
+      v-show="activeName === '1'"
       :id="type + '-calendar'"
       ref="fullCalendar"
       :class="type + '-calendar'"
@@ -39,10 +40,8 @@
       editable="false"
       droppable="false"
       selectable="true"
-      display-event-end="true"
       event-color="#409EFF"
-      event-limit="true"
-      event-limit-text="更多"
+      :display-event-time="false"
       :plugins="calendarPlugins"
       :weekends="calendarWeekends"
       :events="events"
@@ -80,33 +79,38 @@ 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
+    FullCalendar,
+    calenderList
     // CalendarDialog,
     // DeleteDialog
   },
   props: {
     type: {
       type: String,
-      default: 'small'
+      default: 'small',
+      required: false
     },
     events: {
       type: Array,
-      default() {
-        return []
-      }
+      default: () => [],
+      required: false
+    },
+    weekMonYear: {
+      type: Boolean,
+      default: false,
+      required: false
     }
   },
   data() {
     return {
+      activeName: '1',
       today: new Date(),
-      monthClassName: 'month selected',
-      weekClassName: 'week',
-      dayClassName: 'day',
       todayClassName: 'today',
       evnetTime: {
         hour: 'numeric',
@@ -146,21 +150,12 @@ export default {
         // initial event data
         { title: 'Event Now', start: new Date(), end: new Date().setDate(16) }
       ],
-      teamInfoShow: false,
-      teamAndMemberEnum: {},
-      teamAndMemberMap: {},
-      teamInfo: [],
-      userInfo: {},
-      username: localStorage.getItem('username'),
-      realname: localStorage.getItem('realname'),
-      accountInfo: {},
       deleteDialogVisible: false,
       calendarDialogProperty: {
         title: '新建日程',
         visible: false,
         data: null
       },
-      isCalendarCreated: false,
       calendarTitle: ''
     }
   },
@@ -171,21 +166,6 @@ export default {
     expand() {
       this.$emit('expand', true)
     },
-    changeClassName(val) {
-      if (val === 'month') {
-        this.monthClassName = 'month selected'
-        this.weekClassName = 'week'
-        this.dayClassName = 'day'
-      } else if (val === 'week') {
-        this.monthClassName = 'month'
-        this.weekClassName = 'week selected'
-        this.dayClassName = 'day'
-      } else if (val === 'day') {
-        this.monthClassName = 'month'
-        this.weekClassName = 'week'
-        this.dayClassName = 'day selected'
-      }
-    },
     callCalendarApi(methods, viewName) {
       const calendarApi = this.$refs.fullCalendar.getApi()
       this.$emit('change', calendarApi.view)
@@ -203,7 +183,7 @@ export default {
         this.todayClassName = 'today'
       }
     },
-    select(selectionInfo) {
+    select(selectionInfo) { // 滑动多选时候返回的数据
       this.$emit('select', selectionInfo)
     },
     datesRender(arg) {
@@ -222,80 +202,57 @@ export default {
     eventClick(info) {
       this.$emit('eventClick', info)
       // alert('Event: ' + info.event.title)
-      info.el.style.borderColor = 'red'
-      info.el.style.backgroundColor = 'red'
+      // info.el.style.borderColor = 'red'
+      // info.el.style.backgroundColor = 'red'
       // this.deleteDialogVisible = true
+    },
+    add() {
+      this.$emit('add')
     }
   }
 }
 </script>
 
-<style scoped>
-.small-calendar-header .title,
-.big-calendar-header .title {
-  font-weight:500;
-  width: 40%;
-}
-.small-calendar-header .title{
-  font-size: 12px;
-}
-.big-calendar-header .title {
-  font-size: 16px;
-}
-.small-calendar-header button,.big-calendar-header button {
-  background-color: #fff;
-  color: #6f7c93;
-  border: 0.5px solid #bfc6dc;
-}
-.small-calendar-header button {
-  font-size: 12px;
-}
-.big-calendar-header button {
-  font-size: 14px;
-  height: 32px;
-  width: 32px;
-}
-.big-calendar-header .today {
-  width: 50px;
-  height: 32px;
+<style scoped lang="scss">
+>>>.el-tabs__nav-scroll{
+  margin: 0 35px;
 }
-.small-calendar-header button:hover,.big-calendar-header button:hover {
-  background-color: #409eff;
-  color: #fff;
-  border: 0.5px solid #409eff;
+>>>.el-tabs__nav-wrap::after{
+  height: 1px;
 }
-.small-calendar-header .next,.week,.day,
-.big-calendar-header .next,.week,.day {
-  margin-left: -4px;
-  border-left: none;
-}
-.small-calendar-header .week,
-.big-calendar-header .week {
-  border-right: none;
-  border-left: none;
+.calender-top {
+  display: flex;
+  height: 80px;
+  align-items: center;
+  justify-content: space-between;
+  margin: 0 35px;
+  .calender-top-title {
+    font-size:16px;
+    font-family:PingFangSC-Medium;
+    color:rgba(51,59,74,1);
+  }
 }
-.small-calendar-header .prev,.month,
-.big-calendar-header .prev,.month {
-  border-radius: 4px 0 0 4px;
+>>>.fc-content {
+  height: auto !important;
+  display: flex;
+  padding-top: 2px;
 }
-.small-calendar-header .day,.next,
-.big-calendar-header .day,.next {
-  border-radius: 0 4px 4px 0;
+>>>.fc-event-container .fc-content {
+  text-overflow: inherit;
 }
-.small-calendar-header .today,.amplify,
-.big-calendar-header .today,.amplify {
-  border-radius: 4px;
+>>>.fc-day-grid-event .fc-content{
+  white-space: normal;
 }
-.small-calendar-header .selected,
-.big-calendar-header .selected {
-  background-color: #409eff;
-  color: #fff;
-  border: 0.5px solid #409eff;
+>>>.fc-event {
+  line-height: auto !important;
 }
 </style>
 
 // fullcalendar
 <style lang='scss'>
+#small-calendar {
+  margin: 0 35px 50px 35px;
+}
 #small-calendar .btn-primary {
   background-color: #fff;
   color: #6f7c93;