PrinceLee 5 anni fa
parent
commit
95805a39b8

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

@@ -40,6 +40,11 @@ export default {
       default: 'small',
       required: false
     },
+    multiple: {
+      type: Boolean,
+      default: false,
+      required: false
+    },
     disabled: {
       type: Boolean,
       default: false,
@@ -48,7 +53,6 @@ export default {
   },
   data() {
     return {
-      multiple: false, // 是否多选
       searchValue: this.value,
       loading: false,
       options: [],
@@ -61,10 +65,8 @@ export default {
         this.searchValue = newV
         const type = Object.prototype.toString.call(this.searchValue)
         if (type.indexOf('Array') < 0) {
-          this.multiple = false
           this.remoteMethod(newV)
         } else if (type.indexOf('Array') > 0 && newV.length > 0 && this.firstGetArr) {
-          this.multiple = true
           this.initMore(this.searchValue)
           this.firstGetArr = false
         }

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

@@ -71,7 +71,10 @@
     </el-table>
     <div class="bottom-detail">
       <el-row>排期总汇:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }}</el-row>
-      <el-row v-if="scheduleDetail.preOnlineVersion && scheduleDetail.preOnlineVersion.length>0">预计上线版本:{{ scheduleDetail.preOnlineVersion }}</el-row>
+      <el-row v-if="scheduleDetail.preOnlineVersion && scheduleDetail.preOnlineVersion.length>0">
+        预计上线版本:
+        <span v-for="item in scheduleDetail.preOnlineVersion" :key="item">{{ item }}</span>
+      </el-row>
       <el-row v-else>预计上线版本:</el-row>
     </div>
     <modify-schedule

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

@@ -8,7 +8,7 @@
           </el-select>
         </el-form-item>
         <el-form-item label="参与人员" prop="peopleList">
-          <search-people :value.sync="form.peopleList" style="width: 100%" :size="'medium'" :disabled="disabled" />
+          <search-people :value.sync="form.peopleList" style="width: 100%" :size="'medium'" :disabled="disabled" :multiple="true" />
         </el-form-item>
         <el-form-item label="排期" prop="dayList">
           <div v-show="form.dayList.length > 0 ">{{ schedule }}(用时<span class="blue">{{ detailDayList.length }}</span>天)</div>

+ 4 - 1
src/views/projectManage/requirement/components/scheduleList.vue

@@ -71,7 +71,10 @@
     </el-table>
     <div class="bottom-detail">
       <el-row>排期总汇:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }}</el-row>
-      <el-row v-if="scheduleDetail.preOnlineVersion && scheduleDetail.preOnlineVersion.length>0">预计上线版本:{{ scheduleDetail.preOnlineVersion }}</el-row>
+      <el-row v-if="scheduleDetail.preOnlineVersion && scheduleDetail.preOnlineVersion.length>0">
+        预计上线版本:
+        <span v-for="item in scheduleDetail.preOnlineVersion" :key="item">{{ item }}</span>
+      </el-row>
       <el-row v-else>预计上线版本:</el-row>
     </div>
     <modify-schedule

+ 1 - 1
src/views/projectManage/requirement/requirementDetail.vue

@@ -88,7 +88,7 @@
             </el-form>
             <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.referredClientType" size="small" :disabled="!form_query.dependOnRelease" multiple filterable placeholder="请选择" @change="changeArea">
+                <el-select v-if="form_query.dependOnRelease === 1" v-model="form_query.referredClientType" size="small" multiple filterable placeholder="请选择" @change="changeArea">
                   <el-option v-for="(item,index) in appClient" :key="item.msg + index" :label="item.msg" :value="item.code" />
                 </el-select>
               </el-form-item>

+ 336 - 0
src/views/projectManage/taskList/components/bugsList.vue

@@ -0,0 +1,336 @@
+<template>
+  <div>
+    <el-table
+      ref="planTable"
+      :data="bugsDataList"
+      style="width: 100%;"
+      size="mini"
+      row-key="id"
+      :header-cell-style="{ color: '#4A4A4A', fontSize: '14px', fontWeight: '550', textAlign: 'center' }"
+      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 prop="bugName" label="缺陷标题" width="200" align="center" show-overflow-tooltip>
+        <template slot-scope="scope">
+          <span style=" color: #A7AEBC; font-size: 10px;">{{ 'BUG-' + scope.row.id }}</span>
+          <br>
+          <span class="bug-title" @click="getToDetails(scope.row.id)">{{ scope.row.bugName }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" width="115" align="center">
+        <template slot-scope="scope">
+          <el-select
+            v-model="scope.row.status"
+            :class="['status'+scope.row.status]"
+            class="btns"
+            size="mini"
+            @change="statusChange(scope.row)"
+          >
+            <el-option v-for="item in allStatus" :key="item.code" :label="item.name" :value="item.code" />
+          </el-select>
+        </template>
+      </el-table-column>
+      <el-table-column prop="priorityName" label="缺陷等级" align="center" />
+      <el-table-column prop="taskName" label="所属任务" align="center" width="200" show-overflow-tooltip />
+      <el-table-column prop="creatorList" label="提报人" width="100" align="center" />
+      <el-table-column prop="assignerList" label="责任人" width="100" align="center" show-overflow-tooltip />
+      <el-table-column prop="currentHandlerList" label="修复人" width="100" align="center" show-overflow-tooltip />
+      <el-table-column prop="gmtCreate" label="创建日期" width="150" align="center">
+        <template slot-scope="scope">{{ scope.row.gmtCreate | naspOut }}</template>
+      </el-table-column>
+    </el-table>
+    <el-col :span="24">
+      <div align="right">
+        <el-pagination
+          :page-sizes="[10, 20, 30, total]"
+          :current-page="curIndex"
+          :page-size="pageSize"
+          background
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+        />
+      </div>
+    </el-col>
+    <normal-dialog
+      :show-dialog.sync="statusDialog"
+      :title="statusDialogTitle"
+      :width="'50%'"
+      :is-default-close="false"
+      @confirm="confirmStatus()"
+      @cancel="bugsList()"
+    >
+      <el-form
+        v-if="statusDialogTitle !== '删除确认'"
+        ref="ruleForm"
+        label-width="110px"
+        label-position="left"
+        :model="nowTaskDetail"
+        :rules="rules"
+      >
+        <el-form-item
+          v-if="statusDialogTitle === '待测试' || statusDialogTitle === '已完成'"
+          label="缺陷原因"
+          prop="bugReason"
+        >
+          <el-select v-model="nowTaskDetail.bugReason" style="width: 100%">
+            <el-option
+              v-for="item in bugReasonEnumList"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          v-if="statusDialogTitle === '待测试'"
+          label="修复方式"
+          class="bug_manage_dialog bug_manage_dialog_fixMethod"
+        >
+          <el-input
+            v-model="nowTaskDetail.reasonOrDesc"
+            type="textarea"
+            placeholder="请输入具体原因和修复方式"
+            maxlength="300"
+            show-word-limit
+            rows="4"
+          />
+        </el-form-item>
+        <el-form-item
+          v-if="statusDialogTitle === '已完成'"
+          label="修复结果"
+          prop="repairResult"
+          class="bug_manage_dialog"
+        >
+          <el-select
+            v-model="nowTaskDetail.repairResult"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in repairResultEnumList"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="statusDialogTitle === 'Reopen'" label="Reopen原因" prop="reasonOrDesc">
+          <el-input
+            v-model="nowTaskDetail.reasonOrDesc"
+            type="textarea"
+            placeholder="请输入Reopen"
+            maxlength="300"
+            show-word-limit
+            rows="4"
+          />
+        </el-form-item>
+      </el-form>
+    </normal-dialog>
+  </div>
+</template>
+<script>
+import { bugList, bugGetEnum, bugUpdate } from '@/api/defectManage'
+import normalDialog from '@/components/dialog/normalDialog'
+export default {
+  components: { normalDialog },
+  filters: {
+    naspOut(value) {
+      if (!value) return ''
+      var da = value.split(/\s+/)
+      return da[0]
+    }
+  },
+  data() {
+    return {
+      bugsDataList: [],
+      allStatus: [], // 所有状态列表
+      bugReasonEnumList: [], // 所有bug原因列表
+      repairResultEnumList: [], // 修复原因列表
+      pageSize: 10,
+      curIndex: 1,
+      total: 0,
+      nowTaskDetail: null, // 当前需要改变任务的详情
+      statusDialog: false, // 状态修改弹框
+      statusDialogTitle: '',
+      rules: {
+        assigner: [
+          { required: true, message: '责任人不可为空', trigger: 'change' }
+        ],
+        currentHandler: [
+          { required: true, message: '修复人不可为空', trigger: 'change' }
+        ],
+        bugName: [
+          { required: true, message: '标题不可为空', trigger: 'blur' }
+        ],
+        bugReason: [
+          { required: true, message: '请选择缺陷原因', trigger: 'change' }
+        ],
+        repairResult: [
+          { required: true, message: '请选择修复结果', trigger: 'change' }
+        ],
+        reasonOrDesc: [
+          { required: true, message: '请输入Reopen原因', trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  created() {
+    this.getBugGetEnum()
+    this.bugsList()
+  },
+  methods: {
+    async getBugGetEnum() {
+      const res = await bugGetEnum()
+      if (res.code === 200) {
+        this.allStatus = res.data.bugEnumList
+        this.bugReasonEnumList = res.data.bugReasonEnumList
+        this.repairResultEnumList = res.data.repairResultEnumList
+      }
+    },
+    async bugsList() {
+      const params = {
+        bizId: Number(localStorage.getItem('bizId')),
+        pageSize: this.pageSize,
+        curIndex: this.curIndex,
+        taskId: this.$route.query.id
+      }
+      const res = await bugList(params)
+      if (res.code === 200) {
+        this.bugsDataList = res.data
+        this.total = res.total
+      }
+    },
+    handleSizeChange(e) {
+      this.pageSize = e
+      this.bugsList()
+    },
+    handleCurrentChange(e) {
+      this.curIndex = e
+      this.bugsList()
+    },
+    getToDetails(id) { // 详情页跳转
+      this.$router.push({ name: '缺陷详情', params: { id: id }})
+    },
+    statusChange(row) { // 状态改变
+      this.nowTaskDetail = row
+      const nowStatusObj = this.allStatus.find(item => item.code === row.status)
+      if (['待修复', '修复中', 'Hold'].some(item => item === nowStatusObj.name)) {
+        this.bugUpdate()
+      } else {
+        this.statusDialogTitle = nowStatusObj.name
+        this.statusDialog = true
+      }
+    },
+    confirmStatus() { // 确认更改状态
+      this.$refs['ruleForm'].validate((valid) => {
+        if (valid) {
+          this.bugUpdate()
+          this.statusDialog = false
+        }
+      })
+    },
+    async bugUpdate() { // 更改状态请求
+      const userData = {
+        id: '',
+        ename: localStorage.getItem('username'),
+        name: localStorage.getItem('realname')
+      }
+      const res = await bugUpdate({ bugBaseInfo: this.nowTaskDetail, user: userData })
+      if (res.code === 200) {
+        this.$message({ message: '状态修改成功', type: 'success', duration: 1000, offset: 150 })
+      }
+    }
+  }
+}
+</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;
+}
+.bug-title {
+  cursor: pointer;
+}
+.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(#69B3FF)
+}
+.status1 {
+  @include setStatus(#FF8952)
+}
+.status2 {
+  @include setStatus(#2F54EB)
+}
+.status3 {
+  @include setStatus(#61D3B8)
+}
+.status4 {
+  @include setStatus(#F56C6C)
+}
+.status5 {
+  @include setStatus(#7ED321)
+}
+.div_priority {
+  text-align: center;
+  color: #ffffff;
+  padding: inherit;
+  border-radius: 4px;
+  width: 40px;
+  display: inline-block;
+}
+.table-project-name {
+  display: flex;
+  justify-content: center;
+  flex-direction: column;
+  b {
+    color: #A7AEBC;
+    font-size: 10px;
+  }
+  span {
+    font-size: 14px;
+  }
+}
+</style>

+ 293 - 0
src/views/projectManage/taskList/components/modifySchedule.vue

@@ -0,0 +1,293 @@
+<template>
+  <normal-dialog :show-dialog.sync="show" :title="title" :is-default-close="false" @confirm="confirmForm()" @cancel="cancel()">
+    <article>
+      <el-form ref="form" :model="form" :rules="form_rules" label-width="100px" :label-position="'left'">
+        <el-form-item label="排期类型" prop="type">
+          <el-select v-model="form.type" clearable placeholder="请选择" style="width: 100%" :disabled="disabled">
+            <el-option v-for="item in taskScheduleEvent" :key="item.code" :label="item.msg" :value="item.code" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="参与人员" prop="peopleList">
+          <search-people :value.sync="form.peopleList" style="width: 100%" :size="'medium'" :disabled="disabled" :multiple="true" />
+        </el-form-item>
+        <el-form-item label="排期" prop="dayList">
+          <div v-show="form.dayList.length > 0 ">{{ schedule }}(用时<span class="blue">{{ detailDayList.length }}</span>天)</div>
+          <div v-show="form.dayList.length <= 0 " class="empty-schedule">添加排期</div>
+          <div v-if="!disabled" class="picker-hidden">
+            <sel-date-picker :start-end.sync="form.dayList" :detail-day-list="detailDayList" @getDetailDay="getDetailDay" />
+          </div>
+        </el-form-item>
+        <el-form-item label="问题描述">
+          <el-input v-model="form.desc" autocomplete="off" placeholder="请输入问题描述内容..." :disabled="disabled" />
+        </el-form-item>
+        <el-form-item label="关联任务" prop="taskList">
+          <el-select
+            v-model="selectTask"
+            filterable
+            remote
+            reserve-keyword
+            placeholder="请输入关键词"
+            :remote-method="remoteMethod"
+            :loading="loading"
+            style="width: 100%"
+            :disabled="disabled"
+            @change="tasksChange"
+          >
+            <el-option
+              v-for="item in tasksOptions"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div class="task-list-show">
+        <div v-for="item in tasksDetailList" :key="'task'+item.id" class="task-list-item">
+          <div v-if="item.taskIdSting" class="item-id">{{ item.taskIdSting }}</div>
+          <div v-if="item.taskId" class="item-id">{{ item.taskId }}</div>
+          <div class="item-name">{{ item.name }}</div>
+          <div class="item-qa">测试负责人:{{ item.qaObject !== null?item.qaObject.name: '' }}</div>
+          <div class="item-rd">开发负责人:{{ item.rdObject !== null?item.rdObject.name: '' }}</div>
+          <i class="el-icon-circle-close item-cancel" @click="cancelTask(item.id)" />
+        </div>
+      </div>
+    </article>
+  </normal-dialog>
+</template>
+<script>
+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 { getSeprateDayInfo, scheduleCreate, scheduleGet, scheduleUpdate } from '@/api/projectViewDetails'
+export default {
+  components: {
+    searchPeople,
+    normalDialog,
+    selDatePicker
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false,
+      required: true
+    },
+    title: {
+      type: String,
+      default: '新建排期',
+      required: false
+    },
+    detailData: { // 详细日期
+      type: Object,
+      default: () => null,
+      required: false
+    },
+    disabled: {
+      type: Boolean,
+      default: false,
+      required: false
+    }
+  },
+  data() {
+    return {
+      form_rules: {
+        type: [{ required: true, message: '事件类型不能为空', trigger: 'blur' }],
+        peopleList: [{ required: true, message: '参与人员不能为空', trigger: 'blur' }],
+        dayList: [{ required: true, message: '排期不能为空', trigger: 'blur' }],
+        taskList: [{ required: true, message: '关联任务不能为空', trigger: 'blur' }]
+      },
+      show: this.visible,
+      taskScheduleEvent: [],
+      form: {
+        bizId: localStorage.getItem('bizId'),
+        type: '',
+        peopleList: [],
+        taskList: [],
+        desc: '',
+        dayList: [] // 日期列表
+      },
+      detailDayList: [], // 详细的日期
+      schedule: '',
+      selectTask: '', // 选择的任务id
+      tasksOptions: [], // 任务下拉选项
+      tasksDetailList: [], // 已有任务项目
+      loading: false
+    }
+  },
+  watch: {
+    visible: {
+      handler(newV, old) {
+        this.show = newV
+      },
+      immediate: true
+    },
+    detailData: {
+      handler(newV, old) {
+        if (newV) {
+          this.getScheduleData(newV.id)
+        }
+      },
+      immediate: true
+    },
+    title(newV, oldV) {
+      this.title = newV
+    }
+  },
+  created() {
+    this.getType()
+    this.remoteMethod()
+  },
+  methods: {
+    async getScheduleData(id) { // 当有传入的详细信息的时候
+      const res = await scheduleGet(id)
+      let obj
+      if (res.code === 200) {
+        obj = res.data
+      } else {
+        return false
+      }
+      this.form = {
+        id: obj.id,
+        bizId: localStorage.getItem('bizId'),
+        type: obj.type,
+        peopleList: obj.peopleList || [],
+        taskList: obj.taskObjectList.map(item => item.id),
+        desc: obj.desc,
+        dayList: [obj.dayList[0], obj.dayList[obj.dayList.length - 1]] // 日期列表
+      }
+      console.log(this.form)
+      this.detailDayList = obj.dayList || []
+      this.schedule = obj.seperateDaysNoHoliday
+      this.tasksDetailList = obj.taskObjectList || []
+    },
+    async getType() {
+      const resEnum = await configShowTaskEnum()
+      if (resEnum.code === 200) {
+        this.taskScheduleEvent = resEnum.data.taskScheduleEvent
+      }
+    },
+    async remoteMethod(query) { // 远程搜索任务
+      this.loading = true
+      const res = await allTaskList({
+        bizId: Number(localStorage.getItem('bizId')),
+        name: query
+      })
+      if (res.code === 200) {
+        this.loading = false
+        this.tasksOptions = res.data
+      } else {
+        this.loading = false
+      }
+    },
+    tasksChange(id) { // 任务列表变动
+      const isEx = this.tasksDetailList.find(item => item.id === id)
+      if (isEx) {
+        this.$message({ message: '任务已存在', type: 'warning', duration: 1000, offset: 150 })
+        return false
+      }
+      const res = this.tasksOptions.find(item => {
+        return item.id === id
+      })
+      this.tasksDetailList.push(res)
+      this.form.taskList.push(res.id)
+    },
+    cancelTask(id) { // 删除单个关联任务
+      if (this.disabled) {
+        return false
+      }
+      this.tasksDetailList = this.tasksDetailList.filter(item => item.id !== id)
+      this.form.taskList = this.form.taskList.filter(item => item !== id)
+    },
+    getDetailDay(e) { // 获取详细排期日期
+      this.detailDayList = e
+      this.getSeprateDayInfo(e)
+    },
+    async getSeprateDayInfo(dataArr) { // 获取选中时间中的工作日时间
+      const res = await getSeprateDayInfo(dataArr)
+      if (res.code === 200) {
+        this.schedule = res.data.seperateDaysNoHoliday
+      }
+    },
+    async scheduleCreate(params) { // 创建排期
+      const res = await scheduleCreate(params)
+      if (res.code === 200) {
+        this.$message({ message: '添加成功', type: 'success', duration: 1000, offset: 150 })
+      }
+      this.$emit('update')
+      this.cancel()
+    },
+    async scheduleUpdate(params) { // 更新排期
+      const res = await scheduleUpdate(params)
+      if (res.code === 200) {
+        this.$message({ message: '更新成功', type: 'success', duration: 1000, offset: 150 })
+      }
+      this.$emit('update')
+      this.cancel()
+    },
+    confirmForm() { // 确认提交表单
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          const params = _.cloneDeep(this.form)
+          params.dayList = this.detailDayList
+          params.id ? this.scheduleUpdate(params) : this.scheduleCreate(params)
+        }
+      })
+    },
+    cancel() { // 关闭弹框
+      this.show = false
+      this.$emit('update:visible', this.show)
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+article {
+  max-height: 60vh;
+  overflow: scroll;
+    .blue {
+    color: #409EFF;
+  }
+}
+>>>.el-form {
+  padding: 0 156px 0 60px;
+}
+.picker-hidden {
+  opacity: 0;
+  position: absolute;
+  top: 0;
+}
+.empty-schedule {
+  color:rgba(51,51,51,0.45);
+}
+.task-list-show {
+  width: 100%;
+  padding: 0 60px;
+  .task-list-item {
+    width: 100%;
+    display: flex;
+    margin: 10px 0;
+    .item-id {
+      width: 15%;
+    }
+    .item-name {
+      width: 40%;
+    }
+    .item-qa {
+      width: 20%;
+    }
+    .item-rd {
+      width: 20%;
+    }
+    .item-cancel {
+      font-size: 20px;
+    }
+    div {
+      overflow: hidden;
+      text-overflow:ellipsis;
+      white-space: nowrap;
+    }
+  }
+}
+</style>

+ 289 - 0
src/views/projectManage/taskList/components/reportList.vue

@@ -0,0 +1,289 @@
+<template>
+  <div>
+    <section class="main-section">
+      <div class="el-main-title">
+        <div class="title-left-icon" />
+        <div class="title-left-name">提测报告</div>
+      </div>
+      <div class="detail-info">
+        <el-table
+          :data="launchTestInfoDOS"
+          size="small"
+          :header-cell-style="{ background: '#E9E9E9', color: '#333B4A' }"
+          show-overflow-tooltip="true"
+          max-height="300"
+        >
+          <el-table-column label="标题名称" min-width="150">
+            <template slot-scope="scope">
+              <span class="btn" @click="toReportView(scope.row, 2)">{{ scope.row.name }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="状态" min-width="100" align="center">
+            <template slot-scope="scope">
+              <span :style="{color: stColors[scope.row.status]}"> {{ scope.row.statusString }} </span>
+            </template>
+          </el-table-column>
+          <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">
+            <template slot-scope="scope">{{ scope.row.gmtCreate }}</template>
+          </el-table-column>
+          <el-table-column label="操作" width="200">
+            <template slot-scope="scope">
+              <div v-if="scope.row.status === 1 ? false : true">
+                <span v-if="scope.row.status === 3 ? true : false" class="btn" @click="back(1,scope.row.id, scope.row)">通过</span>
+                <span v-if="scope.row.status === 3 ? true : false" style="margin-left: 30px;" class="btn" @click="back(2,scope.row.id, scope.row)">打回</span>
+                <span v-if="scope.row.status === 0 ? true : false" class="btn" @click="back(5,scope.row.id, scope.row)">发送</span>
+                <span v-if="scope.row.status === 0 ? true : false" style="margin: 0 30px;" class="btn" @click="back(6,scope.row.id, scope.row)">编辑</span>
+                <span v-if="scope.row.status === 0 ? true : false" class="btn" @click="back(4,scope.row.id, scope.row )">删除</span>
+                <span v-if="scope.row.status === 2 ? true : false" class="btn" @click="back(3,scope.row.id, scope.row)">重新提测</span>
+                <el-dialog :title="titName" :visible.sync="dialog_launchTestInfoDOS" width="30%" :close-on-click-modal="false">
+                  <div style="position: absolute; top: 23px; left: 12px;width:4px;height:17px;background:#409EFF;border-radius:1px;" />
+                  <div align="center">
+                    <div>是否{{ Str }}以下提测?</div>
+                    <div style="color: #f79232;">{{ requireName }}</div>
+                  </div>
+                  <el-input v-show="Str === '打回'" v-model="CallBackTheReason" type="textarea" placeholder="请输入打回原因..." :rows="3" />
+                  <span slot="footer" class="dialog-footer">
+                    <el-button type="primary" size="mini" @click="passOrBackSend()">确 定</el-button>
+                    <el-button type="danger" size="mini" @click="endDialog">取 消</el-button>
+                  </span>
+                </el-dialog>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-row>
+          <el-col :span="24">
+            <div align="right">
+              <el-pagination
+                :page-sizes="[5, 10, 15, testPages.total]"
+                :current-page="testPages.curIndex"
+                :page-size="testPages.pageSize"
+                background
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="testPages.total"
+                @size-change="testSizeChange"
+                @current-change="testCurrentChange"
+              />
+            </div>
+          </el-col>
+        </el-row>
+      </div>
+    </section>
+    <section class="main-section">
+      <div class="el-main-title">
+        <div class="title-left-icon" />
+        <div class="title-left-name">日报报告</div>
+      </div>
+      <div class="detail-info">
+        <el-tab-pane label="日报报告">
+          <el-table :data="dailyTestReports" size="small" :header-cell-style="{ background: '#E9E9E9', color: '#333B4A' }" show-overflow-tooltip="true">
+            <el-table-column label="标题名称" min-width="100" align="center">
+              <template slot-scope="scope">
+                <a href="javascript:void(0)" style="color:#20a0ff" @click="toReportView(scope.row, 0)">{{ scope.row.reportName }}</a>
+              </template>
+            </el-table-column>
+            <el-table-column label="状态" min-width="100" align="center">
+              <template slot-scope="scope">{{ scope.row.statusString }}</template>
+            </el-table-column>
+            <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="100" align="center">
+              <template slot-scope="scope">{{ scope.row.gmtCreate }}</template>
+            </el-table-column>
+          </el-table>
+          <el-col :span="24">
+            <div align="right">
+              <el-pagination
+                :page-sizes="[5, 10, 15, testPages.total]"
+                :current-page="testPages.curIndex"
+                :page-size="testPages.pageSize"
+                background
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="testPages.total"
+                @size-change="testSizeChange"
+                @current-change="testCurrentChange"
+              />
+            </div>
+          </el-col>
+        </el-tab-pane>
+      </div>
+    </section>
+    <!-- 弹框 -->
+    <Test-report v-if="dialogTest" ref="TestReport" />
+    <Daily-report v-if="dialogDaily" ref="DailyReport" />
+    <Client-report v-if="dialogClient" ref="ClientReport" />
+  </div>
+</template>
+<script>
+import {
+  projectTestReport,
+  dailyReport,
+  launchTest,
+  launchTestUpdate,
+  launchTestDelete
+} from '@/api/taskIndex' // ajax
+import TestReport from '@/views/Platform/presentation/Templates/TestReport' // 提测
+import DailyReport from '@/views/Platform/presentation/Templates/DailyReport' // 日报
+import ClientReport from '@/views/Platform/presentation/Templates/ClientReport' // 准出
+export default {
+  components: {
+    TestReport,
+    DailyReport,
+    ClientReport
+  },
+  data() {
+    return {
+      userInformation: localStorage.getItem('username'),
+      userNames: localStorage.getItem('realname'),
+      taskId: Number(this.$route.query.id), // 任务id
+      stColors: ['#409EFF', '#07BCA4', '#F56C6C', '#07BCA4'],
+      dialog_launchTestInfoDOS: false, // 打回弹窗
+      CallBackTheReason: '', // 打回原因
+      CallBackStatus: '', // 打回状态
+      CallBackId: '', // 打回id
+      titName: '', // 打回title
+      Str: '', // 打回操作名称
+      requireName: '', // 归属需求name
+      launchTestInfoDOS: [], // 提测信息
+      testPages: { // 提测分页
+        curIndex: 1,
+        pageSize: 5,
+        total: 0
+      },
+      dailyTestReports: [], // 日报信息
+      DailyPages: { // 提测分页
+        curIndex: 1,
+        pageSize: 5,
+        total: 0
+      },
+      dialogTest: false, // 新建提测报告
+      dialogDaily: false, // 新建日报报告
+      dialogClient: false // 新建准出报告
+    }
+  },
+  created() {
+    this.getTest()
+  },
+  methods: {
+    async getTest() { // 获取提测
+      const params = { taskId: this.taskId, curIndex: this.testPages.curIndex, pageSize: this.testPages.pageSize }
+      const res = await launchTest(params)
+      if (res.code === 200) {
+        this.launchTestInfoDOS = res.data.list
+        this.testPages.total = res.data.total
+      }
+    },
+    testSizeChange(e) { // 提测分页
+      this.testPages.pageSize = e
+      this.getTest()
+    },
+    testCurrentChange(e) { // 提测分页
+      this.testPages.curIndex = e
+      this.getTest()
+    },
+    async passOrBackSend() { // 提测打回
+      this.dialog_launchTestInfoDOS = false
+      const launchTestInfo = { status: this.CallBackStatus, id: this.CallBackId }
+      const userData = { id: '', ename: this.userInformation, name: this.userNames }
+      const objData = { launchTestInfo: launchTestInfo, user: userData }
+      if (this.Str === '通过' || this.Str === '打回') {
+        const res = await launchTestUpdate(objData)
+        if (res.code === 200) {
+          this.getTest()
+          this.$message({ message: res.msg, type: 'success', offset: 150 })
+        } else {
+          this.$message({ message: res.msg, type: 'error', offset: 150 })
+        }
+      } else if (this.Str === '删除') {
+        const res = await launchTestDelete(userData, this.CallBackId)
+        if (res.code === 200) {
+          this.$message({ type: 'warning', message: '已删除' })
+        }
+      }
+    },
+    endDialog() { // 结束对话框
+      this.dialog_launchTestInfoDOS = false
+      this.$message({ type: 'warning', message: '已取消' })
+    },
+    toReportView(ele, index) { // 进入报告详情页
+      switch (index) {
+        case 0:
+          this.dialogDaily = true
+          this.$nextTick(() => {
+            this.$refs.DailyReport.init(3, ele)
+          })
+          break
+        case 1:
+          this.dialogClient = true
+          this.$nextTick(() => {
+            this.$refs.ClientReport.init(3, ele)
+          })
+          break
+        case 2:
+          this.dialogTest = true
+          this.$nextTick(() => {
+            this.$refs.TestReport.init(3, ele)
+          })
+          break
+      }
+    },
+    back(e, ele, data) { // 打回
+      this.requireName = data.name
+      this.CallBackStatus = e
+      this.CallBackId = ele
+      switch (e) {
+        case 1:
+          this.dialog_launchTestInfoDOS = true
+          this.titName = '提测确认'
+          this.Str = '通过'
+          break
+        case 2:
+          this.dialog_launchTestInfoDOS = true
+          this.titName = '提测确认'
+          this.Str = '打回'
+          break
+        case 3:
+          data.taskIds = [Number(this.taskId)]
+          this.dialogTest = true
+          this.$nextTick(() => {
+            this.$refs.TestReport.init(4, data)
+          })
+          break
+        case 4:
+          this.dialog_launchTestInfoDOS = true
+          this.titName = '删除确认'
+          this.Str = '删除'
+          break
+        case 5:
+          this.dialogTest = true
+          this.$nextTick(() => {
+            this.$refs.TestReport.init(3, data)
+          })
+          break
+        case 6:
+          this.dialogTest = true
+          this.$nextTick(() => {
+            this.$refs.TestReport.init(2, data)
+          })
+          break
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+@import '@/styles/detail-pages.scss';
+.main-section {
+  @include main-section;
+  .detail-info {
+    padding: 0 34px 20px 34px;
+  }
+}
+.btn{
+  cursor: pointer;
+}
+</style>

+ 256 - 0
src/views/projectManage/taskList/components/scheduleList.vue

@@ -0,0 +1,256 @@
+<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-table
+      :id="'schedule-'+id"
+      :data="scheduleList"
+      :header-cell-style="{'background-color': 'rgba(232,232,232,0.4)'}"
+      :row-style="{'background-color': 'transparent'}"
+      style="width: 100%"
+      show-overflow-tooltip="true"
+      row-key="id"
+    >
+      <el-table-column
+        width="80"
+        align="center"
+      >
+        <template>
+          <el-tooltip class="item" effect="dark" content="代表移动,鼠标选中区域可以向上移动" placement="bottom">
+            <div class="sortable-tip" />
+          </el-tooltip>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="type"
+        label="类型"
+        width="180"
+        align="center"
+      >
+        <template slot-scope="scope">
+          {{ getType(scope.row.type) }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="desc"
+        label="描述"
+        min-width="250"
+        align="center"
+        show-overflow-tooltip
+      />
+      <el-table-column
+        prop="seperateDaysNoHoliday"
+        label="排期"
+        min-width="250"
+        align="center"
+        show-overflow-tooltip
+      />
+      <el-table-column
+        prop="dayLength"
+        label="时长"
+        width="200"
+        align="center"
+      />
+      <el-table-column
+        prop="peopleList"
+        label="参与人员"
+        min-width="200"
+        align="center"
+      />
+      <el-table-column
+        label="操作"
+        width="200"
+        align="center"
+        show-overflow-tooltip
+      >
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="editSchedule(scope.row)">编辑</el-button>
+          <el-button type="text" size="small" @click="confirmDel(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+
+    </el-table>
+    <div class="bottom-detail">
+      <el-row>排期总汇:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }}</el-row>
+      <el-row v-if="scheduleDetail.preOnlineVersion && scheduleDetail.preOnlineVersion.length>0">
+        预计上线版本:
+        <span v-for="item in scheduleDetail.preOnlineVersion" :key="item">{{ item }}</span>
+      </el-row>
+      <el-row v-else>预计上线版本:</el-row>
+    </div>
+    <modify-schedule
+      v-if="visibleSchedule"
+      :visible.sync="visibleSchedule"
+      :detail-data="detailData"
+      :title="DialogTitle"
+      @update="listByTask(id)"
+    />
+  </div>
+</template>
+<script>
+import Sortable from 'sortablejs'
+import moment from 'moment'
+import 'moment/locale/zh-cn'
+import { listByTask, scheduleDelete, sortForTask } from '@/api/projectViewDetails'
+import modifySchedule from './modifySchedule'
+export default {
+  components: {
+    modifySchedule
+  },
+  filters: {
+    handlerDate(val) {
+      return val ? moment(val).format('YYYY-MM-DD') : ''
+    }
+  },
+  props: {
+    id: {
+      type: Number,
+      default: NaN,
+      required: true
+    },
+    typeList: {
+      type: Array,
+      default: () => [],
+      required: false
+    }
+  },
+  data() {
+    return {
+      scheduleList: [],
+      scheduleDetail: {},
+      visibleSchedule: false,
+      detailData: null,
+      taskScheduleEvent: [], // 排期类型
+      DialogTitle: '新建排期'
+    }
+  },
+  watch: {
+    id: {
+      handler(newV, oldV) {
+        this.listByTask(newV)
+      },
+      immediate: true
+    },
+    typeList: {
+      handler(newV, oldV) {
+        this.taskScheduleEvent = newV
+      },
+      immediate: true
+    }
+  },
+  mounted() {
+    this.rowDrop()
+  },
+  methods: {
+    rowDrop() {
+      const tbody = document.querySelector(`#schedule-${this.id} tbody`)
+      const _this = this
+      Sortable.create(tbody, {
+        onEnd({ newIndex, oldIndex }) {
+          const currRow = _this.scheduleList.splice(oldIndex, 1)[0]
+          _this.scheduleList.splice(newIndex, 0, currRow)
+          _this.sortForTask(_this.scheduleList.map(item => item.id))
+        }
+      })
+    },
+    async sortForTask(arr) {
+      const res = await sortForTask(this.id, arr)
+      if (res.code === 200) {
+        this.$message({ message: '移动成功', type: 'success', duration: 1000, offset: 150 })
+      }
+    },
+    getType(value) {
+      const res = this.taskScheduleEvent.find(item => item.code === value) || {}
+      return res.msg
+    },
+    async listByTask(id) { // 获取排期列表
+      const res = await listByTask(id)
+      if (res.code === 200) {
+        this.scheduleList = res.data.schedulDetailResponses
+        this.scheduleDetail = res.data || {}
+        this.scheduleList = this.scheduleList.map(item => ({
+          ...item,
+          peopleList: item.peopleObjectList.map(item => item.name).join(',')
+        }))
+      }
+    },
+    addSchedule() {
+      this.detailData = null
+      this.DialogTitle = '新建排期'
+      this.visibleSchedule = true
+    },
+    confirmDel(row) {
+      this.$confirm('是否删除排期?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.deleteSchedule(row)
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '已取消删除'
+        })
+      })
+    },
+    async deleteSchedule(row) { // 删除排期
+      const res = await scheduleDelete(row.id)
+      if (res.code === 200) {
+        this.listByTask(this.id)
+        this.$message({ message: '删除成功', type: 'success', duration: 1000, offset: 150 })
+      }
+    },
+    editSchedule(row) { // 编辑排期
+      this.DialogTitle = '编辑排期'
+      this.visibleSchedule = true
+      this.detailData = row
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.add-schedule {
+  cursor: pointer;
+  color: #409EFF;
+  font-size: 14px;
+  width: calc(100% - 40px);
+  margin: 0 20px;
+  padding: 20px 0;
+  i {
+    margin-right: 4px;
+  }
+  span {
+    margin-right: 20px;
+  }
+}
+.schedule-list {
+  width: calc(100% - 40px);
+  margin: 0 20px;
+  padding: 0;
+  background:rgba(248,248,248,0.6);
+}
+>>>.el-table, .el-table__expanded-cell{
+  background:rgba(248,248,248,0.6);
+}
+.bottom-detail {
+  font-size: 14px;
+  width: calc(100% - 40px);
+  margin: 0 20px;
+  padding: 20px 0;
+  :first-child {
+    margin-bottom: 10px;
+  }
+}
+.sortable-tip {
+  height: 26px;
+  width: 15px;
+  border:1px solid rgba(0,0,0,0.15);
+  border-radius:2px;
+  margin: auto;
+}
+</style>
+<style>
+.el-tooltip__popper.is-dark {
+  background:rgba(121,132,150,0.8);
+  color: #FFF;
+}
+</style>

+ 111 - 19
src/views/projectManage/taskList/taskViewDetail.vue

@@ -34,6 +34,9 @@
             <i class="el-icon-circle-plus icon-add" />
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item @click.native="created_bug()">新建缺陷</el-dropdown-item>
+              <el-dropdown-item @click.native="createReport(1, form_query)">新建提测报告</el-dropdown-item>
+              <el-dropdown-item @click.native="createReport(2, form_query)">新建测试报告</el-dropdown-item>
+              <el-dropdown-item @click.native="createReport(3, form_query)">新建准出报告</el-dropdown-item>
             </el-dropdown-menu>
           </el-dropdown>
           <div class="line" />
@@ -64,17 +67,49 @@
                 </el-select>
               </el-form-item>
               <el-form-item label="所属模块:">
-                {{ form_query.moduleInfoName }}
+                <span class="module">{{ form_query.moduleInfoName }}</span>
               </el-form-item>
             </el-form>
-            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px" />
-            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px" />
+            <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" />
+              </el-form-item>
+              <el-form-item label="测试负责人:">
+                <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">
+                  <el-option v-for="(item,index) in dependList" :key="item.msg + index" :label="item.msg" :value="item.code" />
+                </el-select>
+              </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="跟版客户端:">
+                <el-select v-if="form_query.followVersion === 1" v-model="form_query.involveApp" size="small" filterable placeholder="请选择" @change="changeArea">
+                  <el-option v-for="(item,index) in appClient" :key="item.msg + index" :label="item.msg" :value="item.code" />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="任务进度:">
+                <div class="form-progress">
+                  <el-progress :percentage="Number(form_query.rate && form_query.rate.substring(0,4)) || 0" color="#409eff" />
+                </div>
+              </el-form-item>
+            </el-form>
+          </div>
+        </section>
+        <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="taskId" :type-list="taskScheduleEvent" />
           </div>
         </section>
         <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>
           </div>
           <div>
             <text-area :id="'pro-desc'" :value.sync="form_query.description" :empty-text="'点击'" :input-button="'添加描述'" @change="changeArea" />
@@ -109,23 +144,30 @@
         </section>
       </el-container>
       <!-- 概览 -->
-      <!-- 任务 -->
+      <!-- 缺陷 -->
       <el-container v-show="activeName === '2'" class="is-vertical">
-        <section class="main-section" />
+        <section class="main-section">
+          <bugs-list />
+        </section>
       </el-container>
-      <!-- 任务 -->
       <!-- 缺陷 -->
+      <!-- 报告 -->
       <el-container v-show="activeName === '3'" class="is-vertical">
-        <section class="main-section" />
+        <section class="main-section">
+          <report-list />
+        </section>
       </el-container>
-      <!-- 缺陷 -->
+      <!-- 报告 -->
       <!-- 统计 -->
       <el-container v-if="activeName === '4'" class="is-vertical">
         <section class="main-section" />
       </el-container>
       <!-- 统计 -->
       <!-- 新建(bug) -->
-      <createdBug v-if="updateVisible" ref="createdBug" />
+      <createdBug v-if="bug_open" ref="createdBug" />
+      <Test-report v-if="dialogTest" ref="TestReport" />
+      <Daily-report v-if="dialogDaily" ref="DailyReport" />
+      <Client-report v-if="dialogClient" ref="ClientReport" />
       <!-- 新建 -->
       <!-- 编辑 -->
       <open-dialog v-if="updateVisible" ref="task_createdUpdata" />
@@ -180,6 +222,12 @@ import image_url from '@/assets/home_images/home_u.png'
 import createdBug from '@/views/projectManage/bugList/file/createdBug'
 import normalDialog from '@/components/dialog/normalDialog'
 import openDialog from '@/views/projectManage/dialog_vue'
+import scheduleList from './components/scheduleList'
+import bugsList from './components/bugsList'
+import reportList from './components/reportList'
+import TestReport from '@/views/Platform/presentation/Templates/TestReport' // 提测
+import DailyReport from '@/views/Platform/presentation/Templates/DailyReport' // 日报
+import ClientReport from '@/views/Platform/presentation/Templates/ClientReport' // 准出
 export default {
   components: {
     searchPeople,
@@ -187,7 +235,13 @@ export default {
     textArea,
     drawer,
     createdBug,
-    openDialog
+    openDialog,
+    scheduleList,
+    bugsList,
+    reportList,
+    TestReport,
+    DailyReport,
+    ClientReport
   },
   filters: {
     ellipsis(value, num) {
@@ -204,10 +258,13 @@ export default {
       userInformation: localStorage.getItem('username'),
       userNames: localStorage.getItem('realname'),
       textarea: '', // 评论
-      taskId: this.$route.query.id, // 任务id
+      taskId: Number(this.$route.query.id), // 任务id
       allStatus: [], // 任务所有状态
       belongProjectList: [], // 所属项目列表
       requireList: [], // 所属需求列表
+      appClient: [], // 跟版客户端列表
+      taskScheduleEvent: [], // 排期类型
+      dependList: [{ msg: '否', code: 2 }, { msg: '是', code: 1 }], // 是否跟版
       statusDialog: false, // 修改状态弹框
       changeStatusDate: null, // 状态改变时间
       form_query: {},
@@ -217,6 +274,9 @@ export default {
       updateVisible: false, // 编辑任务弹框
       deleteVisible: false, // 删除任务弹框
       bug_open: false, // 新建缺陷弹框
+      dialogTest: false, // 新建提测报告
+      dialogDaily: false, // 新建日报报告
+      dialogClient: false, // 新建准出报告
       iterationList: [], // 所属迭代列表
       commentContent: null, // 评论内容
       comments: [] // 评论列表
@@ -242,13 +302,13 @@ export default {
   },
   methods: {
     async changeArea(e) { // area修改
-      const requirementInfo = _.cloneDeep(this.form_query)
+      const taskInfoDO = _.cloneDeep(this.form_query)
       const user = {
         name: localStorage.getItem('username'),
         ename: localStorage.getItem('realname'),
         id: ''
       }
-      const res = await taskUpdate({ requirementInfo, user })
+      const res = await taskUpdate({ taskInfoDO, user })
       if (res.code === 200) {
         this.$message({ message: '修改', type: 'success', duration: 1000, offset: 150 })
       }
@@ -266,11 +326,18 @@ export default {
         this.requireList = res.data
       }
     },
-    async getTaskStatus() { // 获取任务状态列表
+    async getTaskStatus() { // 获取任务状态列表,跟版客户端列表
       const res = await configShowTaskEnum()
       if (res.code === 200) {
-        console.log(res.data.taskStatus)
         this.allStatus = res.data.taskStatus
+        this.taskScheduleEvent = res.data.taskScheduleEvent || []
+        this.appClient = res.data.appClient.map(item => {
+          return {
+            ...item,
+            code: `${item.code}`
+          }
+        })
+        console.log(this.appClient)
       }
     },
     async taskGet() { // 获取任务详情
@@ -279,14 +346,14 @@ export default {
         this.form_query = res.data
       }
     },
-    async getCommentList() { // 获取需求评论
+    async getCommentList() { // 获取任务评论
       const res = await commentList({ type: 3, joinId: this.taskId })
       if (res.code === 200) {
         this.comments = res.data
         this.commentContent = ''
       }
     },
-    async addComment() { // 发表需求评论
+    async addComment() { // 发表任务评论
       if (this.commentContent.replace(/\s+/g, '') === '' || this.commentContent === null) {
         this.$message.warning('评论不能为空')
         return
@@ -302,7 +369,8 @@ export default {
       const user = { name: this.userNames, ename: this.userInformation, id: '' }
       const res = await commentCreate({ commentInfo, user })
       if (res.code === 200) {
-        this.taskGet()
+        this.$message({ message: '评论成功', type: 'success', duration: 1000, offset: 150 })
+        this.getCommentList()
       } else {
         this.$message.warning(res.msg)
       }
@@ -344,6 +412,22 @@ export default {
       this.$nextTick(() => {
         this.$refs.createdBug.init(1)
       })
+    },
+    createReport(e, ele) { // 创建报告
+      switch (e) {
+        case 1: // 提测
+          this.dialogTest = true
+          this.$nextTick(() => { this.$refs.TestReport.init(1, ele) })
+          break
+        case 2: // 日报
+          this.dialogDaily = true
+          this.$nextTick(() => { this.$refs.DailyReport.init(1) })
+          break
+        case 3:
+          this.dialogClient = true
+          this.$nextTick(() => { this.$refs.ClientReport.init(1, ele) })
+          break
+      }
     }
   }
 }
@@ -426,6 +510,10 @@ export default {
     }
   }
 }
+.module {
+  width: 100%;
+  overflow: hidden;
+}
 .dialog-change-status {
   margin: 2% 3%;
   display: flex;
@@ -433,4 +521,8 @@ export default {
   align-items: center;
   white-space:nowrap;
 }
+.form-progress {
+  width: 200px;
+  padding-top: 12px;
+}
 </style>

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

@@ -1,5 +1,5 @@
 <template>
-  <normal-dialog v-if="isVisible" :show-dialog.sync="isVisible" :title="title" :is-default-close="false" @confirm="confirmForm()" @cancel="cancel()">
+  <normal-dialog :show-dialog.sync="isVisible" :title="title" :is-default-close="false" @confirm="confirmForm()" @cancel="cancel()">
     <article>
       <el-form ref="calendarform" :model="form" :rules="rules" label-position="left" label-width="90px">
         <el-row>

+ 2 - 2
src/views/workbench/person/components/calenderDetail.vue

@@ -4,7 +4,7 @@
       <div class="detail-title">【任务排期】{{ nowDetailData.name }}</div>
       <div class="detail-time item">
         <div class="label">排期:</div>
-        <div>{{ nowDetailData.seperateDaysHasHoliday }}(用时<span>{{ nowDetailData.needDays }}</span>天)</div>
+        <div>{{ nowDetailData.seperateDaysNoHoliday }}(用时<span>{{ nowDetailData.needDays }}</span>天)</div>
       </div>
       <div class="detail-people item"><div class="label">参与人:</div>{{ nowDetailData.peopleObject.name }}</div>
       <div class="detail-needs item"><div class="label">所属需求:</div>{{ nowDetailData.requireNames | arrToString }}</div>
@@ -18,7 +18,7 @@
       <div class="detail-title">【日程】{{ nowDetailData.name }}</div>
       <div class="detail-time item">
         <div class="label">排期:</div>
-        <div>{{ nowDetailData.seperateDaysHasHoliday }}(用时<span>{{ nowDetailData.needDays }}</span>天)</div>
+        <div>{{ nowDetailData.seperateDaysNoHoliday }}(用时<span>{{ nowDetailData.needDays }}</span>天)</div>
       </div>
       <div class="detail-people item"><div class="label">参与人:</div>{{ nowDetailData.peopleObject.name }}</div>
       <div class="detail-needs item"><div class="label">同步到团队:</div>{{ nowDetailData.syncTeam === 0?'否':'是' }}</div>

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

@@ -41,7 +41,7 @@
       :header-row-style="{height: '61px'}"
     >
       <el-table-column label="日程名称" prop="name" width="250" align="center" show-overflow-tooltip />
-      <el-table-column label="日期" width="250" align="center" prop="seperateDaysHasHoliday" show-overflow-tooltip />
+      <el-table-column label="日期" width="250" align="center" prop="seperateDaysNoHoliday" show-overflow-tooltip />
       <el-table-column label="参与人" align="center" width="120" show-overflow-tooltip>
         <template slot-scope="scope">
           {{ scope.row.peopleObjectList | peopleListHandler }}

+ 1 - 0
src/views/workbench/person/index.vue

@@ -135,6 +135,7 @@
         @confirm="queryWorkListByTime(calendarView)"
       />
       <calendar-dialog
+        v-if="createSchedule.visible"
         :title="'新建日程'"
         :visible.sync="createSchedule.visible"
         :data="createSchedule.data"