Browse Source

Merge remote-tracking branch 'origin/master'

humingbo 1 năm trước cách đây
mục cha
commit
238666e4a1

+ 8 - 0
src/api/system/user.js

@@ -106,3 +106,11 @@ export function getPermissionByUserId(userId) {
     method: 'get'
   })
 }
+
+// 查询具有审核权限的用户
+export function getAuditUsers() {
+  return request({
+    url: '/system/user/auditUsers',
+    method: 'get'
+  })
+}

+ 16 - 0
src/api/task/task.js

@@ -124,3 +124,19 @@ export function toDoTaskList() {
     method: 'get'
   })
 }
+
+export function projectAuditConfigs(parmas) {
+  return request({
+    url: '/task/audit/projectAuditConfigs',
+    method: 'get',
+    params: parmas
+  })
+}
+
+export function taskAuditConfigs(parmas) {
+  return request({
+    url: '/task/audit/taskAuditConfigs',
+    method: 'get',
+    params: parmas
+  })
+}

+ 12 - 1
src/utils/date.js

@@ -61,6 +61,17 @@ export default {
     }
     return moment().unix()
   },
+  compare(date1, date2) {
+    let d1 = moment(date1);
+    let d2 = moment(date2);
+    if (d1.isBefore(d2)) {
+      return -1
+    } else if (d1.isAfter(d2)) {
+      return 1
+    } else {
+      return 0
+    }
+  },
   dayDiff(dateStart, dateEnd) {
     return moment(dateEnd).diff(moment(dateStart), 'day')
   },
@@ -115,7 +126,7 @@ export default {
     return moment(date).add(1, 'weeks').startOf('week').format(DATE_FORMAT)
   },
 
-  getFeedBackDate(startDate,endDate, day) {
+  getFeedBackDate(startDate, endDate, day) {
     let startYear = moment(startDate).year()
     let endYear = moment(endDate).year()
 

+ 12 - 1
src/utils/request.js

@@ -1,5 +1,5 @@
 import axios from 'axios'
-import {MessageBox, Message} from 'element-ui'
+import {MessageBox, Message, Loading} from 'element-ui'
 import store from '@/store'
 import {getToken} from '@/utils/auth'
 
@@ -12,6 +12,7 @@ const service = axios.create({
   timeout: 5000 // request timeout
 })
 
+let loading;
 // request interceptor
 service.interceptors.request.use(
   config => {
@@ -23,11 +24,19 @@ service.interceptors.request.use(
       // please modify it according to the actual situation
       config.headers['satoken'] = getToken();
     }
+
+    loading = Loading.service({
+      lock: true,
+      text: '数据请求中.....',
+      spinner: 'el-icon-loading',
+      background: 'rgba(0, 0, 0, 0.7)'
+    });
     return config
   },
   error => {
     // do something with request error
     console.log(error) // for debug
+    loading.close()
     return Promise.reject(error)
   }
 )
@@ -46,6 +55,7 @@ service.interceptors.response.use(
    */
   response => {
     const res = response.data
+    loading.close()
 
     // if the custom code is not 20000, it is judged as an error.
     if (res.code !== '2000') {
@@ -85,6 +95,7 @@ service.interceptors.response.use(
   },
   error => {
     console.log('err' + error) // for debug
+    loading.close()
     Message({
       message: error.message,
       type: 'error',

+ 46 - 15
src/views/dashboard/index.vue

@@ -80,9 +80,9 @@
     </el-dialog>
 
     <!-- 审核任务对话框--->
-    <el-dialog :title="detailForm.taskName" :visible.sync="auditOpen" width="900px" class="i-audit-dialog"
-               append-to-body
-               :close-on-click-modal="false">
+    <el-dialog :title="detailForm.id+'、'+detailForm.taskName" :visible.sync="auditOpen" width="900px"
+               class="i-audit-dialog" append-to-body @close="auditCancel">
+      <div class="indicator">{{ currentTaskIndex + '/' + carouselNum }}</div>
       <el-carousel ref="auditCarousel" trigger="click" height="630px" :autoplay="false" indicator-position="none"
                    @change="auditTaskChange">
         <el-carousel-item v-for="item in carouselNum" :key="item">
@@ -94,6 +94,7 @@
                   <el-radio-group v-model="auditForm.auditResult">
                     <el-radio label="1">确认完成</el-radio>
                     <el-radio label="0">驳回</el-radio>
+                    <el-radio label="9">评论</el-radio>
                   </el-radio-group>
                 </el-form-item>
               </el-col>
@@ -122,12 +123,13 @@
 <script>
 
 import {mapGetters} from 'vuex'
-import {auditTask, getTask, toDoTaskList} from "@/api/task/task";
+import {addTaskFeedback, auditTask, getTask, toDoTaskList} from "@/api/task/task";
 import {personReceive} from "@/api/material/transfer";
 import {getPersonalTaskList} from '@/api/meeting/enforce'
 import {getTodoMeetinStatistics} from '@/api/meeting/meeting'
 import {getEnforceRemindCount} from '@/api/meeting/enforceRemind'
 import TaskDetail from "@/views/task/components/taskDetail";
+import DateUtil from '@/utils/date'
 
 export default {
   name: 'Dashboard',
@@ -156,6 +158,7 @@ export default {
 
       carouselNum: 0,
       currentCarouselIndex: 0,
+      currentTaskIndex: 1,
       detailForm: {},
       auditForm: {},
       auditOpen: false,
@@ -297,14 +300,14 @@ export default {
     },
 
     auditTaskChange(currIndex, oldIndex) {
+      this.currentTaskIndex = currIndex + 1
       let refs = this.$refs.auditForm
       for (let key in refs) {
         refs[key].resetFields()
         refs[key].clearValidate()
       }
-
       let abs = Math.abs(currIndex - oldIndex);
-      if (abs != 1 && abs != this.auditTasks.length) {
+      if (abs != 1 && abs != this.auditTasks.length - 1) {
         this.$refs.auditCarousel.setActiveItem(this.currentCarouselIndex)
         return
       }
@@ -326,16 +329,35 @@ export default {
       let currAuditForm = this.$refs.auditForm[index - 1]
       currAuditForm.validate(valid => {
         if (valid) {
-          auditTask(this.auditForm).then(res => {
-            this.$message.success("操作成功");
-            this.auditTasks.splice(index - 1, 1)
-            this.currentCarouselIndex = index - 1
-            if (index - 1 === this.auditTasks.length) {
-              this.currentCarouselIndex = 0
+          if (this.auditForm.auditResult != '9') {
+            auditTask(this.auditForm).then(res => {
+              this.$message.success("操作成功");
+              this.auditTasks.splice(index - 1, 1)
+              this.currentCarouselIndex = index - 1
+              if (index - 1 === this.auditTasks.length) {
+                this.currentCarouselIndex = 0
+              }
+              this.$refs.auditCarousel.setActiveItem(this.currentCarouselIndex)
+              this.handleAudit();
+            })
+          } else {
+            let data = {
+              taskId: this.auditForm.taskId,
+              feedbackDate: DateUtil.day(),
+              feedbackType: '4',
+              description: this.auditForm.auditOpinion
             }
-            this.$refs.auditCarousel.setActiveItem(this.currentCarouselIndex)
-            this.handleAudit();
-          })
+            addTaskFeedback(data).then(res => {
+              this.$message.success("评论成功");
+              this.auditTasks.splice(index - 1, 1)
+              this.currentCarouselIndex = index - 1
+              if (index - 1 === this.auditTasks.length) {
+                this.currentCarouselIndex = 0
+              }
+              this.$refs.auditCarousel.setActiveItem(this.currentCarouselIndex)
+              this.handleAudit();
+            });
+          }
         }
       });
     },
@@ -344,6 +366,7 @@ export default {
     auditCancel() {
       // this.detailForm = {};
       this.currentCarouselIndex = 0
+      this.currentTaskIndex = 1
       this.auditForm = {
         taskId: undefined,
         auditResult: undefined,
@@ -425,4 +448,12 @@ export default {
 .footer-btn {
   margin-left: 720px;
 }
+
+.indicator {
+  position: absolute;
+  top: 3px;
+  left: 50%;
+  font-weight: bold;
+  color: #409eff;
+}
 </style>

+ 113 - 0
src/views/task/components/auditModule.vue

@@ -0,0 +1,113 @@
+<template>
+  <div>
+    <template v-for="(config,index) in taskAuditConfigs">
+      <el-select v-model="config.auditUserId" placeholder="请选择" class="user-select">
+        <el-option
+          v-for="item in auditUsers"
+          :key="item.id"
+          :label="item.userName"
+          :value="item.id">
+        </el-option>
+      </el-select>
+      <el-button v-if="taskAuditConfigs.length>1" class="del-btn" circle type="danger"
+                 @click="deleteConfig(index)">
+        <i class="el-icon-close"></i>
+      </el-button>
+      <i class="el-icon-right" v-if="index!=taskAuditConfigs.length-1"></i>
+      <el-button v-else icon="el-icon-plus" circle type="primary" @click="addConfig(index)"
+                 :disabled="index>1"></el-button>
+    </template>
+
+
+  </div>
+</template>
+
+<script>
+export default {
+  name: "auditModule",
+  props: {
+    auditUsers: {
+      type: Array,
+      default: []
+
+    },
+    projectAuditConfigs: {
+      type: Array,
+      default: []
+    }
+  },
+  watch: {
+    projectAuditConfigs: {
+      handler(newVal, oldVal) {
+        this.setTaskAuditConfigs()
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  data() {
+    return {
+      taskAuditConfigs: []
+    }
+  },
+  methods: {
+    setTaskAuditConfigs() {
+      let temp = []
+      if (this.projectAuditConfigs.length === 0) {
+        temp.push({
+          auditOrder: 1,
+          auditUserId: undefined
+        })
+      } else {
+        this.projectAuditConfigs.forEach(pConfig => {
+          temp.push({
+            auditOrder: pConfig.auditOrder,
+            auditUserId: pConfig.auditUserId
+          })
+        })
+      }
+      this.taskAuditConfigs = temp
+    },
+    addConfig(index) {
+      if (index > 1) {
+        return
+      }
+      this.taskAuditConfigs.push({
+        auditOrder: index + 2,
+        auditUserId: undefined
+      })
+    },
+    deleteConfig(index) {
+      this.taskAuditConfigs.splice(index, 1)
+      this.taskAuditConfigs.forEach((config, i) => {
+        config.auditOrder = i + 1
+      })
+    },
+    getAuditConfigs() {
+      let res = []
+      this.taskAuditConfigs.forEach(config => {
+        if (config.auditUserId) {
+          res.push(config)
+        }
+      })
+      return res
+    }
+  }
+}
+</script>
+
+<style scoped>
+.user-select {
+  width: 100px;
+  margin-right: 2px;
+}
+
+.del-btn {
+  margin-right: 5px;
+}
+
+.el-icon-right {
+  font-weight: bold;
+  margin-right: 5px;
+}
+</style>

+ 38 - 9
src/views/task/components/taskDetail.vue

@@ -6,7 +6,8 @@
       </el-descriptions-item>
       <el-descriptions-item label="当前状态">
         <el-tag size="mini" :type="statusMap[form.status].type">
-          {{ statusMap[form.status].name }}
+          <!--          {{ statusMap[form.status].name }}-->
+          {{ getStatusName(form.status) }}
         </el-tag>
       </el-descriptions-item>
       <el-descriptions-item label="进度" :span="2">
@@ -27,6 +28,19 @@
         <div class="desc-item-content">{{ form.endDate }}</div>
       </el-descriptions-item>
     </el-descriptions>
+    <el-descriptions>
+      <el-descriptions-item label="父任务">
+        <div v-if="form.ancestorsTask&&form.ancestorsTask.length>0">
+          <template v-for="item in form.ancestorsTask">
+            <span class="p-task" @click="toTask(item.id)">{{ item.id + '、' + item.taskName }}</span><i
+            class="el-icon-arrow-right"></i>
+          </template>
+          <span>当前任务</span>
+        </div>
+        <div v-else>无</div>
+      </el-descriptions-item>
+    </el-descriptions>
+
     <el-tabs v-model="activeName">
       <el-tab-pane name="first">
         <span slot="label"><i class="el-icon-info"></i><span style="margin-left: 5px">任务信息</span></span>
@@ -35,9 +49,9 @@
           <el-form-item label="所属项目:">
             <div>{{ form.projectName }}</div>
           </el-form-item>
-          <el-form-item label="父任务:" v-if="form.parentTaskId">
-            <div class="p-task" @click="getParentTask(form.parentTaskId)">{{ form.parentTaskName }}</div>
-          </el-form-item>
+          <!--          <el-form-item label="父任务:" v-if="form.parentTaskId">-->
+          <!--            <div class="p-task" @click="getParentTask(form.parentTaskId)">{{ form.parentTaskName }}</div>-->
+          <!--          </el-form-item>-->
           <el-form-item label="附件:">
             <div v-if="form.fileList.length>0">
               <div v-for="(file,index) in form.fileList">
@@ -69,7 +83,9 @@
         </div>
       </el-tab-pane>
       <el-tab-pane name="second">
-        <span slot="label"><i class="el-icon-document"></i><span style="margin-left: 5px">反馈信息</span></span>
+        <span slot="label"><i class="el-icon-document"></i>
+          <span style="margin-left: 5px">反馈信息({{ form.feedbacks.length }})</span>
+        </span>
         <el-table :data="form.feedbacks" size="mini" max-height="400" border>
           <el-table-column width="75" label="反馈状态">
             <template slot-scope="scope">
@@ -113,8 +129,9 @@
         </el-table>
       </el-tab-pane>
       <el-tab-pane label="子任务" name="third">
-          <span slot="label"><i class="el-icon-more"></i><span
-            style="margin-left: 5px">子任务({{ form.children.length }})</span></span>
+          <span slot="label"><i class="el-icon-more"></i>
+            <span style="margin-left: 5px">子任务({{ form.children.length }})</span>
+          </span>
         <el-table :data="form.children"
                   max-height="400"
                   size="mini"
@@ -159,7 +176,9 @@
         </el-table>
       </el-tab-pane>
       <el-tab-pane label="修改日志" name="four">
-        <span slot="label"><i class="el-icon-edit"></i><span style="margin-left: 5px">修改日志</span></span>
+        <span slot="label"><i class="el-icon-edit"></i>
+          <span style="margin-left: 5px">修改日志({{ form.updateLogs.length }})</span>
+        </span>
         <el-table :data="form.updateLogs"
                   max-height="400"
                   size="mini">
@@ -193,6 +212,7 @@
 <script>
 import {getTask} from "@/api/task/task";
 import task from "@/views/mixins/task";
+import DateUtil from "@/utils/date"
 
 export default {
   name: "taskDetail",
@@ -234,7 +254,7 @@ export default {
       }
       return '审批'
     },
-    getParentTask(id) {
+    toTask(id) {
       getTask(id).then(res => {
         this.form = res.data;
         this.activeName = 'first'
@@ -248,6 +268,15 @@ export default {
         this.form = res.data;
         this.activeName = 'first'
       })
+    },
+    getStatusName(status) {
+      let name = this.statusMap[status].name
+      if (status === '6') {
+        let result = DateUtil.compare(this.detailForm.endDate, this.detailForm.finishDate);
+        let temp = result < 0 ? '延期' : '正常'
+        name = name + '(' + temp + ')'
+      }
+      return name
     }
   }
 }

+ 8 - 12
src/views/task/projectView.vue

@@ -36,15 +36,15 @@
           style="width: 135px">
         </el-date-picker>
       </el-form-item>
-      <el-form-item prop="status">
-        <el-radio-group v-model="queryParams.status" size="mini" @change="getList">
-          <el-radio-button
+      <el-form-item prop="statusGroup">
+        <el-checkbox-group v-model="queryParams.statusGroup" size="mini" @change="getList">
+          <el-checkbox-button
             v-for="dict in dict.type.task_status"
             :key="dict.value"
             :label="dict.value"
           >{{ dict.label }}
-          </el-radio-button>
-        </el-radio-group>
+          </el-checkbox-button>
+        </el-checkbox-group>
       </el-form-item>
       <el-form-item prop="priority">
         <el-select
@@ -68,7 +68,6 @@
 
     <el-table
       class="view-table"
-      v-loading="loading"
       :data="tableData"
       v-el-table-infinite-scroll="loadData"
       :infinite-scroll-disabled="disabled"
@@ -204,8 +203,8 @@
       </div>
     </el-dialog>
 
-    <el-dialog :title="detailForm.taskName" :visible.sync="openDetail" width="900px" class="feed-dialog" :close-on-click-modal="true"
-               append-to-body>
+    <el-dialog :title="detailForm.id+'、'+detailForm.taskName" :visible.sync="openDetail" width="900px"
+               class="feed-dialog" :close-on-click-modal="true" append-to-body>
       <task-detail :detailForm="detailForm"></task-detail>
     </el-dialog>
 
@@ -245,10 +244,9 @@ export default {
         projectId: undefined,
         startDate: undefined,
         endDate: undefined,
-        status: '1',
+        statusGroup: ['0', '1', '2', '3'],
         priority: undefined
       },
-      loading: true,
       projectTree: [],
       userList: [],
       tableHeaders: [],
@@ -313,7 +311,6 @@ export default {
         this.$message.warning("时间跨度不可超过一年")
         return
       }
-      this.loading = true
       listProjectView(this.queryParams).then(res => {
         this.tableData = []
         this.page = 0
@@ -321,7 +318,6 @@ export default {
         this.tableHeaders = res.data.headers
         this.totalData = res.data.data || []
         this.total = this.totalData.length > 0 ? Number.parseInt(this.totalData.length / 15) + 1 : 0
-        this.loading = false
       })
     },
     loadData() {

+ 57 - 14
src/views/task/task.vue

@@ -34,7 +34,7 @@
             <el-form-item prop="status">
               <el-select
                 v-model="queryParams.status"
-                placeholder="任务状态"
+                placeholder="状态"
                 style="width: 85px">
                 <el-option
                   v-for="dict in dict.type.task_status"
@@ -135,7 +135,7 @@
                          type="text"
                          icon="el-icon-coordinate"
                          @click="handleAudit(scope.row)"
-                         :disabled="scope.row.status!='6'"
+                         :disabled="scope.row.status!='6'||scope.row.auditUserId!=userId"
                          v-hasPermi="['task:task:audit']"
               >审核
               </el-button>
@@ -193,6 +193,7 @@
               <treeselect v-model="form.projectId" :options="projectOptions"
                           :open-on-click="true"
                           :normalizer="normalizer"
+                          @select="treeProjectChange"
                           :flat="true"
                           :defaultExpandLevel="1"
                           style="width: 220px"
@@ -262,6 +263,10 @@
         <el-form-item label="任务描述" prop="description">
           <rich-text-editor ref="rtEditor" v-model="form.description" v-if="open"></rich-text-editor>
         </el-form-item>
+        <el-form-item label="审核流程" v-if="form.projectId">
+          <audit-module ref="auditModule" :audit-users="auditUsers"
+                        :project-audit-configs="projectAuditConfigs"></audit-module>
+        </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" size="mini" @click="submitForm">确 定</el-button>
@@ -270,14 +275,15 @@
     </el-dialog>
 
     <!-- 任务详情对话框 -->
-    <el-dialog :title="detailForm.taskName" :visible.sync="detailOpen" width="900px" class="add-dialog" append-to-body
+    <el-dialog :title="detailForm.id+'、'+detailForm.taskName" :visible.sync="detailOpen" width="900px"
+               class="add-dialog" append-to-body
                :close-on-click-modal="true">
       <task-detail :detail-form="detailForm"></task-detail>
     </el-dialog>
 
     <!-- 审核任务对话框 -->
-    <el-dialog :title="detailForm.taskName" :visible.sync="auditOpen" width="900px" class="add-dialog" append-to-body
-               @close="auditCancel">
+    <el-dialog :title="detailForm.id+'、'+detailForm.taskName" :visible.sync="auditOpen" width="900px" class="add-dialog"
+               append-to-body @close="auditCancel">
       <task-detail :detail-form="detailForm"></task-detail>
       <el-form ref="auditForm" :model="auditForm" :rules="auditRules" size="mini" label-width="100px">
         <el-row>
@@ -286,6 +292,7 @@
               <el-radio-group v-model="auditForm.auditResult">
                 <el-radio label="1">确认完成</el-radio>
                 <el-radio label="0">驳回</el-radio>
+                <el-radio label="9">评论</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -341,10 +348,11 @@ import {
   addTask,
   updateTask,
   auditTask,
-  splitTask
+  splitTask,
+  projectAuditConfigs, taskAuditConfigs, addTaskFeedback
 } from "@/api/task/task";
 import {getProjectTree, listProject} from "@/api/task/project";
-import {getDeptUserTree} from "@/api/system/user";
+import {getDeptUserTree, getAuditUsers} from "@/api/system/user";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 import DeptUserTree from "@/components/DeptUserTree"
@@ -358,9 +366,11 @@ import {mapGetters} from "vuex";
 import task from "@/views/mixins/task";
 import DateUtil from "@/utils/date";
 
+import AuditModule from '@/views/task/components/auditModule';
+
 export default {
   name: "Task",
-  components: {Project, TaskDetail, DeptUserTree, FileUpload, Treeselect, RichTextEditor, TaskSplit},
+  components: {Project, TaskDetail, DeptUserTree, FileUpload, Treeselect, RichTextEditor, TaskSplit, AuditModule},
   dicts: ['task_status', 'task_priority'],
   mixins: [task],
   computed: {
@@ -387,13 +397,15 @@ export default {
         projectId: undefined,
         startDate: undefined,
         endDate: undefined,
-        status: '1',
+        status: undefined,
         priority: undefined,
         sortField: undefined,
         order: undefined
       },
       // 表单参数
       form: {},
+      projectAuditConfigs: [],
+      auditUsers: [],
       detailTitle: "",
       detailOpen: false,
       detailForm: {},
@@ -557,6 +569,11 @@ export default {
       };
       return newVar;
     },
+    treeProjectChange(node) {
+      projectAuditConfigs({projectId: node.id}).then(res => {
+        this.projectAuditConfigs = res.data
+      })
+    },
 
     /** 新增按钮操作 */
     handleAdd() {
@@ -569,14 +586,26 @@ export default {
           let ids = this.projectOptions.map(item => item.id);
           if (ids.indexOf(this.selectProjectId) < 0) {
             this.form.projectId = this.selectProjectId
+            projectAuditConfigs({projectId: this.form.projectId}).then(res => {
+              this.projectAuditConfigs = res.data
+            })
           }
         }
         this.$set(this.form, 'priority', '4')
       })
+      getAuditUsers().then(res => {
+        this.auditUsers = res.data
+      })
     },
     async handleEdit(row) {
       this.open = true;
       this.title = "修改任务";
+      taskAuditConfigs({taskId: row.id}).then(res => {
+        this.projectAuditConfigs = res.data
+      })
+      getAuditUsers().then(res => {
+        this.auditUsers = res.data
+      })
       let arr = []
       arr.push(getTask(row.id).then(res => {
           this.form = res.data;
@@ -681,6 +710,7 @@ export default {
             let tempFiles = this.form.files.map(item => item.name);
             this.form.fileUrl = JSON.stringify(tempFiles)
           }
+          this.form['auditConfigs'] = this.$refs.auditModule.getAuditConfigs()
           this.form.checkTaskConflict = true;
           if (!this.form.id) {
             addTask(this.form).then(res => {
@@ -745,11 +775,24 @@ export default {
     submitAudit() {
       this.$refs["auditForm"].validate(valid => {
         if (valid) {
-          auditTask(this.auditForm).then(res => {
-            this.$message.success("操作成功");
-            this.getList()
-            this.auditCancel()
-          })
+          if (this.auditForm.auditResult != '9') {
+            auditTask(this.auditForm).then(res => {
+              this.$message.success("操作成功");
+              this.getList()
+              this.auditCancel()
+            })
+          } else {
+            let data = {
+              taskId: this.auditForm.taskId,
+              feedbackDate: DateUtil.day(),
+              feedbackType: '4',
+              description: this.auditForm.auditOpinion
+            }
+            addTaskFeedback(data).then(res => {
+              this.$message.success("评论成功");
+              this.auditCancel()
+            });
+          }
         }
       });
     },

+ 41 - 24
src/views/task/view.vue

@@ -25,15 +25,15 @@
               style="width: 135px">
             </el-date-picker>
           </el-form-item>
-          <el-form-item prop="status">
-            <el-radio-group v-model="queryParams.status" size="mini" @change="getList">
-              <el-radio-button
+          <el-form-item prop="statusGroup">
+            <el-checkbox-group v-model="queryParams.statusGroup" size="mini" @change="getList">
+              <el-checkbox-button
                 v-for="dict in dict.type.task_status"
                 :key="dict.value"
                 :label="dict.value"
-              >{{ dict.label }}
-              </el-radio-button>
-            </el-radio-group>
+              >{{ dict.value === '0' ? '待查看' : dict.label }}
+              </el-checkbox-button>
+            </el-checkbox-group>
           </el-form-item>
           <el-form-item prop="priority">
             <el-select
@@ -69,7 +69,6 @@
 
     <el-table
       class="view-table"
-      v-loading="loading"
       :data="tableData"
       size="mini"
       @cell-mouse-enter="cellMouseEnter"
@@ -248,7 +247,8 @@
       </div>
     </el-dialog>
 
-    <el-dialog :title="detailForm.taskName" :visible.sync="openDetail" width="900px" class="feed-dialog" :close-on-click-modal="true"
+    <el-dialog :title="detailForm.taskName" :visible.sync="openDetail" width="900px" class="feed-dialog"
+               :close-on-click-modal="true"
                append-to-body>
       <task-detail :detailForm="detailForm"></task-detail>
     </el-dialog>
@@ -316,6 +316,10 @@
         <el-form-item label="任务描述" prop="description">
           <rich-text-editor v-model="addForm.description"></rich-text-editor>
         </el-form-item>
+        <el-form-item label="审核流程">
+          <audit-module ref="auditModule" :audit-users="auditUsers"
+                        :project-audit-configs="projectAuditConfigs"></audit-module>
+        </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" size="mini" @click="submitAddForm">确 定</el-button>
@@ -334,20 +338,22 @@ import {
   getFeedbackList,
   confirmComment,
   addTask,
-  updateTask
+  updateTask, projectAuditConfigs
 } from "@/api/task/task";
 import DateUtil from "@/utils/date"
 import TaskDetail from "./components/taskDetail"
 import FileUpload from "@/components/FileUpload"
 import RichTextEditor from '@/components/RichTextEditor'
+import AuditModule from './components/auditModule'
 
 import {mapGetters} from 'vuex'
 import task from "@/views/mixins/task";
 import {listProject} from "@/api/task/project";
+import {getAuditUsers} from "@/api/system/user";
 
 
 export default {
-  components: {TaskDetail, FileUpload, RichTextEditor},
+  components: {TaskDetail, FileUpload, RichTextEditor, AuditModule},
   dicts: ['task_status', 'feedback_type', 'task_priority'],
   mixins: [task],
   computed: {
@@ -398,11 +404,10 @@ export default {
         projectId: undefined,
         startDate: undefined,
         endDate: undefined,
-        status: '1',
+        statusGroup: ['0', '1', '2', '3'],
         priority: undefined,
         userId: undefined
       },
-      loading: true,
       projectTree: [],
       tableHeaders: [],
       tableData: [],
@@ -441,7 +446,9 @@ export default {
         endDate: [
           {required: true, message: "结束时间不能为空", trigger: "change"}
         ]
-      }
+      },
+      projectAuditConfigs: [],
+      auditUsers: []
     }
   },
   created() {
@@ -465,18 +472,22 @@ export default {
       }
       this.queryParams.userId = this.userId
       listView(this.queryParams).then(res => {
-        this.tableHeaders = res.data.headers.map(header => {
-          let dayHours = 0;
-          res.data.data.forEach(item => {
-            if (item[header.day].hours) {
-              dayHours += item[header.day].hours
-            }
+        let data = res.data.data || []
+        if (data.length > 0) {
+          this.tableHeaders = res.data.headers.map(header => {
+            let dayHours = 0;
+            data.forEach(item => {
+              if (item[header.day].hours) {
+                dayHours += item[header.day].hours
+              }
+            })
+            header['dayHours'] = dayHours
+            return header;
           })
-          header['dayHours'] = dayHours
-          return header;
-        })
+        } else {
+          this.tableHeaders = res.data.headers
+        }
         this.tableData = res.data.data
-        this.loading = false
       })
     },
 
@@ -652,7 +663,12 @@ export default {
       this.$set(this.addForm, 'priority', '4')
       this.$set(this.addForm, 'executor', this.userId)
       this.$set(this.addForm, 'projectId', 751562823)
-
+      projectAuditConfigs({projectId: this.addForm.projectId}).then(res => {
+        this.projectAuditConfigs = res.data
+      })
+      getAuditUsers().then(res => {
+        this.auditUsers = res.data
+      })
     },
     submitAddForm() {
       if (DateUtil.unix(this.addForm.beginDate) > DateUtil.unix(this.addForm.endDate)) {
@@ -665,6 +681,7 @@ export default {
             let tempFiles = this.addForm.files.map(item => item.name);
             this.addForm.fileUrl = JSON.stringify(tempFiles)
           }
+          this.addForm['auditConfigs'] = this.$refs.auditModule.getAuditConfigs()
           this.addForm.checkTaskConflict = false;
           addTask(this.addForm).then(res => {
             this.$message.success("新增成功");