浏览代码

工作台需求列表

wangziqian 5 年之前
父节点
当前提交
4c386e43d9

+ 54 - 0
src/api/workSchedule.js

@@ -104,3 +104,57 @@ export function queryTeamWorkList(data) {
     data
   })
 }
+
+// 获取个人项目
+export function projectSelfList(data) {
+  return request({
+    url: TeamManagement + `/project/selfList`,
+    method: 'post',
+    data
+  })
+}
+
+// 获取团队项目
+export function projectTeamList(data) {
+  return request({
+    url: TeamManagement + `/project/teamList`,
+    method: 'post',
+    data
+  })
+}
+
+// 获取个人需求
+export function requirementSelfList(data) {
+  return request({
+    url: TeamManagement + `/requirement/selfList`,
+    method: 'post',
+    data
+  })
+}
+
+// 获取团队需求
+export function requirementTeamList(data) {
+  return request({
+    url: TeamManagement + `/requirement/teamList`,
+    method: 'post',
+    data
+  })
+}
+
+// 获取个人任务
+export function taskSelfList(data) {
+  return request({
+    url: TeamManagement + `/task/selfList`,
+    method: 'post',
+    data
+  })
+}
+
+// 获取团队任务
+export function taskTeamList(data) {
+  return request({
+    url: TeamManagement + `/task/teamList`,
+    method: 'post',
+    data
+  })
+}

+ 0 - 148
src/api/workbench.js

@@ -1,148 +0,0 @@
-import request from '@/utils/request'
-import { workbenchUrl } from '@/apiConfig/api'
-// ================================== Interface ======================================
-
-export default {
-  createSelfSchedule,
-  updateSelfSchedule,
-  getSelfSchedule,
-  deleteSelfSchedule,
-  queryTeamInfoList,
-  showTeamAndMemberEnum,
-  queryWorkListByTime,
-  queryWorkList,
-  queryIdleList,
-  queryTeamWorkList,
-  queryTeamIdleList
-}
-
-// 创建个人日程
-export function createSelfSchedule(data) {
-  return request({
-    url: workbenchUrl + '/selfSchedule/create',
-    method: 'post',
-    data
-  })
-}
-
-// 更新个人日程
-export function updateSelfSchedule(data) {
-  return request({
-    url: workbenchUrl + '/selfSchedule/update',
-    method: 'post',
-    data
-  })
-}
-
-// 获取个人日程
-export function getSelfSchedule(data) {
-  return request({
-    url: workbenchUrl + '/selfSchedule/get',
-    method: 'get',
-    params: data
-  })
-}
-
-// 删除个人日程
-export function deleteSelfSchedule(id) {
-  return request({
-    url: workbenchUrl + '/selfSchedule/delete?id=' + id,
-    method: 'post'
-  })
-}
-
-// 获取指定时间段用户日程信息
-export function queryWorkListByTime(data) {
-  return request({
-    url: workbenchUrl + '/workbench/personal/queryWorkListByTime',
-    method: 'post',
-    data
-  })
-}
-
-// 获取用户日程信息
-export function queryWorkList(data) {
-  return request({
-    url: workbenchUrl + '/workbench/personal/queryWorkList',
-    method: 'post',
-    data
-  })
-}
-
-// 获取个人空闲日程列表
-export function queryIdleList(data) {
-  return request({
-    url: workbenchUrl + '/workbench/personal/queryIdleList',
-    method: 'post',
-    data
-  })
-}
-
-// 获取团队用户日程信息
-export function queryTeamWorkList(data) {
-  return request({
-    url: workbenchUrl + '/workbench/personal/queryTeamWorkList',
-    method: 'post',
-    data
-  })
-}
-
-// 获取团队用户空闲信息
-export function queryTeamIdleList(data) {
-  return request({
-    url: workbenchUrl + '/workbench/personal/queryTeamIdleList',
-    method: 'post',
-    data
-  })
-}
-
-// 获取用户团队列表
-export function queryTeamInfoList(data) {
-  return request({
-    url: workbenchUrl + '/team/queryTeamInfoList',
-    method: 'post',
-    data
-  })
-}
-
-// 角色信息枚举类
-export function showTeamAndMemberEnum(data) {
-  return request({
-    url: workbenchUrl + '/config/showTeamAndMemberEnum',
-    method: 'get',
-    data
-  })
-}
-
-// 创建文件夹
-export function personalworkstationQueryBackLog(data) {
-  return request({
-    url: workbenchUrl + '/personalworkstation/queryBackLog',
-    method: 'post',
-    data
-  })
-}
-
-export function personalworkstationQueryBackLogBugAndTask(data) {
-  return request({
-    url: workbenchUrl + '/personalworkstation/queryBackLogBugAndTask',
-    method: 'post',
-    data
-  })
-}
-
-export function personalworkstationQueryStatusAndPriority(data) {
-  return request({
-    url: workbenchUrl + '/personalworkstation/queryStatusAndPriority',
-    method: 'post',
-    data
-  })
-}
-
-export function personalworkstationQueryPeriodBugAndTask(data) {
-  return request({
-    url: workbenchUrl + '/personalworkstation/queryPeriodBugAndTask',
-    method: 'post',
-    data
-  })
-}

+ 1 - 0
src/styles/detail-pages.scss

@@ -103,6 +103,7 @@
   min-height: 99%;
   margin: 0 10px 10px 10px;
   background-color: #ffffff;
+  border-radius: 5px;
   .el-main-title {
     display: flex;
     align-items: center;

+ 2 - 4
src/views/projectManage/projectList/components/needsList.vue

@@ -48,10 +48,10 @@
         <template slot-scope="scope">{{ scope.row.sourceTypeName }}</template>
       </el-table-column>
       <el-table-column label="跟版客户端" width="150" align="center" show-overflow-tooltip>
-        <template slot-scope="scope">{{ scope.row.app }}</template>
+        <template slot-scope="scope">{{ scope.row.referredClientTypeName }}</template>
       </el-table-column>
       <el-table-column label="PRD连接" width="180" align="center" show-overflow-tooltip>
-        <template slot-scope="scope"><a :href="scope.row.mrdUrl" /></template>
+        <template slot-scope="scope"><a :href="scope.row.mrdUrl">{{ scope.row.mrdUrl }}</a></template>
       </el-table-column>
       <el-table-column label="任务数量" align="center">
         <template slot-scope="scope">{{ scope.row.taskCount }}</template>
@@ -81,14 +81,12 @@ export default {
       const res = await showRequirementEnum()
       if (res.code === 200) {
         this.allStatus = res.data.requirementStatus
-        console.log(res.data)
       }
     },
     async getNeedsList() {
       const res = await requirementQueryRequirementInfoList({ belongingProject: this.$route.query.id })
       if (res.code === 200) {
         this.needsDataList = res.data.list
-        console.log(res.data)
       }
     },
     async changeStatus(e) { // 状态改变

+ 264 - 0
src/views/workbench/team/components/needsList.vue

@@ -0,0 +1,264 @@
+<template>
+  <div>
+    <div class="search-control">
+      <span :class="{'color-blue': status===5}" @click="status = 5;getNeedsList()">进行中的需求</span>
+      <span :class="{'color-blue': status===0}" @click="status = 0;getNeedsList()">未开始的需求</span>
+      <span :class="{'color-blue': status===25}" @click="status = 25;getNeedsList()">已上线的需求</span>
+    </div>
+    <el-table
+      ref="planTable"
+      :data="needsDataList"
+      style="width: 100%;"
+      size="mini"
+      row-key="id"
+      :header-cell-style="{ color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500'}"
+      :row-style="{ fontSize: '14px' }"
+      show-overflow-tooltip="true"
+      :header-row-style="{height: '50px'}"
+    >
+      <el-table-column label="优先级" prop="priority" width="100" sortable align="center">
+        <template slot-scope="scope" style="text-align: center;">
+          <span class="div_priority" :class="scope.row.priorityName">
+            {{ scope.row.priorityName }}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="需求名称" min-width="250" align="left" show-overflow-tooltip>
+        <template slot-scope="scope">
+          <div class="table-project-name" @click="needs_link(scope.row.id)">
+            <span class="id">{{ scope.row.requirementDisplayId }}</span>
+            <span class="name">{{ scope.row.name }}</span>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="业务线" width="150" align="center" prop="bizName" show-overflow-tooltip />
+      <el-table-column label="状态" width="105" align="center">
+        <template slot-scope="scope">
+          <el-select
+            v-model="scope.row.status"
+            :class="['status'+scope.row.status]"
+            class="btns"
+            size="mini"
+            @change="changeStatus(scope.row)"
+          >
+            <el-option v-for="item in allStatus" :key="item.code" :label="item.msg" :value="item.code" />
+          </el-select>
+        </template>
+      </el-table-column>
+      <el-table-column label="需求来源" width="200" align="center" prop="sourceTypeName" show-overflow-tooltip />
+      <el-table-column label="所属项目" width="250" align="center" prop="belongingProjectName" show-overflow-tooltip />
+      <el-table-column label="跟版客户端" width="150" align="center" prop="referredClientTypeName" show-overflow-tooltip />
+      <el-table-column label="PM" width="150" align="center" show-overflow-tooltip>
+        <template v-if="scope.row.pm" slot-scope="scope">
+          <span>{{ scope.row.pm.name }}</span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div align="right">
+      <el-pagination
+        :page-sizes="[15, 30, 45, total]"
+        :current-page.sync="pages.curIndex"
+        :page-size="pages.pageSize"
+        background
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+  </div>
+</template>
+<script>
+import {
+  requirementSelfList,
+  requirementTeamList
+} from '@/api/workSchedule'
+import { showRequirementEnum, updateRequirementStatus } from '@/api/requirement'
+export default {
+  props: {
+    searchForm: {
+      type: Object,
+      default: () => {
+        return {
+          teamId: null,
+          bizId: null
+        }
+      },
+      required: true
+    },
+    type: {
+      type: String,
+      default: 'person',
+      required: true
+    }
+  },
+  data() {
+    return {
+      needsDataList: [], // 需求列表
+      allStatus: [], // 状态列表
+      pages: {
+        pageSize: 15,
+        curIndex: 1
+      },
+      total: 0,
+      status: 5 // 列表状态
+    }
+  },
+  watch: {
+    searchForm: {
+      handler(newV) {
+        this.getNeedsList()
+      },
+      deep: true
+    },
+    type: {
+      handler(newV) {
+        this.getNeedsList()
+      }
+    }
+  },
+  created() {
+    this.getTaskStatus()
+    this.getNeedsList()
+  },
+  methods: {
+    handleSizeChange(val) {
+      this.pageSize = val
+    },
+    handleCurrentChange(val) {
+      this.curIndex = val
+      this.getNeedsList()
+    },
+    async getTaskStatus() { // 获取需求的所有状态
+      const res = await showRequirementEnum()
+      if (res.code === 200) {
+        this.allStatus = res.data.requirementStatus
+      }
+    },
+    async getNeedsList() { // 获取需求列表
+      const params = {
+        teamSearchInfo: this.searchForm,
+        status: this.status,
+        pageInfoDO: this.pages
+      }
+      let res = null
+      if (this.type === 'person') {
+        res = await requirementSelfList(params)
+      } else if (this.type === 'team') {
+        res = await requirementTeamList(params)
+      }
+      if (res && res.code === 200) {
+        this.needsDataList = res.data
+        this.total = res.total
+      }
+    },
+    async changeStatus(e) { // 状态改变
+      const modifier = localStorage.getItem('username')
+      const res = await updateRequirementStatus({ id: e.id, status: e.status, modifier: modifier })
+      if (res.code === 200) {
+        this.$message({ message: '修改成功', type: 'success', offset: 150 })
+      }
+    },
+    needs_link(id) {
+      this.$router.push({ name: '需求详情', query: { id: id }})
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+@mixin setStatus($color) {
+  input {
+    color:$color;
+    border: 1px solid $color;
+  }
+  >>> .el-select__caret{
+    color:$color;
+  }
+  >>> .el-input__inner{
+    color:$color;
+    border-color: $color;
+  }
+  >>> .el-input__inner:focus {
+    border-color: $color;
+  }
+}
+>>>.el-row .el-col {
+  margin: 10px 0;
+}
+.color-blue {
+	color:#409EFF;
+}
+.P0 {
+  background-color: #F56C6C;
+}
+.P1 {
+  background-color: #FF8952;
+}
+.P2 {
+  background-color: #F5E300;
+}
+.P3 {
+  background-color: #7ED321;
+}
+.P4 {
+  background-color: #61D3B8;
+}
+.P5 {
+  background-color: #69B3FF;
+}
+.P6 {
+  background-color: #BDBDBD;
+}
+.status0 {
+  @include setStatus(#409EFF)
+}
+.status5 {
+  @include setStatus(#FF8952)
+}
+.status10 {
+  @include setStatus(#FF8952)
+}
+.status15 {
+  @include setStatus(#FF8952)
+}
+.status20 {
+  @include setStatus(#FF8952)
+}
+.status25 {
+  @include setStatus(#7ED321)
+}
+.search-control {
+	padding: 30px 15px 0;
+	color: #333B4A;
+	font-size: 14px;
+	span {
+		margin-right: 35px;
+		cursor: pointer;
+	}
+}
+.div_priority {
+  text-align: center;
+  color: #ffffff;
+  padding: inherit;
+  border-radius: 4px;
+  width: 40px;
+  display: inline-block;
+}
+.table-project-name {
+  cursor: pointer;
+  display: flex;
+  justify-content: center;
+  flex-direction: column;
+  .id {
+    color: #A7AEBC;
+    font-size: 10px;
+  }
+  .name {
+    font-size: 14px;
+    color: #666666;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+  }
+}
+</style>

+ 526 - 0
src/views/workbench/team/components/taskList.vue

@@ -0,0 +1,526 @@
+<template>
+  <div>
+    <el-row v-if="!showHeader" class="select-main" type="flex" align="center">
+      <el-col :span="2" class="flex-align-center">
+        <el-checkbox v-model="planChecked" class="plan-checked" @change="changeCheck" />
+      </el-col>
+      <el-col :span="3" class="item-checked">已选择<span style="color: #409EFF">{{ curcentChecked }}</span>个</el-col>
+      <el-col :span="1" class="item-line">|</el-col>
+      <el-col :span="2" class="item-click" @click.native="addSechedule()"><img :src="imgUrl">添加排期</el-col>
+      <el-col :span="2" class="item-click" @click.native="handlePlan('test')"><img :src="imgUrl">提测</el-col>
+      <el-col :span="2" class="item-click" @click.native="handlePlan('allow')"><img :src="imgUrl">准出</el-col>
+      <el-col :span="4" class="item-click" @click.native="handlePlan('daily')"><img :src="imgUrl">建立测试日报</el-col>
+      <el-col :span="4" class="item-click" @click.native="handlePlan('cancel')">取消选择</el-col>
+    </el-row>
+    <el-table
+      ref="planTable"
+      :data="all_task"
+      style="width: 100%;"
+      size="mini"
+      row-key="id"
+      :expand-row-keys="expandArr"
+      :header-cell-style="{ color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500'}"
+      :row-style="{ fontSize: '14px' }"
+      show-overflow-tooltip="true"
+      :show-header="showHeader"
+      :header-row-style="{height: '50px'}"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column type="expand" width="40">
+        <template slot="header">
+          <div class="expand"><i v-show="!allChange" class="el-icon-plus" @click="expandAll(true)" /></div>
+          <div class="expand"><i v-show="allChange" class="el-icon-minus" @click="expandAll(false)" /></div>
+        </template>
+        <template slot-scope="props">
+          <schedule-list :id="props.row.id" :type-list="taskScheduleEvent" />
+        </template>
+      </el-table-column>
+      <el-table-column label="优先级" prop="priority" width="90" sortable align="center">
+        <template slot-scope="scope" style="text-align: center;">
+          <span class="div_priority" :class="scope.row.priorityString">
+            {{ scope.row.priorityString }}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="任务名称" width="200" align="left" show-overflow-tooltip>
+        <template slot-scope="scope">
+          <div class="task-main">
+            <span class="task-id">TASK-{{ scope.row.id }}</span>
+            <span class="task-title" @click="link_task(scope.row.id)">{{ scope.row.name }}</span>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="所属模块" width="150" align="center" show-overflow-tooltip>
+        <template slot-scope="scope">{{ scope.row.moduleInfoName }}</template>
+      </el-table-column>
+      <el-table-column label="状态" width="105" align="center">
+        <template slot-scope="scope">
+          <el-select
+            v-model="scope.row.status"
+            :class="'status'+scope.row.status"
+            class="btns"
+            size="mini"
+            @change="changeStatus(scope.row)"
+          >
+            <el-option v-for="item in allStatus" :key="item.code" :label="item.msg" :value="item.code" />
+          </el-select>
+        </template>
+      </el-table-column>
+      <el-table-column label="所属需求" width="200" align="center" show-overflow-tooltip>
+        <template slot-scope="scope">{{ scope.row.requireName }}</template>
+      </el-table-column>
+      <el-table-column label="跟版客户端" width="120" align="center" show-overflow-tooltip>
+        <template slot-scope="scope">{{ scope.row.involveAppString || '无' }}</template>
+      </el-table-column>
+      <el-table-column label="开发负责人" width="100" align="center" show-overflow-tooltip>
+        <template slot-scope="scope">{{ scope.row.rdObject ? scope.row.rdObject.name : '' }}</template>
+      </el-table-column>
+      <el-table-column label="测试负责人" width="100" align="center" show-overflow-tooltip>
+        <template slot-scope="scope">{{ scope.row.qaObject ? scope.row.qaObject.name : '' }}</template>
+      </el-table-column>
+      <el-table-column label="任务进度" min-width="150" align="center">
+        <template slot-scope="scope">
+          <el-progress :percentage="Number(scope.row.rate && scope.row.rate.substring(0,4))" color="#409eff" />
+        </template>
+      </el-table-column>
+    </el-table>
+    <TestReport v-if="dialogTestReport" ref="TestReport" />
+    <DailyReport v-if="dialogDailyReport" ref="DailyReport" />
+    <ClientReport v-if="dialogClientReport" ref="ClientReport" />
+    <taskDialog v-if="showTaskDialog" :show.sync="showTaskDialog" :task-id="taskId.id" :status-name="taskId.statusString" @getList="get_allTask" />
+    <normal-dialog :show-dialog.sync="statusDialog" :title="'状态变更:已上线'" :width="'50%'" @confirm="confirmStatus()">
+      <div class="dialog-change-status">
+        <span>实际上线时间:</span>
+        <el-date-picker v-model="changeStatusDate" type="date" style="width:100%;" placeholder="选择日期" format="yyyy-MM-dd HH:mm:ss" />
+      </div>
+    </normal-dialog>
+    <!-- 批量排期 -->
+    <modify-schedule
+      v-if="visibleSchedule"
+      :visible.sync="visibleSchedule"
+      :select-task-list="selectTaskList"
+      title="新建排期"
+      @update="get_allTask()"
+    />
+  </div>
+</template>
+<script>
+import imgUrl from '@/assets/建立档案@2x.png'
+import '@/styles/PublicStyle/index.scss'
+import TestReport from '@/views/Platform/presentation/Templates/TestReport' // 提测
+import DailyReport from '@/views/Platform/presentation/Templates/DailyReport' // 日报
+import ClientReport from '@/views/Platform/presentation/Templates/ClientReport' // 准出
+import { taskList } from '@/api/projectIndex'
+import { taskUpdate } from '@/api/projectViewDetails'
+import { configShowTaskEnum } from '@/api/taskIndex'
+import scheduleList from './scheduleList'
+import modifySchedule from './modifySchedule'
+import normalDialog from '@/components/dialog/normalDialog'
+import taskDialog from '@/views/projectManage/taskList/dialog/taskDialog' // 任务状态修改(已上线/已提测/已准出)
+export default {
+  components: {
+    normalDialog,
+    TestReport,
+    DailyReport,
+    ClientReport,
+    scheduleList,
+    taskDialog,
+    modifySchedule
+  },
+  data() {
+    return {
+      imgUrl: imgUrl,
+      changeData: new Map(),
+      allChange: false, // 是否全展开
+      expandArr: [], // 展开行数组
+      showTaskDialog: false, // 状态弹窗
+      inputValue: '',
+      all_task: [], // 任务列表
+      allStatus: [], // 任务所有状态
+      taskScheduleEvent: [], // 排期类型
+      showHeader: true, // 任务列表的表头是否显示
+      curcentList: [], // 当前已选择的列表
+      curcentChecked: 0, // 当前已选择的数量
+      planChecked: false,
+      planHandleType: '', // 任务列表操作类型
+      dialogTestReport: false, // 提测
+      dialogDailyReport: false, // 日报
+      dialogClientReport: false, // 准出
+      statusDialog: false, // 修改状态弹框
+      changeStatusDate: null, // 状态改变时间
+      nowChangeTask: null, // 当前正在改变的任务对象
+      taskId: '', // 将要修改状态的任务id
+      visibleSchedule: false, // 排期弹框
+      selectTaskList: [] // 已选任务的id
+    }
+  },
+  watch: {
+    value: {
+      handler(newV, oldV) {
+        this.inputValue = newV
+      },
+      immediate: true
+    }
+  },
+  created() {
+    this.getTaskStatus()
+    this.get_allTask()
+  },
+  methods: {
+    async get_allTask() { // 获取全部任务
+      const res = await taskList({
+        projectId: this.$route.query.id
+      })
+      if (res.code === 200) {
+        this.all_task = res.data
+      }
+    },
+    async getTaskStatus() { // 获取任务状态列表
+      const res = await configShowTaskEnum()
+      if (res.code === 200) {
+        this.allStatus = res.data.taskStatus
+        this.taskScheduleEvent = res.data.taskScheduleEvent || []
+      }
+    },
+    changeCheck(val) {
+      if (val) {
+        this.all_task.forEach(row => {
+          this.$refs.planTable.toggleRowSelection(row, true)
+        })
+      } else {
+        this.$refs.planTable.clearSelection()
+      }
+    },
+    expandAll(isEx) { // 全部展开
+      this.allChange = isEx
+      isEx ? this.expandArr = this.all_task.map(item => item.id) : this.expandArr = []
+    },
+    async changeStatus(e) { // 状态改变
+      if (e.status === 2 || e.status === 4 || e.status === 5) {
+        this.taskId = e
+        this.allStatus.map(item => {
+          item.code === e.status ? this.taskId.statusString = item.msg : ''
+        })
+        this.showTaskDialog = true
+        this.nowChangeTask = e
+        return
+      } else {
+        const user = {
+          name: localStorage.getItem('username'),
+          ename: localStorage.getItem('realname'),
+          id: ''
+        }
+        const taskInfoDO = e
+        const resTask = await taskUpdate({ taskInfoDO, user })
+        if (resTask.code === 200) {
+          this.$message({ message: resTask.msg, type: 'success', offset: 150 })
+        }
+      }
+    },
+    async confirmStatus() { // 确认更改状态
+      const user = { name: localStorage.getItem('username'), ename: localStorage.getItem('realname'), id: '' }
+      const taskInfoDO = this.nowChangeTask
+      taskInfoDO.onlineRealTime = this.changeStatusDate
+      const resTask = await taskUpdate({ taskInfoDO, user })
+      if (resTask.code === 200) {
+        this.$message({ message: resTask.msg, type: 'success', offset: 150 })
+      }
+    },
+    handleSelectionChange(val) { // 任务列表删选操作
+      val.length > 0 ? this.showHeader = false : this.showHeader = true
+      this.curcentChecked = val.length
+      this.curcentList = val
+      if (val.length === this.all_task.length) {
+        this.planChecked = true
+      }
+    },
+    handlePlan(type) { // 任务列表操作
+      this.planHandleType = type
+      switch (type) {
+        case 'test':
+          this.filtrateTest()
+          break
+        case 'allow':
+          this.filtrateAllow()
+          break
+        case 'daily':
+          this.filtrateDaily()
+          break
+        case 'cancel':
+          this.$refs.planTable.clearSelection()
+          break
+      }
+    },
+    addSechedule() { // 添加排期
+      this.visibleSchedule = true
+      this.selectTaskList = this.curcentList
+    },
+    filtrateTest() { // 提测筛选
+      this.dialogTestReport = true
+      this.$nextTick(() => {
+        this.$refs.TestReport.init(7, this.curcentList.map(item => { return item.id }))
+      })
+    },
+    filtrateAllow() { // 准出筛选
+      this.dialogClientReport = true
+      this.$nextTick(() => {
+        this.$refs.ClientReport.init(7, this.curcentList.map(item => { return item.id }))
+      })
+    },
+    filtrateDaily() { // 建立日报
+      this.dialogDailyReport = true
+      this.$nextTick(() => {
+        this.$refs.DailyReport.init(7, this.curcentList.map(item => { return item.id }))
+      })
+    },
+    link_task(id) { // 跳转到任务详情页
+      this.$router.push({ name: '任务详情', query: { id: id }})
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+@mixin setStatus($color) {
+  input {
+    color:$color;
+    border: 1px solid $color;
+  }
+  >>> .el-select__caret{
+    color:$color;
+  }
+  >>> .el-input__inner{
+    color:$color;
+    border-color: $color;
+  }
+  >>> .el-input__inner:focus {
+    border-color: $color;
+  }
+}
+>>>.el-row .el-col {
+  margin: 10px 0;
+}
+.task-main {
+  display: flex;
+  flex-direction: column;
+  .task-title {
+    cursor: pointer;
+    color: #666666;
+    font-size: 14px;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+  }
+  .task-id {
+    color: #A7AEBC;
+    font-size: 10px;
+  }
+}
+.P0 {
+  background-color: #F56C6C;
+}
+.P1 {
+  background-color: #FF8952;
+}
+.P2 {
+  background-color: #F5E300;
+}
+.P3 {
+  background-color: #7ED321;
+}
+.P4 {
+  background-color: #61D3B8;
+}
+.P5 {
+  background-color: #69B3FF;
+}
+.P6 {
+  background-color: #BDBDBD;
+}
+.status0 {
+  @include setStatus(#409EFF)
+}
+.status3, .status5, .status9, .status13, .status17{
+  @include setStatus(#FF8952)
+}
+.status20 {
+  @include setStatus(#7ED321)
+}
+.expand i {
+  border:1px solid #DCDFE6;
+}
+>>>.el-table__expand-icon{
+  font-size: 14px;
+  .el-icon{
+    margin: 0;
+    transform: translate(-50%, -50%);
+    border:1px solid #DCDFE6;
+  }
+}
+>>>.el-table__expand-icon .el-icon-arrow-right::before{
+  content: "\E6D9";
+}
+>>>.el-table__expand-icon--expanded .el-icon-arrow-right::before{
+  content: "\E6D8";
+}
+>>>.el-table__expand-icon--expanded {
+  transform: rotate(180deg);
+}
+>>>.el-table__expanded-cell {
+  background-color: #FFFFFF;
+  padding: 0;
+}
+>>>.el-table__expanded-cell:hover {
+  background-color: #FFFFFF !important;
+}
+.div_priority {
+  text-align: center;
+  color: #ffffff;
+  padding: inherit;
+  border-radius: 4px;
+  width: 40px;
+  display: inline-block;
+}
+.plan-checked {
+  padding-left: 21px;
+}
+.select-main {
+  height: 50px;
+  border-bottom: 1px solid #DCDFE6;
+  .flex-align-center {
+    display: flex;
+    align-items: center;
+  }
+  .item-checked {
+    width: auto;
+    margin-right: 28px;
+    color: #606266;
+    font-size: 14px;
+    display: flex;
+    align-items: center;
+    justify-content: left;
+    cursor: pointer;
+  }
+  .item-click,.item-line{
+    margin: 0;
+    width: auto;
+    color: #666666;
+    font-size: 14px;
+    display: flex;
+    align-items: center;
+    cursor: pointer;
+    margin-right: 28px;
+    img {
+      height: 13.5px;
+      widows: 13.5px;
+      margin-right: 5px;
+    }
+  }
+  .item-line {
+    color:rgba(102,102,102,0.6);
+  }
+  .cancel {
+    position: absolute;
+    right: 0;
+    top: 50%;
+    transform: translateY(-50%);
+  }
+}
+.descr {
+  display: flex;
+  justify-content: flex-start;
+}
+.planList >>> .el-table th>.cell {
+  padding-left: 14px;
+  padding-right: 14px;
+}
+.dialog-change-status {
+  margin: 2% 3%;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  white-space:nowrap;
+}
+</style>
+<style lang="scss">
+.btns .el-input--suffix .el-input__inner {
+  padding-right: 10px;
+  padding-left: 10px;
+  width: 73px;
+}
+.item{
+  /deep/ input {
+    color: rgb(126, 211, 33);
+    border: 1px solid rgb(126, 211, 33);
+     border-color: rgb(126, 211, 33) !important;
+         font-weight: 900;
+  }
+  /deep/ .el-input__suffix {
+    color: rgb(126, 211, 33) !important;
+    right: 1px;
+  }
+  /deep/ .el-select__caret {
+    color: rgb(126, 211, 33) !important;
+  }
+}
+.item1 {
+  /deep/ input {
+    color: rgb(255, 204, 102);
+     border: 1px solid rgb(255, 204, 102);
+     border-color: rgb(255, 204, 102) !important;
+         font-weight: 900;
+  }
+  /deep/ .el-input__suffix {
+    color: rgb(255, 204, 102) !important;
+    right: 1px;
+  }
+  /deep/ .el-select__caret {
+    color: rgb(255, 204, 102) !important;
+  }
+}
+.item2 {
+  /deep/ input {
+    color: rgb(245, 108, 108);
+    border: 1px solid rgb(245, 108, 108);
+    border-color: rgb(245, 108, 108) !important;
+        font-weight: 900;
+  }
+   /deep/ .el-input__suffix {
+    color: rgb(245, 108, 108) !important;
+    right: 1px;
+  }
+  /deep/ .el-select__caret {
+   color: rgb(245, 108, 108) !important;
+  }
+}
+.item3 {
+  /deep/ input {
+    color: #D675F0;
+    border: 1px solid #D675F0;
+    border-color: #D675F0 !important;
+        font-weight: 900;
+  }
+    /deep/ .el-input__suffix {
+    color: #D675F0 !important;
+    right: 1px;
+  }
+   /deep/ .el-select__caret {
+   color: #D675F0 !important;
+  }
+}
+.item-color {
+  /deep/ input {
+    color: rgb(106, 180, 255);
+    border: 1px solid rgb(106, 180, 255);
+    border-color: rgb(106, 180, 255) !important;
+        font-weight: 900;
+  }
+    /deep/ .el-input__suffix {
+    color: rgb(106, 180, 255) !important;
+    right: 1px;
+  }
+   /deep/ .el-select__caret {
+   color: rgb(106, 180, 255) !important;
+  }
+}
+</style>

+ 12 - 5
src/views/workbench/team/index.vue

@@ -31,15 +31,15 @@
       <div class="top-tabs">
         <el-tabs v-model="activeName" @tab-click="handleClick">
           <el-tab-pane label="团队日程" name="1" />
-          <!-- <el-tab-pane label="概览" name="2" />
+          <el-tab-pane label="项目" name="2" />
           <el-tab-pane label="需求" name="3" />
-          <el-tab-pane label="任务" name="4" /> -->
+          <el-tab-pane label="任务" name="4" />
           <el-tab-pane label="缺陷" name="5" />
         </el-tabs>
       </div>
     </el-header>
     <!-- 顶部导航栏 -->
-    <el-container v-show="activeName === '1'">
+    <el-container v-if="activeName === '1'">
       <section class="main-section">
         <el-tabs v-model="activeSchedule" class="tabs-change">
           <el-tab-pane label="日历视图" name="1" />
@@ -80,6 +80,11 @@
         </div>
       </section>
     </el-container>
+    <el-container v-if="activeName === '3'">
+      <section class="main-section">
+        <needsList :search-form="searchForm" type="team" />
+      </section>
+    </el-container>
     <el-container v-show="activeName === '5'">
       <section class="main-section">
         <bugTableList ref="bugTableDialog" :name="'团队'" :team-id="searchForm.teamId" :biz-id="searchForm.bizId" />
@@ -123,6 +128,7 @@ 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'
+import needsList from '@/views/workbench/team/components/needsList'
 import bugTableList from '@/views/workbench/bugTableList.vue'
 
 export default {
@@ -132,7 +138,8 @@ export default {
     calenderDetail,
     calendarDialog,
     modifySchedule,
-    bugTableList
+    bugTableList,
+    needsList
   },
   data() {
     return {
@@ -163,7 +170,7 @@ export default {
       showDetail: false, // 显示详情弹框
       nowDetailData: {}, // 当前选中日程的数据
       detailXY: [0, 0], // 详情弹框位置
-      origin: [0, 1],
+      origin: [0, 1], // 日程,排期
       createSchedule: { // 新建日程
         visible: false,
         data: null