ysc 2 лет назад
Родитель
Сommit
312aaf95a4

+ 2 - 2
src/api/task/project.js

@@ -45,9 +45,9 @@ export function delProject(ProjectId) {
 }
 
 // 查询项目列表
-export function getProjectList(categoryId) {
+export function getProjectTree() {
   return request({
-    url: '/task/project/getProjectList/' + categoryId,
+    url: '/task/project/projectTree',
     method: 'get'
   })
 }

+ 6 - 6
src/api/task/task.js

@@ -1,11 +1,11 @@
 import request from '@/utils/request'
 
 // 查询任务列表
-export function listTask(query) {
+export function listTask(data) {
   return request({
     url: '/task/task/list',
-    method: 'get',
-    params: query
+    method: 'post',
+    data: data
   })
 }
 
@@ -45,11 +45,11 @@ export function delTask(TaskId) {
 }
 
 // 查询任务视图列表
-export function listView(query) {
+export function listView(data) {
   return request({
     url: '/task/task/viewList',
-    method: 'get',
-    params: query
+    method: 'post',
+    data: data
   })
 }
 

+ 1 - 1
src/components/FileUpload/index.vue

@@ -7,7 +7,7 @@
       :on-success="handleSuccess"
       :on-error="handleError"
       name="file">
-      <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
+      <el-button slot="trigger" size="mini" type="primary">选取文件</el-button>
     </el-upload>
   </div>
 

+ 3 - 3
src/views/system/components/dept.vue

@@ -248,12 +248,12 @@ export default {
           if (this.form.id != undefined) {
             updateDept(this.form).then(response => {
               this.open = false;
-              this.getList();
+              this.getDeptTree();
             });
           } else {
             addDept(this.form).then(response => {
               this.open = false;
-              this.getList();
+              this.getDeptTree();
             });
           }
         }
@@ -264,7 +264,7 @@ export default {
       this.$confirm('是否确认删除名称为"' + row.deptName + '"的数据项?').then(function () {
         return delDept(row.id);
       }).then(() => {
-        this.getList();
+        this.getDeptTree();
       }).catch(() => {
       });
     }

+ 0 - 268
src/views/task/category.vue

@@ -1,268 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="mini" :inline="true">
-      <el-form-item label="分类名称" prop="categoryName">
-        <el-input
-          v-model="queryParams.categoryName"
-          placeholder="请输入分类名称"
-          clearable
-          style="width: 240px"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="状态" prop="status">
-        <el-select
-          v-model="queryParams.status"
-          placeholder="分类状态"
-          clearable
-          style="width: 240px">
-          <el-option :key="0" label="正常" :value="0"/>
-          <el-option :key="1" label="停用" :value="1"/>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" style="margin-bottom: 8px">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['task:category:add']"
-        >新增
-        </el-button>
-      </el-col>
-    </el-row>
-
-    <el-table :data="categoryList"
-              border
-              stripe
-              size="mini">
-      <el-table-column label="分类编号" prop="id" width="100"/>
-      <el-table-column label="分类名称" prop="categoryName" :show-overflow-tooltip="true"/>
-      <el-table-column label="分类描述" prop="description" :show-overflow-tooltip="true"/>
-      <el-table-column label="状态" align="center">
-        <template slot-scope="scope">
-          <el-tag type="success" size="small" v-if="scope.row.status==0">正常</el-tag>
-          <el-tag type="info" size="small" v-else>停用</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createTime) }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['task:category:edit']"
-          >修改
-          </el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['task:category:delete']"
-          >删除
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <div style="margin-top: 10px;text-align: center">
-      <el-pagination
-        background
-        @size-change="handleSizeChange"
-        @current-change="handleCurrentChange"
-        :current-page="queryParams.pageNum"
-        :page-sizes="[10, 20, 50]"
-        :page-size="queryParams.pageSize"
-        layout="total, sizes, prev, pager, next, jumper"
-        :total="total">
-      </el-pagination>
-    </div>
-
-    <!-- 添加或修改分类配置对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
-      <el-form ref="form" :model="form" :rules="rules" size="mini" label-width="100px">
-        <el-form-item label="分类名称" prop="categoryName">
-          <el-input v-model="form.categoryName" placeholder="请输入分类名称"/>
-        </el-form-item>
-        <el-form-item label="状态" prop="status">
-          <el-radio-group v-model="form.status">
-            <el-radio label="0">正常</el-radio>
-            <el-radio label="1">停用</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item label="分类描述" prop="description">
-          <el-input v-model="form.description" type="textarea" placeholder="请输入内容"></el-input>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog>
-
-  </div>
-</template>
-
-<script>
-import {
-  listCategory,
-  getCategory,
-  delCategory,
-  addCategory,
-  updateCategory
-} from "@/api/task/category";
-
-export default {
-  name: "Category",
-  data() {
-    return {
-      // 总条数
-      total: 0,
-      // 分类表格数据
-      categoryList: [],
-      // 弹出层标题
-      title: "",
-      // 是否显示弹出层
-      open: false,
-      // 是否显示弹出层(数据权限)
-      openDataScope: false,
-      // 查询参数
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        categoryName: undefined,
-        description: undefined,
-        status: undefined
-      },
-      // 表单参数
-      form: {},
-
-      // 表单校验
-      rules: {
-        categoryName: [
-          {required: true, message: "分类名称不能为空", trigger: "blur"}
-        ],
-      }
-    };
-  },
-  created() {
-    this.getList();
-  },
-  methods: {
-    /** 查询分类列表 */
-    getList() {
-      listCategory(this.queryParams).then(res => {
-          this.categoryList = res.data.records;
-          this.total = res.data.total;
-        }
-      );
-    },
-    // 取消按钮
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 取消按钮(数据权限)
-    cancelDataScope() {
-      this.openDataScope = false;
-      this.reset();
-    },
-    // 表单重置
-    reset() {
-      this.form = {
-        id: undefined,
-        categoryName: undefined,
-        description: undefined,
-        status: "0",
-      };
-      this.resetForm("form");
-    },
-    /** 搜索按钮操作 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    /** 重置按钮操作 */
-    resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-    handleSizeChange(val) {
-      this.pageSize = val;
-      this.getList();
-    },
-    handleCurrentChange(val) {
-      this.pageNum = val;
-      this.getList();
-    },
-    /** 新增按钮操作 */
-    handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "添加分类";
-    },
-    /** 修改按钮操作 */
-    handleUpdate(row) {
-      this.reset();
-      getCategory(row.id).then(res => {
-        this.form = res.data;
-        this.open = true;
-        this.title = "修改分类";
-      });
-    },
-
-
-    /** 提交按钮 */
-    submitForm() {
-      this.$refs["form"].validate(valid => {
-        if (valid) {
-          if (this.form.id != undefined) {
-            updateCategory(this.form).then(res => {
-              this.$message.success("修改成功");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addCategory(this.form).then(res => {
-              this.$message.success("新增成功");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-
-    /** 删除按钮操作 */
-    handleDelete(row) {
-      this.$confirm('是否确认删除分类编号为"' + row.id + '"的数据项?').then(() => {
-        return delCategory(row.id);
-      }).then(() => {
-        this.getList();
-        this.$message.success("删除成功");
-      }).catch(() => {
-      });
-    },
-  }
-};
-</script>
-<style scoped lang="scss">
-.el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
-  margin-bottom: 10px;
-}
-</style>

+ 253 - 0
src/views/task/components/project.vue

@@ -0,0 +1,253 @@
+<template>
+  <div>
+    <div class="head-container">
+      <el-button size="mini" type="primary" plain icon="el-icon-plus" @click="handleAdd">新增结构</el-button>
+
+      <el-input
+        v-model="projectName"
+        placeholder="请输入名称"
+        clearable
+        size="mini"
+        prefix-icon="el-icon-search"
+        style="margin-left: 20px"/>
+    </div>
+    <div class="head-container">
+      <el-tree
+        :data="projectData"
+        :props="defaultProps"
+        :expand-on-click-node="false"
+        :filter-node-method="filterNode"
+        ref="projectTree"
+        node-key="id"
+        default-expand-all
+        highlight-current
+        @node-click="handleNodeClick">
+            <span class="custom-tree-node" slot-scope="{ node, data }">
+              <span>{{ node.label }}</span>
+              <el-popover
+                placement="right"
+                trigger="hover">
+                <el-button size="mini" type="primary" @click="handleAdd(data)">新增</el-button>
+                <el-button size="mini" @click="handleUpdate(data)">修改</el-button>
+                <el-button size="mini" type="danger">删除</el-button>
+                <i class="el-icon-share" slot="reference"></i>
+               </el-popover>
+            </span>
+      </el-tree>
+    </div>
+
+    <!-- 添加或修改项目配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
+      <el-form ref="form" :model="form" :rules="rules" size="mini" label-width="100px">
+        <el-form-item label="名称" prop="projectName">
+          <el-input v-model="form.projectName" placeholder="请输入名称"/>
+        </el-form-item>
+        <el-form-item label="上级结构" prop="parentId">
+          <treeselect v-model="form.parentId" :options="projectOptions" :normalizer="normalizer" placeholder="请选择"/>
+        </el-form-item>
+        <el-form-item label="类型" prop="type">
+          <el-radio-group v-model="form.type">
+            <el-radio label="1">分类</el-radio>
+            <el-radio label="2">项目</el-radio>
+            <el-radio label="3">模块</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio label="0">正常</el-radio>
+            <el-radio label="1">停用</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="描述" prop="description">
+          <el-input v-model="form.description" type="textarea" placeholder="请输入内容"></el-input>
+        </el-form-item>
+        <el-form-item label="可查看人员">
+          <dept-user-tree :userList="userList" @selected="selectCoExecutor"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" size="mini" @click="submitForm">确 定</el-button>
+        <el-button size="mini" @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import {
+  listProject,
+  getProject,
+  delProject,
+  addProject,
+  updateProject, getProjectTree
+} from "@/api/task/project";
+import {getDeptUserTree} from "@/api/system/user";
+
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import DeptUserTree from "@/components/DeptUserTree"
+
+export default {
+  name: "Project",
+  components: {Treeselect, DeptUserTree},
+  data() {
+    return {
+      projectName: '',
+      projectData: [],
+
+      // 项目树数据
+      projectOptions: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      defaultProps: {
+        children: "children",
+        label: "name"
+      },
+      // 表单参数
+      form: {},
+
+      // 表单校验
+      rules: {
+        projectName: [
+          {required: true, message: "项目名称不能为空", trigger: "blur"}
+        ],
+        type: [
+          {required: true, message: "类型不能为空", trigger: "change"}
+        ],
+        status: [
+          {required: true, message: "状态不能为空", trigger: "change"}
+        ]
+      },
+      userList: []
+    };
+  },
+  watch: {
+    projectName(val) {
+      this.$refs.projectTree.filter(val)
+    }
+  },
+  created() {
+    this.getProjectTree();
+  },
+  methods: {
+    /** 查询项目树数据 */
+    getProjectTree() {
+      getProjectTree().then(res => {
+        this.projectData = res.data
+      })
+
+    },
+    /** 筛选节点 */
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.name.indexOf(value) !== -1;
+    },
+    /** 节点单击事件 */
+    handleNodeClick(data) {
+      this.$emit('selectProject', data.id)
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: undefined,
+        projectName: undefined,
+        categoryId: undefined,
+        description: undefined,
+        status: "0",
+      };
+      this.resetForm("form");
+    },
+    /** 转换项目数据结构 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.id,
+        label: node.projectName,
+        children: node.children
+      };
+    },
+    /** 新增按钮操作 */
+    handleAdd(row) {
+      this.reset();
+      if (row != undefined) {
+        this.form.parentId = row.id;
+      }
+      this.open = true;
+      this.title = "添加项目";
+      listProject().then(response => {
+        this.projectOptions = this.handleTree(response.data, "id");
+      });
+      getDeptUserTree('').then(res => {
+        this.userList = res.data
+      })
+    },
+    selectCoExecutor(val) {
+      this.form.viewable = val.join();
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      getProject(row.id).then(res => {
+        this.form = res.data;
+        this.open = true;
+        this.title = "修改项目";
+      });
+    },
+
+
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateProject(this.form).then(res => {
+              this.$message.success("修改成功");
+              this.open = false;
+              this.getProjectTree();
+            });
+          } else {
+            addProject(this.form).then(res => {
+              this.$message.success("新增成功");
+              this.open = false;
+              this.getProjectTree();
+            });
+          }
+        }
+      });
+    },
+
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      this.$confirm('是否确认删除项目编号为"' + row.id + '"的数据项?').then(() => {
+        return delProject(row.id);
+      }).then(() => {
+        this.getProjectTree();
+        this.$message.success("删除成功");
+      }).catch(() => {
+      });
+    },
+
+  }
+};
+</script>
+<style scoped lang="scss">
+.el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
+  margin-bottom: 10px;
+}
+
+.head-container {
+  display: flex;
+  margin-bottom: 20px;
+  justify-content: space-between;
+}
+</style>

+ 1 - 0
src/views/task/components/taskDetail.vue

@@ -45,6 +45,7 @@
         </template>
       </el-table-column>
       <el-table-column width="140" property="createTime" label="反馈时间"></el-table-column>
+      <el-table-column width="70" property="hours" label="工时(h)"></el-table-column>
       <el-table-column label="反馈备注">
         <template slot-scope="scope">
           <div>

+ 0 - 292
src/views/task/project.vue

@@ -1,292 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="mini" :inline="true">
-      <el-form-item label="项目名称" prop="projectName">
-        <el-input
-          v-model="queryParams.projectName"
-          placeholder="请输入项目名称"
-          clearable
-          style="width: 240px"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="所属分类" prop="projectName">
-        <el-select
-          v-model="queryParams.categoryId"
-          clearable
-          style="width: 240px">
-          <el-option v-for="item in categoryList" :key="item.id" :label="item.categoryName" :value="item.id"/>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="状态" prop="status">
-        <el-select
-          v-model="queryParams.status"
-          placeholder="项目状态"
-          clearable
-          style="width: 240px">
-          <el-option :key="0" label="正常" :value="0"/>
-          <el-option :key="1" label="停用" :value="1"/>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" style="margin-bottom: 8px">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['task:project:add']"
-        >新增
-        </el-button>
-      </el-col>
-    </el-row>
-
-    <el-table :data="projectList"
-              border
-              stripe
-              size="mini">
-      <el-table-column label="项目编号" prop="id" width="100"/>
-      <el-table-column label="项目名称" prop="projectName" :show-overflow-tooltip="true"/>
-      <el-table-column label="项目描述" prop="description" :show-overflow-tooltip="true"/>
-      <el-table-column label="状态" align="center">
-        <template slot-scope="scope">
-          <el-tag type="success" size="mini" v-if="scope.row.status==0">正常</el-tag>
-          <el-tag type="info" size="mini" v-else>停用</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createTime) }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="操作" align="center">
-        <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['task:project:edit']"
-          >修改
-          </el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['task:project:delete']"
-          >删除
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <div style="margin-top: 10px;text-align: center">
-      <el-pagination
-        background
-        @size-change="handleSizeChange"
-        @current-change="handleCurrentChange"
-        :current-page="queryParams.pageNum"
-        :page-sizes="[10, 20, 50]"
-        :page-size="queryParams.pageSize"
-        layout="total, sizes, prev, pager, next, jumper"
-        :total="total">
-      </el-pagination>
-    </div>
-
-    <!-- 添加或修改项目配置对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
-      <el-form ref="form" :model="form" :rules="rules" size="mini" label-width="100px">
-        <el-form-item label="项目名称" prop="projectName">
-          <el-input v-model="form.projectName" placeholder="请输入项目名称"/>
-        </el-form-item>
-        <el-form-item label="所属分类" prop="categoryId">
-          <el-select
-            v-model="form.categoryId"
-            clearable
-            style="width: 240px">
-            <el-option v-for="item in categoryList" :key="item.id" :label="item.categoryName" :value="item.id"/>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="状态" prop="status">
-          <el-radio-group v-model="form.status">
-            <el-radio label="0">正常</el-radio>
-            <el-radio label="1">停用</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item label="项目描述" prop="description">
-          <el-input v-model="form.description" type="textarea" placeholder="请输入内容"></el-input>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog>
-
-  </div>
-</template>
-
-<script>
-import {
-  listProject,
-  getProject,
-  delProject,
-  addProject,
-  updateProject
-} from "@/api/task/project";
-import {getCategoryList} from "@/api/task/category";
-
-export default {
-  name: "Project",
-  data() {
-    return {
-      categoryList: [],
-      // 总条数
-      total: 0,
-      // 项目表格数据
-      projectList: [],
-      // 弹出层标题
-      title: "",
-      // 是否显示弹出层
-      open: false,
-      // 查询参数
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        projectName: undefined,
-        categoryId: undefined,
-        description: undefined,
-        status: undefined
-      },
-      // 表单参数
-      form: {},
-
-      // 表单校验
-      rules: {
-        projectName: [
-          {required: true, message: "项目名称不能为空", trigger: "blur"}
-        ],
-        categoryId: [
-          {required: true, message: "所属分类不能为空", trigger: "change"}
-        ]
-      }
-    };
-  },
-  created() {
-    this.getList();
-  },
-  methods: {
-    /** 查询项目列表 */
-    getList() {
-      getCategoryList().then(res => {
-        this.categoryList = res.data;
-      })
-      listProject(this.queryParams).then(res => {
-          this.projectList = res.data.records;
-          this.total = res.data.total;
-        }
-      );
-    },
-    // 取消按钮
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 取消按钮(数据权限)
-    cancelDataScope() {
-      this.openDataScope = false;
-      this.reset();
-    },
-    // 表单重置
-    reset() {
-      this.form = {
-        id: undefined,
-        projectName: undefined,
-        categoryId: undefined,
-        description: undefined,
-        status: "0",
-      };
-      this.resetForm("form");
-    },
-    /** 搜索按钮操作 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    /** 重置按钮操作 */
-    resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-    handleSizeChange(val) {
-      this.pageSize = val;
-      this.getList();
-    },
-    handleCurrentChange(val) {
-      this.pageNum = val;
-      this.getList();
-    },
-    /** 新增按钮操作 */
-    handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "添加项目";
-    },
-    /** 修改按钮操作 */
-    handleUpdate(row) {
-      this.reset();
-      getProject(row.id).then(res => {
-        this.form = res.data;
-        this.open = true;
-        this.title = "修改项目";
-      });
-    },
-
-
-    /** 提交按钮 */
-    submitForm() {
-      this.$refs["form"].validate(valid => {
-        if (valid) {
-          if (this.form.id != undefined) {
-            updateProject(this.form).then(res => {
-              this.$message.success("修改成功");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addProject(this.form).then(res => {
-              this.$message.success("新增成功");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-
-    /** 删除按钮操作 */
-    handleDelete(row) {
-      this.$confirm('是否确认删除项目编号为"' + row.id + '"的数据项?').then(() => {
-        return delProject(row.id);
-      }).then(() => {
-        this.getList();
-        this.$message.success("删除成功");
-      }).catch(() => {
-      });
-    },
-  }
-};
-</script>
-<style scoped lang="scss">
-.el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
-  margin-bottom: 10px;
-}
-</style>

+ 205 - 197
src/views/task/task.vue

@@ -1,187 +1,164 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="mini" :inline="true">
-      <el-form-item label="所属项目" prop="projectId">
-        <el-select
-          v-model="queryParams.projectId"
-          clearable
-          style="width: 200px">
-          <el-option v-for="item in projectList" :key="item.id" :label="item.projectName" :value="item.id"/>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="月份选择" prop="month">
-        <el-date-picker
-          v-model="queryParams.month"
-          type="month"
-          value-format="yyyy-MM"
-          placeholder="选择月份"
-          :clearable="false"
-          style="width: 200px">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="状态" prop="status">
-        <el-select
-          v-model="queryParams.status"
-          placeholder="项目状态"
-          style="width: 200px">
-          <el-option label="全部" value="0"/>
-          <el-option label="未开始" value="1"/>
-          <el-option label="进行中" value="2"/>
-          <el-option label="延期" value="3"/>
-          <el-option label="完成" value="4"/>
-          <el-option label="终止" value="5"/>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" style="margin-bottom:8px">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['task:task:add']"
-        >新增
-        </el-button>
+    <el-row :gutter="20">
+      <el-col :span="5" :xs="24">
+        <project @selectProject="selectProject"></project>
       </el-col>
-    </el-row>
+      <el-col :span="19" :xs="24">
+        <el-form :model="queryParams" ref="queryForm" size="mini" :inline="true">
+          <el-form-item label="任务名称" prop="taskName">
+            <el-input v-model="queryParams.taskName"></el-input>
+          </el-form-item>
+          <el-form-item label="月份选择" prop="month">
+            <el-date-picker
+              v-model="queryParams.month"
+              type="daterange"
+              value-format="yyyy-MM-dd"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              :clearable="false"
+              style="width: 220px">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="状态" prop="status">
+            <el-select
+              v-model="queryParams.status"
+              placeholder="项目状态"
+              style="width: 200px">
+              <el-option label="全部" value="0"/>
+              <el-option label="未开始" value="1"/>
+              <el-option label="进行中" value="2"/>
+              <el-option label="延期" value="3"/>
+              <el-option label="完成" value="4"/>
+              <el-option label="终止" value="5"/>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
 
-    <el-table :data="taskList"
-              @row-click="rowClick"
-              border
-              stripe
-              size="mini">
-      <el-table-column label="任务编号" prop="id" width="80"/>
-      <el-table-column label="任务名称" prop="taskName" :show-overflow-tooltip="true"/>
-      <el-table-column label="任务类型" prop="taskType" width="80">
-        <template slot-scope="scope">
-          <span v-if="scope.row.taskType==1">软件开发</span>
-          <span v-if="scope.row.taskType==2">硬件开发</span>
-          <span v-if="scope.row.taskType==3">测试</span>
-          <span v-if="scope.row.taskType==4">实施</span>
-          <span v-if="scope.row.taskType==5">日常事务</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="所属项目" prop="projectName" :show-overflow-tooltip="true"/>
-      <el-table-column label="执行人" prop="executorName" width="80"/>
-      <el-table-column label="进度" prop="progressValue" width="70">
-        <template slot-scope="scope">
-          <span>{{ (scope.row.progressValue ? scope.row.progressValue : 0) + '%' }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="状态" width="80">
-        <template slot-scope="scope">
-          <el-tag size="mini" :type="statusMap[scope.row.status].type">{{ statusMap[scope.row.status].name }}</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column label="任务起止时间" width="170">
-        <template slot-scope="scope">
-          <span>{{ scope.row.beginDate + ' 至 ' + scope.row.endDate }}</span>
-        </template>
-      </el-table-column>
+        <el-row :gutter="10" style="margin-bottom:8px">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['task:task:add']"
+            >新增任务
+            </el-button>
+          </el-col>
+        </el-row>
 
-      <el-table-column label="创建时间" prop="createTime" width="120">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createTime) }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="操作" width="210">
-        <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleAudit(scope.row)"
-            :disabled="scope.row.progressValue!=100||(scope.row.status!='2'&&scope.row.status!='3')"
-            v-hasPermi="['task:task:audit']"
-          >审核
-          </el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleSplit(scope.row)"
-            v-hasPermi="['task:task:split']"
-          >分解
-          </el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['task:task:edit']"
-          >终止
-          </el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['task:task:delete']"
-          >删除
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
+        <el-table :data="taskList"
+                  @row-click="rowClick"
+                  size="mini">
+          <el-table-column label="任务编号" prop="id" width="80"/>
+          <el-table-column label="任务名称" prop="taskName" min-width="150" :show-overflow-tooltip="true"/>
+          <!--          <el-table-column label="任务类型" prop="taskType" width="80">-->
+          <!--            <template slot-scope="scope">-->
+          <!--              <span v-if="scope.row.taskType==1">软件开发</span>-->
+          <!--              <span v-if="scope.row.taskType==2">硬件开发</span>-->
+          <!--              <span v-if="scope.row.taskType==3">测试</span>-->
+          <!--              <span v-if="scope.row.taskType==4">实施</span>-->
+          <!--              <span v-if="scope.row.taskType==5">日常事务</span>-->
+          <!--            </template>-->
+          <!--          </el-table-column>-->
+          <!--          <el-table-column label="所属项目" prop="projectName" :show-overflow-tooltip="true"/>-->
+          <el-table-column label="执行人" prop="executorName"/>
+          <el-table-column label="进度" prop="progressValue">
+            <template slot-scope="scope">
+              <span>{{ (scope.row.progressValue ? scope.row.progressValue : 0) + '%' }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="状态" width="80">
+            <template slot-scope="scope">
+              <el-tag size="mini" :type="statusMap[scope.row.status].type">{{
+                  statusMap[scope.row.status].name
+                }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="任务起止时间" width="170">
+            <template slot-scope="scope">
+              <span>{{ scope.row.beginDate + ' 至 ' + scope.row.endDate }}</span>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="创建时间" prop="createTime" width="120">
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="210">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleAudit(scope.row)"
+                :disabled="scope.row.progressValue!=100||(scope.row.status!='2'&&scope.row.status!='3')"
+                v-hasPermi="['task:task:audit']"
+              >审核
+              </el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleSplit(scope.row)"
+                v-hasPermi="['task:task:split']"
+              >分解
+              </el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['task:task:edit']"
+              >终止
+              </el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['task:task:delete']"
+              >删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <div style="margin-top: 10px;text-align: center">
+          <el-pagination
+            background
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+            :current-page="queryParams.pageNum"
+            :page-sizes="[10, 20, 50]"
+            :page-size="queryParams.pageSize"
+            layout="total, sizes, prev, pager, next, jumper"
+            :total="total">
+          </el-pagination>
+        </div>
+      </el-col>
+    </el-row>
 
-    <div style="margin-top: 10px;text-align: center">
-      <el-pagination
-        background
-        @size-change="handleSizeChange"
-        @current-change="handleCurrentChange"
-        :current-page="queryParams.pageNum"
-        :page-sizes="[10, 20, 50]"
-        :page-size="queryParams.pageSize"
-        layout="total, sizes, prev, pager, next, jumper"
-        :total="total">
-      </el-pagination>
-    </div>
 
     <!-- 添加或修改任务配置对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
+    <el-dialog :title="title" :visible.sync="open" width="490px" append-to-body :close-on-click-modal="false">
       <el-form ref="form" :model="form" :rules="rules" size="mini" label-width="100px">
         <el-form-item label="任务名称" prop="taskName">
           <el-input v-model="form.taskName" placeholder="请输入任务名称"/>
         </el-form-item>
-        <el-form-item label="任务类型" prop="taskType">
-          <el-radio-group v-model="form.taskType">
-            <el-radio-button label="1">软件开发</el-radio-button>
-            <el-radio-button label="2">硬件开发</el-radio-button>
-            <el-radio-button label="3">测试</el-radio-button>
-            <el-radio-button label="4">实施</el-radio-button>
-            <el-radio-button label="5">日常事务</el-radio-button>
-          </el-radio-group>
+        <el-form-item label="所属项目" prop="projectId" class="mini-treeselect">
+          <treeselect v-model="form.projectId" :options="projectOptions" :normalizer="normalizer"
+                      placeholder="请选择"/>
         </el-form-item>
-        <el-form-item label="所属项目" prop="projectId">
-          <el-select
-            v-model="form.projectId"
-            clearable
-            style="width: 240px">
-            <el-option v-for="item in projectList" :key="item.id" :label="item.projectName" :value="item.id"/>
-          </el-select>
-        </el-form-item>
-        <el-row :gutter="10" v-if="form.taskType==='4'">
-          <el-col :span="12">
-            <el-form-item label="实施医院">
-              <el-select clearable filterable v-model="form.hname" placeholder="请选择医院">
-                <el-option v-for="(item,index) in hnos" :label="item.dictLabel" :value="item.dictValue"></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="实施系统">
-              <el-select clearable filterable v-model="form.hsytem" placeholder="请选择医院">
-                <el-option v-for="(item,indexw) in hsytem" :label="item.dictLabel" :value="item.dictValue"></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
         <el-form-item label="起止时间" prop="rangeDate">
           <el-date-picker
             v-model="form.rangeDate"
@@ -211,8 +188,8 @@
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" size="small" @click="submitForm">确 定</el-button>
-        <el-button size="small" @click="cancel">取 消</el-button>
+        <el-button type="primary" size="mini" @click="submitForm">确 定</el-button>
+        <el-button size="mini" @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
 
@@ -234,8 +211,8 @@
         </el-form>
       </div>
       <div v-if="detailTitle=='审核任务'" slot="footer" class="dialog-footer">
-        <el-button type="primary" size="small" @click="submitAudit">确 定</el-button>
-        <el-button size="small" @click="detailCancel">取 消</el-button>
+        <el-button type="primary" size="mini" @click="submitAudit">确 定</el-button>
+        <el-button size="mini" @click="detailCancel">取 消</el-button>
       </div>
     </el-dialog>
 
@@ -252,13 +229,15 @@
         </el-form-item>
         <el-card shadow="always" v-for="(child,index) in splitForm.children" :key="index">
           <div slot="header" class="clearfix">
-            <span>子任务{{ index + 1 }}</span>
-            <el-button type="text" icon="el-icon-delete" @click="delChild(index)"
-                       style="float: right;color: red; padding: 3px 0"></el-button>
+            <div class="card-header">
+              <div style="margin-top: 5px">子任务{{ index + 1 }}</div>
+              <el-button type="text" icon="el-icon-delete" @click="delChild(index)"
+                         style="float: right;color: red; padding: 3px 0"></el-button>
+            </div>
           </div>
           <el-form ref="splitChild" :model="child" :rules="rules" size="mini" label-width="80px">
             <el-form-item label="任务名称" prop="taskName">
-              <el-input v-model="child.taskName" size="small" style="width: 350px"/>
+              <el-input v-model="child.taskName" style="width: 350px"/>
             </el-form-item>
             <el-form-item label="执行人" prop="executor">
               <el-cascader
@@ -273,7 +252,6 @@
               <el-date-picker
                 v-model="child.rangeDate"
                 type="daterange"
-                size="small"
                 value-format="yyyy-MM-dd"
                 range-separator="至"
                 start-placeholder="开始日期"
@@ -284,8 +262,8 @@
         </el-card>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" size="small" @click="submitSplit">确 定</el-button>
-        <el-button size="small" @click="splitCancel">取 消</el-button>
+        <el-button type="primary" size="mini" @click="submitSplit">确 定</el-button>
+        <el-button size="mini" @click="splitCancel">取 消</el-button>
       </div>
     </el-dialog>
 
@@ -302,13 +280,15 @@ import {
   auditTask,
   splitTask
 } from "@/api/task/task";
-import {getProjectList} from "@/api/task/project";
+import {getProjectList, listProject} from "@/api/task/project";
 import {getDeptUserTree} from "@/api/system/user";
-import {getHosInfos, getHsystems} from '@/api/meeting/enforce'
 import DateUtil from "@/utils/date"
 import TaskDetail from "./components/taskDetail"
 import DeptUserTree from "@/components/DeptUserTree"
 import FileUpload from "@/components/FileUpload"
+import Project from "@/views/task/components/project";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 
 const statusMap = {
   '0': {name: '待查看', type: 'info'},
@@ -320,11 +300,10 @@ const statusMap = {
 }
 export default {
   name: "Task",
-  components: {TaskDetail, DeptUserTree, FileUpload},
+  components: {Project, TaskDetail, DeptUserTree, FileUpload, Treeselect},
   data() {
     return {
-      categoryList: [],
-      projectList: [],
+      projectOptions: [],
       userList: [],
       // 总条数
       total: 0,
@@ -339,7 +318,7 @@ export default {
       queryParams: {
         pageNum: 1,
         pageSize: 10,
-        categoryId: undefined,
+        taskName: undefined,
         projectId: undefined,
         month: DateUtil.month(),
         status: '0'
@@ -382,15 +361,20 @@ export default {
   methods: {
     /** 查询项目列表 */
     getList() {
-      getProjectList("").then(res => {
-        this.projectList = res.data;
-      })
+      if (this.queryParams.month && this.queryParams.month.length === 2) {
+        this.queryParams.startDate = this.queryParams.month[0]
+        this.queryParams.endDate = this.queryParams.month[1]
+      }
       listTask(this.queryParams).then(res => {
           this.taskList = res.data.records;
           this.total = res.data.total;
         }
       );
     },
+    selectProject(data) {
+      this.queryParams.projectId = data;
+      this.handleQuery()
+    },
     /** 搜索按钮操作 */
     handleQuery() {
       this.queryParams.pageNum = 1;
@@ -449,20 +433,29 @@ export default {
         this.detailTitle = "任务详情";
       })
     },
+    /** 转换项目数据结构 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.id,
+        label: node.projectName,
+        children: node.children
+      };
+    },
+
     /** 新增按钮操作 */
     handleAdd() {
       getDeptUserTree('').then(res => {
         this.userList = res.data
       })
-      getHosInfos().then(res => {
-        this.hnos = res.data
-      })
-      getHsystems().then(res => {
-        this.hsytem = res.data
-      })
       this.reset();
       this.open = true;
       this.title = "添加项目";
+      listProject().then(response => {
+        this.projectOptions = this.handleTree(response.data, "id");
+      });
     },
     selectExecutor(val, form, index) {
       if (form === 'splitForm') {
@@ -609,4 +602,19 @@ export default {
   margin-bottom: 10px;
 }
 
+.mini-treeselect {
+  ::v-deep.vue-treeselect__control {
+    height: 28px;
+  }
+
+  ::v-deep.vue-treeselect__placeholder, .vue-treeselect__single-value {
+    padding-left: 10px;
+    line-height: 28px;
+  }
+}
+
+.card-header {
+  display: flex;
+  justify-content: space-between
+}
 </style>

+ 35 - 16
src/views/task/view.vue

@@ -13,11 +13,14 @@
       <el-form-item label="月份" prop="month">
         <el-date-picker
           v-model="queryParams.month"
+          type="daterange"
+          value-format="yyyy-MM-dd"
           @change="getList"
-          type="month"
-          value-format="yyyy-MM"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
           :clearable="false"
-          style="width: 200px">
+          style="width: 220px">
         </el-date-picker>
       </el-form-item>
       <el-form-item prop="status">
@@ -59,9 +62,9 @@
           <span v-if="scope.row.formLastMonth" style="color: red">是</span>
         </template>
       </el-table-column>
-      <el-table-column align="center" v-for="(item,index) in tableHeaders" :key="index" :prop="item.day" width="37">
+      <el-table-column align="center" v-for="item in tableHeaders" :key="item.day" :prop="item.day" width="37">
         <template slot="header" slot-scope="scope">
-          <div style="width: 20px">{{ item.day }}</div>
+          <div style="width:28px;font-size: 10px">{{ item.day }}</div>
           <div v-if="item.week=='周六'" style="width: 24px;font-size: 12px;color: #1c84c6">{{ item.week }}</div>
           <div v-else-if="item.week=='周日'" style="width: 24px;font-size: 12px;color: #1c84c6">{{ item.week }}</div>
           <div v-else-if="item.week=='今日'" style="width: 24px;font-size: 12px;color: #008000">{{ item.week }}</div>
@@ -80,12 +83,16 @@
                 </template>
               </el-table-column>
               <el-table-column width="60" property="userName" label="反馈人"></el-table-column>
-              <el-table-column width="60" label="完成度">
+              <el-table-column width="55" label="完成度">
                 <template slot-scope="scope">
                   <div>{{ scope.row.feedbackType === '4' ? '' : scope.row.value + '%' }}</div>
                 </template>
               </el-table-column>
-              <el-table-column width="140" property="createTime" label="反馈时间"></el-table-column>
+              <el-table-column width="110" property="createTime" label="反馈时间">
+                <template slot-scope="scope">
+                  <div>{{ parseTime(scope.row.createTime) }}</div>
+                </template>
+              </el-table-column>
               <el-table-column label="反馈备注">
                 <template slot-scope="scope">
                   <div>
@@ -124,6 +131,10 @@
             <el-radio label="4">评论</el-radio>
           </el-radio-group>
         </el-form-item>
+        <el-form-item label="工时" prop="hours">
+          <el-input v-model="form.hours" style="width: 130px"></el-input>
+          <span style="margin-left: 5px">小时</span>
+        </el-form-item>
         <el-form-item label="进度" prop="value">
           <el-input-number v-model="form.value" :min="1" :max="100"></el-input-number>
         </el-form-item>
@@ -217,16 +228,21 @@ export default {
   },
   methods: {
     initData() {
-      this.queryParams.month = DateUtil.month(new Date())
+      let today = new Date();
+      this.queryParams.month = [DateUtil.beforeDay(today, 13), DateUtil.afterDay(today, 15)]
       this.getList()
-      getProjectList("").then(res => {
-        this.projectList = res.data;
-      })
+      // getProjectList("").then(res => {
+      //   this.projectList = res.data;
+      // })
     },
     getList() {
+      if (this.queryParams.month && this.queryParams.month.length === 2) {
+        this.queryParams.startDate = this.queryParams.month[0]
+        this.queryParams.endDate = this.queryParams.month[1]
+      }
       listView(this.queryParams).then(res => {
-        this.tableHeaders = this.getMonthDate(this.queryParams.month);
-        this.tableData = res.data
+        this.tableHeaders = res.data.headers
+        this.tableData = res.data.data
       })
     },
     cellMouseEnter(row, column, cell, event) {
@@ -234,14 +250,14 @@ export default {
         return
       }
       cell.style.color = '#306FB1';
-      cell.style.textDecoration= 'underline';
+      cell.style.textDecoration = 'underline';
     },
     cellMouseLeave(row, column, cell, event) {
       if (column.property != 'taskName') {
         return
       }
       cell.style.color = '#606266';
-      cell.style.textDecoration= 'none';
+      cell.style.textDecoration = 'none';
     },
     cellStyle({row, column, rowIndex, columnIndex}) {
       let style = {
@@ -264,7 +280,7 @@ export default {
       if (!row[column.property].value || row[column.property].value === '') {
         return;
       }
-      let date = this.queryParams.month + '-' + column.property
+      let date = row[column.property].date
       if (DateUtil.unix(date) > DateUtil.unix()) {
         return;
       }
@@ -290,6 +306,7 @@ export default {
         feedbackDate: feedbackDate,
         feedbackType: '1',
         value: undefined,
+        hours: undefined,
         fileUrl: undefined,
         description: undefined
       };
@@ -326,6 +343,7 @@ export default {
         feedbackDate: undefined,
         feedbackType: undefined,
         value: undefined,
+        hours: undefined,
         fileUrl: undefined,
         description: undefined
       };
@@ -382,4 +400,5 @@ export default {
 .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
   margin-bottom: 10px;
 }
+
 </style>