Prechádzať zdrojové kódy

Merge branch 'pern' into qinqiao_NEW

qinqiao 5 rokov pred
rodič
commit
3183d65768
35 zmenil súbory, kde vykonal 662 pridanie a 354 odobranie
  1. 3 1
      package.json
  2. 16 8
      src/api/requirement.js
  3. 7 2
      src/components/input/textArea.vue
  4. 2 1
      src/components/picker/SelDatePicker.vue
  5. 3 0
      src/components/select/searchPeople.vue
  6. 5 4
      src/styles/detail-pages.scss
  7. 2 2
      src/views/apiManagement/index.vue
  8. 26 5
      src/views/projectManage/bugList/details/bugTableDialog.vue
  9. 16 30
      src/views/projectManage/bugList/details/index.vue
  10. 29 12
      src/views/projectManage/bugList/details/statusChange.vue
  11. 16 3
      src/views/projectManage/dialog_vue.vue
  12. 7 5
      src/views/projectManage/iteration/components/create.vue
  13. 1 1
      src/views/projectManage/iteration/components/iterationTable.vue
  14. 3 4
      src/views/projectManage/iteration/components/modifySchedule.vue
  15. 2 3
      src/views/projectManage/projectList/components/modifySchedule.vue
  16. 21 13
      src/views/projectManage/projectList/components/needsList.vue
  17. 1 1
      src/views/projectManage/projectList/components/scheduleList.vue
  18. 54 28
      src/views/projectManage/projectList/components/taskList.vue
  19. 24 6
      src/views/projectManage/projectList/projectViewDetails.vue
  20. 6 4
      src/views/projectManage/requirement/components/dataStatistics.vue
  21. 6 6
      src/views/projectManage/requirement/components/modifySchedule.vue
  22. 22 50
      src/views/projectManage/requirement/components/scheduleList.vue
  23. 61 39
      src/views/projectManage/requirement/components/taskList.vue
  24. 1 1
      src/views/projectManage/requirement/list/create.vue
  25. 112 24
      src/views/projectManage/requirement/requirementDetail.vue
  26. 7 11
      src/views/projectManage/taskList/components/modifySchedule.vue
  27. 7 7
      src/views/projectManage/taskList/components/reportList.vue
  28. 50 16
      src/views/projectManage/taskList/taskViewDetail.vue
  29. 2 2
      src/views/projectManage/version/list/index.vue
  30. 31 17
      src/views/workbench/bugTableList.vue
  31. 10 3
      src/views/workbench/person/components/calenderDetail.vue
  32. 1 1
      src/views/workbench/person/components/calenderList.vue
  33. 37 0
      src/views/workbench/person/components/myFullCalendar.vue
  34. 38 22
      src/views/workbench/person/index.vue
  35. 33 22
      src/views/workbench/team/index.vue

+ 3 - 1
package.json

@@ -28,6 +28,8 @@
     "axios": "^0.19.2",
     "cnpm": "^6.1.1",
     "core-js": "^2.6.11",
+    "browserslist": "^4.12.0",
+    "caniuse-lite": "^1.0.30001084",
     "crypto-js": "^4.0.0",
     "dayjs": "^1.8.17",
     "echarts": "^4.2.1",
@@ -71,7 +73,7 @@
     "@vue/cli-service": "^4.4.5",
     "@vue/test-utils": "1.0.0-beta.29",
     "ant-design-vue": "^1.6.2",
-    "autoprefixer": "^9.5.1",
+    "autoprefixer": "^9.8.0",
     "babel-core": "7.0.0-bridge.0",
     "babel-eslint": "10.0.1",
     "babel-jest": "^26.0.1",

+ 16 - 8
src/api/requirement.js

@@ -18,6 +18,22 @@ export function showRequirementEnum() {
   })
 }
 
+// 获取需求下历史排期记录
+export function scheduleGetRequireScheduleHistory(id) {
+  return request({
+    url: requestIp + '/schedule/getRequireScheduleHistory?id=' + id,
+    method: 'get'
+  })
+}
+
+// 根据历史记录id获取排期
+export function scheduleGetHistoryScheduleById(id) {
+  return request({
+    url: requestIp + '/schedule/getHistoryScheduleById?id=' + id,
+    method: 'get'
+  })
+}
+
 export function getMemberInfo(data) {
   return request({
     url: requestIp + '/member/queryMemberInfoByIDAPorName',
@@ -90,14 +106,6 @@ export function getBugStatusMapInfo(data) {
   })
 }
 
-export function getTaskByRequireId(data) {
-  return request({
-    url: requestIp + '/task/listByRequireId',
-    method: 'get',
-    params: data
-  })
-}
-
 export function getCommentList(data) {
   return request({
     url: requestIp + '/comment/list',

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

@@ -11,7 +11,7 @@
         </el-tooltip>
       </div>
       <div v-show="!isEmpty && !edit">
-        <pre class="text-pre" @click="ImmediateAddition" v-html="value" />
+        <pre class="text-pre" @click="ImmediateAddition" v-html="handlerText(value)" />
       </div>
       <div :id="'inputUpload_'+id" style="display: none" @click.stop="blur_textarea" />
       <div v-show="edit" class="control">
@@ -120,6 +120,12 @@ export default {
         this.$emit('update:value', this.inputValue)
         this.$emit('change', this.inputValue)
       }
+    },
+    handlerText(val) {
+      if (val) {
+        const reg = new RegExp(/<\/?p[^>]*>/gi)
+        return val.replace(reg, '')
+      }
     }
   }
 }
@@ -142,7 +148,6 @@ article {
   color: #333B4A;
   cursor: pointer;
   min-height: 20vh;
-  padding: 0 40px;
 }
 /deep/ textarea {
   width: calc(100% - 40px);

+ 2 - 1
src/components/picker/SelDatePicker.vue

@@ -32,7 +32,8 @@
 <script>
 const _ = require('lodash')
 import moment from 'moment'
-import 'moment/locale/zh-cn'
+import 'moment/locale/zh-hk'
+moment.locale('zh-hk')
 import locale from 'ant-design-vue/es/date-picker/locale/zh_CN'
 import { getHolidayDayInfo } from '@/api/projectViewDetails'
 export default {

+ 3 - 0
src/components/select/searchPeople.vue

@@ -67,6 +67,9 @@ export default {
   watch: {
     value: {
       handler(newV, oldV) {
+        if (this.searchValue === newV) {
+          return
+        }
         this.searchValue = newV
         const type = Object.prototype.toString.call(this.searchValue)
         if (type.indexOf('Array') < 0) {

+ 5 - 4
src/styles/detail-pages.scss

@@ -79,16 +79,17 @@
     }
   }
   .top-control {
-    width: 20%;
+    width: 235px;
     display: flex;
     justify-content: space-between;
     align-items: center;
     /deep/.icon-add {
-      font-size: 30px;
+      padding-top: 4px;
+      font-size: 20px;
       color: #409EFF;
     }
     /deep/.icon-delete {
-      font-size: 22px;
+      font-size: 20px;
       color: #6F7C93
     }
     .line {
@@ -113,7 +114,7 @@
       border-radius: 1px;
     }
     .title-left-name {
-      width: 100px;
+      width: auto;
       height: 20px;
       font-size: 16px;
       font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","\5FAE\8F6F\96C5\9ED1",Arial,sans-serif;

+ 2 - 2
src/views/apiManagement/index.vue

@@ -23,9 +23,9 @@
             :expand-on-click-node="false"
             @node-click="handleNodeClick"
           >
-            <span slot-scope="{ node, data }" style="display: flex; align-items: center; justify-content: space-between;" class="custom-tree-node" @mouseenter="mouseenter(data)" @mouseleave="mouseleave(data)">
+            <span slot-scope="{ node, data }" style="width:100%;display: flex; align-items: center; justify-content: space-between;" class="custom-tree-node" @mouseenter="mouseenter(data)" @mouseleave="mouseleave(data)">
               <span>{{ node.label }}</span>
-              <span>
+              <span v-show="data.parentId === 0 && data.del === true">
                 <el-tooltip class="item" effect="dark" content="添加接口" placement="top">
                   <span v-if="Interface_list === '接口分类'" class="el-icon-plus Api_btn" @click="() => append(data)" />
                 </el-tooltip>

+ 26 - 5
src/views/projectManage/bugList/details/bugTableDialog.vue

@@ -1,6 +1,13 @@
 <template>
   <div>
-    <el-table size="small" :data="tableData" class="bug_tableHeader" show-overflow-tooltip="true" :header-cell-style="{ color: '#4A4A4A', fontSize: '14px', fontWeight: '500' }">
+    <el-table
+      size="small"
+      :data="tableData"
+      class="bug_tableHeader"
+      show-overflow-tooltip="true"
+      :header-cell-style="{ color: '#4A4A4A', fontSize: '14px', fontWeight: '500' }"
+      row-key="id"
+    >
       <el-table-column label="优先级" prop="priorityCode" min-width="100" sortable align="center">
         <template slot-scope="scope" style="text-align: center;">
           <span class="div_priority" :class="[{'priority_color': scope.row.priorityLevel === 'High'},{'priority_color1': scope.row.priorityLevel === 'Medium'},{'priority_color3': scope.row.priorityLevel === 'Low'}]">
@@ -18,7 +25,7 @@
       <el-table-column prop="priorityName" label="缺陷等级" align="center" />
       <el-table-column prop="bugStatusName" label="状态" min-width="110" align="center">
         <template slot-scope="scope">
-          <statusChange :status-code="Number(scope.row.status)" :bug-data="scope.row" />
+          <statusChange :status-code="Number(scope.row.status)" :bug-data="scope.row" :status-obj="statusObj" />
         </template>
       </el-table-column>
       <el-table-column v-if="noShow !== 'taskName'" prop="taskName" label="所属任务" align="center" min-width="250" show-overflow-tooltip />
@@ -41,7 +48,7 @@
       />
     </div>
 
-    <el-drawer :visible.sync="drawerShow" :modal="false" :with-header="false" size="50%" class="bug_manage_drawer" @click.stop>
+    <el-drawer v-if="drawerShow" :visible.sync="drawerShow" :modal="false" :with-header="false" size="50%" class="bug_manage_drawer" @click.stop>
       <div @click.stop>
         <bug-details
           :id="bugQuery.id+''"
@@ -59,7 +66,7 @@
 
 <script>
 import statusChange from '@/views/projectManage/bugList/details/statusChange'
-import { bugList } from '@/api/defectManage'
+import { bugList, bugGetEnum } from '@/api/defectManage'
 import BugDetails from './index'
 import '@/styles/PublicStyle/index.scss'
 
@@ -97,7 +104,8 @@ export default {
       drawerShow: false, // drawer展示
       queryData: {}, // 查询条件
       data: {}, // 查询条件
-      bizId: Number(localStorage.getItem('bizId')) // 业务线
+      bizId: Number(localStorage.getItem('bizId')), // 业务线
+      statusObj: null // 状态对象
     }
   },
   computed: {
@@ -119,7 +127,20 @@ export default {
       immediate: true
     }
   },
+  created() {
+    this.getBugSelect()
+  },
   methods: {
+    async getBugSelect() { //  获取下拉菜单option
+      const res = await bugGetEnum()
+      if (res.code === 200) {
+        this.statusObj = {
+          bugEnumList: res.data.bugEnumList, // status
+          repairResultEnumList: res.data.repairResultEnumList, // 修复结果
+          bugReasonEnumList: res.data.bugReasonEnumList // 缺陷原因
+        }
+      }
+    },
     bugGetTableList(e, index) {
       this.queryData = e
       this.data = {}

+ 16 - 30
src/views/projectManage/bugList/details/index.vue

@@ -3,7 +3,7 @@
     <div v-if="type!=='page'" style="padding: 15px 5px 5px 30px" class="Layout_space_between bug_manage_container bug_manage_title">
       <div class="Layout_flex_start">
         <span style="font-size:18px;font-weight:500;color:#333b4a; margin-right: 20px;">{{ 'BUG-'+ id }}</span>
-        <statusChange v-if="map.bugEnumList && typeof bug.status !== 'undefined'" :status-code="bug.status" :bug-data="bug" @bugGet="updateBugStatus" />
+        <statusChange :status-code="bug.status" :bug-data="bug" :status-obj="statusObj" @bugGet="updateBugStatus" />
       </div>
       <div style="display: inline-block;float:right">
         <span class="newBtn" @click="getToDetails()"><i class="el-icon-document" /> 查看详情</span>
@@ -50,7 +50,7 @@
                   />
                 </el-form-item>
                 <el-form-item id="itemLength1" style="margin:0">
-                  <statusChange v-if="map.bugEnumList && typeof bug.status !== 'undefined'" :status-code="bug.status" :bug-data="bug" />
+                  <statusChange :status-code="bug.status" :bug-data="bug" :status-obj="statusObj" @bugGet="updateBugStatus" />
                 </el-form-item>
                 <el-form-item id="itemLength2" style="margin:0;float:right">
                   <el-button size="small" class="button_delete2" @click="openDeleteDialog()">删除</el-button>
@@ -677,7 +677,8 @@ export default {
           { required: true, message: '请输入图片名称', trigger: 'blur' },
           { min: 1, max: 50, message: '长度在 1 到 50 个字符', trigger: 'blur' }
         ]
-      }
+      },
+      statusObj: null // 状态对象
     }
   },
   watch: {
@@ -697,6 +698,7 @@ export default {
     }
   },
   created() {
+    this.getBugSelect()
     if (this.type !== 'page') {
       var height = window.innerHeight > document.body.clientHeight ? window.innerHeight : document.body.clientHeight
       height -= 130
@@ -725,6 +727,16 @@ export default {
     })
   },
   methods: {
+    async getBugSelect() { //  获取下拉菜单option
+      const res = await bugGetEnum()
+      if (res.code === 200) {
+        this.statusObj = {
+          bugEnumList: res.data.bugEnumList, // status
+          repairResultEnumList: res.data.repairResultEnumList, // 修复结果
+          bugReasonEnumList: res.data.bugReasonEnumList // 缺陷原因
+        }
+      }
+    },
     handleClick() {
       operationLogBug(this.id).then(res => {
         this.changeRecord = res.data
@@ -734,6 +746,7 @@ export default {
       this.$emit('close', false)
     },
     init() {
+      this.getBugSelect()
       this.formHeight = ''
       this.formHeight1 = ''
       this.bugGet(this.id, false).then(res => {
@@ -927,33 +940,6 @@ export default {
       this.bug.bugName = this.bugNameForm.bugName
       this.bugUpdate(this.bug, 'title')
     },
-    bugStatusList(status) { // 不同状态返回不同的option
-      if (status === '待修复') {
-        return this.enums.bugEnumList.filter(item => {
-          return item.code === 0 || item.code === 2 || item.code === 5
-        })
-      }
-      if (status === '待测试') {
-        return this.enums.bugEnumList.filter(item => {
-          return item.code === 2 || item.code === 3 || item.code === 4
-        })
-      }
-      if (status === '已完成') {
-        return this.enums.bugEnumList.filter(item => {
-          return item.code === 3
-        })
-      }
-      if (status === 'Reopen') {
-        return this.enums.bugEnumList.filter(item => {
-          return item.code === 2 || item.code === 5 || item.code === 4
-        })
-      }
-      if (status === 'Hold') {
-        return this.enums.bugEnumList.filter(item => {
-          return item.code === 5 || item.code === 2
-        })
-      }
-    },
     RichText() {
       this.editor = new E('#wage', '#wage1')
       this.editor.customConfig.zIndex = 0

+ 29 - 12
src/views/projectManage/bugList/details/statusChange.vue

@@ -57,15 +57,23 @@
 
 <script>
 import '@/styles/PublicStyle/index.scss'
-import { bugGetEnum, bugUpdate } from '@/api/defectManage'
+import { bugUpdate } from '@/api/defectManage'
 export default {
   props: {
+    bugId: { type: Number, default: null },
     statusCode: { type: Number, default: null }, // 状态值
-    bugData: { type: Object, default: null } // 行数据
+    bugData: { type: Object, default: null }, // 行数据
+    statusObj: {
+      type: Object,
+      default: () => { return {} },
+      required: false
+    }
   },
   data() {
     return {
       status: this.statusCode, // 状态
+      bugIds: this.bugId,
+      bugDatas: this.bugData,
       bugEnumList: [], // 状态option
       userData: { id: '', ename: localStorage.getItem('username'), name: localStorage.getItem('realname') }, // 用户信息
       statusDialogForm: { // 修复结果
@@ -83,24 +91,32 @@ export default {
     }
   },
   watch: {
-    statusCode(newVal, oldVal) {
-      this.status = newVal
+    statusCode: {
+      handler(newV) {
+        this.status = newV
+      },
+      immediate: true
+    },
+    statusObj: {
+      handler(newV) {
+        if (newV) {
+          this.bugEnumList = newV.bugEnumList || []// status
+          this.repairResultEnumList = newV.repairResultEnumList || []// 修复结果
+          this.bugReasonEnumList = newV.bugReasonEnumList || []// 缺陷原因
+          this.bugStatusList(this.status)
+        }
+      },
+      deep: true,
+      immediate: true
     }
   },
   mounted() {
-    this.getBugSelect() // 获取下拉菜单option
   },
   methods: {
-    getBugSelect() { //  获取下拉菜单option
-      bugGetEnum().then(res => {
-        this.bugEnumList = res.data.bugEnumList // status
-        this.repairResultEnumList = res.data.repairResultEnumList // 修复结果
-        this.bugReasonEnumList = res.data.bugReasonEnumList // 缺陷原因
-      })
-    },
     statusDialogConfirm() { // 点击确定 验证 修改
       this.$refs.statusDialogForm.validate((valid) => {
         if (valid) {
+          console.log(this.statusCode, 'code')
           const data = {}
           data.id = this.bugData.id
           data.status = this.status
@@ -192,6 +208,7 @@ export default {
       }
     },
     modalClose() {
+      this.$forceUpdate()
       this.statusDialogVisible = false
       this.status = this.statusCode
     }

+ 16 - 3
src/views/projectManage/dialog_vue.vue

@@ -103,6 +103,13 @@ import { taskCreate, memberQueryMemberInfoByIDAPorName, configShowTaskEnum, conf
 import { projectList, settingGetBizList } from '@/api/projectIndex'
 import { settingQueryBizModuleList } from '@/api/defectManage'
 export default {
+  props: {
+    noJump: {
+      type: Boolean,
+      default: false,
+      required: false
+    }
+  },
   data() {
     return {
       arr_priority: [{ value: 0, name: 'P0' }, { value: 1, name: 'P1' }, { value: 2, name: 'P2' }, { value: 3, name: 'P3' }],
@@ -244,8 +251,10 @@ export default {
               that.$set(that.task_form, 'projectId', '')
               that.$set(that.task_form, 'bizId', Number(localStorage.getItem('bizId')))
               that.task_form.followVersion === 2 ? that.show_Client = false : ''
-              if (data.requirementId) {
-                that.task_form.requireId = data.requirementId
+              if (data) {
+                that.$set(that.task_form, 'requireId', data.requirementId)
+                that.$set(that.task_form, 'name', data.name)
+                that.$set(that.task_form, 'priority', data.priority)
               }
             }, 300)
           })
@@ -296,7 +305,11 @@ export default {
           taskCreate({ taskInfoDO, user }).then(res => {
             this.dialogFormVisible = false
             this.$message({ message: res.msg, type: 'success', duration: 1000, offset: 150 })
-            this.$router.push({ name: '任务详情', query: { id: res.data.id }})
+            if (!this.noJump) {
+              this.$router.push({ name: '任务详情', query: { id: res.data.id }})
+            } else {
+              this.$emit('change')
+            }
           })
         }
       })

+ 7 - 5
src/views/projectManage/iteration/components/create.vue

@@ -74,11 +74,13 @@ export default {
     iterations: {
       immediate: true,
       handler(iterations) {
-        if (iterations.endTime === '未设置') {
-          this.$set(this.iterations, 'endTime', '')
-        }
-        if (iterations.startTime === '未设置') {
-          this.$set(this.iterations, 'startTime', '')
+        if (iterations !== null) {
+          if (iterations.endTime === '未设置') {
+            this.$set(this.iterations, 'endTime', '')
+          }
+          if (iterations.startTime === '未设置') {
+            this.$set(this.iterations, 'startTime', '')
+          }
         }
         this.iteration = iterations === null ? {} : this.iterations
       }

+ 1 - 1
src/views/projectManage/iteration/components/iterationTable.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="schedule-list">
-    <el-col align="right" class="add-schedule"><span @click="addSchedule()"><i class="el-icon-circle-plus-outline" />添加排期</span></el-col>
+    <!-- <el-col align="right" class="add-schedule"><span @click="addSchedule()"><i class="el-icon-circle-plus-outline" />添加排期</span></el-col> -->
     <el-table
       :id="'schedule-'+id"
       :data="scheduleList"

+ 3 - 4
src/views/projectManage/iteration/components/modifySchedule.vue

@@ -91,8 +91,7 @@ const _ = require('lodash')
 import searchPeople from '@/components/select/searchPeople'
 import normalDialog from '@/components/dialog/normalDialog'
 import selDatePicker from '@/components/picker/SelDatePicker'
-// import { taskList } from '@/api/projectIndex'
-import { getTaskByRequireId } from '@/api/requirement'
+import { taskList } from '@/api/projectIndex'
 import { taskList as allTaskList, configShowTaskEnum } from '@/api/taskIndex'
 import { getSeprateDayInfo, scheduleCreate, scheduleGet, scheduleUpdate, scheduleDelete } from '@/api/projectViewDetails'
 import danger from '@/assets/感叹@2x.png'
@@ -220,8 +219,8 @@ export default {
       }
     },
     async getNowTask() { // 获取当前需求下任务
-      const res = await getTaskByRequireId({
-        id: this.$route.query.id
+      const res = await taskList({
+        requireId: this.$route.query.id
       })
       if (res.code === 200) {
         this.tasksOptions = res.data

+ 2 - 3
src/views/projectManage/projectList/components/modifySchedule.vue

@@ -26,7 +26,7 @@
             <sel-date-picker :start-end.sync="form.dayList" :detail-day-list="detailDayList" @getDetailDay="getDetailDay" />
           </div>
         </el-form-item>
-        <el-form-item label="问题描述">
+        <el-form-item label="描述">
           <el-input v-model="form.desc" autocomplete="off" placeholder="请输入问题描述内容..." :disabled="disabled" />
         </el-form-item>
         <el-form-item label="关联任务" prop="taskList">
@@ -35,7 +35,7 @@
             filterable
             remote
             reserve-keyword
-            placeholder="请输入关键词"
+            placeholder="请输入任务名称或ID"
             :remote-method="remoteMethod"
             :loading="loading"
             style="width: 100%"
@@ -193,7 +193,6 @@ export default {
     isDelete: {
       handler(newV, old) {
         this.isDeleteStatus = newV
-        console.log(this.isDeleteStatus)
       },
       immediate: true,
       deep: true

+ 21 - 13
src/views/projectManage/projectList/components/needsList.vue

@@ -6,7 +6,8 @@
       style="width: 100%;"
       size="mini"
       row-key="id"
-      :header-cell-style="{ color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500', textAlign: 'center' }"
+      :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'}"
     >
@@ -17,11 +18,11 @@
           </span>
         </template>
       </el-table-column>
-      <el-table-column label="需求名称" width="250" align="center" show-overflow-tooltip>
+      <el-table-column label="需求名称" width="250" align="left" show-overflow-tooltip>
         <template slot-scope="scope">
           <div class="table-project-name" @click="needs_link(scope.row.id)">
-            <b>{{ scope.row.requirementDisplayId }}</b>
-            <span>{{ scope.row.name }}</span>
+            <span class="id">{{ scope.row.requirementDisplayId }}</span>
+            <span class="name">{{ scope.row.name }}</span>
           </div>
         </template>
       </el-table-column>
@@ -98,7 +99,7 @@ export default {
       }
     },
     needs_link(id) {
-      this.$router.push({ name: '需求详情', params: { id: id + '' }})
+      this.$router.push({ name: '需求详情', query: { id: id }})
     }
   }
 }
@@ -147,16 +148,19 @@ export default {
 .status0 {
   @include setStatus(#409EFF)
 }
-.status1 {
+.status5 {
   @include setStatus(#FF8952)
 }
-.status3 {
-  @include setStatus(#C97DEA)
+.status10 {
+  @include setStatus(#FF8952)
 }
-.status5 {
-  @include setStatus(#13C2C2)
+.status15 {
+  @include setStatus(#FF8952)
+}
+.status20 {
+  @include setStatus(#FF8952)
 }
-.status9 {
+.status25 {
   @include setStatus(#7ED321)
 }
 .div_priority {
@@ -172,12 +176,16 @@ export default {
   display: flex;
   justify-content: center;
   flex-direction: column;
-  b {
+  .id {
     color: #A7AEBC;
     font-size: 10px;
   }
-  span {
+  .name {
     font-size: 14px;
+    color: #666666;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
   }
 }
 </style>

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

@@ -1,6 +1,6 @@
 <template>
   <div class="schedule-list">
-    <el-col align="right" class="add-schedule"><span @click="addSchedule()"><i class="el-icon-circle-plus-outline" />添加排期</span></el-col>
+    <!-- <el-col align="right" class="add-schedule"><span @click="addSchedule()"><i class="el-icon-circle-plus-outline" />添加排期</span></el-col> -->
     <el-table
       :id="'schedule-'+id"
       :data="scheduleList"

+ 54 - 28
src/views/projectManage/projectList/components/taskList.vue

@@ -5,11 +5,11 @@
         <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-click">|</el-col>
-      <el-col :span="2" class="item-click click-blue" @click.native="addSechedule()">添加排期</el-col>
-      <el-col :span="2" class="item-click click-blue" @click.native="handlePlan('test')">提测</el-col>
-      <el-col :span="2" class="item-click click-blue" @click.native="handlePlan('allow')">准出</el-col>
-      <el-col :span="4" class="item-click click-blue" @click.native="handlePlan('daily')">建立测试日报</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
@@ -19,7 +19,8 @@
       size="mini"
       row-key="id"
       :expand-row-keys="expandArr"
-      :header-cell-style="{ color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500', textAlign: 'center' }"
+      :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'}"
@@ -42,8 +43,13 @@
           </span>
         </template>
       </el-table-column>
-      <el-table-column label="任务名称" width="200" align="center" show-overflow-tooltip>
-        <template slot-scope="scope"><span class="task-title" @click="link_task(scope.row.id)">{{ scope.row.name }}</span></template>
+      <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>
@@ -52,14 +58,7 @@
         <template slot-scope="scope">
           <el-select
             v-model="scope.row.status"
-            :class="{
-              'status_color': scope.row.status === 0,
-              'status_color1': scope.row.status === 1,
-              'status_color4': scope.row.status === 3,
-              'status_color6': scope.row.status === 2,
-              'status_color7': scope.row.status === 4,
-              'status_color2': scope.row.status === 5
-            }"
+            :class="'status'+scope.row.status"
             class="btns"
             size="mini"
             @change="changeStatus(scope.row)"
@@ -72,7 +71,7 @@
         <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.app }}</template>
+        <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>
@@ -107,6 +106,7 @@
   </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' // 日报
@@ -130,6 +130,7 @@ export default {
   },
   data() {
     return {
+      imgUrl: imgUrl,
       changeData: new Map(),
       allChange: false, // 是否全展开
       expandArr: [], // 展开行数组
@@ -302,8 +303,21 @@ export default {
 >>>.el-row .el-col {
   margin: 10px 0;
 }
-.task-title {
-  cursor: pointer;
+.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;
@@ -329,12 +343,9 @@ export default {
 .status0 {
   @include setStatus(#409EFF)
 }
-.status1 {
+.status1, .status2, .status3, .status4{
   @include setStatus(#FF8952)
 }
-.status3 {
-  @include setStatus(#13C2C2)
-}
 .status5 {
   @include setStatus(#7ED321)
 }
@@ -384,6 +395,8 @@ export default {
     align-items: center;
   }
   .item-checked {
+    width: auto;
+    margin-right: 28px;
     color: #606266;
     font-size: 14px;
     display: flex;
@@ -391,16 +404,29 @@ export default {
     justify-content: left;
     cursor: pointer;
   }
-  .item-click{
-    color: #606266;
+  .item-click,.item-line{
+    margin: 0;
+    width: auto;
+    color: #666666;
     font-size: 14px;
     display: flex;
     align-items: center;
-    justify-content: 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);
   }
-  .click-blue {
-    color: #409EFF;
+  .cancel {
+    position: absolute;
+    right: 0;
+    top: 50%;
+    transform: translateY(-50%);
   }
 }
 .descr {

+ 24 - 6
src/views/projectManage/projectList/projectViewDetails.vue

@@ -43,7 +43,7 @@
             </el-dropdown-menu>
           </el-dropdown>
           <div class="line" />
-          <span style="vertical-align: bottom; cursor: pointer; color: #6F7C93;" @click.stop="setChild(), display = true"><img style="width: 24px; display: inline-block;" :src="image_url">&nbsp; {{ num }} &nbsp;</span>
+          <span style="vertical-align: bottom; cursor: pointer; color: #6F7C93;" @click.stop="setChild(), display = true"><img style="width: 20px; display: inline-block;" :src="image_url">&nbsp; {{ num }} &nbsp;</span>
           <div class="line" />
           <i class="el-icon-setting icon-delete" @click="modify_project = true" />
           <div class="line" />
@@ -95,7 +95,7 @@
             <div class="title-left-name">项目描述</div>
           </div>
           <div>
-            <text-area :id="'pro-desc'" :value.sync="form_query.description" :empty-text="'请输入'" :input-button="'需求描述'" @change="changeArea" />
+            <text-area :id="'pro-desc'" :value.sync="form_query.description" :empty-text="'点击'" :input-button="'添加描述'" @change="changeArea" />
           </div>
         </section>
         <section class="main-section">
@@ -121,7 +121,7 @@
       <!-- 需求 -->
       <el-container v-if="activeName === '2'">
         <section class="main-section contain">
-          <needs-list />
+          <needs-list ref="needs-list" />
         </section>
       </el-container>
       <!-- 需求 -->
@@ -155,8 +155,8 @@
         </span>
       </el-dialog>
       <!-- 弹窗 -->
-      <openDialog v-if="task_open" ref="task_createdUpdata" />
-      <createdBug v-if="bug_open" ref="createdBug" />
+      <openDialog v-if="task_open" ref="task_createdUpdata" :no-jump="true" @change="reloadList" />
+      <createdBug v-if="bug_open" ref="createdBug" @reloadList="reloadList" />
       <requirement-create
         class="diologPadding"
         title="新建需求"
@@ -182,6 +182,7 @@
     </el-container></div>
 </template>
 <script>
+const _ = require('lodash')
 import {
   projectList,
   projectUpdate,
@@ -277,7 +278,7 @@ export default {
   },
   methods: {
     async changeArea(e) { // area修改
-      const projectInfo = this.form_query
+      const projectInfo = _.cloneDeep(this.form_query)
       const res = await projectUpdate({ projectInfo, user: this.user })
       if (res.code === 200) {
         this.$message({ message: '修改成功', type: 'success', duration: 1000, offset: 150 })
@@ -289,11 +290,13 @@ export default {
     initRequirementCreateDialog() { // 初始化新建需求弹框
       this.requirement.belongingProject = this.projectId // 这里传入项目id
       this.requirement.bizId = localStorage.getItem('bizId') // 这里传入业务线id
+      this.requirement.dependOnRelease = 0 // 这里传入是否依赖发版
     },
     closeDioang() { // 关闭新建需求弹框
       this.need_open = false
       this.get_list()
       this.initRequirementCreateDialog()
+      this.reloadList()
     },
     async get_list() {
       // 获取项目ID(查询)
@@ -357,6 +360,21 @@ export default {
       this.$nextTick(() => {
         this.$refs.task_createdUpdata.init(2)
       })
+    },
+    reloadList() {
+      this.get_project_detail()
+      if (this.$refs['bugTableDialog']) {
+        this.$refs['bugTableDialog'].bugGetTableList()
+      }
+      if (this.$refs['data-statistics']) {
+        this.$refs['data-statistics'].getRequireSumData()
+      }
+      if (this.$refs['tasks-list']) {
+        this.$refs['tasks-list'].get_allTask()
+      }
+      if (this.$refs['needs-list']) {
+        this.$refs['needs-list'].getNeedsList()
+      }
     }
   }
 }

+ 6 - 4
src/views/projectManage/requirement/components/dataStatistics.vue

@@ -63,16 +63,18 @@ export default {
     }
   },
   mounted() {
-    this.getProjectSumData()
+    this.getRequireSumData()
   },
   methods: {
-    async getProjectSumData() { // 获取数据
+    async getRequireSumData() { // 获取数据
       const res = await getRequireSumData(this.$route.query.id)
       if (res.code === 200) {
         this.taskData = res.data.taskData
         this.bugData = res.data.bugData
-        this.setDataChart(this.taskData.detail, 'echartsOption2')
-        this.setDataChart(this.bugData.detail, 'echartsOption3')
+        this.$nextTick(() => {
+          this.setDataChart(this.taskData.detail, 'echartsOption2')
+          this.setDataChart(this.bugData.detail, 'echartsOption3')
+        })
       }
     },
     setDataChart(data, obj) {

+ 6 - 6
src/views/projectManage/requirement/components/modifySchedule.vue

@@ -26,7 +26,7 @@
             <sel-date-picker :start-end.sync="form.dayList" :detail-day-list="detailDayList" @getDetailDay="getDetailDay" />
           </div>
         </el-form-item>
-        <el-form-item label="问题描述">
+        <el-form-item label="描述">
           <el-input v-model="form.desc" autocomplete="off" placeholder="请输入问题描述内容..." :disabled="disabled" />
         </el-form-item>
         <el-form-item label="关联任务" prop="taskList">
@@ -35,7 +35,7 @@
             filterable
             remote
             reserve-keyword
-            placeholder="请输入关键词"
+            placeholder="请输入任务名称或ID"
             :remote-method="remoteMethod"
             :loading="loading"
             style="width: 100%"
@@ -91,7 +91,7 @@ const _ = require('lodash')
 import searchPeople from '@/components/select/searchPeople'
 import normalDialog from '@/components/dialog/normalDialog'
 import selDatePicker from '@/components/picker/SelDatePicker'
-import { getTaskByRequireId } from '@/api/requirement'
+import { taskList } from '@/api/projectIndex'
 import { taskList as allTaskList, configShowTaskEnum } from '@/api/taskIndex'
 import { getSeprateDayInfo, scheduleCreate, scheduleGet, scheduleUpdate, scheduleDelete } from '@/api/projectViewDetails'
 import danger from '@/assets/感叹@2x.png'
@@ -232,9 +232,9 @@ export default {
         this.taskScheduleEvent = resEnum.data.taskScheduleEvent
       }
     },
-    async getNowTask() { // 获取当前项目下任务
-      const res = await getTaskByRequireId({
-        id: this.$route.query.id
+    async getNowTask() { // 获取当前需求下任务
+      const res = await taskList({
+        requireId: this.$route.query.id
       })
       if (res.code === 200) {
         this.tasksOptions = res.data.taskDetails

+ 22 - 50
src/views/projectManage/requirement/components/scheduleList.vue

@@ -1,20 +1,15 @@
 <template>
   <div class="schedule-list" :class="className">
-    <el-col align="right" class="add-schedule"><span @click="addSchedule()"><i class="el-icon-circle-plus-outline" />添加排期</span></el-col>
+    <!-- <el-col align="right" class="add-schedule"><span @click="addSchedule()"><i class="el-icon-circle-plus-outline" />添加排期</span></el-col> -->
     <el-table
       :id="'schedule-'+id"
       :data="scheduleList"
       :header-cell-style="{ backgroundColor: 'rgba(232,232,232,0.4)', color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500'}"
       :row-style="{'background-color': 'transparent'}"
-      style="width: 100%"
       show-overflow-tooltip="true"
       row-key="id"
     >
-      <el-table-column
-        v-if="noMove"
-        width="80"
-        align="center"
-      >
+      <el-table-column v-if="noMove" width="80" align="center">
         <template>
           <el-tooltip class="item" effect="dark" content="代表移动,鼠标选中区域可以向上移动" placement="bottom">
             <div class="sortable-tip">
@@ -23,48 +18,16 @@
           </el-tooltip>
         </template>
       </el-table-column>
-      <el-table-column
-        prop="type"
-        label="类型"
-        width="100"
-        align="center"
-      >
+      <el-table-column prop="type" label="类型" min-width="100" align="center">
         <template slot-scope="scope">
           {{ getType(scope.row.type) }}
         </template>
       </el-table-column>
-      <el-table-column
-        prop="desc"
-        label="描述"
-        min-width="150"
-        align="left"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="seperateDaysNoHoliday"
-        label="排期"
-        min-width="200"
-        align="center"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="dayLength"
-        label="时长"
-        width="50"
-        align="center"
-      />
-      <el-table-column
-        prop="peopleList"
-        label="参与人员"
-        min-width="100"
-        align="center"
-      />
-      <el-table-column
-        label="操作"
-        width="200"
-        align="center"
-        show-overflow-tooltip
-      >
+      <el-table-column prop="desc" label="描述" min-width="150" align="left" show-overflow-tooltip />
+      <el-table-column prop="seperateDaysNoHoliday" label="排期" min-width="200" align="center" show-overflow-tooltip />
+      <el-table-column prop="dayLength" label="时长" min-width="50" align="center" />
+      <el-table-column prop="peopleList" label="参与人员" min-width="100" align="center" />
+      <el-table-column label="操作" width="200" align="center">
         <template slot-scope="scope">
           <el-button type="text" size="small" @click="editSchedule(scope.row)">编辑</el-button>
           <el-button type="text" size="small" @click="deleteSchedule(scope.row)">删除</el-button>
@@ -75,9 +38,9 @@
     <div class="bottom-detail">
       <el-row>排期总汇:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }}</el-row>
       <el-row v-if="scheduleDetail.preOnlineVersion && scheduleDetail.preOnlineVersion.length>0">
-        <el-col :span="2">预计上线版本:</el-col>
+        <el-col :span="2" style="width: 100px">预计上线版本:</el-col>
         <el-col :span="6">
-          <span v-for="item in scheduleDetail.preOnlineVersion" :key="item">{{ item }}</span><br>
+          <span v-for="item in scheduleDetail.preOnlineVersion" :key="item">{{ item }}<br></span>
         </el-col>
       </el-row>
       <el-row v-else>预计上线版本:</el-row>
@@ -120,6 +83,11 @@ export default {
       default: false,
       required: false
     },
+    requiredList: {
+      type: Array,
+      default: () => [],
+      required: false
+    },
     typeList: {
       type: Array,
       default: () => [],
@@ -155,6 +123,12 @@ export default {
       },
       immediate: true
     },
+    requiredList: {
+      handler(newV, oldV) {
+        this.scheduleList = newV
+      },
+      immediate: true
+    },
     typeList: {
       handler(newV, oldV) {
         this.taskScheduleEvent = newV
@@ -223,7 +197,6 @@ export default {
   cursor: pointer;
   color: #409EFF;
   font-size: 14px;
-  width: calc(100% - 40px);
   margin: 0 20px;
   padding: 20px 0;
   i {
@@ -234,7 +207,6 @@ export default {
   }
 }
 .schedule-list {
-  width: calc(100% - 40px);
   margin: 0 20px;
   padding: 0;
   background:rgba(248,248,248,0.6);
@@ -253,7 +225,7 @@ export default {
 }
 .bottom-detail {
   font-size: 14px;
-  width: calc(100% - 40px);
+  // width: calc(100% - 40px);
   margin: 0 20px;
   padding: 20px 0;
   :first-child {

+ 61 - 39
src/views/projectManage/requirement/components/taskList.vue

@@ -4,13 +4,13 @@
       <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-click">|</el-col>
-      <el-col :span="2" class="item-click click-blue" @click.native="addSechedule()">添加排期</el-col>
-      <el-col :span="2" class="item-click click-blue" @click.native="handlePlan('test')">提测</el-col>
-      <el-col :span="2" class="item-click click-blue" @click.native="handlePlan('allow')">准出</el-col>
-      <el-col :span="4" class="item-click click-blue" @click.native="handlePlan('daily')">建立测试日报</el-col>
-      <el-col :span="4" class="item-click" @click.native="handlePlan('cancel')">取消选择</el-col>
+      <el-col :span="2" 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 cancel" @click.native="handlePlan('cancel')">取消选择</el-col>
     </el-row>
     <el-table
       ref="planTable"
@@ -19,7 +19,8 @@
       size="mini"
       row-key="id"
       :expand-row-keys="expandArr"
-      :header-cell-style="{ color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500', textAlign: 'center' }"
+      :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'}"
@@ -42,8 +43,13 @@
           </span>
         </template>
       </el-table-column>
-      <el-table-column label="任务名称" width="200" align="center" show-overflow-tooltip>
-        <template slot-scope="scope"><span class="task-title" @click="link_task(scope.row.id)">{{ scope.row.name }}</span></template>
+      <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>
@@ -52,14 +58,7 @@
         <template slot-scope="scope">
           <el-select
             v-model="scope.row.status"
-            :class="{
-              'status_color': scope.row.status === 0,
-              'status_color1': scope.row.status === 1,
-              'status_color4': scope.row.status === 3,
-              'status_color6': scope.row.status === 2,
-              'status_color7': scope.row.status === 4,
-              'status_color2': scope.row.status === 5
-            }"
+            :class="'status'+scope.row.status"
             class="btns"
             size="mini"
             @change="changeStatus(scope.row)"
@@ -69,7 +68,7 @@
         </template>
       </el-table-column>
       <el-table-column label="跟版客户端" width="120" align="center" show-overflow-tooltip>
-        <template slot-scope="scope">{{ scope.row.app }}</template>
+        <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>
@@ -104,10 +103,11 @@
   </div>
 </template>
 <script>
+import imgUrl from '@/assets/建立档案@2x.png'
 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 { getTaskByRequireId } from '@/api/requirement'
+import { taskList } from '@/api/projectIndex'
 import { taskUpdate } from '@/api/projectViewDetails'
 import { configShowTaskEnum } from '@/api/taskIndex'
 import scheduleList from './scheduleList'
@@ -127,6 +127,7 @@ export default {
   },
   data() {
     return {
+      imgUrl: imgUrl,
       changeData: new Map(),
       allChange: false, // 是否全展开
       expandArr: [], // 展开行数组
@@ -165,15 +166,11 @@ export default {
   },
   methods: {
     async get_allTask() { // 获取全部任务
-      const res = await getTaskByRequireId({
-        id: this.$route.query.id
+      const res = await taskList({
+        requireId: this.$route.query.id
       })
-      if (res.code === 200 && res.data) {
-        console.log(res)
-        this.all_task = res.data.taskDetails || []
-        // for (const [key, value] of Object.entries(res.data[0])) {
-        //   console.log(`${key}: ${value}`)
-        // }
+      if (res.code === 200) {
+        this.all_task = res.data
       }
     },
     async getTaskStatus() { // 获取任务状态列表
@@ -304,8 +301,21 @@ export default {
 >>>.el-row .el-col {
   margin: 10px 0;
 }
-.task-title {
-  cursor: pointer;
+.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;
@@ -331,12 +341,9 @@ export default {
 .status0 {
   @include setStatus(#409EFF)
 }
-.status1 {
+.status1, .status2, .status3, .status4{
   @include setStatus(#FF8952)
 }
-.status3 {
-  @include setStatus(#13C2C2)
-}
 .status5 {
   @include setStatus(#7ED321)
 }
@@ -386,6 +393,8 @@ export default {
     align-items: center;
   }
   .item-checked {
+    width: auto;
+    margin-right: 28px;
     color: #606266;
     font-size: 14px;
     display: flex;
@@ -393,16 +402,29 @@ export default {
     justify-content: left;
     cursor: pointer;
   }
-  .item-click{
-    color: #606266;
+  .item-click,.item-line{
+    margin: 0;
+    width: auto;
+    color: #666666;
     font-size: 14px;
     display: flex;
     align-items: center;
-    justify-content: 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);
   }
-  .click-blue {
-    color: #409EFF;
+  .cancel {
+    position: absolute;
+    right: 0;
+    top: 50%;
+    transform: translateY(-50%);
   }
 }
 .descr {

+ 1 - 1
src/views/projectManage/requirement/list/create.vue

@@ -75,8 +75,8 @@
       <div style="display: flex;justify-content: space-between; align-items: center;">
         <el-form-item label="是否依赖发版" prop="dependOnRelease">
           <el-radio-group v-model="form.dependOnRelease" style="width:20vw">
-            <el-radio :label="1">是</el-radio>
             <el-radio :label="0">否</el-radio>
+            <el-radio :label="1">是</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item v-if="form.dependOnRelease" label="涉及的客户端" prop="referredClientType">

+ 112 - 24
src/views/projectManage/requirement/requirementDetail.vue

@@ -41,7 +41,7 @@
             </el-dropdown-menu>
           </el-dropdown>
           <div class="line" />
-          <span style="vertical-align: bottom; cursor: pointer; color: #6F7C93;" @click.stop="setChild(), display = true"><img style="width: 24px; display: inline-block;" :src="image_url">&nbsp; {{ num }} &nbsp;</span>
+          <span style="vertical-align: bottom; cursor: pointer; color: #6F7C93;" @click.stop="setChild(), display = true"><img style="width: 20px; display: inline-block;" :src="image_url">&nbsp; {{ num }} &nbsp;</span>
           <div class="line" />
           <i class="el-icon-setting icon-delete" @click="updateVisible = true" />
           <div class="line" />
@@ -57,10 +57,9 @@
           </div>
           <div class="detail-info">
             <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
-              <el-form-item label="所属项目:">
-                <el-select v-model="form_query.belongingProject" placeholder="请选择" @change="changeArea">
-                  <el-option v-for="(item,index) in belongProjectList" :key="item.name + index" :label="item.name" :value="item.id" />
-                </el-select>
+              <el-form-item label="所属项目:" class="module">
+                <div v-if="form_query.belongingProject !== -1" @click="jump('项目详情',form_query.belongingProject)">{{ form_query.belongingProjectName }}</div>
+                <template v-else>{{ form_query.belongingProjectName }}</template>
               </el-form-item>
               <el-form-item label="所属迭代:">
                 <el-select v-model="form_query.iterationId" placeholder="请选择" @change="changeArea">
@@ -114,17 +113,39 @@
         <section class="main-section">
           <div class="el-main-title">
             <div class="title-left-icon" />
-            <div class="title-left-name">需求计划</div>
-          </div>
-          <div>
-            <schedule-list
-              :id="requirementId"
-              :type-list="taskScheduleEvent"
-              class-name="white"
-              :all="true"
-              :no-move="false"
-            />
+            <div class="title-left-name">
+              <div class="require-plan">
+                需求计划
+                <div> 🔒已锁定</div>
+                <span><i class="el-icon-warning-outline" />每个任务仅支持一次提测和一次准出,请合理拆解后任务再排期</span>
+              </div>
+            </div>
           </div>
+          <el-container>
+            <el-main style="padding: 0;">
+              <schedule-list :id="requirementId" :type-list="taskScheduleEvent" :required-list="taskScheduleList" class-name="white" :all="true" :no-move="false" />
+            </el-main>
+            <el-aside>
+              <div align="center" class="Scheduling">排期变更记录</div>
+              <el-timeline style=" padding: 10px 0 0 10px;width: 270px;border-radius: 0;margin: 0 20px 20px 0;box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04)">
+                <el-timeline-item
+                  v-for="(item, index) in SchedulingContent"
+                  :key="index"
+                  icon="el-icon-goods"
+                  type="primary"
+                  color="#409EFF"
+                  size="large"
+                  :timestamp="item.timestamp"
+                  class="timeline"
+                  @click.native="clickScheduling(item)"
+                >
+                  <div>{{ item.modifyTime }}</div>
+                  <div>{{ item.operatorObject.name !== null ? item.operatorObject.name : '' }}{{ item.operation }}</div>
+                  <div>{{ item.remark }}</div>
+                </el-timeline-item>
+              </el-timeline>
+            </el-aside>
+          </el-container>
         </section>
         <section class="main-section">
           <div class="el-main-title">
@@ -158,7 +179,7 @@
       <!-- 任务 -->
       <el-container v-if="activeName === '2'" class="is-vertical">
         <section class="main-section contain">
-          <tasks-list />
+          <tasks-list ref="tasks-list" />
         </section>
       </el-container>
       <!-- 任务 -->
@@ -172,7 +193,7 @@
       <!-- 统计 -->
       <el-container v-if="activeName === '4'" class="is-vertical">
         <section class="main-section contain">
-          <data-statistics @change="getRequirementById" />
+          <data-statistics ref="data-statistics" @change="getRequirementById" />
         </section>
       </el-container>
       <!-- 统计 -->
@@ -202,8 +223,8 @@
         </span>
       </el-dialog>
       <!-- 删除 -->
-      <openDialog v-if="task_open" ref="task_createdUpdata" />
-      <createdBug v-if="bug_open" ref="createdBug" :required="requirementId" />
+      <openDialog v-if="task_open" ref="task_createdUpdata" :no-jump="true" @change="reloadList" />
+      <createdBug v-if="bug_open" ref="createdBug" :required="requirementId" @reloadList="reloadList" />
       <drawer
         ref="drawer"
         title="需求成员"
@@ -231,7 +252,9 @@ import {
   projectListProject,
   iterationList,
   getCommentList,
-  addComment
+  addComment,
+  scheduleGetRequireScheduleHistory,
+  scheduleGetHistoryScheduleById
 } from '@/api/requirement.js'
 import { configShowTaskEnum } from '@/api/taskIndex'
 import searchPeople from '@/components/select/searchPeople'
@@ -292,7 +315,9 @@ export default {
       belongProjectList: [], // 所属项目列表
       iterationList: [], // 所属迭代列表
       commentContent: null, // 评论内容
-      comments: [] // 评论列表
+      comments: [], // 评论列表
+      taskScheduleList: [], // 排期数据
+      SchedulingContent: [] // 排期历史变更记录
     }
   },
   computed: {
@@ -307,6 +332,7 @@ export default {
     this.getIterationList()
     this.getCommentList()
     this.getTaskStatus()
+    this.GetRequireScheduleHistory()
     this.$store.state.data.status = true
     this.$store.state.data.bizId = true
   },
@@ -315,6 +341,14 @@ export default {
     this.$store.state.data.bizId = false
   },
   methods: {
+    async GetRequireScheduleHistory() {
+      const res = await scheduleGetRequireScheduleHistory(this.requirementId)
+      this.SchedulingContent = res.data
+    },
+    async clickScheduling(ele) {
+      const res = await scheduleGetHistoryScheduleById(ele.id)
+      this.taskScheduleList = res.data.schedulDetailResponses
+    },
     async changeArea(e) { // area修改
       const requirementInfo = _.cloneDeep(this.form_query)
       requirementInfo.pm = requirementInfo.pm.idap
@@ -409,12 +443,19 @@ export default {
       })
       if (res.code === 200) {
         this.$message({ message: '删除成功', type: 'success', duration: 1000, offset: 150 })
+        this.$router.push({ name: '需求', query: {}})
       }
     },
     reated_task() { // 新建任务
       this.task_open = true
       this.$nextTick(() => {
-        this.$refs.task_createdUpdata.init(4, this.$route.query.id, { requirementId: this.requirementId })
+        this.$refs.task_createdUpdata.init(4, this.$route.query.id,
+          {
+            requirementId: this.requirementId,
+            name: `${this.form_query.name}的任务`,
+            priority: this.form_query.priority
+          }
+        )
       })
     },
     created_bug() { // 缺陷创建
@@ -422,6 +463,21 @@ export default {
       this.$nextTick(() => {
         this.$refs.createdBug.init(1)
       })
+    },
+    jump(page, id) { // 跳转
+      this.$router.push({ name: page, query: { id: id }})
+    },
+    reloadList() {
+      this.getRequirementById()
+      if (this.$refs['bugTableDialog']) {
+        this.$refs['bugTableDialog'].bugGetTableList()
+      }
+      if (this.$refs['data-statistics']) {
+        this.$refs['data-statistics'].getRequireSumData()
+      }
+      if (this.$refs['tasks-list']) {
+        this.$refs['tasks-list'].get_allTask()
+      }
     }
   }
 }
@@ -447,6 +503,26 @@ export default {
 }
 .main-section {
   @include main-section;
+  .require-plan {
+    display: flex;
+    align-items: center;
+    span {
+      margin-left: 20px;
+      color: #E6A23C;
+      font-size: 12px;
+    }
+  }
+  .Scheduling {
+    margin:0px 30px 20px 0px;
+    cursor: pointer;
+  }
+  .timeline {
+    padding: 2px;
+    cursor: pointer;
+  }
+  .timeline:hover {
+      color:#409EFF !important;
+    }
   .detail-info {
     padding: 0 34px 20px 34px;
     /deep/.el-input__inner{
@@ -476,12 +552,12 @@ export default {
     }
     .comment-main {
       list-style: none;
-      padding: 0px;
+      padding: 15px 0 0 0;
       margin: 0 0 20px 0;
       li {
         list-style: none;
         padding: 0px;
-        margin: 0px;
+        margin: 0px 0px 25px 0;
       }
       .comment-name {
         font-size:14px;
@@ -507,6 +583,18 @@ export default {
     }
   }
 }
+>>>.module .el-form-item__content {
+    display: inline-block;
+    width: calc(100% - 100px);
+    div {
+      line-height: 18px;
+      padding-top: 12px;
+      cursor: pointer;
+    }
+    div:hover{
+      color: #409EFF;
+    }
+  }
 >>>.el-input--small {
   font-size: 14px;
 }

+ 7 - 11
src/views/projectManage/taskList/components/modifySchedule.vue

@@ -26,7 +26,7 @@
             <sel-date-picker :start-end.sync="form.dayList" :detail-day-list="detailDayList" @getDetailDay="getDetailDay" />
           </div>
         </el-form-item>
-        <el-form-item label="问题描述">
+        <el-form-item label="描述">
           <el-input v-model="form.desc" autocomplete="off" placeholder="请输入问题描述内容..." :disabled="disabled" />
         </el-form-item>
         <el-form-item label="关联任务" prop="taskList">
@@ -35,7 +35,7 @@
             filterable
             remote
             reserve-keyword
-            placeholder="请输入关键词"
+            placeholder="请输入任务名称或ID"
             :remote-method="remoteMethod"
             :loading="loading"
             style="width: 100%"
@@ -91,7 +91,7 @@ const _ = require('lodash')
 import searchPeople from '@/components/select/searchPeople'
 import normalDialog from '@/components/dialog/normalDialog'
 import selDatePicker from '@/components/picker/SelDatePicker'
-import { taskList as allTaskList, configShowTaskEnum } from '@/api/taskIndex'
+import { taskList as allTaskList, configShowTaskEnum, taskGet } from '@/api/taskIndex'
 import { getSeprateDayInfo, scheduleCreate, scheduleGet, scheduleUpdate, scheduleDelete } from '@/api/projectViewDetails'
 import danger from '@/assets/感叹@2x.png'
 export default {
@@ -184,21 +184,17 @@ export default {
   },
   created() {
     this.getType()
-    this.remoteMethod()
     if (this.detailData === null) {
       this.init()
     }
   },
   methods: {
     async init() {
-      const res = await allTaskList({
-        bizId: Number(localStorage.getItem('bizId')),
-        name: this.$route.query.id
-      })
+      const res = await taskGet(this.$route.query.id)
       if (res.code === 200) {
-        this.tasksOptions = res.data
-        this.tasksDetailList = [...res.data]
-        this.form.taskList = res.data.map(item => item.id)
+        this.tasksOptions = [res.data]
+        this.tasksDetailList = [res.data]
+        this.form.taskList = [res.data.id]
       }
     },
     async getScheduleData(id) { // 当有传入的详细信息的时候

+ 7 - 7
src/views/projectManage/taskList/components/reportList.vue

@@ -9,11 +9,11 @@
         <el-table
           :data="testData"
           size="small"
-          :header-cell-style="{ color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500', textAlign: 'center' }"
+          :header-cell-style="{ color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500' }"
           show-overflow-tooltip="true"
           max-height="300"
         >
-          <el-table-column label="标题名称" min-width="150" align="center">
+          <el-table-column label="标题名称" min-width="120">
             <template slot-scope="scope">
               <a href="javascript:void(0)" style="color:#20a0ff" @click="toReportView(scope.row, 2)">{{ scope.row.name }}</a>
             </template>
@@ -26,7 +26,7 @@
           <el-table-column label="创建人" min-width="100" align="center">
             <template slot-scope="scope">{{ scope.row.createrObject.name }}</template>
           </el-table-column>
-          <el-table-column label="创建日期" min-width="150" align="center">
+          <el-table-column label="创建日期" min-width="100" align="center">
             <template slot-scope="scope">{{ scope.row.gmtCreate }}</template>
           </el-table-column>
           <el-table-column label="操作" width="200">
@@ -76,8 +76,8 @@
         <div class="title-left-name">测试日报</div>
       </div>
       <div class="detail-info">
-        <el-table :data="dailyData" size="small" :header-cell-style="{ color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500', textAlign: 'center' }" show-overflow-tooltip="true">
-          <el-table-column label="标题名称" min-width="100" align="center">
+        <el-table :data="dailyData" size="small" :header-cell-style="{ color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500' }" show-overflow-tooltip="true">
+          <el-table-column label="标题名称" min-width="120">
             <template slot-scope="scope">
               <a href="javascript:void(0)" style="color:#20a0ff" @click="toReportView(scope.row, 0)">{{ scope.row.reportName }}</a>
             </template>
@@ -136,8 +136,8 @@
         <div class="title-left-name">准出报告</div>
       </div>
       <div class="detail-info">
-        <el-table :data="clientData" size="small" :header-cell-style="{ color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500', textAlign: 'center' }" show-overflow-tooltip="true">
-          <el-table-column label="标题名称" min-width="100" align="center">
+        <el-table :data="clientData" size="small" :header-cell-style="{ color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500' }" show-overflow-tooltip="true">
+          <el-table-column label="标题名称" min-width="120">
             <template slot-scope="scope">
               <a href="javascript:void(0)" style="color:#20a0ff" @click="toReportView(scope.row, 1)">{{ scope.row.reportName }}</a>
             </template>

+ 50 - 16
src/views/projectManage/taskList/taskViewDetail.vue

@@ -55,7 +55,7 @@
             </el-dropdown-menu>
           </el-dropdown>
           <div class="line" />
-          <span style="vertical-align: bottom; cursor: pointer; color: #6F7C93;" @click.stop="setChild(), display = true"><img style="width: 24px; display: inline-block;" :src="image_url">&nbsp; {{ num }} &nbsp;</span>
+          <span style="vertical-align: bottom; cursor: pointer; color: #6F7C93;" @click.stop="setChild(), display = true"><img style="width: 20px; display: inline-block;" :src="image_url">&nbsp; {{ num }} &nbsp;</span>
           <div class="line" />
           <i class="el-icon-setting icon-delete" @click="open_created" />
           <div class="line" />
@@ -71,22 +71,24 @@
           </div>
           <div class="detail-info">
             <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
-              <el-form-item label="所属项目:">
-                {{ form_query.projectName }}
+              <el-form-item label="所属项目:" class="module">
+                <div v-if="form_query.projectId !== -1" @click="jump('项目详情',form_query.projectId)">{{ form_query.projectName }}</div>
+                <template v-else>{{ form_query.projectName }}</template>
               </el-form-item>
-              <el-form-item label="所属需求:">
-                {{ form_query.requireName }}
+              <el-form-item label="所属需求:" class="module">
+                <div v-if="form_query.requireId !== -1" @click="jump('需求详情',form_query.requireId)">{{ form_query.requireName }}</div>
+                <template v-else>{{ form_query.requireName }}</template>
               </el-form-item>
               <el-form-item label="所属模块:" class="module">
-                <span>{{ form_query.moduleInfoName }}</span>
+                <div>{{ form_query.moduleInfoName }}</div>
               </el-form-item>
             </el-form>
             <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
               <el-form-item label="开发负责人:">
-                <search-people :value.sync="form_query.rdOwner" @change="changeArea" />
+                <search-people :value.sync="form_query.rdOwner || ''" @change="changeArea" />
               </el-form-item>
               <el-form-item label="测试负责人:">
-                <search-people :value.sync="form_query.qaOwner" @change="changeArea" />
+                <search-people :value.sync="form_query.qaOwner || ''" @change="changeArea" />
               </el-form-item>
               <el-form-item label="是否跟版:">
                 <el-select v-model="form_query.followVersion" size="small" filterable placeholder="请选择" @change="changeArea">
@@ -111,7 +113,12 @@
         <section class="main-section">
           <div class="el-main-title">
             <div class="title-left-icon" />
-            <div class="title-left-name">任务计划</div>
+            <div class="title-left-name">
+              <div class="require-plan">
+                任务计划
+                <span><i class="el-icon-warning-outline" />每个任务仅支持一次提测和一次准出,请合理拆解后任务再排期</span>
+              </div>
+            </div>
           </div>
           <div>
             <schedule-list
@@ -174,12 +181,12 @@
       <!-- 统计 -->
       <el-container v-if="activeName === '4'" class="is-vertical">
         <section class="main-section contain">
-          <data-statistics />
+          <data-statistics ref="data-statistics" />
         </section>
       </el-container>
       <!-- 统计 -->
       <!-- 新建(bug) -->
-      <createdBug v-if="bug_open" ref="createdBug" />
+      <createdBug v-if="bug_open" ref="createdBug" @reloadList="reloadList" />
       <Test-report v-if="dialogTest" ref="TestReport" />
       <Daily-report v-if="dialogDaily" ref="DailyReport" />
       <Client-report v-if="dialogClient" ref="ClientReport" />
@@ -435,6 +442,7 @@ export default {
       const res = await tasktaskDelete(user, this.taskId)
       if (res.code === 200) {
         this.$message({ message: '删除成功', type: 'success', duration: 1000, offset: 150 })
+        this.$router.push({ name: '任务', query: {}})
       }
     },
     created_bug() { // 缺陷创建
@@ -458,6 +466,18 @@ export default {
           this.$nextTick(() => { this.$refs.ClientReport.init(1, ele) })
           break
       }
+    },
+    jump(page, id) { // 跳转
+      this.$router.push({ name: page, query: { id: id }})
+    },
+    reloadList() {
+      this.taskGet()
+      if (this.$refs['bugTableDialog']) {
+        this.$refs['bugTableDialog'].bugGetTableList()
+      }
+      if (this.$refs['data-statistics']) {
+        this.$refs['data-statistics'].getRequireSumData()
+      }
     }
   }
 }
@@ -483,6 +503,15 @@ export default {
 }
 .main-section {
   @include main-section;
+  .require-plan {
+    display: flex;
+    align-items: center;
+    span {
+      margin-left: 20px;
+      color: #E6A23C;
+      font-size: 12px;
+    }
+  }
   .detail-info {
     padding: 0 34px 20px 34px;
     /deep/.el-input__inner{
@@ -512,12 +541,12 @@ export default {
     }
     .comment-main {
       list-style: none;
-      padding: 0px;
+      padding: 15px 0 0 0;
       margin: 0 0 20px 0;
       li {
         list-style: none;
         padding: 0px;
-        margin: 0px;
+        margin: 0px 0px 25px 0;
       }
       .comment-name {
         font-size:14px;
@@ -571,9 +600,14 @@ export default {
 >>>.module .el-form-item__content {
     display: inline-block;
     width: calc(100% - 100px);
-    white-space:nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
+    div {
+      line-height: 18px;
+      padding-top: 12px;
+      cursor: pointer;
+    }
+    div:hover{
+      color: #409EFF;
+    }
   }
 .form-progress {
   width: 200px;

+ 2 - 2
src/views/projectManage/version/list/index.vue

@@ -77,7 +77,7 @@
                     <el-tooltip class="item" effect="dark" placement="bottom" :content="scope.row.requirementName" :disabled="scope.row.requirementName.length < 16">
                       <div style="cursor: pointer;" @click="getToRequirementDetails(scope.row.requirementId)">
                         {{ getRequirementName(scope.row.requirementName) }}
-                        <div v-if="scope.row.delay" class="div_requirement_name">{{ searchTitle.version +'版本已延期' }}</div>
+                        <!-- <div v-if="scope.row.delay" class="div_requirement_name">{{ searchTitle.version +'版本已延期' }}</div> -->
                       </div>
                     </el-tooltip>
                   </div>
@@ -338,7 +338,7 @@ export default {
       }
     },
     getToRequirementDetails(id) {
-      this.$router.push({ name: '需求详情', params: { id: id + '' }})
+      this.$router.push({ name: '需求详情', query: { id: id }})
     },
     // 分页pageSize选择
     handleSizeChange(pageSize) {

+ 31 - 17
src/views/workbench/bugTableList.vue

@@ -8,7 +8,15 @@
         <el-dropdown-item v-for="(item, index) in bugProcessStatusList" :key="index" @click.native="handleClick(item)">{{ item.name }}</el-dropdown-item>
       </el-dropdown-menu>
     </el-dropdown>
-    <el-table size="small" :data="tableData" class="bug_tableHeader" show-overflow-tooltip="true" :header-cell-style="{ color: '#4A4A4A', fontSize: '14px', fontWeight: '500' }">
+    <el-table
+      ref="bug_tableHeader"
+      size="small"
+      :data="tableData"
+      class="bug_tableHeader"
+      show-overflow-tooltip="true"
+      :header-cell-style="{ color: '#4A4A4A', fontSize: '14px', fontWeight: '500' }"
+      row-key="id"
+    >
       <el-table-column label="优先级" prop="priorityCode" min-width="100" sortable align="center">
         <template slot-scope="scope" style="text-align: center;">
           <span class="div_priority" :class="[{'priority_color': scope.row.priorityLevel === 'High'},{'priority_color1': scope.row.priorityLevel === 'Medium'},{'priority_color3': scope.row.priorityLevel === 'Low'}]">
@@ -26,7 +34,7 @@
       <el-table-column prop="priorityName" label="缺陷等级" align="center" />
       <el-table-column prop="bugStatusName" label="状态" min-width="110" align="center">
         <template slot-scope="scope">
-          <statusChange :status-code="Number(scope.row.status)" :bug-data="scope.row" @bugGet="bugGetTableList" />
+          <statusChange :bug-id="scope.row.id" :status-code="Number(scope.row.status)" :bug-data="scope.row" :status-obj="statusObj" @bugGet="bugGetTableList" />
         </template>
       </el-table-column>
       <el-table-column prop="taskName" label="所属任务" align="center" min-width="250" show-overflow-tooltip />
@@ -50,7 +58,7 @@
       />
     </div>
 
-    <el-drawer :visible.sync="drawerShow" :modal="false" :with-header="false" size="50%" class="bug_manage_drawer" @click.stop>
+    <el-drawer v-if="drawerShow" :visible.sync="drawerShow" :modal="false" :with-header="false" size="50%" class="bug_manage_drawer" @click.stop>
       <div @click.stop>
         <bug-details
           :id="bugQuery.id+''"
@@ -99,7 +107,8 @@ export default {
       total: 0, // 总数
       bugQuery: '', // bug详情
       drawerShow: false, // drawer展示
-      bugProcessStatusList: [] // 筛选
+      bugProcessStatusList: [], // 筛选
+      statusObj: null // 状态对象
     }
   },
   computed: {
@@ -133,9 +142,14 @@ export default {
           this.title = '待团队成员处理'
           this.bugProcessStatusList = res.data.bugProcessTeamStatusList // 待团队成员处理
         }
+        this.statusObj = {
+          bugEnumList: res.data.bugEnumList, // status
+          repairResultEnumList: res.data.repairResultEnumList, // 修复结果
+          bugReasonEnumList: res.data.bugReasonEnumList // 缺陷原因
+        }
       })
     },
-    bugGetTableList(name, value) {
+    async bugGetTableList(name, value) {
       const teamSearchInfo = value || { teamId: this.teamId, bizId: this.bizId }
       if (value) {
         this.curIndex = 1
@@ -144,20 +158,20 @@ export default {
       pageInfoDO.pageSize = this.pageSize
       pageInfoDO.curIndex = this.curIndex
       if (this.name === '团队') {
-        bugTeamList({ pageInfoDO, status: this.statusCode, teamSearchInfo }).then(res => {
-          if (res.code === 200) {
-            this.tableData = res.data.map(item => { return { ...item, isSelected: false } })
-            this.total = res.total
-          }
-        })
+        const res = await bugTeamList({ pageInfoDO, status: this.statusCode, teamSearchInfo })
+        if (res.code === 200) {
+          this.$forceUpdate()
+          this.tableData = res.data.map(item => { return { ...item, isSelected: false } })
+          this.total = res.total
+        }
       }
       if (this.name === '个人') {
-        bugSelfList({ pageInfoDO, status: this.statusCode }).then(res => {
-          if (res.code === 200) {
-            this.tableData = res.data.map(item => { return { ...item, isSelected: false } })
-            this.total = res.total
-          }
-        })
+        const res = await bugSelfList({ pageInfoDO, status: this.statusCode })
+        if (res.code === 200) {
+          this.$forceUpdate()
+          this.tableData = res.data.map(item => { return { ...item, isSelected: false } })
+          this.total = res.total
+        }
       }
     },
     handleSizeChange(val) {

+ 10 - 3
src/views/workbench/person/components/calenderDetail.vue

@@ -6,7 +6,9 @@
         <div class="label">排期:</div>
         <div>{{ nowDetailData.seperateDaysNoHoliday }}(用时<span>{{ nowDetailData.needDays }}</span>天)</div>
       </div>
-      <div class="detail-people item"><div class="label">参与人:</div>{{ nowDetailData.peopleObject.name }}</div>
+      <div class="detail-people item"><div class="label">参与人:</div>
+        {{ nowDetailData.peopleObjectList.map(item=>item.name).join(',') }}
+      </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">
@@ -20,7 +22,9 @@
         <div class="label">排期:</div>
         <div>{{ nowDetailData.seperateDaysNoHoliday }}(用时<span>{{ nowDetailData.needDays }}</span>天)</div>
       </div>
-      <div class="detail-people item"><div class="label">参与人:</div>{{ nowDetailData.peopleObject.name }}</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">
@@ -66,7 +70,10 @@ export default {
     },
     data: {
       handler(newV) {
-        this.nowDetailData = newV
+        console.log(newV)
+        if (newV) {
+          this.nowDetailData = newV
+        }
       },
       deep: true
     },

+ 1 - 1
src/views/workbench/person/components/calenderList.vue

@@ -36,7 +36,7 @@
     <el-table
       :data="tableData"
       style="width: 100%"
-      :header-cell-style="{ backgroundColor: 'rgba(240,242,244,0.7)' ,color: '#333B4A', fontSize: '14px', fontWeight: '550', textAlign: 'center' }"
+      :header-cell-style="{ backgroundColor: 'rgba(232,232,232,0.4)', color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500'}"
       show-overflow-tooltip="true"
       :header-row-style="{height: '61px'}"
     >

+ 37 - 0
src/views/workbench/person/components/myFullCalendar.vue

@@ -24,6 +24,7 @@
       v-show="activeName === '1'"
       :id="type + '-calendar'"
       ref="fullCalendar"
+      height="auto"
       :class="type + '-calendar'"
       default-view="dayGridMonth"
       theme-system="bootstrap"
@@ -166,6 +167,9 @@ export default {
         }
       }
       this.$nextTick(() => {
+        setTimeout(() => {
+          this.setIcon()
+        }, 2000)
         this.$emit('change', calendarApi.view)
       })
       this.calendarTitle = calendarApi.view.title
@@ -175,6 +179,24 @@ export default {
         this.todayClassName = 'today'
       }
     },
+    setIcon() {
+      const eleList = document.getElementsByClassName('fc-title')
+      Array.prototype.forEach.call(eleList, item => {
+        // const grandParent = item.parentElement.parentElement
+        // const color = grandParent.style.color
+        const div = document.createElement('div')
+        div.style.display = 'inline-block'
+        div.style.paddingTop = '0'
+        const icon = document.createElement('i')
+        if (item.innerText.match(/排期/)) {
+          icon.className = 'el-icon-document'
+        } else {
+          icon.className = 'el-icon-date'
+        }
+        div.appendChild(icon)
+        item.parentElement.insertBefore(div, item)
+      })
+    },
     select(selectionInfo) { // 滑动多选时候返回的数据
       this.$emit('select', selectionInfo)
     },
@@ -226,6 +248,10 @@ export default {
   display: flex;
   padding-top: 2px;
 }
+>>>.fc-title {
+  line-height: 15px;
+  padding-left: 4px;
+}
 >>>.fc-event-container .fc-content {
   text-overflow: inherit;
 }
@@ -239,6 +265,17 @@ export default {
   height: 52px;
   line-height: 52px;
 }
+>>>#small-calendar .fc-dayGridMonth-view .table-bordered .fc-body .fc-day-number {
+  transform: scale(1);
+  font-size: 12px;
+}
+>>>#small-calendar .fc-view-container .table-bordered .fc-head .fc-day-header {
+  transform: scale(1);
+  font-size: 14px;
+}
+>>>.fc-scroller::-webkit-scrollbar {
+  display:none !important;
+}
 </style>
 
 // fullcalendar

+ 38 - 22
src/views/workbench/person/index.vue

@@ -149,8 +149,9 @@
       <modify-schedule
         v-if="visibleSchedule"
         :visible.sync="visibleSchedule"
-        :detail-data="updateSchedule.data"
-        :title="'修改排期'"
+        :is-delete.sync="isDelete"
+        :detail-data="nowDetailData"
+        :title="DialogTitle"
         @update="queryWorkListByTime(calendarView)"
       />
       <!-- 排期操作弹框 -->
@@ -214,6 +215,8 @@ export default {
         visible: false,
         data: null
       },
+      DialogTitle: '新建排期', // 排期弹框标题
+      isDelete: false, // 删除排期操作
       teamAndMemberEnum: {},
       teamAndMemberMap: {},
       teamInfo: null, // 团队信息数据
@@ -225,12 +228,12 @@ export default {
       visibleSchedule: false, // 排期任务弹框
       detailXY: [0, 0], // 详情弹框位置
       colorList: [
-        'rgba(8,172,133,1)', 'rgba(12,119,229,1)', 'rgba(237,82,9,1)', 'rgba(209,194,0,1)', 'rgba(126,211,33,1)',
-        'rgba(245,108,108,1)', 'rgba(88,118,240,1)', 'rgba(235,103,175,1)', 'rgba(255,256,110,1)', 'rgba(186,230,55,1)'
+        'rgba(11,160,188,1)', 'rgba(28,188,126,1)', 'rgba(240,187,39,1)', 'rgba(132,100,247 ,1)', 'rgba(73,92,197 ,1)',
+        'rgba(193,67,96,1)', 'rgba(211,87,35,1)', 'rgba(211,96,118,1)', 'rgba(179,201,58,1)', 'rgba(64,127,232,1)'
       ],
       bgColorList: [
-        'rgba(8,172,133,0.6)', 'rgba(12,119,229,0.6)', 'rgba(237,82,9,0.6)', 'rgba(209,194,0,0.6)', 'rgba(126,211,33,0.6)',
-        'rgba(245,108,108,0.6)', 'rgba(88,118,240,0.6)', 'rgba(235,103,175,0.6)', 'rgba(255,256,110,0.6)', 'rgba(186,230,55,0.6)'
+        'rgba(11,160,188,0.2)', 'rgba(28,188,126,0.2)', 'rgba(240,187,39,0.2)', 'rgba(132,100,247 ,0.2)', 'rgba(73,92,197 ,0.2)',
+        'rgba(193,67,96,0.2)', 'rgba(211,87,35,0.2)', 'rgba(211,96,118,0.2)', 'rgba(179,201,58,0.2)', 'rgba(64,127,232,0.2)'
       ]
     }
   },
@@ -291,13 +294,19 @@ export default {
       if (data) {
         this.nowDetailData = data
       }
-      this.$confirm('是否删除此日程', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.nowDetailData.origin === 0 ? this.deleteSchedule_0() : this.deleteSchedule_1()
-      }).catch(() => {})
+      if (this.nowDetailData.origin === 0) {
+        this.DialogTitle = '删除排期'
+        this.isDelete = true
+        this.visibleSchedule = true
+      } else if (this.nowDetailData.origin === 1) {
+        this.$confirm('是否删除此日程', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.deleteSchedule_0()
+        }).catch(() => {})
+      }
     },
     async deleteSchedule_1() { // 删除日程
       const res = await deleteSelfSchedule(this.nowDetailData.id)
@@ -316,14 +325,17 @@ export default {
       }
     },
     async queryWorkListByTime(view) { // 获取指定时间段用户日程信息
-      this.calendarView = view
+      this.calendarView = {
+        activeStart: view.activeStart,
+        activeEnd: view.activeEnd
+      }
       const params = {
         timeInfo: {
-          startTime: view.activeStart
-            ? moment(view.activeStart).format('YYYY.MM.DD')
+          startTime: this.calendarView.activeStart
+            ? moment(this.calendarView.activeStart).format('YYYY.MM.DD')
             : moment().startOf('month').format('YYYY.MM.DD'),
-          endTime: view.activeEnd
-            ? moment(view.activeEnd).format('YYYY.MM.DD')
+          endTime: this.calendarView.activeEnd
+            ? moment(this.calendarView.activeEnd).format('YYYY.MM.DD')
             : moment().endOf('month').format('YYYY.MM.DD')
         },
         teamSearchInfo: { bizId: null },
@@ -331,9 +343,13 @@ export default {
       }
       const res = await queryWorkListByTime(params)
       if (res.code === 200) {
+        let num = 0
         this.calendarEvents = res.data.map((item, index) => {
           const title = item.origin ? '日程' : '排期'
           const require = `${item.requireNames && item.requireNames.length > 0 ? item.requireNames.join(',') : '无'}`
+          if (index >= 1 && item.id === res.data[index - 1].id) {
+            num = num + 1
+          }
           return {
             id: item.id,
             title: `${title}:${item.peopleObject.name}:${item.name}-${item.desc || '无'};所属需求:${require}`,
@@ -341,8 +357,8 @@ export default {
             end: moment(item.endTime).add(1, 'day').toDate(),
             detailData: item,
             className: item.origin ? 'schedule1' : 'schedule2',
-            backgroundColor: this.bgColorList[index % 10],
-            textColor: this.colorList[index % 10]
+            backgroundColor: this.bgColorList[(index - num) % 10],
+            textColor: this.colorList[(index - num) % 10]
           }
         })
       }
@@ -464,12 +480,12 @@ export default {
   }
 }
 >>>.schedule1 {
-  margin: 1px;
+  margin: 4px;
   padding: 2px 10px;
   border: none;
 }
 >>>.schedule2 {
-  margin: 1px;
+  margin: 4px;
   padding: 2px 10px;
   border: none;
 }

+ 33 - 22
src/views/workbench/team/index.vue

@@ -52,7 +52,7 @@
               <el-checkbox v-for="item in memberList" :key="item.idap" :label="item.idap">
                 <div class="check-point">
                   {{ item.name }}
-                  <div class="point" :style="{'background-color': mapMemberColor.get(item.idap).bgColor}" />
+                  <div class="point" :style="{'background-color': mapMemberColor.get(item.idap).color}" />
                 </div>
               </el-checkbox>
             </el-checkbox-group>
@@ -104,8 +104,9 @@
     <modify-schedule
       v-if="visibleSchedule"
       :visible.sync="visibleSchedule"
-      :detail-data="updateSchedule.data"
-      :title="'修改排期'"
+      :is-delete.sync="isDelete"
+      :detail-data="nowDetailData"
+      :title="DialogTitle"
       @update="queryTeamWorkListByTime(calendarView)"
     />
     <!-- 排期操作弹框 -->
@@ -122,7 +123,6 @@ 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 { View } from '@fullcalendar/core'
 import bugTableList from '@/views/workbench/bugTableList.vue'
 
 export default {
@@ -172,14 +172,16 @@ export default {
         visible: false,
         data: null
       },
+      DialogTitle: '新建排期', // 排期弹框标题
+      isDelete: false, // 删除排期操作
       visibleSchedule: false, // 排期任务弹框
       colorList: [
-        'rgba(8,172,133,1)', 'rgba(12,119,229,1)', 'rgba(237,82,9,1)', 'rgba(209,194,0,1)', 'rgba(126,211,33,1)',
-        'rgba(245,108,108,1)', 'rgba(88,118,240,1)', 'rgba(235,103,175,1)', 'rgba(255,256,110,1)', 'rgba(186,230,55,1)'
+        'rgba(11,160,188,1)', 'rgba(28,188,126,1)', 'rgba(240,187,39,1)', 'rgba(132,100,247 ,1)', 'rgba(73,92,197 ,1)',
+        'rgba(193,67,96,1)', 'rgba(211,87,35,1)', 'rgba(211,96,118,1)', 'rgba(179,201,58,1)', 'rgba(64,127,232,1)'
       ],
       bgColorList: [
-        'rgba(8,172,133,0.6)', 'rgba(12,119,229,0.6)', 'rgba(237,82,9,0.6)', 'rgba(209,194,0,0.6)', 'rgba(126,211,33,0.6)',
-        'rgba(245,108,108,0.6)', 'rgba(88,118,240,0.6)', 'rgba(235,103,175,0.6)', 'rgba(255,256,110,0.6)', 'rgba(186,230,55,0.6)'
+        'rgba(11,160,188,0.2)', 'rgba(28,188,126,0.2)', 'rgba(240,187,39,0.2)', 'rgba(132,100,247 ,0.2)', 'rgba(73,92,197 ,0.2)',
+        'rgba(193,67,96,0.2)', 'rgba(211,87,35,0.2)', 'rgba(211,96,118,0.2)', 'rgba(179,201,58,0.2)', 'rgba(64,127,232,0.2)'
       ],
       mapMemberColor: new Map()// 人员对应颜色表
     }
@@ -308,13 +310,19 @@ export default {
       if (data) {
         this.nowDetailData = data
       }
-      this.$confirm('是否删除此日程', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.nowDetailData.origin === 0 ? this.deleteSchedule_0() : this.deleteSchedule_1()
-      }).catch(() => {})
+      if (this.nowDetailData.origin === 0) {
+        this.DialogTitle = '删除排期'
+        this.isDelete = true
+        this.visibleSchedule = true
+      } else if (this.nowDetailData.origin === 1) {
+        this.$confirm('是否删除此日程', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.deleteSchedule_0()
+        }).catch(() => {})
+      }
     },
     async deleteSchedule_1() { // 删除日程
       const res = await deleteSelfSchedule(this.nowDetailData.id)
@@ -333,14 +341,17 @@ export default {
       }
     },
     async queryTeamWorkListByTime(view) { // 获取指定时间段团队日程信息
-      this.calendarView = View
+      this.calendarView = {
+        activeStart: view.activeStart,
+        activeEnd: view.activeEnd
+      }
       const params = {
         timeInfo: {
-          startTime: view.activeStart
-            ? moment(view.activeStart).format('YYYY.MM.DD')
+          startTime: this.calendarView.activeStart
+            ? moment(this.calendarView.activeStart).format('YYYY.MM.DD')
             : moment().startOf('month').format('YYYY.MM.DD'),
-          endTime: view.activeEnd
-            ? moment(view.activeEnd).format('YYYY.MM.DD')
+          endTime: this.calendarView.activeEnd
+            ? moment(this.calendarView.activeEnd).format('YYYY.MM.DD')
             : moment().endOf('month').format('YYYY.MM.DD')
         },
         teamSearchInfo: this.searchForm,
@@ -432,12 +443,12 @@ export default {
   overflow: scroll;
 }
 >>>.schedule1 {
-  margin: 1px;
+  margin: 4px;
   padding: 2px 10px;
   border: none;
 }
 >>>.schedule2 {
-  margin: 1px;
+  margin: 4px;
   padding: 2px 10px;
   border: none;
 }