Jelajahi Sumber

任务管理修改

ysc 1 tahun lalu
induk
melakukan
7f3a834c06
3 mengubah file dengan 170 tambahan dan 95 penghapusan
  1. 17 11
      src/views/task/projectView.vue
  2. 83 55
      src/views/task/task.vue
  3. 70 29
      src/views/task/view.vue

+ 17 - 11
src/views/task/projectView.vue

@@ -60,18 +60,18 @@
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column fixed prop="" label="上月延期" width="40">
-        <template slot-scope="scope">
-          <span v-if="scope.row.formLastMonth" style="color: red">是</span>
-        </template>
-      </el-table-column>
-      <el-table-column align="center" v-for="item in tableHeaders" :key="item.day" :prop="item.day" width="38">
+<!--      <el-table-column fixed prop="" label="上月延期" width="40">-->
+<!--        <template slot-scope="scope">-->
+<!--          <span v-if="scope.row.formLastMonth" style="color: red">是</span>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+      <el-table-column align="center" v-for="item in tableHeaders" :key="item.day" :prop="item.day" width="42">
         <template slot="header" slot-scope="scope">
-          <div style="width:28px;font-size: 9px">{{ 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>
-          <div v-else style="width: 24px;font-size: 12px">{{ item.week }}</div>
+          <div style="width:32px;font-size: 10px;text-align: center">{{ item.day }}</div>
+          <div v-if="item.week=='周六'" class="view-cell" style="color: #1c84c6">{{ item.week }}</div>
+          <div v-else-if="item.week=='周日'" class="view-cell" style="color: #1c84c6">{{ item.week }}</div>
+          <div v-else-if="item.week=='今日'" class="view-cell" style="color: #008000">{{ item.week }}</div>
+          <div v-else class="view-cell">{{ item.week }}</div>
         </template>
         <template slot-scope="scope">
           <span v-if="scope.row[item.day].comment" class="comment-badge"></span>
@@ -421,6 +421,12 @@ export default {
   margin-bottom: 10px;
 }
 
+.view-cell {
+  width: 32px;
+  font-size: 10px;
+  text-align: center
+}
+
 .comment-badge {
   height: 10px;
   width: 10px;

+ 83 - 55
src/views/task/task.vue

@@ -11,23 +11,31 @@
               <dept-user-tree ref="dut" :userList="userList" :multiple="true"
                               @selected="(val)=>queryParams.executors=val"></dept-user-tree>
             </el-form-item>
-            <el-form-item prop="rangeDate">
+            <el-form-item prop="startDate">
               <el-date-picker
-                v-model="queryParams.rangeDate"
-                type="daterange"
+                v-model="queryParams.startDate"
+                type="date"
                 value-format="yyyy-MM-dd"
-                range-separator="至"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
+                placeholder="开始日期"
                 clearable
-                style="width: 220px">
+                style="width: 128px">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="endDate">
+              <el-date-picker
+                v-model="queryParams.endDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="结束日期"
+                clearable
+                style="width: 128px">
               </el-date-picker>
             </el-form-item>
             <el-form-item prop="status">
               <el-select
                 v-model="queryParams.status"
                 placeholder="任务状态"
-                style="width: 100px">
+                style="width: 85px">
                 <el-option
                   v-for="dict in dict.type.task_status"
                   :key="dict.value"
@@ -154,7 +162,8 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="所属项目" prop="projectId" class="mini-treeselect">
-              <treeselect v-model="form.projectId" :options="projectOptions" :normalizer="normalizer"
+              <treeselect v-model="form.projectId" :options="projectOptions"
+                          :normalizer="normalizer"
                           placeholder="请选择"/>
             </el-form-item>
           </el-col>
@@ -167,21 +176,23 @@
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="起止时间" prop="rangeDate">
+            <el-form-item label="开始时间" prop="beginDate">
               <el-date-picker
-                v-model="form.rangeDate"
-                type="daterange"
+                v-model="form.beginDate"
+                type="date"
                 value-format="yyyy-MM-dd"
-                range-separator="至"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
-                style="width: 255px">
+                placeholder="开始日期">
               </el-date-picker>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="计划工时(小时)" prop="planHours">
-              <el-input-number v-model="form.planHours" :min="1" :max="2000"></el-input-number>
+            <el-form-item label="结束时间" prop="endDate">
+              <el-date-picker
+                v-model="form.endDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="开始日期">
+              </el-date-picker>
             </el-form-item>
           </el-col>
         </el-row>
@@ -205,12 +216,21 @@
       <task-detail :detail-form="detailForm"></task-detail>
       <div v-if="detailTitle=='审核任务'" style="margin-top: 10px">
         <el-form ref="auditForm" :model="auditForm" :rules="auditRules" size="mini" label-width="100px">
-          <el-form-item label="审核意见" prop="auditResult">
-            <el-radio-group v-model="auditForm.auditResult">
-              <el-radio label="1">确认完成</el-radio>
-              <el-radio label="0">驳回</el-radio>
-            </el-radio-group>
-          </el-form-item>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="审核意见" prop="auditResult">
+                <el-radio-group v-model="auditForm.auditResult">
+                  <el-radio label="1">确认完成</el-radio>
+                  <el-radio label="0">驳回</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item v-if="auditForm.auditResult==='0'" label="进度(%)" prop="value">
+                <el-input-number v-model="auditForm.value" :min="1" :max="99"></el-input-number>
+              </el-form-item>
+            </el-col>
+          </el-row>
           <el-form-item label="审核备注" prop="auditOpinion">
             <el-input v-model="auditForm.auditOpinion" type="textarea"/>
           </el-form-item>
@@ -223,15 +243,18 @@
     </el-dialog>
 
     <!-- 分解任务对话框 -->
-    <el-dialog title="分解任务" :visible.sync="splitOpen" :fullscreen="true" class="add-dialog" append-to-body>
+    <el-dialog title="分解任务" :visible.sync="splitOpen" width="90%" class="add-dialog" append-to-body>
       <el-form ref="splitForm" class="split-form" size="mini">
         <el-form-item label="任务名称:">
           <div>{{ splitForm.taskName }}</div>
         </el-form-item>
         <el-form-item label="所属项目:">
           <span>{{ splitForm.projectName }}</span>
-          <el-button type="primary" plain circle icon="el-icon-plus"
-                     style="float: right; padding: -1px 3px" @click="addChild"></el-button>
+          <div style="float: right; padding: -1px 3px">
+            <el-button type="primary" plain circle icon="el-icon-plus"
+                       @click="addChild"></el-button>
+          </div>
+
         </el-form-item>
         <div style="display: flex;justify-content: flex-start;flex-wrap:wrap">
           <el-card shadow="always" v-for="(child,index) in splitForm.children" :key="index" class="split-card">
@@ -245,30 +268,34 @@
             </div>
             <el-form ref="splitChild" :model="child" :rules="rules" size="mini">
               <el-form-item label="任务名称" prop="taskName" label-width="80px">
-                <el-input v-model="child.taskName" style="width: 350px"/>
+                <el-input v-model="child.taskName"/>
               </el-form-item>
               <el-row :gutter="20">
-                <el-col :span="14">
-                  <el-form-item label="起止时间" prop="rangeDate" label-width="80px">
+                <el-col :span="12">
+                  <el-form-item label="开始时间" prop="beginDate" label-width="80px">
                     <el-date-picker
-                      v-model="child.rangeDate"
-                      type="daterange"
+                      v-model="child.beginDate"
+                      type="date"
                       value-format="yyyy-MM-dd"
-                      style="width: 250px"
-                      range-separator="至"
-                      start-placeholder="开始日期"
-                      end-placeholder="结束日期">
+                      style="width: 130px"
+                      start-placeholder="开始日期">
                     </el-date-picker>
                   </el-form-item>
                 </el-col>
-                <el-col :span="10">
-                  <el-form-item label="计划工时(小时)" prop="planHours" label-width="115px">
-                    <el-input-number v-model="child.planHours" :min="1" :max="2000"></el-input-number>
+                <el-col :span="12">
+                  <el-form-item label="结束时间" prop="endDate">
+                    <el-date-picker
+                      v-model="child.endDate"
+                      type="date"
+                      value-format="yyyy-MM-dd"
+                      style="width: 130px"
+                      start-placeholder="结束日期">
+                    </el-date-picker>
                   </el-form-item>
                 </el-col>
               </el-row>
               <el-form-item label="执行人" prop="executor" label-width="80px">
-                <dept-user-tree ref="dutSplit" :userList="userList" style="width: 350px"
+                <dept-user-tree ref="dutSplit" :userList="userList"
                                 @selected="(val)=>selectExecutor(val,'splitForm',index)"/>
               </el-form-item>
               <el-form-item label="任务附件" label-width="80px">
@@ -283,9 +310,9 @@
           </el-card>
         </div>
       </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" size="mini" @click="submitSplit">确 定</el-button>
-        <el-button size="mini" @click="splitCancel">取 消</el-button>
+      <div v-if="splitForm.children&&splitForm.children.length>0" style=" position: fixed; bottom: 10px;left: 49%">
+        <el-button type="primary" size="mini" @click="submitSplit">保存</el-button>
+        <!--        <el-button size="mini" @click="splitCancel">取消</el-button>-->
       </div>
     </el-dialog>
 
@@ -364,7 +391,8 @@ export default {
         pageSize: 10,
         executors: [],
         projectId: undefined,
-        rangeDate: [],
+        startDate: undefined,
+        endDate: undefined,
         status: '0'
       },
       // 表单参数
@@ -383,8 +411,11 @@ export default {
         projectId: [
           {required: true, message: "所属项目不能为空", trigger: "blur"}
         ],
-        rangeDate: [
-          {required: true, message: "起止时间不能为空", trigger: "change"}
+        beginDate: [
+          {required: true, message: "开始时间不能为空", trigger: "change"}
+        ],
+        endDate: [
+          {required: true, message: "结束时间不能为空", trigger: "change"}
         ],
         planHours: [
           {required: true, message: "计划工时不能为空", trigger: "blur"}
@@ -396,6 +427,9 @@ export default {
       auditRules: {
         auditResult: [
           {required: true, message: "审核意见不能为空", trigger: "change"}
+        ],
+        value: [
+          {required: true, message: "进度不能为空", trigger: "blur"}
         ]
       },
       confirmOpen: false,
@@ -414,12 +448,7 @@ export default {
     },
     /** 查询项目列表 */
     getList() {
-      let data = _.cloneDeep(this.queryParams)
-      if (data.rangeDate && data.rangeDate.length === 2) {
-        data.startDate = data.rangeDate[0]
-        data.endDate = data.rangeDate[1]
-      }
-      listTask(data).then(res => {
+      listTask(this.queryParams).then(res => {
           this.taskList = res.data.records;
           this.total = res.data.total;
         }
@@ -596,6 +625,7 @@ export default {
         this.auditForm = {
           taskId: row.id,
           auditResult: undefined,
+          value: undefined,
           auditOpinion: undefined
         }
         this.detailOpen = true;
@@ -624,8 +654,6 @@ export default {
       }
       this.$refs["form"].validate(valid => {
         if (valid) {
-          this.form.beginDate = this.form.rangeDate[0]
-          this.form.endDate = this.form.rangeDate[1]
           if (this.form.files) {
             let tempFiles = this.form.files.map(item => item.name);
             this.form.fileUrl = JSON.stringify(tempFiles)
@@ -825,7 +853,7 @@ export default {
 
 .split-card {
   width: 49%;
-  padding: 10px;
+  padding: 5px 10px;
   margin: 5px;
 }
 

+ 70 - 29
src/views/task/view.vue

@@ -57,18 +57,18 @@
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column fixed prop="" label="上月延期" width="40">
-        <template slot-scope="scope">
-          <span v-if="scope.row.formLastMonth" style="color: red">是</span>
-        </template>
-      </el-table-column>
-      <el-table-column align="center" v-for="item in tableHeaders" :key="item.day" :prop="item.day" width="37">
+      <!--      <el-table-column fixed prop="" label="上月延期" width="40">-->
+      <!--        <template slot-scope="scope">-->
+      <!--          <span v-if="scope.row.formLastMonth" style="color: red">是</span>-->
+      <!--        </template>-->
+      <!--      </el-table-column>-->
+      <el-table-column align="center" v-for="item in tableHeaders" :key="item.day" :prop="item.day" width="42">
         <template slot="header">
-          <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>
-          <div v-else style="width: 24px;font-size: 12px">{{ item.week }}</div>
+          <div style="width: 32px;font-size: 10px;text-align: center">{{ item.day }}</div>
+          <div v-if="item.week=='周六'" class="view-cell" style="color: #1c84c6">{{ item.week }}</div>
+          <div v-else-if="item.week=='周日'" class="view-cell" style="color: #1c84c6">{{ item.week }}</div>
+          <div v-else-if="item.week=='今日'" class="view-cell" style="color: #008000">{{ item.week }}</div>
+          <div v-else class="view-cell">{{ item.week }}</div>
         </template>
         <template slot-scope="scope">
           <span v-if="scope.row[item.day].comment" class="comment-badge"></span>
@@ -150,31 +150,54 @@
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="反馈类型" prop="feedbackType">
-              <el-radio-group v-model="form.feedbackType" @input="feedbackTypeChange">
-                <el-radio
-                  v-for="dict in dict.type.feedback_type"
-                  :key="dict.value"
-                  :label="dict.value"
-                  v-if="dict.value<3"
-                >{{ dict.label }}
-                </el-radio>
-              </el-radio-group>
+            <el-form-item label="计划工时">
+              <el-input-number v-model="form.planHours" @change="hoursChange" :min="1" :step-strictly="true"
+                               :controls="false"></el-input-number>
+              <span style="margin-left: 5px">小时</span>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="工时" prop="hours">
-              <el-input v-model="form.hours" style="width: 130px"></el-input>
+            <el-form-item label="已反馈工时">
+              <span>{{ form.feedbackHours }}</span>
               <span style="margin-left: 5px">小时</span>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
+          <!--          <el-col :span="12">-->
+          <!--            <el-form-item label="反馈类型" prop="feedbackType">-->
+          <!--              <el-radio-group v-model="form.feedbackType" @input="feedbackTypeChange">-->
+          <!--                <el-radio-->
+          <!--                  v-for="dict in dict.type.feedback_type"-->
+          <!--                  :key="dict.value"-->
+          <!--                  :label="dict.value"-->
+          <!--                  v-if="dict.value<3"-->
+          <!--                >{{ dict.label }}-->
+          <!--                </el-radio>-->
+          <!--              </el-radio-group>-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
+          <el-col :span="12">
+            <el-form-item label="工作时长" prop="hours">
+              <el-input-number v-model="form.hours" @change="hoursChange" :min="0.5" :step="0.5" :step-strictly="true"
+                               :controls="false"></el-input-number>
+              <!--              <el-input v-model="form.hours" style="width: 130px"></el-input>-->
+              <span style="margin-left: 5px">小时</span>
+            </el-form-item>
+          </el-col>
           <el-col :span="12">
-            <el-form-item label="进度(%)" prop="value">
-              <el-input-number v-model="form.value" controls-position="left" :min="1" :max="100"></el-input-number>
+            <el-form-item prop="value">
+              <template slot="label">
+                <span>进度</span>
+                <el-tooltip class="item" effect="dark" content="计算方式:(工作时长+已反馈工时)÷计划工时×100%" placement="top">
+                  <i class="el-icon-info"></i>
+                </el-tooltip>
+              </template>
+              <el-progress :percentage="form.value" style="margin-top: 7px"></el-progress>
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="附件" prop="fileUrl">
               <file-upload ref="fu" @getFileUrl="getFileUrl" @removeFile="removeFile"></file-upload>
@@ -195,7 +218,7 @@
       </div>
     </el-dialog>
 
-    <el-dialog title="任务详情" :visible.sync="openDetail" width="760px" class="feed-dialog" append-to-body>
+    <el-dialog title="任务详情" :visible.sync="openDetail" width="70%" class="feed-dialog" append-to-body>
       <task-detail :detailForm="detailForm"></task-detail>
     </el-dialog>
 
@@ -333,7 +356,7 @@ export default {
         return
       }
       cell.style.color = '#306FB1';
-      cell.style.cursor='pointer';
+      cell.style.cursor = 'pointer';
       cell.style.textDecoration = 'underline';
     },
     cellMouseLeave(row, column, cell, event) {
@@ -345,7 +368,7 @@ export default {
     },
     cellStyle({row, column, rowIndex, columnIndex}) {
       let style = {
-        fontSize: '12px',
+        // fontSize: '12px',
         padding: '2px 0'
       }
       if (row[column.property]) {
@@ -382,8 +405,10 @@ export default {
         taskId: row.id,
         projectName: row.projectName,
         feedbackDate: feedbackDate,
+        planHours: row.planHours,
+        feedbackHours: row.feedbackHours,
         feedbackType: '1',
-        value: undefined,
+        value: row.progressValue,
         hours: undefined,
         fileUrl: undefined,
         description: undefined
@@ -480,6 +505,16 @@ export default {
           this.getList()
         }
       })
+    },
+
+    hoursChange() {
+      let planHours = Number.parseInt(this.form.planHours)
+      let hours = Number.parseFloat(this.form.hours)
+      if (planHours && hours) {
+        let feedbackHours = Number.parseFloat(this.form.feedbackHours)
+        let percent = (hours + feedbackHours) / planHours * 100;
+        this.form.value = Number.parseInt(percent > 100 ? 100 : percent)
+      }
     }
   }
 }
@@ -500,6 +535,12 @@ export default {
   margin-bottom: 10px;
 }
 
+.view-cell {
+  width: 32px;
+  font-size: 10px;
+  text-align: center
+}
+
 .comment-badge {
   height: 10px;
   width: 10px;