Explorar o código

feature(督办): 1.协办人取消星号
2.督办负责人填写进展情况不显示上传附件按钮,且没有提交
3.审批流评价:由督办人审批,选择继续进行或者结束督办。选择结束后由监办人在进行审批。
4.督办负责人、协办人、监办人等没有提醒。接收按钮比较内置,看不到操作。
5.督办内容在详情页面看不到全部信息
6.督办权限,郎总看不到全部督办(抄送功能,且新加左侧分类条目)
7.添加到期提醒规则为手动添加,提醒日期,不限上限

likai %!s(int64=2) %!d(string=hai) anos
pai
achega
d8a8343181

+ 116 - 3
src/views/plat/task/components/TaskAdd.vue

@@ -90,6 +90,50 @@
             </el-input>
           </el-form-item>
         </el-col>
+        <el-col :span="12">
+          <el-form-item label="抄送人" prop="copyUsers">
+            <el-input v-model="form.copyUsers" placeholder="抄送人" readonly>
+              <el-button slot="append" icon="el-icon-search" @click="choose(true, 'copyUserIds', 'copyUsers')" />
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="提醒规则">
+            <el-checkbox v-model="isRemind">定时提醒</el-checkbox>
+            <span v-show="isRemind" style="margin-left: 10px">
+              类型
+              <el-select
+                v-model="remindType"
+                placeholder="请选择提醒类型"
+                style="width: 100px"
+                @change="changeRemindType">
+                <el-option
+                  v-for="option in remindTypeOptions"
+                  :key="option.value"
+                  :label="option.label"
+                  :value="option.value" />
+              </el-select>
+            </span>
+            <span v-show="isRemind && remindType !== '天'" style="margin-left: 10px">
+              选项
+              <el-select v-model="remindDay" multiple placeholder="请选择提醒项" style="width: 150px">
+                <el-option
+                  v-for="option in remindDayoptions"
+                  :key="option.value"
+                  :label="option.label"
+                  :value="option.value" />
+              </el-select>
+            </span>
+            <span v-show="isRemind" style="margin-left: 10px">
+              时间
+              <el-time-picker
+                v-model="remindTime"
+                placeholder="请选择具体时间"
+                style="width: 150px"
+                value-format="HH:mm:ss" />
+            </span>
+          </el-form-item>
+        </el-col>
         <!-- <el-col :span="12">
           <el-form-item label="关联类型" prop="targetType">
             <el-select
@@ -171,6 +215,17 @@
     },
     data() {
       return {
+        // 提醒规则
+        isRemind: true,
+        remindTime: '00:00:00',
+        remindType: '天',
+        remindDay: [1],
+        remindTypeOptions: [
+          { value: '天', label: '天' },
+          { value: '月', label: '月' },
+          { value: '周', label: '周' },
+        ],
+        remindDayoptions: [],
         // 项目数据
         projects: [],
         // 合同
@@ -208,6 +263,9 @@
           mainUserName: '',
           watchUserName: '',
           supervisorUserName: '',
+          copyUsers: '',
+          copyUserIds: [],
+          copyUserId: '',
         },
         // 校验规则
         rules: {
@@ -218,7 +276,7 @@
           taskEndDate: [{ required: true, message: '要求完成时间不能为空', trigger: 'blur' }],
           supervisorUserId: [{ required: true, message: '督办人不能为空', trigger: 'change' }],
           mainUserId: [{ required: true, message: '负责人不能为空', trigger: 'change' }],
-          teamNames: [{ required: true, message: '协办人不能为空', trigger: 'change' }],
+          teamNames: [{ required: false, message: '协办人不能为空', trigger: 'change' }],
           watchUserId: [{ required: true, message: '监办人不能为空', trigger: 'change' }],
         },
         multiple: false,
@@ -237,6 +295,22 @@
       this.getOptions()
     },
     methods: {
+      // 提醒类型变更,提醒项配置
+      changeRemindType() {
+        let end = 0
+        this.remindDayoptions.splice(0, this.remindDayoptions.length)
+        this.remindDay.splice(0, this.remindDay.length, 1)
+        if (this.remindType == '月') {
+          end = 31
+        } else if (this.remindType == '周') {
+          end = 7
+        }
+        if (end > 0) {
+          for (let begin = 1; begin <= end; begin++) {
+            this.remindDayoptions.push({ value: begin, label: begin })
+          }
+        }
+      },
       getOptions() {
         Promise.all([this.getDicts('plat_task_source')])
           .then(([source]) => {
@@ -384,6 +458,15 @@
         this.form.mainUserName = ''
         this.form.watchUserName = ''
         this.form.supervisorUserName = ''
+        this.form.copyUsers = ''
+        this.form.teamIds.splice(0, this.form.teamIds.length)
+        this.form.copyUserIds.splice(0, this.form.copyUserIds.length)
+        this.form.copyUserId = ''
+        // 提醒规则初始化
+        this.isRemind = true
+        this.remindTime = '00:00:00'
+        this.remindType = '天'
+        // 项目数据
       },
       // 关闭弹窗
       close() {
@@ -397,16 +480,46 @@
       save() {
         this.$refs['form'].validate(async (valid) => {
           if (valid) {
+            // 协作人数据
             if (this.form.teamIds && this.form.teamIds.length > 0) {
               this.form.ownerUserId = this.form.teamIds.join(',')
             } else {
               this.form.ownerUserId = ''
             }
-            // eslint-disable-next-line vue/no-mutating-props
-            this.selfVisible = false
+            // 抄送人数据
+            if (this.form.copyUserIds && this.form.copyUserIds.length > 0) {
+              this.form.copyUserId = this.form.copyUserIds.join(',')
+            } else {
+              this.form.copyUserId = ''
+            }
             if (this.form.targetId == '') {
               this.form.targetId = 0
             }
+            // 提醒规则
+            if (this.isRemind) {
+              // 提醒规则数据校验
+              if (!this.remindDay || this.remindDay.length == 0) {
+                this.$baseMessage('提醒规则不完善,不可保存', 'error', 'vab-hey-message-error')
+                return
+              }
+              // 提醒规则数据校验
+              if (!this.remindTime) {
+                this.$baseMessage('提醒规则不完善,不可保存', 'error', 'vab-hey-message-error')
+                return
+              }
+              // 提醒规则格式化    * * * */1-31/? 1-7   (第一个*为秒,第二个*为分,第三个*为时,第四位:*每天、数字每月几号、?每周,第五位:周几进行提醒)
+              this.form.reminderRule = this.remindTime.split(':').reverse().join(' ')
+              if (this.remindType == '天') {
+                this.form.reminderRule += ' * *'
+              } else if (this.remindType == '月') {
+                this.form.reminderRule += ' ' + this.remindDay.join(',') + ' *'
+              } else {
+                this.form.reminderRule += ' ? ' + this.remindDay.join(',')
+              }
+            } else {
+              this.form.reminderRule = ''
+            }
+            this.selfVisible = false
             const { msg } = await taskApi.createTask(this.form)
             this.$baseMessage(msg, 'success', 'vab-hey-message-success')
             if (this.doRefresh) {

+ 34 - 12
src/views/plat/task/detail.vue

@@ -18,7 +18,7 @@
           </h3>
         </div>
         <header>
-          <el-descriptions :colon="false" :column="6" direction="vertical">
+          <el-descriptions :colon="false" :column="5" direction="vertical">
             <el-descriptions-item content-class-name="my-content" label="督办类型" label-class-name="my-label">
               {{ typeMap[theTask.taskType] }}
             </el-descriptions-item>
@@ -38,11 +38,11 @@
             <el-descriptions-item content-class-name="my-content" label="要求完成时间" label-class-name="my-label">
               {{ parseTime(theTask.taskEndDate, '{y}-{m}-{d}') }}
             </el-descriptions-item>
-            <el-descriptions-item content-class-name="my-content" label="督办内容" label-class-name="my-label">
-              {{ theTask.taskDesc }}
-            </el-descriptions-item>
+            <!-- <el-descriptions-item content-class-name="my-content" label="提醒规则" label-class-name="my-label">
+              {{ theTask.reminderRuleInfo }}
+            </el-descriptions-item> -->
           </el-descriptions>
-          <el-descriptions :colon="false" :column="6" direction="vertical">
+          <el-descriptions :colon="false" :column="5" direction="vertical">
             <el-descriptions-item content-class-name="my-content" label="负责人" label-class-name="my-label">
               {{ userMap[theTask.mainUserId] }}
             </el-descriptions-item>
@@ -65,6 +65,13 @@
               {{ selectDictLabel(sourceOptions, theTask.source) }}
             </el-descriptions-item>
           </el-descriptions>
+          <el-descriptions :colon="false" :column="1" direction="vertical">
+            <el-descriptions-item content-class-name="my-content" label="督办内容" label-class-name="my-label">
+              <el-tooltip class="item" :content="theTask.taskDesc" effect="dark" placement="top">
+                <span>{{ theTask.taskDesc }}</span>
+              </el-tooltip>
+            </el-descriptions-item>
+          </el-descriptions>
         </header>
         <el-form label-width="80px" :model="form" style="margin-top: 10px">
           <el-form-item label="进展情况">
@@ -90,10 +97,13 @@
               </el-table-column>
               <el-table-column align="center" label="附件" prop="progFile">
                 <template #default="{ row }">
-                  <el-upload action="#" :disabled="type !== '1'" :http-request="uploadrequest" :show-file-list="false">
+                  <el-upload
+                    action="#"
+                    :disabled="type !== '1' || theTask.step !== 20"
+                    :http-request="uploadrequest"
+                    :show-file-list="false">
                     <el-button
-                      v-permissions="['plat:task:enclosure:add']"
-                      :disabled="type !== '1'"
+                      :disabled="type !== '1' || theTask.step !== 20"
                       size="mini"
                       style="margin-left: 10px"
                       slot="trigger"
@@ -126,6 +136,10 @@
               </el-table-column>
             </el-table>
           </el-form-item>
+          <el-form-item v-if="theTask.step === 30 || theTask.step === 40" label="任务状态">
+            <el-radio v-model="form.isComplete" label="10">完成</el-radio>
+            <el-radio v-model="form.isComplete" label="20">继续进行</el-radio>
+          </el-form-item>
           <el-form-item v-if="theTask.approDate || theTask.step === 30" label="审批意见">
             <el-input v-if="theTask.step === 30" v-model="form.approDesc" placeholder="审批意见" />
             <span v-else>{{ theTask.approDesc }}</span>
@@ -171,7 +185,7 @@
           <el-button v-show="theTask.step === 40 && type == 1" type="danger" @click="changeStatus(40, '40')">
             审批退回
           </el-button>
-          <el-button @click="$router.go(-1)">返回</el-button>
+          <el-button @click="returnTaskPage">返回</el-button>
         </div>
         <ul class="records">
           <li v-for="log in logList" :key="log.id">
@@ -220,6 +234,7 @@
         teamNames: '',
         form: {
           comment: '',
+          isComplete: '10', // 10完成;其他 继续进行
         },
         type: '',
         // 选中进展
@@ -233,6 +248,12 @@
       this.open()
     },
     methods: {
+      // 返回督办页面
+      returnTaskPage() {
+        this.$router.push({
+          name: 'Task',
+        })
+      },
       // 判断是否没有超期
       isNotOverdue(date) {
         return new Date() <= new Date(date)
@@ -258,9 +279,9 @@
       async initData() {
         const [err, [type, source, user]] = await to(
           Promise.all([
-            dictApi.getDictDataList({ dictType: 'task_type' }),
+            dictApi.getDictDataList({ dictType: 'task_type', pageNum: 1, pageSize: 9999 }),
             this.getDicts('plat_task_source'),
-            userApi.getList(),
+            userApi.getList({ pageNum: 1, pageSize: 9999 }),
           ])
         )
         if (err) return
@@ -319,12 +340,13 @@
             handleStatus: status,
             handleDesc: '',
             progressList: this.progressList,
+            isComplete: this.form.isComplete,
           }
           if (this.theTask.step == 30) data.handleDesc = this.form.approDesc
           else if (this.theTask.step == 40) data.handleDesc = this.form.evaluateDesc
           const { msg } = await taskApi.handleTask(data)
           this.$baseMessage(msg, 'success', 'vab-hey-message-success')
-          this.$router.go(-1)
+          this.returnTaskPage()
         })
       },
       // 查看附件

+ 83 - 9
src/views/plat/task/index.vue

@@ -33,6 +33,16 @@
           <i class="el-icon-folder-checked" style="margin-right: 10px"></i>
           我处理的
         </div>
+        <div
+          :style="{
+            color: queryForm.operateType != '4' ? '#999999' : '#1D66DC',
+            'margin-top': '20px',
+            cursor: 'pointer',
+          }"
+          @click="search('4')">
+          <i class="el-icon-s-promotion" style="margin-right: 10px"></i>
+          抄送我的
+        </div>
         <div class="type" style="margin-top: 50px">事项来源</div>
         <div
           class="el-icon-s-management"
@@ -85,7 +95,13 @@
           </vab-query-form-right-panel>
         </vab-query-form>
         <!-- 主页面 -->
-        <el-table ref="table" v-loading="listLoading" border :data="list" :height="height" width="100%">
+        <el-table
+          v-loading="listLoading"
+          border
+          :data="list"
+          :height="height"
+          :row-class-name="tableRowClassName"
+          width="100%">
           <el-table-column
             v-for="(item, index) in showColumns"
             :key="index"
@@ -131,6 +147,17 @@
               <span v-else>{{ row[item.prop] }}</span>
             </template>
           </el-table-column>
+          <el-table-column v-if="queryForm.operateType == 1" align="center" fixed="right" label="操作" width="68">
+            <template #default="{ row }">
+              <el-button
+                v-show="row.taskStatus === '10' && queryForm.operateType == 1"
+                v-permissions="['plat:task:detail:receive']"
+                type="text"
+                @click="receiveTask(row)">
+                接收
+              </el-button>
+            </template>
+          </el-table-column>
           <template #empty>
             <el-image class="vab-data-empty" :src="require('@/assets/empty_images/data_empty.png')" />
           </template>
@@ -236,12 +263,6 @@
             prop: 'source',
             sortable: false,
           },
-          // {
-          //   label: '关联对象',
-          //   width: '120px',
-          //   prop: 'targetName',
-          //   sortable: false,
-          // },
           {
             label: '负责人',
             width: '120px',
@@ -278,6 +299,12 @@
             prop: 'taskEndDate',
             sortable: false,
           },
+          {
+            label: '提醒规则',
+            width: '200px',
+            prop: 'reminderRuleInfo',
+            sortable: false,
+          },
           // {
           //   label: '创建时间',
           //   width: '160px',
@@ -307,7 +334,35 @@
       await this.initData()
       this.fetchData()
     },
+    activated() {
+      this.statistics()
+      this.fetchData()
+    },
     methods: {
+      // 单元格样式控制
+      tableRowClassName({ row, rowIndex }) {
+        if (row.taskStatus === '10' && this.queryForm.operateType == 1) {
+          return 'warning-row'
+        }
+        return ''
+      },
+      // 接收任务
+      receiveTask(task) {
+        this.$confirm('确定接收该督办?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning',
+        }).then(async () => {
+          let data = {
+            taskId: task.id,
+            step: 10,
+            handleStatus: '10',
+          }
+          const { msg } = await taskApi.handleTask(data)
+          this.$baseMessage(msg, 'success', 'vab-hey-message-success')
+          this.doRefresh()
+        })
+      },
       // 判断是否没有超期
       isNotOverdue(date) {
         return new Date() <= new Date(date)
@@ -367,7 +422,7 @@
       // 初始化数据
       async initData() {
         await dictApi
-          .getDictDataList({ dictType: 'task_type' })
+          .getDictDataList({ dictType: 'task_type', pageNum: 1, pageSize: 9999 })
           .then((res) => {
             if (res.data.list) {
               this.types = res.data.list
@@ -380,7 +435,7 @@
             console.error(err)
           })
         await userApi
-          .getList()
+          .getList({ pageNum: 1, pageSize: 9999 })
           .then((res) => {
             if (res.data.list) {
               this.users = res.data.list
@@ -436,6 +491,22 @@
           .getTaskList(this.queryForm)
           .then((res) => {
             if (res.data.list) {
+              for (let item of res.data.list) {
+                if (item.reminderRule == '') {
+                  item.reminderRuleInfo = '不提醒'
+                } else {
+                  let rules = item.reminderRule.split(' ')
+                  if (rules[3] == '*') {
+                    item.reminderRuleInfo = '每天在' + rules[2] + ':' + rules[1] + ':' + rules[0] + '提醒'
+                  } else if (rules[3] == '?') {
+                    item.reminderRuleInfo =
+                      '每周周' + rules[4] + '在' + rules[2] + ':' + rules[1] + ':' + rules[0] + '提醒'
+                  } else {
+                    item.reminderRuleInfo =
+                      '每月' + rules[3] + '日在' + rules[2] + ':' + rules[1] + ':' + rules[0] + '提醒'
+                  }
+                }
+              }
               this.list = res.data.list
             }
             this.total = res.data.total
@@ -481,4 +552,7 @@
     text-overflow: ellipsis;
     white-space: nowrap;
   }
+  ::v-deep .el-table .warning-row {
+    background: oldlace;
+  }
 </style>