From 901607bb65a40aebf55a246d64b09d3f3a99cd5c Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Fri, 05 Jan 2024 17:12:00 +0800
Subject: [PATCH] 个人评优任务更新

---
 src/views/evaluate/evaluateResult.vue                  |    2 
 src/option/evaluate/evaluateTask.js                    |    2 
 src/option/assessmentTask/assessmentTask.js            |   44 --
 src/views/evaluate/components/addEcCandidate.vue       |  246 +++++++++++++++
 src/views/employee/list.vue                            |  240 +++++++-------
 src/views/evaluate/components/IndividualTaskPublic.vue |   90 +++-
 src/api/evaluate/evaluateTask.js                       |   45 ++
 src/views/evaluate/evaluateTask.vue                    |    3 
 src/option/employee/list.js                            |    3 
 src/views/evaluate/components/candidateDialog.vue      |  235 ++++++++++++++
 src/views/evaluate/components/addIndividualTask.vue    |   14 
 11 files changed, 719 insertions(+), 205 deletions(-)

diff --git a/src/api/evaluate/evaluateTask.js b/src/api/evaluate/evaluateTask.js
index 1b03fac..c7426df 100644
--- a/src/api/evaluate/evaluateTask.js
+++ b/src/api/evaluate/evaluateTask.js
@@ -49,6 +49,7 @@
   })
 }
 
+// 获取类别
 export const getEcList = (current, size, evaluateTaskId ) => {
   return request({
     url: '/evaluate/evaluateTaskCategory/list',
@@ -60,6 +61,50 @@
     }
   })
 }
+// 更新类别
+export const upDateEcList = (data) => {
+  return request({
+    url: '/evaluate/evaluateTaskCategory/sumbit',
+    method: 'post',
+    data
+  })
+}
+
+
+// 查询类别候选人
+export const getEtaskCcList = (current, size, values) => {
+  return request({
+    url: '/evaluate/evaluateTaskCategoryCandidate/list',
+    method: 'get',
+    params: {
+      current, 
+      size,
+      ...values
+    }
+  })
+}
+
+// 添加类别候选人
+export const addEtaskCc = (data) => {
+  return request({
+    url: '/evaluate/evaluateTaskCategoryCandidate/submit',
+    method: 'post',
+    data
+  })
+}
+
+export const removeEtaskCc = (ids) => {
+  return request({
+    url: '/evaluate/evaluateTaskCategoryCandidate/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+
+
 
 // 获取最终结果
 //  url: '/evaluate/evaluateCandidate/page',
diff --git a/src/option/assessmentTask/assessmentTask.js b/src/option/assessmentTask/assessmentTask.js
index fc0b794..518d1c3 100644
--- a/src/option/assessmentTask/assessmentTask.js
+++ b/src/option/assessmentTask/assessmentTask.js
@@ -154,48 +154,6 @@
       display: false,
       width: 100,
       slot: true
-    },
-    // {
-    //   label: "创建人",
-    //   prop: "createUser",
-    //   type: "input",
-    //   hide: true,
-    // },
-    // {
-    //   label: "创建部门",
-    //   prop: "createDept",
-    //   type: "input",
-    //   hide: true,
-    // },
-    // {
-    //   label: "创建时间",
-    //   prop: "createTime",
-    //   type: "input",
-    //   hide: true,
-    // },
-    // {
-    //   label: "修改人",
-    //   prop: "updateUser",
-    //   type: "input",
-    //   hide: true,
-    // },
-    // {
-    //   label: "修改时间",
-    //   prop: "updateTime",
-    //   type: "input",
-    //   hide: true,
-    // },
-    // {
-    //   label: "状态",
-    //   prop: "status",
-    //   type: "input",
-    //   hide: true,
-    // },
-    // {
-    //   label: "是否已删除",
-    //   prop: "isDeleted",
-    //   type: "input",
-    //   hide: true,
-    // },
+    }
   ]
 }
diff --git a/src/option/employee/list.js b/src/option/employee/list.js
index b5387cc..37b6248 100644
--- a/src/option/employee/list.js
+++ b/src/option/employee/list.js
@@ -265,6 +265,9 @@
                         label: 'dictValue',
                         value: 'dictKey',
                     },
+                    // formatter: (row, value) => {
+                    //     return value.toString()
+                    // },
                     rules: [
                         {
                             required: true,
diff --git a/src/option/evaluate/evaluateTask.js b/src/option/evaluate/evaluateTask.js
index 6b8ac3a..00650b3 100644
--- a/src/option/evaluate/evaluateTask.js
+++ b/src/option/evaluate/evaluateTask.js
@@ -87,7 +87,7 @@
       minWidth: '100px'
     },
     {
-      label: "第二轮结束时间",
+      label: "第二轮时间",
       prop: "evaluateCutoffTimeEnd",
       type: "input",
       minWidth: '170px',
diff --git a/src/views/employee/list.vue b/src/views/employee/list.vue
index 1b1dde6..d272ee7 100644
--- a/src/views/employee/list.vue
+++ b/src/views/employee/list.vue
@@ -4,7 +4,7 @@
             <div class="box">
                 <el-scrollbar>
                     <basic-container>
-                        <avue-tree :option="treeOption" :data="treeData" @node-click="nodeClick"/>
+                        <avue-tree :option="treeOption" :data="treeData" @node-click="nodeClick" />
                     </basic-container>
                 </el-scrollbar>
             </div>
@@ -13,23 +13,19 @@
             <basic-container>
                 <!-- :permission="permissionList"  -->
                 <avue-crud :option="option" v-model:search="search" :table-loading="loading" :data="data" ref="crud"
-                           v-model="form" @row-del="rowDel" @row-update="rowUpdate"
-                           @row-save="rowSave"
-                           :before-open="beforeOpen" v-model:page="page" @search-change="searchChange"
-                           @search-reset="searchReset"
-                           @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
-                           @refresh-change="refreshChange" @on-load="onLoad">
+                    v-model="form" @row-del="rowDel" @row-update="rowUpdate" @row-save="rowSave" :before-open="beforeOpen"
+                    v-model:page="page" @search-change="searchChange" @search-reset="searchReset"
+                    @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
+                    @refresh-change="refreshChange" @on-load="onLoad">
                     <template #menu-left>
                         <el-button type="danger" plain icon="el-icon-delete" v-if="permission.user_delete"
-                                   @click="handleDelete">删 除
+                            @click="handleDelete">删 除
                         </el-button>
-                        <el-button type="success" plain v-if="userInfo.role_name.includes('admin')"
-                                   icon="el-icon-upload"
-                                   @click="handleImport">导入
+                        <el-button type="success" plain v-if="userInfo.role_name.includes('admin')" icon="el-icon-upload"
+                            @click="handleImport">导入
                         </el-button>
-                        <el-button type="warning" plain v-if="userInfo.role_name.includes('admin')"
-                                   icon="el-icon-download"
-                                   @click="handleExport">导出
+                        <el-button type="warning" plain v-if="userInfo.role_name.includes('admin')" icon="el-icon-download"
+                            @click="handleExport">导出
                         </el-button>
                     </template>
                     <template #deptName="{ row }">
@@ -66,15 +62,15 @@
     resetPassword,
     unlock,
 } from '@/api/system/user';
-import {option} from '@/option/employee/list'
-import {exportBlob} from '@/api/common';
-import {getDeptTree, getDeptLazyTree} from '@/api/system/dept';
-import {getRoleTree} from '@/api/system/role';
-import {getPostList} from '@/api/system/post';
-import {mapGetters} from 'vuex';
+import { option } from '@/option/employee/list'
+import { exportBlob } from '@/api/common';
+import { getDeptTree, getDeptLazyTree } from '@/api/system/dept';
+import { getRoleTree } from '@/api/system/role';
+import { getPostList } from '@/api/system/post';
+import { mapGetters } from 'vuex';
 import website from '@/config/website';
-import {getToken} from '@/utils/auth';
-import {downloadXls} from '@/utils/util';
+import { getToken } from '@/utils/auth';
+import { downloadXls } from '@/utils/util';
 import NProgress from 'nprogress';
 import 'nprogress/nprogress.css';
 import func from '@/utils/func';
@@ -121,12 +117,12 @@
                     const parentId = node.level === 0 ? 0 : node.data.id;
                     getDeptLazyTree(parentId).then(res => {
                         resolve(
-                                res.data.data.map(item => {
-                                    return {
-                                        ...item,
-                                        leaf: !item.hasChildren,
-                                    };
-                                })
+                            res.data.data.map(item => {
+                                return {
+                                    ...item,
+                                    leaf: !item.hasChildren,
+                                };
+                            })
                         );
                     });
                 },
@@ -352,19 +348,19 @@
             row.account = row.phone
             row.roleId = '1123598816738675202'
             add(row).then(
-                    () => {
-                        this.initFlag = false;
-                        this.onLoad(this.page);
-                        this.$message({
-                            type: 'success',
-                            message: '操作成功!',
-                        });
-                        done();
-                    },
-                    error => {
-                        window.console.log(error);
-                        loading();
-                    }
+                () => {
+                    this.initFlag = false;
+                    this.onLoad(this.page);
+                    this.$message({
+                        type: 'success',
+                        message: '操作成功!',
+                    });
+                    done();
+                },
+                error => {
+                    window.console.log(error);
+                    loading();
+                }
             );
         },
         rowUpdate(row, index, done, loading) {
@@ -372,19 +368,19 @@
             row.roleId = func.join(row.roleId);
             row.postId = func.join(row.postId);
             update(row).then(
-                    () => {
-                        this.initFlag = false;
-                        this.onLoad(this.page);
-                        this.$message({
-                            type: 'success',
-                            message: '操作成功!',
-                        });
-                        done();
-                    },
-                    error => {
-                        window.console.log(error);
-                        loading();
-                    }
+                () => {
+                    this.initFlag = false;
+                    this.onLoad(this.page);
+                    this.$message({
+                        type: 'success',
+                        message: '操作成功!',
+                    });
+                    done();
+                },
+                error => {
+                    window.console.log(error);
+                    loading();
+                }
             );
         },
         rowDel(row) {
@@ -393,16 +389,16 @@
                 cancelButtonText: '取消',
                 type: 'warning',
             })
-                    .then(() => {
-                        return remove(row.id);
-                    })
-                    .then(() => {
-                        this.onLoad(this.page);
-                        this.$message({
-                            type: 'success',
-                            message: '操作成功!',
-                        });
+                .then(() => {
+                    return remove(row.id);
+                })
+                .then(() => {
+                    this.onLoad(this.page);
+                    this.$message({
+                        type: 'success',
+                        message: '操作成功!',
                     });
+                });
         },
         searchReset() {
             this.query = {};
@@ -432,17 +428,17 @@
                 cancelButtonText: '取消',
                 type: 'warning',
             })
-                    .then(() => {
-                        return remove(this.ids);
-                    })
-                    .then(() => {
-                        this.onLoad(this.page);
-                        this.$message({
-                            type: 'success',
-                            message: '操作成功!',
-                        });
-                        this.$refs.crud.toggleSelection();
+                .then(() => {
+                    return remove(this.ids);
+                })
+                .then(() => {
+                    this.onLoad(this.page);
+                    this.$message({
+                        type: 'success',
+                        message: '操作成功!',
                     });
+                    this.$refs.crud.toggleSelection();
+                });
         },
         handleReset() {
             if (this.selectionList.length === 0) {
@@ -454,16 +450,16 @@
                 cancelButtonText: '取消',
                 type: 'warning',
             })
-                    .then(() => {
-                        return resetPassword(this.ids);
-                    })
-                    .then(() => {
-                        this.$message({
-                            type: 'success',
-                            message: '操作成功!',
-                        });
-                        this.$refs.crud.toggleSelection();
+                .then(() => {
+                    return resetPassword(this.ids);
+                })
+                .then(() => {
+                    this.$message({
+                        type: 'success',
+                        message: '操作成功!',
                     });
+                    this.$refs.crud.toggleSelection();
+                });
         },
         handleGrant() {
             if (this.selectionList.length === 0) {
@@ -492,15 +488,15 @@
                 cancelButtonText: '取消',
                 type: 'warning',
             })
-                    .then(() => {
-                        return unlock(this.ids);
-                    })
-                    .then(() => {
-                        this.$message({
-                            type: 'success',
-                            message: '操作成功!',
-                        });
+                .then(() => {
+                    return unlock(this.ids);
+                })
+                .then(() => {
+                    this.$message({
+                        type: 'success',
+                        message: '操作成功!',
                     });
+                });
         },
         handleImport() {
             this.excelBox = true;
@@ -521,8 +517,8 @@
             }).then(() => {
                 NProgress.start();
                 exportBlob(
-                        `/blade-system/user/export-user?${this.website.tokenHeader
-                        }=${getToken()}&account=${account}&realName=${realName}`
+                    `/blade-system/user/export-user?${this.website.tokenHeader
+                    }=${getToken()}&account=${account}&realName=${realName}`
                 ).then(res => {
                     downloadXls(res.data, `用户数据表${this.$dayjs().format('YYYY-MM-DD')}.xlsx`);
                     NProgress.done();
@@ -531,7 +527,7 @@
         },
         handleTemplate() {
             exportBlob(
-                    `/blade-system/user/export-template?${this.website.tokenHeader}=${getToken()}`
+                `/blade-system/user/export-template?${this.website.tokenHeader}=${getToken()}`
             ).then(res => {
                 downloadXls(res.data, '用户数据模板.xlsx');
             });
@@ -566,14 +562,14 @@
         onLoad(page, params = {}) {
             this.loading = true;
             getList(
-                    page.currentPage,
-                    page.pageSize,
-                    // Object.assign(params, this.query),
-                    Object.assign(params, {
-                        ...this.query,
-                        userType: 2
-                    }),
-                    this.treeDeptId
+                page.currentPage,
+                page.pageSize,
+                // Object.assign(params, this.query),
+                Object.assign(params, {
+                    ...this.query,
+                    userType: 2
+                }),
+                this.treeDeptId
             ).then(res => {
                 const data = res.data.data;
                 this.page.total = data.total;
@@ -584,18 +580,18 @@
         },
         platformRowUpdate(row, index, done, loading) {
             updatePlatform(row.id, row.userType, row.userExt).then(
-                    () => {
-                        this.platformOnLoad(this.platformPage);
-                        this.$message({
-                            type: 'success',
-                            message: '操作成功!',
-                        });
-                        done();
-                    },
-                    error => {
-                        window.console.log(error);
-                        loading();
-                    }
+                () => {
+                    this.platformOnLoad(this.platformPage);
+                    this.$message({
+                        type: 'success',
+                        message: '操作成功!',
+                    });
+                    done();
+                },
+                error => {
+                    window.console.log(error);
+                    loading();
+                }
             );
         },
         platformBeforeOpen(done, type) {
@@ -635,14 +631,14 @@
         platformOnLoad(page, params = {}) {
             this.platformLoading = true;
             getList(
-                    page.currentPage,
-                    page.pageSize,
-                    // Object.assign(params, this.query),
-                    Object.assign(params, {
-                        ...this.query,
-                        userType: 2
-                    }),
-                    this.treeDeptId
+                page.currentPage,
+                page.pageSize,
+                // Object.assign(params, this.query),
+                Object.assign(params, {
+                    ...this.query,
+                    userType: 2
+                }),
+                this.treeDeptId
             ).then(res => {
                 const data = res.data.data;
                 this.platformPage.total = data.total;
@@ -670,7 +666,7 @@
 
 :deep() {
     .el-tree-node__children {
-        .el-tree-node[aria-checked = 'false'] {
+        .el-tree-node[aria-checked='false'] {
             position: relative;
 
             &::after,
diff --git a/src/views/evaluate/components/IndividualTaskPublic.vue b/src/views/evaluate/components/IndividualTaskPublic.vue
index e519611..c796021 100644
--- a/src/views/evaluate/components/IndividualTaskPublic.vue
+++ b/src/views/evaluate/components/IndividualTaskPublic.vue
@@ -1,8 +1,12 @@
 <template>
-    <el-dialog v-model="params.visible" title="发布评优任务" width="50%" @open="openDialog" @close="dialogClose">
+    <el-dialog v-model="params.visible" :title="`发布评优任务(${params.data?.taskName || ''})`" width="50%" @open="openDialog" @close="dialogClose">
         <div class="content">
             <el-form :model="form" ref="formRef" :rules="rules" label-position="top">
-                <el-form-item label="任务类别" prop="taskType">
+                <el-form-item prop="categoryEntities">
+                    <template #label>
+                        评优类别
+                        <el-button type="primary" icon="el-icon-view" text>查看第一轮候选结果</el-button>
+                    </template>
                     <ul class="type-list">
                         <li class="type-item">
                             <div class="title">类别</div>
@@ -10,39 +14,39 @@
                             <div class="number">名额</div>
                             <div class="tool">操作</div>
                         </li>
-                        <li class="type-item" v-for="(item, index) in form.taskType" :key="index">
-                            <div class="title">{{ item.title }}</div>
+                        <li class="type-item" v-for="(item, index) in form.categoryEntities" :key="index">
+                            <div class="title">{{ item.categoryName }}</div>
                             <el-tooltip effect="dark" placement="top">
                                 <template #content>
-                                    <p style="width: 500px;">{{ item.introduction }}</p>
+                                    <p style="max-width: 500px;">{{ item.standard }}</p>
                                 </template>
                                 <div class="introduction">
-                                    {{ item.introduction }}
+                                    {{ item.standard }}
                                 </div>
                             </el-tooltip>
 
-                            <div class="number">{{ item.number }}</div>
+                            <div class="number">{{ item.peopleNum }}</div>
                             <div class="tool">
-                               <el-button type="primary" icon="el-icon-plus" text>添加候选人</el-button>
+                               <el-button type="primary" icon="el-icon-plus" text @click="addEcCandidateHandler(item)">添加候选人</el-button>
                             </div>
                         </li>
                     </ul>
                 </el-form-item>
-                <el-form-item label="投票人员" prop="employees">
-                    <el-checkbox-group v-model="form.employees">
+                <el-form-item label="投票人员" prop="pollingPersons">
+                    <el-checkbox-group v-model="form.pollingPersons">
                         <el-checkbox v-for="item in employeeDict" :key="item.id" :label="item.dictKey">
                             {{ item.dictValue }}
                         </el-checkbox>
                     </el-checkbox-group>
                 </el-form-item>
                 <el-form-item label="第二轮任务结束时间" required>
-                    <el-form-item class="time-box" prop="candidateCutoffTimeStart">
-                        <el-date-picker v-model="form.candidateCutoffTimeStart" type="datetime" placeholder="请选择任务开始时间"
+                    <el-form-item class="time-box" prop="evaluateCutoffTimeStart">
+                        <el-date-picker v-model="form.evaluateCutoffTimeStart" type="datetime" placeholder="请选择任务开始时间"
                             value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%;" />
                     </el-form-item>
                     <span class="time-span">至</span>
-                    <el-form-item class="time-box" prop="candidateCutoffTimeEnd">
-                        <el-date-picker v-model="form.candidateCutoffTimeEnd" type="datetime" placeholder="请选择任务结束时间"
+                    <el-form-item class="time-box" prop="evaluateCutoffTimeEnd">
+                        <el-date-picker v-model="form.evaluateCutoffTimeEnd" type="datetime" placeholder="请选择任务结束时间"
                             value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%;" />
                     </el-form-item>
                 </el-form-item>
@@ -50,17 +54,22 @@
         </div>
         <template #footer>
             <el-button @click="() => params.visible = false">取消</el-button>
-            <el-button type="primary">确定发布</el-button>
+            <el-button type="primary" @click="taskPublic">确认发布</el-button>
         </template>
+        <addEcCandidate :params="addEcCandidateParams" />
     </el-dialog>
 </template>
 
 <script>
 import _ from 'lodash';
 import { getDict } from '@/api/dict'
-import { getEcList } from '@/api/evaluate/evaluateTask'
+import { update, getEcList } from '@/api/evaluate/evaluateTask'
+import addEcCandidate from './addEcCandidate.vue';
 
 export default {
+    components: {
+        addEcCandidate
+    },
     props: {
         params: {
             type: Object,
@@ -76,30 +85,31 @@
         return {
             employeeDict: [],
             form: {
-                taskType: [],
-                employees: [],
-                candidateCutoffTimeStart: '',
-                candidateCutoffTimeEnd: ''
+                categoryEntities: [],
+                pollingPersons: [],
+                evaluateCutoffTimeStart: '',
+                evaluateCutoffTimeEnd: ''
             },
             rules: {
-                taskType: [
+                categoryEntities: [
                     { required: true, message: '任务类别不可为空', trigger: 'click' },
                 ],
-                employees: [
+                pollingPersons: [
                     { required: true, message: '请选择评定人员', trigger: 'click' },
                 ],
-                candidateCutoffTimeStart: [
+                evaluateCutoffTimeStart: [
                     { required: true, message: '请选择任务开始时间', trigger: 'click' },
                 ],
-                candidateCutoffTimeEnd: [
+                evaluateCutoffTimeEnd: [
                     { required: true, message: '请选择任务开始时间', trigger: 'click' },
                 ]
             },
             page: {
                 current: 1,
-                size: 10,
+                size: 100,
                 total: 0
-            }
+            },
+            addEcCandidateParams: {}
         }
     },
     methods: {
@@ -111,8 +121,9 @@
             const { id } = this.params.data
             const { current, size } = this.page
             getEcList(current, size, id).then(ecResult => {
-                const { code, data } = ecResult.data
-                console.log(data);
+                const { code, data: { records } } = ecResult.data
+                if (code !== 200) return this.$message.error('评优类别加载失败')
+                this.form.categoryEntities = records
             })
         },
         initDict() {
@@ -123,6 +134,29 @@
                 }
                 this.employeeDict = data
             })
+        },
+        taskPublic() {
+            this.$refs.formRef.validate(valid => {
+                if (!valid) return
+                const data = _.cloneDeep(this.form)
+                const { id } = this.params.data
+                data.id = id
+                data.candidateState = 2
+                data.evaluateState = 1
+                data.pollingPersons = data.pollingPersons.join(',')
+                delete data.categoryEntities
+                update(data).then(res => {
+                    if (res.data.code !== 200) return
+                    this.params.visible = false 
+                    this.$emit('refreshTable', { currentPage:1, pageSize: 10 })
+                })
+            })
+        },
+        addEcCandidateHandler(row) {
+            this.addEcCandidateParams = {
+                visible: true,
+                data: row
+            }
         }
     }
 };
diff --git a/src/views/evaluate/components/addEcCandidate.vue b/src/views/evaluate/components/addEcCandidate.vue
new file mode 100644
index 0000000..563e3e2
--- /dev/null
+++ b/src/views/evaluate/components/addEcCandidate.vue
@@ -0,0 +1,246 @@
+<template>
+    <el-dialog v-model="params.visible" :title="params.data?.categoryName || '添加类别候选人'" width="50%">
+        <avue-crud :option="option" v-model:search="search" v-model:page="page" v-model="form" :table-loading="loading"
+            :data="data" :before-open="beforeOpen" ref="crud" @row-update="rowUpdate"
+            @row-del="rowDel" @search-change="searchChange" @search-reset="searchReset"
+            @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
+            @refresh-change="refreshChange" @on-load="onLoad">
+            <template #menu-left> 
+                <el-button icon="el-icon-plus" type="primary" @click="addCandidateDailog">新增{{ params.data.categoryName }}</el-button>
+            </template>
+        </avue-crud>
+        <candidateDialog :params="candidateDailogParams" @refreshTable="this.onLoad"/>
+    </el-dialog>
+</template>
+  
+<script>
+import { getEtaskCcList, removeEtaskCc } from '@/api/evaluate/evaluateTask'
+import { exportBlob } from "@/api/common";
+import { getToken } from '@/utils/auth';
+import { downloadXls } from "@/utils/util";
+import { dateNow } from "@/utils/date";
+import NProgress from 'nprogress';
+import 'nprogress/nprogress.css';
+import candidateDialog from './candidateDialog.vue'
+
+export default {
+    components: {
+        candidateDialog
+    },
+    props: {
+        params: {
+            type: Object,
+            default: () => {
+                return {
+                    visible: false,
+                    data: {}
+                }
+            }
+        }
+    },
+    data() {
+        return {
+            form: {},
+            query: {},
+            search: {},
+            loading: true,
+            page: {
+                pageSize: 10,
+                currentPage: 1,
+                total: 0
+            },
+            selectionList: [],
+            option: {
+                height: '300',
+                calcHeight: 30,
+                tip: false,
+                searchShow: true,
+                searchMenuSpan: 6,
+                border: true,
+                index: true,
+                viewBtn: false,
+                editBtn: false,
+                addBtn: false,
+                dialogClickModal: false,
+                column: [
+                    {
+                        label: '姓名',
+                        prop: 'userName',
+                        type: 'input'
+                    },
+                    {
+                        label: '职位',
+                        prop: 'postName',
+                        type: 'input'
+                    },
+                    {
+                        label: '部门',
+                        prop: 'deptName',
+                        type: 'input'
+                    }
+                ]
+            },
+            data: [],
+            candidateDailogParams: {}
+        };
+    },
+    computed: {
+        ids() {
+            let ids = [];
+            this.selectionList.forEach(ele => {
+                ids.push(ele.id);
+            });
+            return ids.join(",");
+        }
+    },
+    methods: {
+        rowSave(row, done, loading) {
+            add(row).then(() => {
+                this.onLoad(this.page);
+                this.$message({
+                    type: "success",
+                    message: "操作成功!"
+                });
+                done();
+            }, error => {
+                loading();
+                window.console.log(error);
+            });
+        },
+        addCandidateDailog() {
+            this.candidateDailogParams = {
+                visible: true,
+                data: this.params.data
+            }
+        },
+        rowUpdate(row, index, done, loading) {
+            update(row).then(() => {
+                this.onLoad(this.page);
+                this.$message({
+                    type: "success",
+                    message: "操作成功!"
+                });
+                done();
+            }, error => {
+                loading();
+                console.log(error);
+            });
+        },
+        rowDel(row) {
+            this.$confirm("确定将选择数据删除?", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning"
+            })
+                .then(() => {
+                    return removeEtaskCc(row.id);
+                })
+                .then(() => {
+                    this.onLoad(this.page);
+                    this.$message({
+                        type: "success",
+                        message: "操作成功!"
+                    });
+                });
+        },
+        handleDelete() {
+            if (this.selectionList.length === 0) {
+                this.$message.warning("请选择至少一条数据");
+                return;
+            }
+            this.$confirm("确定将选择数据删除?", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning"
+            })
+                .then(() => {
+                    return removeEtaskCc(this.ids);
+                })
+                .then(() => {
+                    this.onLoad(this.page);
+                    this.$message({
+                        type: "success",
+                        message: "操作成功!"
+                    });
+                    this.$refs.crud.toggleSelection();
+                });
+        },
+        handleExport() {
+            let downloadUrl = `/evaluate/evaluateResult/export-evaluateResult?${this.website.tokenHeader}=${getToken()}`;
+            const {
+            } = this.query;
+            let values = {
+            };
+            this.$confirm("是否导出数据?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning"
+            }).then(() => {
+                NProgress.start();
+                exportBlob(downloadUrl, values).then(res => {
+                    downloadXls(res.data, `评优结果${dateNow()}.xlsx`);
+                    NProgress.done();
+                })
+            });
+        },
+        beforeOpen(done, type) {
+            if (["edit", "view"].includes(type)) {
+                getDetail(this.form.id).then(res => {
+                    this.form = res.data.data;
+                });
+            }
+            done();
+        },
+        searchReset() {
+            this.query = {};
+            this.onLoad(this.page);
+        },
+        searchChange(params, done) {
+            this.query = {
+                type: this.defaultTaskType,
+                ...params
+            };
+            this.page.currentPage = 1;
+            this.onLoad(this.page, params);
+            done();
+        },
+        selectionChange(list) {
+            this.selectionList = list;
+        },
+        selectionClear() {
+            this.selectionList = [];
+            this.$refs.crud.toggleSelection();
+        },
+        currentChange(currentPage) {
+            this.page.currentPage = currentPage;
+        },
+        sizeChange(pageSize) {
+            this.page.pageSize = pageSize;
+        },
+        refreshChange() {
+            this.onLoad(this.page, this.query);
+        },
+        onLoad(page, params = {}) {
+            this.loading = true;
+            const { id } = this.params.data
+
+            const {
+            } = this.query;
+
+            let values = {
+                ...this.query,
+                ...params,
+                evaluateTaskCategoryId: id,
+            };
+
+            getEtaskCcList(page.currentPage, page.pageSize, values).then(res => {
+                const data = res.data.data;
+                this.page.total = data.total;
+                this.data = data.records;
+                this.loading = false;
+                this.selectionClear();
+            });
+        },
+    }
+};
+</script>
\ No newline at end of file
diff --git a/src/views/evaluate/components/addIndividualTask.vue b/src/views/evaluate/components/addIndividualTask.vue
index 5f582da..0f927c7 100644
--- a/src/views/evaluate/components/addIndividualTask.vue
+++ b/src/views/evaluate/components/addIndividualTask.vue
@@ -5,7 +5,7 @@
                 <el-form-item label="任务名称" prop="taskName">
                     <el-input v-model="form.taskName" placeholder="请输入任务名称"></el-input>
                 </el-form-item>
-                <el-form-item label="任务类别" prop="categoryEntities">
+                <el-form-item label="评优类别" prop="categoryEntities">
                     <ul class="type-list">
                         <li class="type-item">
                             <div class="title">类别</div>
@@ -60,7 +60,7 @@
                         <el-input type="textarea" v-model="taskTypeForm.standard" placeholder="请输入认定标准"></el-input>
                     </el-form-item>
                     <el-form-item label="名额" prop="peopleNum">
-                        <el-input v-model="taskTypeForm.peopleNum" placeholder="请输入名额数量"></el-input>
+                        <el-input-number v-model="taskTypeForm.peopleNum" placeholder="请输入名额数量" controls-position="right"></el-input-number>
                     </el-form-item>
                 </el-form>
                 <template #footer>
@@ -167,13 +167,11 @@
         addEvaluateTask() {
             this.$refs.formRef.validate(valid => {
                 if (!valid) return
-                const data = {
-                   ..._.cloneDeep(this.form),
-                   type: this.type() 
-                }
                 add(this.form).then(res => {
-                    // if ()
-                    console.log(res);
+                    if (res.data.code !== 200) return
+                    this.$emit('refreshTable', { currentPage: 1, pageSize: 10 })
+                    this.$message.success('添加成功')
+                    this.params.visible = false
                 })
             })
         }
diff --git a/src/views/evaluate/components/candidateDialog.vue b/src/views/evaluate/components/candidateDialog.vue
new file mode 100644
index 0000000..67bc27b
--- /dev/null
+++ b/src/views/evaluate/components/candidateDialog.vue
@@ -0,0 +1,235 @@
+<template>
+    <el-dialog v-model="props.params.visible" title="添加考核人" @close="dialogClose">
+        <div style="margin-bottom: 20px;" v-if="!form.deptId">
+            <el-alert title="请先选择部门信息" type="warning" />
+        </div>
+        <el-form :model="form" ref="formRef" :rules="rules" label-width="70px">
+            <el-row>
+                <el-col :span="12">
+                    <el-form-item label="部门" prop="deptId">
+                        <el-cascader v-model="form.deptId" :props="cascaderProps" placeholder="请选择部门" @change="deptChange"
+                            style="width: 100%;" />
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="候选人" prop="userId">
+                        <el-select v-model="form.userId" placeholder="请选择候选人"
+                            :disabled="userSelectOption.length > 0 ? false : true" @change="userSelectChange"
+                            style="width: 100%;">
+                            <el-option v-for="item in userSelectOption" :label="item.name" :key="item.id"
+                                :value="item.id" />
+                            <div class="loading-more" @click="loadMore">{{ loadingMoreText }}</div>
+                        </el-select>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="职务">
+                        <el-input v-model="form.postName" placeholder="请填写职务" disabled />
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+        <template #footer>
+            <el-button @click="() => props.params.visible = false">取消</el-button>
+            <el-button type="primary" @click="submit">确定</el-button>
+        </template>
+    </el-dialog>
+</template>
+
+<script setup>
+import { computed, markRaw, reactive, ref, watch } from 'vue';
+import { getDeptLazyTree } from '@/api/system/dept.js'
+import { getList } from '@/api/system/user.js'
+import { ElMessage } from 'element-plus';
+import { addEtaskCc } from '@/api/evaluate/evaluateTask'
+
+const props = defineProps({
+    params: {
+        type: Object,
+        default: () => { }
+    },
+})
+
+const emits = defineEmits(['refresh'])
+
+const curType = ref()
+
+const formRef = ref(null)
+
+const form = reactive({
+    evaluateTaskCategoryId: '',
+    userId: '',
+    userName: '',
+    deptId: '',
+    deptName: '',
+    postName: ''
+})
+
+
+const rules = markRaw({
+    userId: [
+        {
+            required: true,
+            message: '请选择候选人',
+            trigger: 'click',
+        }
+    ],
+    deptId: [
+        {
+            required: true,
+            message: '请选择部门',
+            trigger: 'click',
+        }
+    ]
+})
+
+const requestParams = reactive({
+    evaluateTaskCategoryId: '',
+    userId: '',
+    userName: '',
+    deptId: '',
+    deptName: '',
+    postName: ''
+})
+
+const currentDeptId = ref('')
+
+
+const deptList = ref([])
+
+// options 数据
+const userSelectOption = ref([])
+
+// 懒加载
+const isOptionsLoading = ref(false)
+
+const loadingMoreText = computed(() => {
+    if (userSelectOption.value.length >= page.total) {
+        return '数据已全部加载完成'
+    }
+    if (isOptionsLoading.value) {
+        return '加载中...'
+    }
+    if (!isOptionsLoading.value) {
+        return '点击加载更多'
+    }
+})
+// 分页
+const page = reactive({
+    current: 1,
+    size: 10,
+    total: 0
+})
+
+const loadMore = async () => {
+    isOptionsLoading.value = true
+    page.current += 1
+    const res = await initUserList(currentDeptId.value)
+    userSelectOption.value = [...userSelectOption.value, ...res]
+    isOptionsLoading.value = false
+}
+
+// 初始化部门数据
+const initDept = async (parentId) => {
+    const deptResult = await getDeptLazyTree(parentId)
+    return deptResult.data.data
+}
+
+// 初始化用户列表
+const initUserList = (deptId) => {
+    return getList(
+        page.current,
+        page.size,
+        {
+            userType: 2,
+        },
+        deptId,
+    ).then(res => {
+        page.total = res.data.data.total
+        return res.data.data.records
+    })
+}
+
+
+// 选择部门改变
+const deptChange = async (value) => {
+    const id = value[value.length - 1]
+    currentDeptId.value = id
+    const userList = await initUserList(id)
+    userSelectOption.value = userList
+}
+
+// 级联配置
+const cascaderProps = {
+    lazy: true,
+    label: 'title',
+    value: 'id',
+    multiple: false,
+    lazyLoad: async (node, resovle) => {
+        const level = node.level || 0
+        if (level == 0) {
+            const res = await initDept(level)
+            deptList.value = res
+            resovle(res)
+        } else {
+            const { value } = node
+            const res = await initDept(value)
+            deptList.value = res
+            resovle(res)
+        }
+    },
+    leaf(node) {
+        const { hasChildren } = node
+        return !hasChildren
+    }
+}
+
+const userSelectChange = (value) => {
+    const obj = userSelectOption.value.find(item => item.id == value)
+    const { id, deptName, deptId, postName, realName } = obj
+    requestParams.userId = id
+    requestParams.deptId = deptId
+    requestParams.userName = realName
+    requestParams.deptName = deptName
+    requestParams.postName = postName
+
+    form.deptName = deptName
+    form.postName = postName
+}
+
+const submit = () => {
+    formRef.value.validate(valid => {
+        if (!valid) return ElMessage.error('添加候选人失败')
+        addEtaskCc(requestParams).then(res => {
+            ElMessage.success('添加候选人成功')
+            props.params.visible = false
+            emits('refreshTable', {
+                currentPage: 1,
+                pageSize: 10,
+            })
+        }, error => {
+            ElMessage.error(error)
+        })
+    })
+}
+
+const dialogClose = () => {
+    formRef.value.resetFields()
+}
+
+watch(() => props.params.visible, (val) => {
+    if (!val) return
+    const { id } = props.params.data
+    requestParams.evaluateTaskCategoryId = id
+    
+}, {
+    deep: true
+})
+</script>
+
+<style lang="scss" scoped>
+.loading-more {
+    text-align: center;
+    cursor: pointer;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/evaluate/evaluateResult.vue b/src/views/evaluate/evaluateResult.vue
index 194fe11..3b1828f 100755
--- a/src/views/evaluate/evaluateResult.vue
+++ b/src/views/evaluate/evaluateResult.vue
@@ -235,7 +235,7 @@
 
       let values = {
         ...this.query,
-        ...this.params
+        ...params
       };
 
       getList(page.currentPage, page.pageSize, values).then(res => {
diff --git a/src/views/evaluate/evaluateTask.vue b/src/views/evaluate/evaluateTask.vue
index d4f2c43..31275e5 100644
--- a/src/views/evaluate/evaluateTask.vue
+++ b/src/views/evaluate/evaluateTask.vue
@@ -28,7 +28,7 @@
       </template>
       <template #menu="{ size, row, index }">
         <el-button type="primary" text plain icon="el-icon-view" @click="viewDateilDialog(row)">详情</el-button>
-        <el-button type="primary" v-if="!row.type" text plain icon="el-icon-position"
+        <el-button type="primary" v-if="!row.type && row.candidateState === 2 && !row.evaluateState" text plain icon="el-icon-position"
           @click="taskPublicDialog(row)">发布</el-button>
         <el-button type="danger" text plain icon="el-icon-delete" @click="rowDel(row)">删除</el-button>
       </template>
@@ -174,7 +174,6 @@
       }
     },
     taskPublicDialog(row) {
-      console.log(row);
       this.taskPublicParams = {
         visible: true,
         data: row

--
Gitblit v1.9.3