Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

humingbo 1 rok temu
rodzic
commit
f014d3b4bd

+ 10 - 1
src/components/DeptUserTree/index.vue

@@ -15,7 +15,7 @@
           :default-checked-keys="checkedKeys"
           node-key="id"
           :show-checkbox="multiple"
-          default-expand-all
+          :default-expanded-keys="defaultExpandedKeys"
           @check-change="checkChange"
           @node-click="checkChange"
           :filter-node-method="filterNode">
@@ -47,6 +47,11 @@ export default {
       default: false
     }
   },
+  computed: {
+    defaultExpandedKeys() {
+      return this.userList.map(item => item.id)
+    }
+  },
   watch: {
     filterText(val) {
       this.$refs.dut.filter(val);
@@ -69,6 +74,10 @@ export default {
       if (this.multiple) {
         return
       }
+      if (data.type === 'd') {
+        this.$refs.dut.setChecked(data, false)
+        return;
+      }
       this.$emit('selected', data.id)
       this.userNames = data.name
       this.usersVisible = false

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

@@ -3,6 +3,7 @@
     <el-upload
       ref="upload"
       :action="fileAction"
+      :file-list="fileList"
       :on-remove="handleRemove"
       :on-success="handleSuccess"
       :on-error="handleError"
@@ -18,9 +19,28 @@ import {uploadFileUrl, deleteFile} from "@/api/file/file";
 
 export default {
   name: "index",
+  props: {
+    files: {
+      type: Array,
+      default: () => []
+    }
+  },
+  watch: {
+    files: {
+      handler(newVal, oldVal) {
+        this.fileList = newVal.map(item => {
+          item['name'] = item.fileName.replace('<br/>', '')
+          return item;
+        })
+      },
+      deep: true,
+      immediate: true
+    }
+  },
   data() {
     return {
-      fileAction: ''
+      fileAction: '',
+      fileList: []
     }
   },
   created() {
@@ -30,6 +50,7 @@ export default {
     handleRemove(file, fileList) {
       let url = file.response.data.url;
       deleteFile(url).then(res => {
+        this.fileList = this.fileList.filter(item => item != url);
         this.$message({
           message: '操作成功!',
           type: 'success'
@@ -39,6 +60,7 @@ export default {
     },
     handleSuccess(response, file, fileList) {
       let fileUrl = response.data.url
+      this.fileList.push(fileUrl)
       this.$emit('getFileUrl', fileUrl)
     },
     handleError() {

+ 25 - 11
src/components/RichTextEditor/index.vue

@@ -1,18 +1,18 @@
 <template>
   <div style="border: 1px solid #ccc;">
     <Toolbar
-      style="border-bottom: 1px solid #ccc"
-      :editor="editor"
-      :defaultConfig="toolbarConfig"
-      :mode="mode"
+        style="border-bottom: 1px solid #ccc"
+        :editor="editor"
+        :defaultConfig="toolbarConfig"
+        :mode="mode"
     />
     <Editor
-      style="height: 300px; overflow-y: hidden;"
-      v-model="html"
-      :defaultConfig="editorConfig"
-      :mode="mode"
-      @onCreated="onCreated"
-      @onChange="onChange"
+        style="height: 300px; overflow-y: hidden;"
+        v-model="html"
+        :defaultConfig="editorConfig"
+        :mode="mode"
+        @onCreated="onCreated"
+        @onChange="onChange"
     />
   </div>
 </template>
@@ -27,6 +27,10 @@ export default {
     isSimple: {
       type: Boolean,
       default: true
+    },
+    value: {
+      type: String,
+      default: undefined
     }
   },
   data() {
@@ -121,6 +125,15 @@ export default {
       return this.isSimple ? this.toolbarSimpleConfig : this.toolbarDefaultConfig
     }
   },
+  watch: {
+    value: {
+      handler(newVal, oldVal) {
+        this.html = newVal
+      },
+      deep: true,
+      immediate: true
+    }
+  },
   beforeDestroy() {
     const editor = this.editor
     if (editor == null) return
@@ -135,7 +148,8 @@ export default {
     },
     clear() {
       this.html = undefined
-    }
+    },
+
   }
 }
 </script>

+ 11 - 6
src/views/task/components/project.vue

@@ -46,8 +46,7 @@
     </div>
 
     <!-- 添加或修改项目配置对话框 -->
-    <el-dialog :title="title" :visible.sync="open" @close="cancel" width="500px" append-to-body
-               :close-on-click-modal="false">
+    <el-dialog :title="title" :visible.sync="open" @close="cancel" width="700px" class="add-dialog" append-to-body>
       <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="请输入名称"/>
@@ -69,12 +68,13 @@
             <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="可查看人员" prop="viewable">
           <dept-user-tree ref="dut" :userList="userList" :multiple="true" @selected="selectCoExecutor"/>
         </el-form-item>
+        <el-form-item label="描述" prop="description">
+          <rich-text-editor ref="rtEditor" :value="form.description"
+                            @getHtml="(val)=>form.description=val"></rich-text-editor>
+        </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" size="mini" @click="submitForm">确 定</el-button>
@@ -98,10 +98,11 @@ 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"
+import RichTextEditor from '@/components/RichTextEditor'
 
 export default {
   name: "Project",
-  components: {Treeselect, DeptUserTree},
+  components: {Treeselect, DeptUserTree, RichTextEditor},
   data() {
     return {
       projectName: '',
@@ -302,4 +303,8 @@ export default {
   font-size: 14px;
   padding-right: 8px;
 }
+
+.add-dialog ::v-deep .el-dialog__body {
+  padding: 0 20px 10px 20px;
+}
 </style>

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

@@ -8,24 +8,24 @@
         <div class="p-task" @click="getParentTask(form.parentTaskId)">{{ form.parentTaskName }}</div>
       </el-form-item>
       <el-row :gutter="20">
-        <el-col span="12">
+        <el-col :span="12">
           <el-form-item label="所属项目:">
             <div>{{ form.projectName }}</div>
           </el-form-item>
         </el-col>
-        <el-col span="12">
+        <el-col :span="12">
           <el-form-item label="起止时间:">
             <div>{{ form.beginDate + ' 至 ' + form.endDate }}</div>
           </el-form-item>
         </el-col>
       </el-row>
       <el-row :gutter="20">
-        <el-col span="12">
+        <el-col :span="12">
           <el-form-item label="主要负责人:">
             <div>{{ form.executorName }}</div>
           </el-form-item>
         </el-col>
-        <el-col span="12">
+        <el-col :span="12">
           <el-form-item label="共同执行人:">
             <template v-for="item in form.coExecutorNames">
               <el-tag size="mini" style="margin-right: 5px">{{ item }}</el-tag>
@@ -56,7 +56,11 @@
           <div v-if="scope.row.value!==undefined">{{ scope.row.value + '%' }}</div>
         </template>
       </el-table-column>
-      <el-table-column width="140" property="createTime" label="反馈时间"></el-table-column>
+      <el-table-column width="120" property="createTime" label="反馈时间">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
       <el-table-column width="70" property="hours" label="工时(h)"></el-table-column>
       <el-table-column label="反馈备注">
         <template slot-scope="scope">

+ 58 - 19
src/views/task/task.vue

@@ -96,7 +96,7 @@
             <template slot-scope="scope">
               <el-button size="mini"
                          type="text"
-                         icon="el-icon-edit"
+                         icon="el-icon-coordinate"
                          @click="handleAudit(scope.row)"
                          :disabled="scope.row.progressValue!=100||(scope.row.status!='2'&&scope.row.status!='3')||scope.row.createBy!=userId"
                          v-hasPermi="['task:task:audit']"
@@ -106,14 +106,20 @@
                            v-hasPermi="['task:task:edit','task:task:split', 'task:task:delete']">
                 <el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>
                 <el-dropdown-menu slot="dropdown">
-                  <el-dropdown-item command="handleSplit" icon="el-icon-edit"
+                  <el-dropdown-item command="handleSplit" icon="el-icon-tickets"
                                     v-hasPermi="['task:task:split']"
                   >分解
                   </el-dropdown-item>
-                  <el-dropdown-item command="handleUpdate" icon="el-icon-edit"
+                  <el-dropdown-item command="handleUpdate" icon="el-icon-edit-outline"
+                                    v-if="userId===scope.row.createBy"
                                     v-hasPermi="['task:task:edit']"
                   >终止
                   </el-dropdown-item>
+                  <el-dropdown-item command="handleEdit" icon="el-icon-edit"
+                                    v-if="userId===scope.row.createBy"
+                                    v-hasPermi="['task:task:edit']"
+                  >修改
+                  </el-dropdown-item>
                   <el-dropdown-item command="handleDelete" icon="el-icon-delete"
                                     v-hasPermi="['task:task:delete']"
                   >删除
@@ -169,12 +175,11 @@
           <dept-user-tree ref="dut3" :userList="userList" :multiple="true" @selected="selectCoExecutor"/>
         </el-form-item>
         <el-form-item label="任务附件">
-          <file-upload @getFileUrl="getFileUrl" @removeFile="removeFile"></file-upload>
+          <file-upload :files="form.fileList" @getFileUrl="getFileUrl" @removeFile="removeFile"></file-upload>
         </el-form-item>
         <el-form-item label="任务描述" prop="description">
-
-          <!--          <el-input v-model="form.description" type="textarea" placeholder="请输入内容"></el-input>-->
-          <rich-text-editor ref="rtEditor" @getHtml="(val)=>form.description=val"></rich-text-editor>
+          <rich-text-editor ref="rtEditor" :value="form.description"
+                            @getHtml="(val)=>form.description=val"></rich-text-editor>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -310,6 +315,7 @@ export default {
   data() {
     return {
       projectOptions: [],
+      selectProjectId: undefined,
       userList: [],
       // 总条数
       total: 0,
@@ -385,6 +391,7 @@ export default {
       );
     },
     selectProject(data) {
+      this.selectProjectId = data
       this.queryParams.projectId = data;
       this.handleQuery()
     },
@@ -471,11 +478,34 @@ export default {
     handleAdd() {
       this.reset();
       this.open = true;
-      this.title = "添加项目";
+      this.title = "添加任务";
       listProject().then(response => {
         this.projectOptions = this.handleTree(response.data, "id");
+        if (this.selectProjectId) {
+          this.form.projectId = this.selectProjectId
+        }
       });
     },
+    async handleEdit(row) {
+      this.open = true;
+      this.title = "修改任务";
+      let arr = []
+      arr.push(getTask(row.id).then(res => {
+        this.form = res.data;
+        this.form.rangeDate = [row.beginDate, row.endDate]
+        this.form['files'] = this.form.files || []
+        if (this.form.fileList.length > 0) {
+          this.form.files = this.form.fileList.map(item => item.fileName.replace('<br/>', ''))
+        }
+      }))
+      arr.push(listProject().then(response => {
+        this.projectOptions = this.handleTree(response.data, "id");
+      }))
+      await Promise.all(arr)
+
+      this.$refs.dut2.setCheckedNode(this.form.executor)
+      this.$refs.dut3.setCheckedNode(this.form.coExecutor)
+    },
     selectExecutor(val, form, index) {
       if (form === 'splitForm') {
         let child = this.splitForm.children[index];
@@ -504,6 +534,9 @@ export default {
         case 'handleUpdate':
           this.handleUpdate(row)
           break
+        case 'handleEdit':
+          this.handleEdit(row)
+          break
         case 'handleDelete':
           this.handleDelete(row)
           break
@@ -543,17 +576,23 @@ export default {
           this.form.endDate = this.form.rangeDate[1]
           this.form.fileUrl = JSON.stringify(this.form.files)
           this.form.checkTaskConflict = true;
-          addTask(this.form).then(res => {
-            if (res.code === 'S.F-2001') {
-              this.conflictTasks = res.data
-              this.confirmOpen = true
-            } else {
-              this.$message.success("新增成功");
-              this.open = false;
-              this.reset();
-              this.getList();
-            }
-          });
+          if (!this.form.id) {
+            addTask(this.form).then(res => {
+              if (res.code === 'S.F-2001') {
+                this.conflictTasks = res.data
+                this.confirmOpen = true
+              } else {
+                this.$message.success("新增成功");
+                this.open = false;
+                this.reset();
+                this.getList();
+              }
+            });
+          } else {
+            updateTask(this.form).then(res => {
+
+            })
+          }
         }
       });
     },