wenbobowen 4 жил өмнө
parent
commit
589cca29c7

+ 1 - 1
package.json

@@ -63,7 +63,7 @@
     "vue-json-viewer": "^2.2.8",
     "vue-json-viewer": "^2.2.8",
     "vue-qr": "^2.2.1",
     "vue-qr": "^2.2.1",
     "vue-router": "3.0.6",
     "vue-router": "3.0.6",
-    "vuedraggable": "^2.23.2",
+    "vuedraggable": "^2.24.3",
     "vuex": "3.1.0",
     "vuex": "3.1.0",
     "wangeditor": "^3.1.1",
     "wangeditor": "^3.1.1",
     "webpack": "^4.44.2",
     "webpack": "^4.44.2",

+ 81 - 0
src/api/publishTask.js

@@ -0,0 +1,81 @@
+// 项目
+import request from '@/utils/request'
+import { TeamManagement } from '@/apiConfig/api'
+
+console.log(TeamManagement)
+// 获取项目列表
+const host = TeamManagement
+export function getCheckListBytask(data) {
+  return request({
+    url: `${host}/checklist/getByTask?taskId=${data.taskId}`,
+    method: 'get'
+  })
+}
+
+export function getBizBindTemList(data) {
+  return request({
+    url: `${host}/checklist/selectTemplates`,
+    method: 'post',
+    data
+  })
+}
+
+export function getOnlineBizModule(data) {
+  return request({
+    url: `${host}/checklist/selectBizModule?taskId=${data.taskId}&moduleName=${data.moduleName}`,
+    method: 'get',
+    data
+  })
+}
+
+export function updateChecklist(data) {
+  return request({
+    url: `${host}/checklist/update`,
+    method: 'post',
+    data
+  })
+}
+
+export function createChecklist(data) {
+  return request({
+    url: `${host}/checklist/create`,
+    method: 'post',
+    data
+  })
+}
+
+// 更新checklist下模板的check状态
+export function updateTemplateCheckStatus(data) {
+  return request({
+    url: `${host}/checklist/updateTemplateCheckStatus`,
+    method: 'post',
+    data
+  })
+}
+
+// 获取评论列表
+export function getCommentList(data) {
+  return request({
+    url: `${host}/comment/list`,
+    method: 'post',
+    data
+  })
+}
+
+// 创建评论列表/comment/create
+export function createComment(data) {
+  return request({
+    url: `${host}/comment/create`,
+    method: 'post',
+    data
+  })
+}
+
+// 获取变更记录列表
+export function getRecordList(data) {
+  return request({
+    url: `${host}/operationLog/checkList`,
+    method: 'post',
+    data
+  })
+}

+ 153 - 0
src/components/actionDynamic/index.vue

@@ -0,0 +1,153 @@
+<template>
+  <div class="actionDynamic">
+    <el-tabs v-model="activeName" @tab-click="changeTabs">
+      <el-tab-pane label="评论" name="Comments">
+        <div class="Comments">
+          <div
+            v-for="(item, index) in comments"
+            :key="index"
+          >
+            <div style="font-size: 14px; color: #333b4a; display: inline-block">
+              {{ item.commentInfo.name }}
+            </div>
+            <div
+              style="
+                margin-left: 20px;
+                display: inline-block;
+                color: #9b9b9b;
+                font-size: 12px;
+              "
+            >
+              {{ item.commentInfo.gmtCreater }}
+            </div>
+            <p
+              style="
+                font-size: 14px;
+                color: #333b4a;
+                margin: 0 0 25px 0;
+                white-space: pre-line;
+              "
+            >
+              {{ item.commentInfo.content }}
+            </p>
+          </div>
+          <el-input
+            v-model="commentContent"
+            type="textarea"
+            placeholder="请输入评论内容"
+            maxlength="1000"
+            show-word-limit
+            :autosize="{ minRows: 3, maxRows: 5 }"
+            style="margin-bottom: 2%"
+          />
+          <el-button
+            type="primary"
+            size="small"
+            style="float: right"
+            @click="$emit('addComment', commentContent, callback)"
+          >
+            发表评论
+          </el-button>
+        </div>
+      </el-tab-pane>
+      <el-tab-pane label="变更记录" name="Logs">
+        <div v-for="(item,index) in changeRecord" :key="index" class="Layout_space_between sign-record">
+          <span>
+            <span class="operatorName">{{ item.operator }} : </span>
+            <span class="remark">{{ item.remark }}</span>
+          </span>
+          <span class="createTime">{{ item.createTime }}</span>
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+<script>
+import '@/styles/PublicStyle/index.scss'
+export default {
+  props: {
+    comments: {
+      type: Array,
+      required: false,
+      default: () => []
+    },
+    changeRecord: {
+      type: Array,
+      required: false,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      activeName: 'Comments',
+      commentContent: ''
+      // comments: [
+      //   {
+      //     child: [],
+      //     commentInfo: {"id":11529,"joinId":4721,"bizId":null,"type":3,"fatherId":0,"name":"文博","email":"wenbobowen","content":"test111","gmtCreater":"2020-12-31 15:03:37","gmtModify":"2020-12-31 15:03:37"}
+      //   },
+      //   {
+      //     child: [],
+      //     commentInfo: {"id":11529,"joinId":4721,"bizId":null,"type":3,"fatherId":0,"name":"文博","email":"wenbobowen","content":"test222","gmtCreater":"2020-12-31 15:03:37","gmtModify":"2020-12-31 15:03:37"}
+      //   }
+      // ],
+      // changeRecord: [
+      //   {
+      //     createTime: "2020-12-29 13:48:55",
+      //     operator: "廖子君",
+      //     remark: "更新了任务状态,从【已准出】到【已上线】"
+      //   },
+      //   {
+      //     createTime: "2020-12-29 13:48:55",
+      //     operator: "廖子君",
+      //     remark: "更新了任务状态,从【已准出】到【已上线】"
+      //   },
+      //   {
+      //     createTime: "2020-12-29 13:48:55",
+      //     operator: "廖子君",
+      //     remark: "更新了任务状态,从【已准出】到【已上线】"
+      //   }
+      // ]
+    }
+  },
+  methods: {
+    changeTabs(e) {
+      console.log(e)
+    },
+    callback() {
+      console.log('chengg')
+      this.commentContent = ''
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+.actionDynamic {
+  padding: 0px 30px 20px 30px;
+  .Comments {
+    padding: 0 34px 20px 34px;
+  }
+}
+.sign-record {
+  margin: 20px 0;
+  font-size:14px;
+  line-height:20px;
+  opacity:1;
+  font-family:PingFangSC-Regular;
+}
+.createTime {
+  min-width:150px;
+  color:rgba(68,68,68,1);
+}
+
+.remark {
+  min-width:500px;
+  text-align: left;
+  color:#444444;
+}
+.operatorName {
+  min-width: 60px;
+  color:rgba(51,59,74,1);
+  margin-right: 10px;
+}
+</style>

+ 32 - 0
src/components/checkListStopConfirm/index.vue

@@ -0,0 +1,32 @@
+<template>
+  <div class="dialog-main">
+    <el-dialog
+      title="设置checklist"
+      :visible.sync="visible"
+      width="30%"
+      :close-on-click-modal="false"
+      :show-close="false"
+    >
+      <div style="position: absolute; top: 23px; left: 12px;width:4px;height:17px;background:#409EFF;border-radius:1px;" />
+      <div align="center">
+        <div>是否需为任务设置发布checklist?</div>
+        <div style="color: #f79232;">您所在的业务线要求提测前设置发布checklist</div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" size="mini" @click="$emit('confirm')">是,去设置</el-button>
+        <el-button type="danger" size="mini" @click="$emit('cancel')">不需要</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    visible: {
+      type: Boolean,
+      default: false,
+      required: true
+    }
+  }
+}
+</script>

+ 54 - 0
src/components/headTitle/index.vue

@@ -0,0 +1,54 @@
+<template>
+  <div class="main-title">
+    <div class="title-left-icon" />
+    <div class="title-left-name">{{ title }}</div>
+    <div v-if="openEdit" class="editBtn">
+      <i class="el-icon-edit" @click="$emit('editHandle')" />
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    title: {
+      type: String,
+      required: true
+    },
+    openEdit: {
+      type: Boolean,
+      required: false
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+.main-title {
+  align-items: center;
+  padding: 20px 30px;
+  .title-left-icon {
+    width: 4px;
+    height: 17px;
+    background: #409eff;
+    border-radius: 1px;
+    display: inline-block;
+    vertical-align: text-top;
+  }
+  .title-left-name {
+    display: inline-block;
+    width: auto;
+    height: 20px;
+    line-height: 20px;
+    font-size: 16px;
+    font-family: Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,"\5FAE\8F6F\96C5\9ED1",Arial,sans-serif;
+    color: #333b4a;
+    margin-left: 6px;
+  }
+  .editBtn {
+    display: inline-block;
+    .el-icon-edit {
+      color: #1890FF;
+      margin-left: 6px;
+    }
+  }
+}
+</style>

+ 8 - 2
src/components/input/normalArea.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div>
   <div>
-    <article :id="id">
+    <article :id="id" :style="styles">
       <editor :id="'tinymce_'+id" ref="editor" v-model="inputValue" :init="init" @input="changeText" />
       <editor :id="'tinymce_'+id" ref="editor" v-model="inputValue" :init="init" @input="changeText" />
     </article>
     </article>
   </div>
   </div>
@@ -10,7 +10,6 @@ import tinymce from 'tinymce/tinymce'
 import Editor from '@tinymce/tinymce-vue'
 import Editor from '@tinymce/tinymce-vue'
 import 'tinymce/themes/silver/theme'
 import 'tinymce/themes/silver/theme'
 import 'tinymce/icons/default/icons'
 import 'tinymce/icons/default/icons'
-
 export default {
 export default {
   components: {
   components: {
     Editor
     Editor
@@ -30,6 +29,13 @@ export default {
       type: Number,
       type: Number,
       default: 200,
       default: 200,
       required: false
       required: false
+    },
+    styles: {
+      type: Object,
+      default: () => {
+        return { }
+      },
+      required: false
     }
     }
   },
   },
   data() {
   data() {

+ 11 - 3
src/components/input/textArea.vue

@@ -3,6 +3,7 @@
     <article
     <article
       :id="id"
       :id="id"
       v-loading="loading"
       v-loading="loading"
+      :style="styles"
       element-loading-text="数据上传中,请稍后"
       element-loading-text="数据上传中,请稍后"
       element-loading-spinner="el-icon-loading"
       element-loading-spinner="el-icon-loading"
     >
     >
@@ -39,6 +40,13 @@ export default {
     Editor
     Editor
   },
   },
   props: {
   props: {
+    styles: {
+      type: Object,
+      default: () => {
+        return { padding: '0 30px 20px 30px' }
+      },
+      required: false
+    },
     id: {
     id: {
       type: String,
       type: String,
       default: '',
       default: '',
@@ -149,9 +157,9 @@ export default {
 }
 }
 </script>
 </script>
 <style scoped lang="scss">
 <style scoped lang="scss">
-article {
-  padding: 0 30px 20px 30px;
-}
+// article {
+//   padding: 0 30px 20px 30px;
+// }
 .text-edit {
 .text-edit {
   color: #666666;
   color: #666666;
   font-size: 14px;
   font-size: 14px;

+ 43 - 0
src/components/redTipTitle/index.vue

@@ -0,0 +1,43 @@
+<template>
+  <p class="redTipword">
+    <span class="title" :class="isedit && 'edit'">{{ title }}</span>
+  </p>
+</template>
+<script>
+export default {
+  name: 'Tipword',
+  props: {
+    title: {
+      type: String,
+      required: true
+    },
+    isedit: {
+      type: Boolean,
+      required: false,
+      default: false
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+.redTipword {
+  vertical-align: middle;
+  margin: 35px 0 10px 0px;
+  .title {
+    font-size: 16px;
+    font-weight: 400;
+    line-height: 18px;
+    color: #444;
+  }
+  &:first-child {
+    margin-top: 0px;
+  }
+  .edit {
+    &::before{
+      content: '*';
+      color: #F56C6C;
+      margin-right: 4px;
+    }
+  }
+}
+</style>

+ 1 - 0
src/icons/svg/add.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14"><defs><style>.cls-1{fill:#409eff}</style></defs><g id="添加_2_" data-name="添加 (2)" transform="translate(-138.581 -138.581)"><path id="路径_13078" data-name="路径 13078" class="cls-1" d="M271.147 491.958h-7.309c-.186 0-.328-.095-.328-.219s.142-.219.328-.219h7.309c.186 0 .328.095.328.219s-.142.219-.328.219z" transform="translate(-121.911 -346.152)"/><path id="路径_13079" data-name="路径 13079" class="cls-1" d="M491.739 271.482c-.124 0-.219-.142-.219-.329v-7.315c0-.186.095-.329.219-.329s.219.142.219.329v7.315c0 .186-.095.329-.219.329z" transform="translate(-346.158 -121.91)"/><path id="路径_13080" data-name="路径 13080" class="cls-1" d="M151.468 152.581h-11.773a1.115 1.115 0 01-1.113-1.114V139.7a1.115 1.115 0 011.113-1.114h11.773a1.115 1.115 0 011.113 1.114v11.78a1.12 1.12 0 01-1.113 1.101zm-11.773-13.231a.362.362 0 00-.346.346v11.771a.362.362 0 00.346.346h11.773a.344.344 0 00.346-.346V139.7a.362.362 0 00-.346-.346z"/></g></svg>

+ 1 - 0
src/icons/svg/del.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14"><defs><style>.cls-1{fill:#409eff}</style></defs><g id="添加_2_" data-name="添加 (2)" transform="translate(-138.581 -138.581)"><path id="路径_13078" data-name="路径 13078" class="cls-1" d="M272.138 492.1h-8.258c-.21 0-.371-.125-.371-.288s.161-.288.371-.288h8.258c.21 0 .371.125.371.288s-.16.288-.371.288z" transform="translate(-122.17 -346.22)"/><path id="路径_13080" data-name="路径 13080" class="cls-1" d="M151.468 152.581h-11.773a1.115 1.115 0 01-1.113-1.114V139.7a1.115 1.115 0 011.113-1.114h11.773a1.115 1.115 0 011.113 1.114v11.78a1.12 1.12 0 01-1.113 1.101zm-11.773-13.231a.362.362 0 00-.346.346v11.771a.362.362 0 00.346.346h11.773a.344.344 0 00.346-.346V139.7a.362.362 0 00-.346-.346z"/></g></svg>

+ 1 - 5
src/icons/svg/problem.svg

@@ -1,6 +1,3 @@
-<<<<<<< HEAD
-<svg xmlns="http://www.w3.org/2000/svg" width="13.308" height="14.215"><defs><linearGradient id="a" x1=".5" x2=".5" y2="1" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#409eff"/><stop offset="1" stop-color="#80c9ff"/></linearGradient></defs><g transform="translate(-201.5 -191.2)" fill="url(#a)"><path data-name="路径 13053" d="M212.3 205.415h-9.6a1.157 1.157 0 01-1.2-1.111v-11.993a1.158 1.158 0 011.2-1.111h9.6a1.157 1.157 0 011.2 1.111v1.8a.443.443 0 01-.887 0v-1.8c0-.119-.145-.222-.309-.222h-9.6c-.165 0-.309.1-.309.222V204.3c0 .119.145.222.309.222h9.6c.165 0 .309-.1.309-.222v-.7a.443.443 0 11.887 0v.709a1.156 1.156 0 01-1.2 1.106z"/><path data-name="路径 13054" d="M210.565 195.652h-6.664a.45.45 0 010-.9h6.664a.45.45 0 010 .9zm-1.332 3.095h-5.332a.439.439 0 110-.878h5.329a.439.439 0 110 .878zm1.332 3.117h-6.664a.45.45 0 010-.9h6.664a.45.45 0 010 .9z"/><path data-name="路径 13055" d="M214.363 197.923a.444.444 0 01-.443-.443.91.91 0 10-1.82 0 .444.444 0 01-.887 0 1.8 1.8 0 113.6 0 .445.445 0 01-.45.443z"/><path data-name="路径 13056" d="M213.103 201.123a.444.444 0 01-.443-.443v-.72a1.9 1.9 0 01.56-1.361 1.908 1.908 0 00.694-1.124.451.451 0 01.439-.441.437.437 0 01.443.415 2.553 2.553 0 01-.964 1.789 1 1 0 00-.29.722v.72a.442.442 0 01-.439.443z"/><path data-name="路径 13057" d="M212.62900000000002 201.912a.474.474 0 10.474-.474.474.474 0 00-.474.474z"/></g></svg>
-=======
 
 
 <svg xmlns="http://www.w3.org/2000/svg" width="8.272" height="9.613" viewBox="0 0 8.272 9.613">
 <svg xmlns="http://www.w3.org/2000/svg" width="8.272" height="9.613" viewBox="0 0 8.272 9.613">
   <g id="问题" transform="translate(-160.5 -103.5)">
   <g id="问题" transform="translate(-160.5 -103.5)">
@@ -8,5 +5,4 @@
     <path id="路径_433" data-name="路径 433" d="M165.2,112.347h-3.692a1.008,1.008,0,0,1-1.006-1.006v-6.835a1.008,1.008,0,0,1,1.006-1.006h6.26a1.008,1.008,0,0,1,1.006,1.006v3.8a.335.335,0,1,1-.671,0v-3.8a.336.336,0,0,0-.335-.335h-6.26a.336.336,0,0,0-.335.335v6.835a.336.336,0,0,0,.335.335H165.2a.335.335,0,1,1,0,.671Z" fill="#666"/>
     <path id="路径_433" data-name="路径 433" d="M165.2,112.347h-3.692a1.008,1.008,0,0,1-1.006-1.006v-6.835a1.008,1.008,0,0,1,1.006-1.006h6.26a1.008,1.008,0,0,1,1.006,1.006v3.8a.335.335,0,1,1-.671,0v-3.8a.336.336,0,0,0-.335-.335h-6.26a.336.336,0,0,0-.335.335v6.835a.336.336,0,0,0,.335.335H165.2a.335.335,0,1,1,0,.671Z" fill="#666"/>
     <path id="路径_434" data-name="路径 434" d="M646.23,572.333a.333.333,0,0,1-.335-.332,1.675,1.675,0,0,1,.688-1.32.518.518,0,0,0,.192-.539.538.538,0,0,0-.406-.388.589.589,0,0,0-.5.109.521.521,0,0,0-.2.406.335.335,0,1,1-.671,0,1.186,1.186,0,0,1,.449-.928,1.256,1.256,0,0,1,1.064-.241,1.2,1.2,0,0,1,.913.89,1.188,1.188,0,0,1-.433,1.224,1.014,1.014,0,0,0-.427.784A.34.34,0,0,1,646.23,572.333Zm0,.87a.335.335,0,0,1,0-.671h0a.335.335,0,1,1,0,.671Z" transform="translate(-478.799 -460.089)" fill="#666"/>
     <path id="路径_434" data-name="路径 434" d="M646.23,572.333a.333.333,0,0,1-.335-.332,1.675,1.675,0,0,1,.688-1.32.518.518,0,0,0,.192-.539.538.538,0,0,0-.406-.388.589.589,0,0,0-.5.109.521.521,0,0,0-.2.406.335.335,0,1,1-.671,0,1.186,1.186,0,0,1,.449-.928,1.256,1.256,0,0,1,1.064-.241,1.2,1.2,0,0,1,.913.89,1.188,1.188,0,0,1-.433,1.224,1.014,1.014,0,0,0-.427.784A.34.34,0,0,1,646.23,572.333Zm0,.87a.335.335,0,0,1,0-.671h0a.335.335,0,1,1,0,.671Z" transform="translate(-478.799 -460.089)" fill="#666"/>
   </g>
   </g>
-</svg>
->>>>>>> http_mock
+</svg>

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

@@ -171,4 +171,30 @@
       margin-bottom: 0;
       margin-bottom: 0;
     }
     }
   }
   }
+}
+@mixin main-title {
+  align-items: center;
+  padding: 20px 30px;
+  .title-left-icon {
+    width: 4px;
+    height: 17px;
+    background: #409eff;
+    border-radius: 1px;
+    display: inline-block;
+    vertical-align: text-top;
+  }
+  .title-left-name {
+    display: inline-block;
+    width: auto;
+    height: 20px;
+    line-height: 20px;
+    font-size: 16px;
+    font-family: Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,"\5FAE\8F6F\96C5\9ED1",Arial,sans-serif;
+    color: #333b4a;
+    margin-left: 6px;
+  }
+}
+p {
+  padding: 0;
+  margin: 0;
 }
 }

+ 22 - 2
src/views/ToConfigure/components/bizConfigure.vue

@@ -10,7 +10,21 @@
     </el-radio-group>
     </el-radio-group>
     <el-button v-if="!Prohibit" size="small" class="biz_buttom" @click="cancel"> 取消 </el-button>
     <el-button v-if="!Prohibit" size="small" class="biz_buttom" @click="cancel"> 取消 </el-button>
     <el-button v-if="!Prohibit" size="small" class="biz_buttom" type="primary" @click="preservation"> 保存 </el-button>
     <el-button v-if="!Prohibit" size="small" class="biz_buttom" type="primary" @click="preservation"> 保存 </el-button>
-
+    <!--- ck ---->
+    <p class="biz_property">
+      提测前checklist拦截
+      <el-tooltip class="item" effect="dark" content="设置为拦截后,业务线发送提测报告前会校验checklist是否已创建" placement="top">
+        <i class="el-icon-info" />
+      </el-tooltip>
+      <i v-if="!isCkEdit" class="el-icon-edit icon-sty" @click="isCkEdit = true" />
+    </p>
+    <el-radio-group v-model="ckStatus" :disabled="!isCkEdit" class="biz_radio">
+      <el-radio label="0"> 拦截 </el-radio>
+      <el-radio label="1"> 不拦截</el-radio>
+    </el-radio-group>
+    <el-button v-if="isCkEdit" size="small" class="biz_buttom" @click="cancel"> 取消 </el-button>
+    <el-button v-if="isCkEdit" size="small" class="biz_buttom" type="primary" @click="preservation"> 保存 </el-button>
+    <!-- ck -->
     <div v-if="bizObj.fromDpm">
     <div v-if="bizObj.fromDpm">
       <p class="biz_property">
       <p class="biz_property">
         排期同步望岳
         排期同步望岳
@@ -39,6 +53,8 @@ export default {
       radio: '1',
       radio: '1',
       Prohibit: true,
       Prohibit: true,
       Schedule: true, // 排期同步望岳
       Schedule: true, // 排期同步望岳
+      isCkEdit: false, // checklist编辑
+      ckStatus: '1', // ckecklist状态
       bizObj: {},
       bizObj: {},
       num: 30
       num: 30
     }
     }
@@ -62,18 +78,22 @@ export default {
         this.bizObj = res.data[0]
         this.bizObj = res.data[0]
         this.num = this.bizObj.syncScheduleDpm
         this.num = this.bizObj.syncScheduleDpm
         this.radio = JSON.stringify(this.bizObj.isSecret)
         this.radio = JSON.stringify(this.bizObj.isSecret)
+        this.ckStatus = '' + this.bizObj.isChecklistIntercept
       }
       }
     },
     },
     async preservation() { // 保存业务线配置
     async preservation() { // 保存业务线配置
-      const res = await settingUpdateBiz({ id: this.bizId, isSecret: Number(this.radio), bizName: this.bizObj.name })
+      const res = await settingUpdateBiz({ id: this.bizId, isSecret: Number(this.radio), bizName: this.bizObj.name, isChecklistIntercept: Number(this.ckStatus) })
       if (res.code === 200) {
       if (res.code === 200) {
         this.Prohibit = true
         this.Prohibit = true
+        this.isCkEdit = false
         this.$message({ message: '修改成功', type: 'success', duration: 1000, offset: 150 })
         this.$message({ message: '修改成功', type: 'success', duration: 1000, offset: 150 })
       }
       }
     },
     },
     cancel() {
     cancel() {
       this.Prohibit = true
       this.Prohibit = true
+      this.isCkEdit = false
       this.radio = JSON.stringify(this.bizObj.isSecret)
       this.radio = JSON.stringify(this.bizObj.isSecret)
+      this.ckStatus = '' + this.bizObj.isChecklistIntercept
     },
     },
     async changeSchedule() { // 设置同步望岳时间
     async changeSchedule() { // 设置同步望岳时间
       const res = await updateBiz({ id: this.bizId, syncScheduleDpm: this.num })
       const res = await updateBiz({ id: this.bizId, syncScheduleDpm: this.num })

+ 0 - 10
src/views/projectManage/components/record.vue

@@ -4,17 +4,7 @@
     <div v-for="(item,index) in changeRecord" :key="index" class="Layout_space_between sign-record">
     <div v-for="(item,index) in changeRecord" :key="index" class="Layout_space_between sign-record">
       <span>
       <span>
         <span class="operatorName">{{ item.operator }} : </span>
         <span class="operatorName">{{ item.operator }} : </span>
-        <!-- <el-tooltip
-          v-if="item.remark.length > 50"
-          class="item"
-          effect="dark"
-          :content="item.remark"
-          placement="top-start"
-          popper-class="tip-style"
-        > -->
         <span class="remark">{{ item.remark }}</span>
         <span class="remark">{{ item.remark }}</span>
-        <!-- </el-tooltip>
-        <span v-else class="remark">{{ item.remark.length > 50 ? item.remark.substring(0, 50) + '...' : item.remark }}</span> -->
       </span>
       </span>
       <span class="createTime">{{ item.createTime }}</span>
       <span class="createTime">{{ item.createTime }}</span>
     </div>
     </div>

+ 30 - 2
src/views/projectManage/projectList/components/taskList.vue

@@ -117,12 +117,18 @@
       title="新建排期"
       title="新建排期"
       @update="get_allTask()"
       @update="get_allTask()"
     />
     />
+    <checkListStopConfirm
+      :visible="checklistStopVisible"
+      @confirm="checklistConfirm"
+      @cancel="checklistCancel"
+    />
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
 import { analysisBizId_id, EncryptId } from '@/utils/crypto-js.js'
 import { analysisBizId_id, EncryptId } from '@/utils/crypto-js.js'
 import { mapGetters } from 'vuex'
 import { mapGetters } from 'vuex'
 import imgUrl from '@/assets/建立档案@2x.png'
 import imgUrl from '@/assets/建立档案@2x.png'
+import checkListStopConfirm from '@/components/checkListStopConfirm'
 import TestReport from '@/views/reportManagement/components/TestingReport' // 提测
 import TestReport from '@/views/reportManagement/components/TestingReport' // 提测
 import DailyReport from '@/views/reportManagement/components/DailyReport' // 日报
 import DailyReport from '@/views/reportManagement/components/DailyReport' // 日报
 import ReleaseReport from '@/views/reportManagement/components/ReleaseReport' // 准出
 import ReleaseReport from '@/views/reportManagement/components/ReleaseReport' // 准出
@@ -141,7 +147,8 @@ export default {
     ReleaseReport,
     ReleaseReport,
     scheduleList,
     scheduleList,
     taskDialog,
     taskDialog,
-    modifySchedule
+    modifySchedule,
+    checkListStopConfirm
   },
   },
   data() {
   data() {
     return {
     return {
@@ -167,7 +174,9 @@ export default {
       nowChangeTask: null, // 当前正在改变的任务对象
       nowChangeTask: null, // 当前正在改变的任务对象
       taskId: '', // 将要修改状态的任务id
       taskId: '', // 将要修改状态的任务id
       visibleSchedule: false, // 排期弹框
       visibleSchedule: false, // 排期弹框
-      selectTaskList: [] // 已选任务的id
+      selectTaskList: [], // 已选任务的id
+      checklistStopVisible: false, // checklist拦截弹窗是否显示
+      firstChecklistTaskId: -1
     }
     }
   },
   },
   computed: {
   computed: {
@@ -297,6 +306,11 @@ export default {
       const data = this.curcentList.map(item => { return item.id })
       const data = this.curcentList.map(item => { return item.id })
       const res = await reportdelivertestCheckStatus(data)
       const res = await reportdelivertestCheckStatus(data)
       if (res.code === 200) {
       if (res.code === 200) {
+        if (res.data && res.data.id) {
+          this.checklistStopVisible = true
+          this.firstChecklistTaskId = res.data.id
+          return
+        }
         this.dialogTestReport = true
         this.dialogTestReport = true
         this.$nextTick(() => {
         this.$nextTick(() => {
           this.$refs.TestReport.init(7, this.curcentList.map(item => { return item.id }))
           this.$refs.TestReport.init(7, this.curcentList.map(item => { return item.id }))
@@ -329,6 +343,20 @@ export default {
     link_task(id) { // 跳转到任务详情页
     link_task(id) { // 跳转到任务详情页
       const bizId_id = EncryptId(`${this.bizId}_${id}`)
       const bizId_id = EncryptId(`${this.bizId}_${id}`)
       this.$router.push({ name: '任务详情', query: { bizId_id: bizId_id }})
       this.$router.push({ name: '任务详情', query: { bizId_id: bizId_id }})
+    },
+    checklistConfirm() {
+      this.checklistStopVisible = false
+      const { bizId = null } = this.$store.state.global || {}
+      const bizId_id = EncryptId(`${bizId}_${this.firstChecklistTaskId}`)
+      const newTab = this.$router.resolve({ name: '任务详情', query: { bizId_id: bizId_id, page: 6 }})
+      window.open(newTab.href, '_blank')
+    },
+    checklistCancel() {
+      this.checklistStopVisible = false
+      this.dialogTestReport = true
+      this.$nextTick(() => {
+        this.$refs.TestReport.init(7, this.curcentList.map(item => { return item.id }))
+      })
     }
     }
   }
   }
 }
 }

+ 47 - 0
src/views/projectManage/publishTask/components/checkboxList.vue

@@ -0,0 +1,47 @@
+<template>
+  <el-checkbox-group v-model="List" @change="$emit('change', List)">
+    <el-checkbox v-for="item in data" :key="item.id" class="checkbox" :label="item.id">{{ item.name }}</el-checkbox>
+  </el-checkbox-group>
+</template>
+<script>
+// const cityOptions = ['上海', '北京', '广州', '深圳', 'ss', 'qq', 'www', 'eeee', 'ssss', 'vvvv', 'ggg', 'jjj']
+export default {
+  props: {
+    selectedList: {
+      type: Array,
+      required: false,
+      default: () => []
+    },
+    data: {
+      type: Array,
+      required: false,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      checkAll: false,
+      // checkedCities: ['上海', '北京'],
+      // cities: cityOptions,
+      isIndeterminate: true,
+      List: this.selectedList
+    }
+  },
+  methods: {
+    handleCheckAllChange(val) {
+      // this.checkedCities = val ? cityOptions : []
+      this.isIndeterminate = false
+    },
+    handleCheckedCitiesChange(value) {
+      const checkedCount = value.length
+      this.checkAll = checkedCount === this.cities.length
+      this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length
+    }
+  }
+}
+</script>
+<style scoped lang='scss'>
+.checkbox {
+  width: 18%
+}
+</style>

+ 135 - 0
src/views/projectManage/publishTask/components/multipleSelect.vue

@@ -0,0 +1,135 @@
+<template>
+  <div class="taskSelect" :style="styles">
+    <el-select
+      v-if="isedit"
+      v-model="value"
+      class="maxWidth"
+      :size="size"
+      multiple
+      filterable
+      remote
+      reserve-keyword
+      :placeholder="placeholder"
+      :remote-method="remoteMethod"
+      :loading="loading"
+      @change="clearHandle"
+    >
+      <el-option
+        v-for="item in options"
+        :key="item.id"
+        :value="item.id"
+      >
+        <p class="content" style="margin: 0">
+          <span>
+            <span class="taskId">TASK-{{ item.id }}</span>
+            <span class="ml20">{{ item.name }}</span>
+          </span>
+          <!-- <i v-if="isedit" class="el-icon-circle-close didi-hover" @click="$emit('delate', item.id)" /> -->
+        </p>
+      </el-option>
+    </el-select>
+    <div class="maxWidth">
+      <p v-for="item in data" :key="item.id" class="content">
+        <span>
+          <span class="taskId">TASK-{{ item.id }}</span>
+          <span class="ml20">{{ item.name }}</span>
+        </span>
+        <i v-if="isedit" class="el-icon-circle-close didi-hover" @click="$emit('change', item, 'del')" />
+      </p>
+    </div>
+  </div>
+</template>
+<script>
+import { taskList } from '@/api/taskIndex'
+export default {
+  name: 'MultipleSelect',
+  props: {
+    styles: {
+      type: Object,
+      required: false,
+      default: () => {
+        return { maxWidth: '690px' }
+      }
+    },
+    size: {
+      type: String,
+      required: false,
+      default: 'medium'
+    },
+    placeholder: {
+      type: String,
+      required: false,
+      default: '请输入'
+    },
+    isedit: {
+      type: Boolean,
+      required: false,
+      default: false
+    },
+    data: {
+      type: Array,
+      required: false,
+      default: () => []
+    },
+    taskId: {
+      type: Number,
+      required: false,
+      default: null
+    }
+  },
+  data() {
+    return {
+      options: [],
+      value: [],
+      loading: false
+    }
+  },
+  methods: {
+    async remoteMethod(query) {
+      this.query = query
+      if (query !== '') {
+        this.loading = true
+        const res = await taskList({ taskId: this.taskId, name: query })
+        this.options = res.data
+        this.loading = false
+      } else {
+        this.options = []
+      }
+    },
+    clearHandle(val) {
+      console.log(val)
+      let item = null
+      console.log(this.data)
+      this.options.forEach(t => {
+        if (t.id === val[0]) {
+          item = t
+        }
+        console.log(t.id === val[0], t)
+      })
+      console.log(item)
+      this.$emit('change', item, 'add')
+      this.query = ''
+      this.value = null
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+.taskSelect {
+  .maxWidth {
+    width: 100%;
+  }
+  .ml20 {
+    margin-left: 20px;
+  }
+}
+.content {
+  display: flex;
+  justify-content: space-between;
+  margin: 15px 0;
+  .taskId {
+    display: inline-block;
+    width: 120px;
+  }
+}
+</style>

+ 283 - 0
src/views/projectManage/publishTask/components/onlineCheckList.vue

@@ -0,0 +1,283 @@
+<template>
+  <div class="onlineCheckList">
+    <table class="table">
+      <tr>
+        <th class="">模块</th>
+        <th>模块名</th>
+      </tr>
+      <tr v-for="(d, index) in data.tableContent" :key="d.id">
+        <td>
+          <el-input v-if="isedit" v-model="d.module" placeholder="请输入模块" :size="size" />
+          <span v-else>{{ d.module }}</span>
+        </td>
+        <td>
+          <div v-if="isedit" class="addmodule">
+            <el-select
+              v-model="value"
+              class="addSelect"
+              :size="size"
+              multiple
+              filterable
+              remote
+              reserve-keyword
+              placeholder="请选择模块"
+              :remote-method="remoteMethod"
+              :loading="loading"
+              @change="clearHandle(index)"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item"
+                :label="item"
+                :value="item"
+              />
+            </el-select>
+            <span class="addBtn" @click="addModule(index)">添加</span>
+          </div>
+          <div v-if="isedit">
+            <el-tag
+              v-for="tag in d.moduleNames"
+              :key="tag"
+              class="tag"
+              size="small"
+              closable
+              type="info"
+              @close="handleClose(index, tag)"
+            >
+              {{ tag }}
+            </el-tag>
+          </div>
+          <div v-else>
+            <span v-for="tag in d.moduleNames" :key="tag" class="tag word">{{ tag }}</span>
+          </div>
+          <div v-if="isedit" class="btnGroup">
+            <svg-icon icon-class="add" class="svg" @click="$emit('changeRow', 'add', moduleId, index)" />
+            <svg-icon v-if="data.tableContent.length !== 1" icon-class="del" class="svg" @click="$emit('changeRow', 'del', moduleId, index)" />
+          </div>
+        </td>
+      </tr>
+    </table>
+    <div class="inlineList">
+      <div class="subTitle">
+        上线顺序
+        <el-tooltip effect="dark" content="鼠标拖动模块,可调整顺序" placement="top-start">
+          <i class="el-icon-info" />
+        </el-tooltip>
+      </div>
+      <draggable
+        v-if="isedit"
+        v-model="data.onlineOrder"
+        chosen-class="chosen"
+        force-fallback="true"
+        group="people"
+        animation="1000"
+        @start="onStart"
+        @end="onEnd"
+      >
+        <transition-group>
+          <div
+            v-for="(element, index) in data.onlineOrder"
+            :key="element"
+            class="onlineItem"
+          >
+            <span class="dragNo">{{ index+ 1 }}</span>
+            <span class="dragword">{{ element }}</span>
+          </div>
+        </transition-group>
+      </draggable>
+      <div v-else>
+        <div
+          v-for="(element, index) in data.onlineOrder"
+          :key="element"
+          class="onlineItem textItem"
+        >
+          <span class="dragNo">{{ index+ 1 }}</span>
+          <span class="dragword">{{ element }}</span>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import draggable from 'vuedraggable'
+import { getOnlineBizModule } from '@/api/publishTask'
+export default {
+  components: {
+    draggable
+  },
+  props: {
+    isedit: {
+      type: Boolean,
+      required: false,
+      default: false
+    },
+    data: {
+      type: Object,
+      required: false,
+      default: () => {}
+    },
+    moduleId: {
+      type: Number,
+      required: true,
+      default: -1
+    },
+    taskId: {
+      type: Number,
+      required: false,
+      default: null
+    }
+  },
+  data() {
+    return {
+      drag: false,
+      options: [],
+      value: [],
+      loading: false,
+      size: 'small',
+      moduleName: '',
+      name: ''
+    }
+  },
+  mounted() {
+    console.log(1111111111)
+  },
+  methods: {
+    async remoteMethod(moduleName) {
+      this.moduleName = moduleName
+      if (moduleName !== '') {
+        this.loading = true
+        const res = await getOnlineBizModule({ taskId: this.taskId, moduleName })
+        this.options = res.data
+        this.loading = false
+      } else {
+        this.options = []
+      }
+    },
+    clearHandle(subIdx) {
+      console.log(subIdx, this.value)
+      this.$emit('changeSelectedHandle', this.moduleId, subIdx, this.value[0], 'add')
+      this.moduleName = ''
+      this.value = null
+    },
+    addModule(subIdx) {
+      if (this.moduleName) {
+        this.$emit('changeSelectedHandle', this.moduleId, subIdx, this.moduleName, 'add')
+      }
+    },
+    getfocus(index) {
+      console.log(index)
+      // window.elemmm[`s${index}`]=this.$refs[`s${index}`]
+      // this.$refs[`s${index}`][0].focused()
+    },
+    handleClose(subIdx, val) {
+      this.$emit('changeSelectedHandle', this.moduleId, subIdx, val, 'del')
+    },
+    // 开始拖拽事件
+    onStart() {
+      this.drag = true
+    },
+    // 拖拽结束事件
+    onEnd() {
+      this.drag = false
+      console.log(this.data)
+    }
+  }
+}
+</script>
+<style scoped lang='scss'>
+.onlineCheckList {
+  max-width: 690px;
+  .table {
+    width: 100%;
+    border-radius: 4px;
+    border-collapse: collapse;
+    border: none;
+    th {
+      background: #E8E8E8;
+      text-align: center;
+      color: '#333B4A';
+      font-size: '14px';
+      font-weight: '400';
+      &:first-child {
+        width: 216px;
+      }
+    }
+    th, td {
+      border: 1px solid #D1D0D0;
+      padding: 12px 10px;
+      position: relative;
+      &:first-child {
+        text-align: center;
+      }
+    }
+    .btnGroup {
+      position: absolute;
+      bottom: 0px;
+      right: -60px;
+      width: 60px;
+      text-align: center;
+      .svg {
+        margin: 0 5px;
+        font-size: 14px;
+      }
+    }
+  }
+  .inlineList {
+    .dragNo {
+      display: inline-block;
+      width: 16px;
+      height:16px;
+      line-height: 14px;
+      text-align: center;
+      border: 1px solid #999;
+      border-radius: 50%;
+      margin-right: 5px;
+    }
+    .dragword {
+      font-size: 12px;
+    }
+    .subTitle {
+      margin-top: 16px;
+      .el-icon-info {
+        color: #999;
+      }
+    }
+  }
+  .tag {
+    margin-right: 24px;
+    margin-bottom: 5px;
+    &.word {
+      margin-right: 0px;
+      &::after{
+        content: ',';
+      }
+      &:last-child::after {
+        content: '';
+      }
+    }
+  }
+  .addmodule {
+    margin-bottom: 5px;
+    .addBtn {
+      font-size: 12px;
+      color: #409eff;
+      margin-left: 6px;
+      cursor: pointer;
+    }
+  }
+}
+.onlineItem {
+  display: inline-block;
+  margin: 10px 40px 10px 0px;
+  font-size: 14px;
+  border: solid 2px transparent;
+  // margin-bottom: 10px;
+  cursor: move;
+  &.textItem{
+    cursor: text;
+  }
+}
+.chosen {
+  border: solid 2px #3089dc !important;
+}
+</style>

+ 83 - 0
src/views/projectManage/publishTask/components/step.vue

@@ -0,0 +1,83 @@
+<template>
+  <div class="stepBox">
+    <div class="line">
+      <span class="before circle" />
+      <div v-for="item in data" :key="item.id" class="subTitle" @click="$emit('goto', `s${item.id}`)">
+        <i class="el-icon-success icon" :class="getclass(item.id)" />
+        {{ item.name }}
+      </div>
+      <span class="after circle" />
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    data: {
+      type: Array,
+      default: () => [],
+      required: false
+    },
+    typeList: {
+      type: Array,
+      default: () => [],
+      required: false
+    }
+  },
+  methods: {
+    getclass(id) {
+      let type = 'el-icon-question'
+      this.typeList.map(t => {
+        if (t.id === id && t.isCheck) {
+          type = 'el-icon-success'
+        }
+      })
+      return type
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+.line {
+  border-right: 2px solid #D1D1D1;
+  position: relative;
+  padding: 2px 0;
+  .circle {
+    display: inline-block;
+    width: 6px;
+    height: 6px;
+    border-radius: 50%;
+    border: 1px solid #666;
+    background-color: #fff;
+    position: absolute;
+    left: calc(100% - 2px);
+  }
+  .subTitle {
+    width: 130px;
+    text-align: center;
+    margin: 16px 0px 16px 50%;
+    background: #fff;
+    cursor: pointer;
+    position: relative;
+    .icon {
+      position: absolute;
+      left: 0px;
+      top: 4px;
+      font-size: 14px;
+    }
+    .el-icon-success {
+      color: #1890FF;
+    }
+    .el-icon-question {
+      color: #999;
+    }
+  }
+  .before {
+    top: 0px;
+    margin-bottom: 8px;
+  }
+  .after {
+    bottom: 0px;
+  }
+}
+</style>

+ 510 - 0
src/views/projectManage/publishTask/index.vue

@@ -0,0 +1,510 @@
+<template>
+  <div class="editPublishTask">
+    <section class="main-section pubconfig">
+      <div v-if="showEmpty">
+        <header>
+          <headTitle title="checklist" />
+        </header>
+        <div class="empty">
+          未设置 <span class="createBtn" @click="addAction">点击添加</span>
+        </div>
+      </div>
+      <div v-else>
+        <header>
+          <headTitle title="checklist" :open-edit="openEdit" @editHandle="editHandle" />
+        </header>
+        <div class="wrap">
+          <redTipword title="关联任务" :isedit="edit" />
+          <multipleSelect placeholder="🔍 请输入任务名称或ID" :isedit="edit" :data="data.tasks" :task-id="taskId" @change="changeTask" />
+          <div v-if="edit" style="margin-top: 30px">
+            <redTipword title="选择checklist列表" :isedit="edit" />
+            <checkboxList :selected-list="data.selectedBizTemplateIds" :data="temList" @change="updateSelectedTemHandle" />
+          </div>
+        </div>
+        <div class="moduleList wrap">
+          <redTipword v-if="!edit" title="检查项" :isedit="edit" />
+          <div v-for="(item, index) in data.templates" :key="item.parentTemplateId" class="item">
+            <div v-if="item.type === 1">
+              <p :id="`s${item.parentTemplateId}`" class="title">
+                <el-checkbox v-if="!edit" v-model="item.isCheck" :label="item.name" @change="updateCheckItemHandle(item)">{{ item.name }}</el-checkbox>
+                <span v-else>{{ item.name }}</span>
+              </p>
+              <onlineCheckList
+                :module-id="item.parentTemplateId"
+                :isedit="edit"
+                :data="item.onlineModule"
+                :task-id="taskId"
+                @changeSelectedHandle="changeOnlineSelectedHandle"
+                @changeRow="changeOnlineModuleRow"
+                @onChangeModuleName="(val, subIdx) => onChangeModuleName(val, subIdx, index)"
+              />
+            </div>
+            <div v-else>
+              <p :id="`s${item.parentTemplateId}`" class="title">
+                <el-checkbox v-if="!edit" v-model="item.isCheck" :label="item.name" @change="updateCheckItemHandle(item)">{{ item.name }}</el-checkbox>
+                <span v-else>{{ item.name }}</span>
+              </p>
+              <normal-area
+                v-if="edit"
+                :id="'tem'+item.parentTemplateId"
+                :value.sync="item.content"
+                :empty-text="'点击'"
+                :input-button="'修改模板'"
+                :styles="{ padding: '0 0px 20px 0px', width: '690px' }"
+              />
+              <div v-else v-html="item.content" />
+            </div>
+          </div>
+        </div>
+        <div v-if="edit" class="control">
+          <el-button size="small" @click="cancel()">取消</el-button>
+          <el-button type="primary" size="small" @click="saveHandle()">
+            保存
+          </el-button>
+        </div>
+      </div>
+    </section>
+    <div v-if="!edit">
+      <section class="main-section">
+        <div>
+          <headTitle title="动态" />
+        </div>
+        <actionDynamic :comments="commentlist" :change-record="changeRecordList" @addComment="createCommentHandle" />
+      </section>
+      <div v-if="!showEmpty" class="step">
+        <step :data="data.templates" :type-list="data.templates" @goto="scrollToHandle" />
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+const _ = require('lodash')
+import redTipword from '@/components/redTipTitle'
+import headTitle from '@/components/headTitle'
+import multipleSelect from './components/multipleSelect'
+import checkboxList from './components/checkboxList'
+import onlineCheckList from './components/onlineCheckList'
+import actionDynamic from '@/components/actionDynamic'
+import step from './components/step'
+// 富文本
+// import textArea from '@/components/input/textArea'
+import normalArea from '@/components/input/normalArea' // 富文本
+import 'tinymce/plugins/table'// 插入表格插件
+import store from '@/store'
+import {
+  getCheckListBytask,
+  getBizBindTemList,
+  updateChecklist,
+  createChecklist,
+  updateTemplateCheckStatus,
+  getCommentList,
+  createComment,
+  getRecordList
+} from '@/api/publishTask'
+export default {
+  components: {
+    redTipword,
+    multipleSelect,
+    checkboxList,
+    onlineCheckList,
+    normalArea,
+    headTitle,
+    actionDynamic,
+    step
+  },
+  props: {
+    taskId: {
+      type: Number,
+      required: true,
+      default: -1
+    },
+    taskName: {
+      type: String,
+      required: true,
+      default: ''
+    },
+    userNames: {
+      type: String,
+      required: true,
+      default: ''
+    },
+    userInformation: {
+      type: String,
+      required: true,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      description: '<p style="color:red;">123</p>',
+      edit: false, // 是否是编辑状态
+      showEmpty: true,
+      openEdit: true,
+      data: {},
+      temList: [],
+      commentlist: [], // 评价列表
+      changeRecordList: [] // 变更记录列表
+    }
+  },
+  mounted() {
+    // 获取模板列表
+    this.getBizBindTemList()
+    // 获取checklist详情
+    this.getList()
+    // 获取评论列表
+    this.getCommentList()
+    // 获取变更记录
+    this.getRecordList()
+  },
+  methods: {
+    // 获取checklist详情
+    async getList() {
+      if (this.taskId) {
+        const res = await getCheckListBytask({ taskId: this.taskId })
+        // res.data = null
+        if (res.data) {
+          // 如果绑定过
+          this.showEmpty = false
+          this.data = res.data
+        } else {
+          this.showEmpty = true
+        }
+      }
+    },
+
+    // 获取业务线下绑定的可以选checklist列表
+    async getBizBindTemList() {
+      console.log(1111)
+      const { bizId = null } = store.state.global || {}
+      const res = await getBizBindTemList({ name: '', bizId })
+      this.temList = res.data
+    },
+
+    async getCommentList() {
+      const res = await getCommentList({ type: 5, joinId: this.taskId })
+      if (res.code === 200) {
+        this.commentlist = res.data
+      }
+    },
+
+    // 获取变更记录
+    async getRecordList() {
+      const res = await getRecordList({ taskId: this.taskId })
+      console.log(res)
+      if (res.code === 200) {
+        this.changeRecordList = res.data
+      }
+    },
+    // 添加评论
+    async createCommentHandle(content, callback) {
+      const commentInfo = {
+        joinId: this.taskId,
+        content,
+        type: 5,
+        fatherId: 0,
+        name: this.userNames,
+        email: this.userInformation
+      }
+      const user = { name: this.userNames, ename: this.userInformation, id: '' }
+      const res = await createComment({ commentInfo, user })
+      if (res.code === 200) {
+        this.$message({ message: '评论成功', type: 'success', duration: 1000, offset: 150 })
+        this.getCommentList()
+        callback()
+      } else {
+        this.$message.warning(res.msg)
+      }
+    },
+
+    // 添加或者删除线上模板的模版名
+    changeOnlineSelectedHandle(id, subIdx, value, type) {
+      /**
+       * id: 模块id
+       * name: 线上模块中哪个模块下的模块名称
+       * value: 模块名
+       * type: 是添加还是删除
+      **/
+      // const tem = this.data.templates
+      console.log(this.data, id, subIdx, value, type)
+      this.data.templates.map(t => {
+        if (t.parentTemplateId === id) {
+          if (type === 'del') {
+            t.onlineModule.onlineOrder = t.onlineModule.onlineOrder.filter(g => g !== value)
+            t.onlineModule.tableContent.map((t, i) => {
+              if (i === subIdx) {
+                t.moduleNames = t.moduleNames.filter(g => g !== value)
+              }
+            })
+          } else if (!t.onlineModule.onlineOrder.includes(value)) {
+            t.onlineModule.onlineOrder.push(value)
+            t.onlineModule.tableContent.map((t, i) => {
+              if (i === subIdx) {
+                t.moduleNames.push(value)
+              }
+            })
+          } else {
+            this.$message({
+              message: '已经添加过该模块名称',
+              type: 'error'
+            })
+          }
+        }
+      })
+    },
+
+    changeOnlineModuleRow(type, mId, index) {
+      console.log(type, mId, index, this.data.templates)
+      this.data.templates.map(t => {
+        if (t.parentTemplateId === mId) {
+          if (type === 'del') {
+            console.log(t.onlineModule)
+            const delModuleNames = t.onlineModule.tableContent[index].moduleNames
+            const test = t.onlineModule.onlineOrder.filter(t => !delModuleNames.includes(t))
+            console.log(delModuleNames, test)
+            t.onlineModule.onlineOrder = t.onlineModule.onlineOrder.filter(t => !delModuleNames.includes(t))
+            t.onlineModule.tableContent.splice(index, 1)
+          } else {
+            t.onlineModule.tableContent.splice(index + 1, 0, {
+              module: `模块${index + 1}`,
+              moduleNames: []
+            })
+          }
+        }
+      })
+    },
+
+    // 保存
+    async saveHandle() {
+      if (this.data.tasks.length < 1) {
+        this.$message({
+          message: '请关联一个任务',
+          type: 'error'
+        })
+        return
+      }
+      let res = null
+      if (this.data.id) {
+        res = await updateChecklist(this.data)
+      } else {
+        res = await createChecklist(this.data)
+      }
+      if (res.code === 200) {
+        this.edit = false
+        this.openEdit = true
+        // 保存更新变更记录
+        this.getRecordList()
+        this.$message({
+          message: '保存成功',
+          type: 'success'
+        })
+      }
+    },
+
+    // 取消
+    cancel() {
+      this.edit = false
+      this.openEdit = true
+      this.data = this.copyData
+      if (!this.data || JSON.stringify(this.data) === '{}') {
+        this.showEmpty = true
+      }
+    },
+    // 点击添加
+    addAction() {
+      // 校验是否绑定过checklist模板
+      if (!this.RegHasCheckListTem()) {
+        return
+      }
+      // 复制一份数据,以便取消时复原
+      this.copyData = this.data
+      // 编辑按钮隐藏
+      this.openEdit = false
+      // 编辑状态打开
+      this.edit = true
+      // 是否显示空状态
+      this.showEmpty = false
+      this.data = {
+        selectedBizTemplateIds: [],
+        templates: [],
+        tasks: [{
+          id: this.taskId,
+          name: this.taskName
+        }]
+      }
+      this.checkAllTem()
+    },
+
+    // 编辑
+    editHandle() {
+      // 校验是否绑定过checklist模板
+      if (!this.RegHasCheckListTem()) {
+        return
+      }
+      // 复制一份数据,以便取消时复原
+      this.copyData = this.data
+      // 编辑状态打开
+      this.edit = true
+      // 编辑按钮隐藏
+      this.openEdit = false
+      this.checkAllTem()
+    },
+
+    // 添加和编辑checklist时 如果没有选择模版默认全选。
+    checkAllTem() {
+      const { selectedBizTemplateIds } = this.data
+      if (!selectedBizTemplateIds || selectedBizTemplateIds.length < 1) {
+        this.temList.map(t => {
+          this.data.selectedBizTemplateIds.push(t.id)
+          const { content, isCheck, name, onlineModule, type, id: parentTemplateId } = t
+          this.data.templates.push({
+            content,
+            isCheck,
+            name,
+            onlineModule,
+            type,
+            parentTemplateId,
+            belongType: 2 // checklist的模板
+          })
+        })
+      }
+    },
+
+    // 校验是否该业务线有绑定checklist模板
+    RegHasCheckListTem() {
+      if (!this.temList || this.temList.length < 1) {
+        this.$message({
+          message: '该业务线暂无绑定checklist模板,请先绑定checklist模板',
+          type: 'error'
+        })
+        return false
+      } else {
+        return true
+      }
+    },
+
+    // 修改checklist绑定模版列表
+    updateSelectedTemHandle(checkedIds) {
+      console.log(checkedIds)
+      const selectedBizTemplateIds = []
+      const templates = []
+      checkedIds.map(checkedId => {
+        this.temList.map(t => {
+          if (t.id === checkedId) {
+            selectedBizTemplateIds.push(t.id)
+            const { content, isCheck, name, onlineModule, type, id: parentTemplateId } = t
+            templates.push({
+              content,
+              isCheck,
+              name,
+              onlineModule,
+              type,
+              parentTemplateId,
+              belongType: 2 // checklist的模板
+            })
+          }
+        })
+      })
+      this.data = { ...this.data, templates, selectedBizTemplateIds }
+    },
+
+    // 锚点
+    scrollToHandle(targe) {
+      const anchorH = document.getElementById(targe).offsetTop
+      const container = document.getElementsByClassName('main-wrapper')[0]
+      container.scrollTop = anchorH - 20
+    },
+
+    // 解绑删除任务
+    changeTask(task, type) {
+      let hasTask = false
+      let tasks = []
+      this.data.tasks.map(g => {
+        if (g.id === task.id) {
+          hasTask = true
+        }
+      })
+      if (type === 'del') {
+        tasks = this.data.tasks.filter(t => t.id !== task.id)
+      } else if (!hasTask) {
+        tasks = [...this.data.tasks, task]
+      } else {
+        console.log('已经添加过该任务')
+        return
+      }
+      this.data = { ...this.data, tasks }
+    },
+
+    // 更新检查项到数据库
+    async updateCheckItemHandle(item) {
+      console.log(item)
+      const { id: templateId, isCheck, parentTemplateId } = item
+      const res = await updateTemplateCheckStatus({ templateId, isCheck, taskId: this.taskId, templateId: parentTemplateId })
+      if (res.code === 200) {
+        this.getRecordList()
+        this.$message({
+          message: '检查项状态更新成功',
+          type: 'success'
+        })
+      }
+    },
+
+    // 修改线上问题模块
+    onChangeModuleName: _.debounce(function(val, subIdx, index) {
+      console.log(val, subIdx, index, this.data)
+      this.data.templates[index].onlineModule.tableContent[subIdx].module = val
+      console.log(this.data)
+    })
+  }
+}
+</script>
+<style scoped lang="scss">
+@import '@/styles/detail-pages.scss';
+.editPublishTask {
+  min-height: 400px;
+  overflow-y: auto;
+  padding-bottom: 20px;
+  .step {
+    position: fixed;
+    top: 200px;
+    right:100px;
+  }
+  .pubconfig {
+    .control {
+      padding: 20px 0px 20px 690px;
+    }
+  }
+  .main-section {
+    @include main-section;
+  }
+  .wrap{
+    padding: 0 40px;
+  }
+  .moduleList {
+    margin-top: 40px;
+    padding-bottom: 16px;
+    .title {
+      font-weight: 400;
+      color: #444444;
+      font-size: 14px;
+      margin-bottom: 16px;
+      margin-top: 40px;
+      &:first-child {
+        margin-top: 0px;
+      }
+    }
+  }
+}
+.empty {
+  padding: 0px 30px 40px 30px;
+  color: #444;
+  font-size: 14px;
+  .createBtn {
+    color: #409EFF;
+    margin-left: 5px;
+    cursor: pointer;
+  }
+}
+.main-title {
+  @include main-title;
+}
+</style>

+ 30 - 2
src/views/projectManage/requirement/components/taskList.vue

@@ -119,12 +119,18 @@
       type="requirement"
       type="requirement"
       @update="get_allTask()"
       @update="get_allTask()"
     />
     />
+    <checkListStopConfirm
+      :visible="checklistStopVisible"
+      @confirm="checklistConfirm"
+      @cancel="checklistCancel"
+    />
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
 import { analysisBizId_id, EncryptId } from '@/utils/crypto-js.js'
 import { analysisBizId_id, EncryptId } from '@/utils/crypto-js.js'
 import { mapGetters } from 'vuex'
 import { mapGetters } from 'vuex'
 import imgUrl from '@/assets/建立档案@2x.png'
 import imgUrl from '@/assets/建立档案@2x.png'
+import checkListStopConfirm from '@/components/checkListStopConfirm'
 import TestReport from '@/views/reportManagement/components/TestingReport' // 提测
 import TestReport from '@/views/reportManagement/components/TestingReport' // 提测
 import DailyReport from '@/views/reportManagement/components/DailyReport' // 日报
 import DailyReport from '@/views/reportManagement/components/DailyReport' // 日报
 import ReleaseReport from '@/views/reportManagement/components/ReleaseReport' // 准出
 import ReleaseReport from '@/views/reportManagement/components/ReleaseReport' // 准出
@@ -143,7 +149,8 @@ export default {
     ReleaseReport,
     ReleaseReport,
     scheduleList,
     scheduleList,
     taskDialog,
     taskDialog,
-    modifySchedule
+    modifySchedule,
+    checkListStopConfirm
   },
   },
   data() {
   data() {
     return {
     return {
@@ -168,7 +175,9 @@ export default {
       nowChangeTask: null, // 当前正在改变的任务对象
       nowChangeTask: null, // 当前正在改变的任务对象
       taskId: '', // 将要修改状态的任务id
       taskId: '', // 将要修改状态的任务id
       visibleSchedule: false, // 排期弹框
       visibleSchedule: false, // 排期弹框
-      selectTaskList: [] // 已选任务的id
+      selectTaskList: [], // 已选任务的id
+      checklistStopVisible: false, // checklist拦截弹窗是否显示
+      firstChecklistTaskId: -1
     }
     }
   },
   },
   computed: {
   computed: {
@@ -305,6 +314,11 @@ export default {
       const data = this.curcentList.map(item => { return item.id })
       const data = this.curcentList.map(item => { return item.id })
       const res = await reportdelivertestCheckStatus(data)
       const res = await reportdelivertestCheckStatus(data)
       if (res.code === 200) {
       if (res.code === 200) {
+        if (res.data && res.data.id) {
+          this.checklistStopVisible = true
+          this.firstChecklistTaskId = res.data.id
+          return
+        }
         this.dialogTestReport = true
         this.dialogTestReport = true
         this.$nextTick(() => {
         this.$nextTick(() => {
           this.$refs.TestReport.init(7, this.curcentList.map(item => { return item.id }))
           this.$refs.TestReport.init(7, this.curcentList.map(item => { return item.id }))
@@ -335,6 +349,20 @@ export default {
     link_task(ele) { // 跳转到任务详情页
     link_task(ele) { // 跳转到任务详情页
       const bizId_id = EncryptId(`${ele.bizId}_${ele.id}`)
       const bizId_id = EncryptId(`${ele.bizId}_${ele.id}`)
       this.$router.push({ name: '任务详情', query: { bizId_id: bizId_id }})
       this.$router.push({ name: '任务详情', query: { bizId_id: bizId_id }})
+    },
+    checklistConfirm() {
+      this.checklistStopVisible = false
+      const { bizId = null } = this.$store.state.global || {}
+      const bizId_id = EncryptId(`${bizId}_${this.firstChecklistTaskId}`)
+      const newTab = this.$router.resolve({ name: '任务详情', query: { bizId_id: bizId_id, page: 6 }})
+      window.open(newTab.href, '_blank')
+    },
+    checklistCancel() {
+      this.checklistStopVisible = false
+      this.dialogTestReport = true
+      this.$nextTick(() => {
+        this.$refs.TestReport.init(7, this.curcentList.map(item => { return item.id }))
+      })
     }
     }
   }
   }
 }
 }

+ 51 - 3
src/views/projectManage/taskList/taskViewDetail.vue

@@ -67,6 +67,7 @@
             <el-tab-pane label="缺陷" name="3" />
             <el-tab-pane label="缺陷" name="3" />
             <el-tab-pane label="报告" name="4" />
             <el-tab-pane label="报告" name="4" />
             <el-tab-pane label="统计" name="5" />
             <el-tab-pane label="统计" name="5" />
+            <el-tab-pane label="发布" name="6" />
           </el-tabs>
           </el-tabs>
         </div>
         </div>
         <div class="top-control">
         <div class="top-control">
@@ -320,6 +321,21 @@
         </section>
         </section>
       </el-container>
       </el-container>
       <!-- 统计 -->
       <!-- 统计 -->
+
+      <!-- 发布 -->
+      <el-container v-if="activeName === '6'" class="is-vertical">
+        <!-- <section class="main-section contain"> -->
+        <publishTask
+          v-if="loaded"
+          :task-id="form_query.id"
+          :task-name="form_query.name"
+          :user-names="userNames"
+          :user-information="userInformation"
+        />
+        <!-- </section> -->
+      </el-container>
+      <!-- 发布 -->
+
       <!-- 新建(bug) -->
       <!-- 新建(bug) -->
       <createdBug v-if="bug_open" ref="createdBug" @getBugList="reloadList" />
       <createdBug v-if="bug_open" ref="createdBug" @getBugList="reloadList" />
       <create-children v-if="createChildren" :visible.sync="createChildren" :data="form_query" :new-add="true" @change="reloadList" />
       <create-children v-if="createChildren" :visible.sync="createChildren" :data="form_query" :new-add="true" @change="reloadList" />
@@ -374,6 +390,11 @@
         @childValInput="childVal"
         @childValInput="childVal"
         @click.stop
         @click.stop
       />
       />
+      <checkListStopConfirm
+        :visible="checklistStopVisible"
+        @confirm="checklistConfirm"
+        @cancel="checklistCancel"
+      />
     </el-container>
     </el-container>
   </div>
   </div>
 </template>
 </template>
@@ -383,6 +404,7 @@ import Vue from 'vue'
 import VueClipboard from 'vue-clipboard2'
 import VueClipboard from 'vue-clipboard2'
 Vue.use(VueClipboard)
 Vue.use(VueClipboard)
 import { mapGetters } from 'vuex'
 import { mapGetters } from 'vuex'
+// import store from '@/store'
 import { EncryptId, analysisBizId_id } from '@/utils/crypto-js.js'
 import { EncryptId, analysisBizId_id } from '@/utils/crypto-js.js'
 import {
 import {
   taskGet,
   taskGet,
@@ -396,6 +418,7 @@ import {
   configShowRequirementVersionEnum,
   configShowRequirementVersionEnum,
   scheduleGetTaskScheduleHistory
   scheduleGetTaskScheduleHistory
 } from '@/api/taskIndex'
 } from '@/api/taskIndex'
+import checkListStopConfirm from '@/components/checkListStopConfirm'
 import { listByTask, taskUpdates } from '@/api/projectViewDetails'
 import { listByTask, taskUpdates } from '@/api/projectViewDetails'
 import { projectListProject, scheduleGetHistoryScheduleById, taskListAvailableDpmTask, taskSetTaskRelated, taskDeleteRelationship } from '@/api/requirement.js'
 import { projectListProject, scheduleGetHistoryScheduleById, taskListAvailableDpmTask, taskSetTaskRelated, taskDeleteRelationship } from '@/api/requirement.js'
 import searchPeople from '@/components/select/searchPeople'
 import searchPeople from '@/components/select/searchPeople'
@@ -417,6 +440,7 @@ import stage1 from '@/assets/detailPage/正常状态.png'
 import stage2 from '@/assets/detailPage/延期状态.png'
 import stage2 from '@/assets/detailPage/延期状态.png'
 import taskDialog from '@/views/projectManage/taskList/dialog/taskDialog' // 任务状态修改(已上线/已提测/已准出)
 import taskDialog from '@/views/projectManage/taskList/dialog/taskDialog' // 任务状态修改(已上线/已提测/已准出)
 import bugTableDialog from '@/views/projectManage/bugList/details/bugTableDialog' // 缺陷表格
 import bugTableDialog from '@/views/projectManage/bugList/details/bugTableDialog' // 缺陷表格
+import publishTask from '@/views/projectManage/publishTask'
 import schedule from '@/views/projectManage/schedule' // 排期锁定弹窗
 import schedule from '@/views/projectManage/schedule' // 排期锁定弹窗
 import download from '@/views/projectManage/components/export.vue'
 import download from '@/views/projectManage/components/export.vue'
 import record from '@/views/projectManage/components/record.vue'
 import record from '@/views/projectManage/components/record.vue'
@@ -448,7 +472,9 @@ export default {
     record,
     record,
     timeLine,
     timeLine,
     workflowAndStatus,
     workflowAndStatus,
-    synchronizeDialog
+    synchronizeDialog,
+    publishTask,
+    checkListStopConfirm // checklist拦截弹窗
   },
   },
   filters: {
   filters: {
     ellipsis(value, num) {
     ellipsis(value, num) {
@@ -511,7 +537,10 @@ export default {
       comments: [], // 评论列表
       comments: [], // 评论列表
       taskIds: '', // 将要修改状态的任务id
       taskIds: '', // 将要修改状态的任务id
       synchronizeDialog: false, // 同步任务至望月弹框
       synchronizeDialog: false, // 同步任务至望月弹框
-      dplOption: [] // 关联的望岳任务
+      dplOption: [], // 关联的望岳任务
+      checklistStopVisible: false, // checklist拦截弹窗是否显示
+      firstChecklistTaskId: -1,
+      loaded: false // 是否请求到当前任务的task信息
     }
     }
   },
   },
 
 
@@ -682,6 +711,9 @@ export default {
       const res = await taskGet(this.taskId)
       const res = await taskGet(this.taskId)
       if (res.code === 200) {
       if (res.code === 200) {
         this.form_query = res.data
         this.form_query = res.data
+        if (!this.loaded) {
+          this.loaded = true
+        }
         if (this.form_query.isDirectlyFromDpm === 0 || this.form_query.isDirectlyFromDpm === 1) {
         if (this.form_query.isDirectlyFromDpm === 0 || this.form_query.isDirectlyFromDpm === 1) {
           this.toilp = this.form_query.relatedDpmTaskInfo.taskId + this.form_query.relatedDpmTaskInfo.name
           this.toilp = this.form_query.relatedDpmTaskInfo.taskId + this.form_query.relatedDpmTaskInfo.name
         }
         }
@@ -786,11 +818,15 @@ export default {
         case 1: // 提测
         case 1: // 提测
           reportdelivertestCheckStatus([this.taskId]).then(res => {
           reportdelivertestCheckStatus([this.taskId]).then(res => {
             if (res.code === 200) {
             if (res.code === 200) {
+              if (res.data && res.data.id) {
+                this.checklistStopVisible = true
+                this.firstChecklistTaskId = res.data.id
+                return
+              }
               this.dialogTest = true
               this.dialogTest = true
               this.$nextTick(() => { this.$refs.TestReport.init(7, [this.taskId]) })
               this.$nextTick(() => { this.$refs.TestReport.init(7, [this.taskId]) })
             }
             }
           })
           })
-
           break
           break
         case 2: // 日报
         case 2: // 日报
           dailyReportCheckStatus([this.taskId]).then(res => {
           dailyReportCheckStatus([this.taskId]).then(res => {
@@ -867,6 +903,18 @@ export default {
         this.taskGet()
         this.taskGet()
         this.$message({ message: '已取消关联', type: 'success', offset: 150 })
         this.$message({ message: '已取消关联', type: 'success', offset: 150 })
       }
       }
+    },
+    checklistConfirm() {
+      this.checklistStopVisible = false
+      const { bizId = null } = this.$store.state.global || {}
+      const bizId_id = EncryptId(`${bizId}_${this.firstChecklistTaskId}`)
+      const newTab = this.$router.resolve({ name: '任务详情', query: { bizId_id: bizId_id, page: 6 }})
+      window.open(newTab.href, '_blank')
+    },
+    checklistCancel() {
+      this.checklistStopVisible = false
+      this.dialogTest = true
+      this.$nextTick(() => { this.$refs.TestReport.init(7, [this.taskId]) })
     }
     }
   }
   }
 }
 }

+ 44 - 2
src/views/reportManagement/testPresentation.vue

@@ -146,6 +146,11 @@
         <acceptTheReport v-if="acceptTheReport" :message="message" />
         <acceptTheReport v-if="acceptTheReport" :message="message" />
       </div>
       </div>
     </el-dialog>
     </el-dialog>
+    <checkListStopConfirm
+      :visible="checklistStopVisible"
+      @confirm="checklistConfirm"
+      @cancel="checklistCancel"
+    />
   </div>
   </div>
 </template>
 </template>
 
 
@@ -154,6 +159,7 @@ const _ = require('lodash')
 import { EncryptId } from '@/utils/crypto-js.js'
 import { EncryptId } from '@/utils/crypto-js.js'
 import { mapGetters } from 'vuex'
 import { mapGetters } from 'vuex'
 import '@/styles/PublicStyle/index.scss'
 import '@/styles/PublicStyle/index.scss'
+import checkListStopConfirm from '@/components/checkListStopConfirm'
 import { dailyReportDelete } from '@/api/testPresentetion' // 日报
 import { dailyReportDelete } from '@/api/testPresentetion' // 日报
 import { projectTestReportList } from '@/api/ResultPage' // 准出
 import { projectTestReportList } from '@/api/ResultPage' // 准出
 import { launchTestList } from '@/api/InterfaceReport' // 提测
 import { launchTestList } from '@/api/InterfaceReport' // 提测
@@ -174,7 +180,8 @@ export default {
     ReleaseReport,
     ReleaseReport,
     testPresenyL,
     testPresenyL,
     ResultPageyL,
     ResultPageyL,
-    acceptTheReport
+    acceptTheReport,
+    checkListStopConfirm
   },
   },
   data() {
   data() {
     return {
     return {
@@ -212,7 +219,10 @@ export default {
       indexPage: {
       indexPage: {
         pageSize: 10,
         pageSize: 10,
         curIndex: 1
         curIndex: 1
-      }
+      },
+      goDataReport: -1,
+      checklistStopVisible: false, // checklist拦截弹窗是否显示
+      firstChecklistTaskId: -1
     }
     }
   },
   },
   computed: {
   computed: {
@@ -375,6 +385,12 @@ export default {
               const data = res.data
               const data = res.data
               reportdelivertestCheckStatus(data.taskIds).then(response => {
               reportdelivertestCheckStatus(data.taskIds).then(response => {
                 if (response.code === 200) {
                 if (response.code === 200) {
+                  if (response.data && response.data.id) {
+                    this.checklistStopVisible = true
+                    this.firstChecklistTaskId = response.data.id
+                    this.goDataReport = data
+                    return
+                  }
                   this.dialogVisible1 = true
                   this.dialogVisible1 = true
                   this.$nextTick(() => {
                   this.$nextTick(() => {
                     this.$refs.TestReport.init(4, data)
                     this.$refs.TestReport.init(4, data)
@@ -453,6 +469,12 @@ export default {
           const res = await reportdelivertestCheckStatus([vel])
           const res = await reportdelivertestCheckStatus([vel])
           if (res.code === 200) {
           if (res.code === 200) {
             this.centerDialogVisible = false
             this.centerDialogVisible = false
+            if (res.data && res.data.id) {
+              this.checklistStopVisible = true
+              this.firstChecklistTaskId = res.data.id
+              this.goDataReport = vel
+              return
+            }
             this.dialogVisible1 = true
             this.dialogVisible1 = true
             this.$nextTick(() => {
             this.$nextTick(() => {
               this.$refs.TestReport.init(7, [vel])
               this.$refs.TestReport.init(7, [vel])
@@ -553,6 +575,26 @@ export default {
     handleCurrentChange1(curIndex) { // used 分页
     handleCurrentChange1(curIndex) { // used 分页
       this.curIndex = curIndex
       this.curIndex = curIndex
       this.gethistoryData()
       this.gethistoryData()
+    },
+    checklistConfirm() {
+      this.checklistStopVisible = false
+      const { bizId = null } = this.$store.state.global || {}
+      const bizId_id = EncryptId(`${bizId}_${this.firstChecklistTaskId}`)
+      const newTab = this.$router.resolve({ name: '任务详情', query: { bizId_id: bizId_id, page: 6 }})
+      window.open(newTab.href, '_blank')
+    },
+    checklistCancel() {
+      this.checklistStopVisible = false
+      this.dialogVisible1 = true
+      if (this.goDataReport.taskIds) {
+        this.$nextTick(() => {
+          this.$refs.TestReport.init(4, this.goDataReport)
+        })
+      } else {
+        this.$nextTick(() => {
+          this.$refs.TestReport.init(7, [this.goDataReport])
+        })
+      }
     }
     }
   }
   }
 }
 }