From 06dd89e20c026ed578dcbc7618f83c7b3d8f6e15 Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Fri, 29 Dec 2023 15:23:29 +0800
Subject: [PATCH] 考核任务任务配置完善

---
 src/views/evaluate/components/taskSetting.vue        |  168 +++++
 src/option/evaluate/evaluateTask.js                  |   80 -
 /dev/null                                            |   74 --
 src/views/evaluate/components/viewEvaluateDetail.vue |  380 ------------
 src/views/evaluate/components/selectAssessor.vue     |  226 +++++++
 src/views/evaluate/components/addDialog.vue          |  211 ------
 src/api/evaluate/evaluateTask.js                     |   29 
 src/views/evaluate/components/addCandidate.vue       |  383 ++++++-----
 src/views/evaluate/evaluateTask.vue                  |  112 ---
 src/views/evaluate/components/addAssessors.vue       |  166 +++++
 10 files changed, 849 insertions(+), 980 deletions(-)

diff --git a/src/api/evaluate/evaluateTask.js b/src/api/evaluate/evaluateTask.js
index d508574..e7c4256 100644
--- a/src/api/evaluate/evaluateTask.js
+++ b/src/api/evaluate/evaluateTask.js
@@ -35,6 +35,7 @@
 export const add = (row) => {
   return request({
     url: '/evaluate/evaluateTask/submit',
+    // url: '/evaluate/evaluateTask/sava',
     method: 'post',
     data: row
   })
@@ -48,7 +49,7 @@
   })
 }
 
-
+// 获取候选人列表
 export const getCandidateList = (current, size, params) => {
   return request({
     url: '/evaluate/evaluateCandidate/list',
@@ -61,6 +62,7 @@
   })
 }
 
+// 添加候选人
 export const addCandidate = (data) => {
   return request({
     url: '/evaluate/evaluateCandidate/submit',
@@ -69,6 +71,7 @@
   })
 }
 
+// 删除候选人
 export const removeCandidate = (ids) => {
   return request({
     url: '/evaluate/evaluateCandidate/remove',
@@ -79,7 +82,31 @@
   })
 }
 
+// 获取单个候选人的评定人
+export const getAssessorList = (current, size, evaluateCandidateId) => {
+  return request({
+    url: '/evaluate/evaluateCandidateAssessor/list',
+    method: 'get',
+    params: {
+      current,
+      size,
+      evaluateCandidateId
+    }
+  })
+}
 
+
+// 添加评定人
+export const addAssessorSubmit = (data) => {
+  return request({
+    url: '/evaluate/evaluateCandidateAssessor/submit',
+    method: 'post',
+    data
+  })
+}
+
+
+// 获取最终结果
 //  url: '/evaluate/evaluateCandidate/page',
 export const getFinallyResult = (params) => {
   return request({
diff --git a/src/option/evaluate/evaluateTask.js b/src/option/evaluate/evaluateTask.js
index 7661343..d94ac22 100644
--- a/src/option/evaluate/evaluateTask.js
+++ b/src/option/evaluate/evaluateTask.js
@@ -68,21 +68,7 @@
       //   label: "title",
       // },
       formatter: (row, value) => {
-        let num = 0
-        if (value === void 0) {
-          num = 0
-        } else {
-          if (!row.type) {
-            value.forEach(item => {
-              num += Number(item.val)
-            })
-          } else {
-            row.candidateNum.forEach(item => {
-              num += Number(item.users.length)
-            })
-          }
-        }
-        return num + '人'
+       return 0
       },
     },
     {
@@ -100,15 +86,7 @@
       }]
     },
     {
-      label: "候选人截止日期",
-      prop: "candidateCutoffTime",
-      type: "date",
-      format: "YYYY-MM-DD HH:mm:ss",
-      valueFormat: "YYYY-MM-DD HH:mm:ss",
-      minWidth: '200px'
-    },
-    {
-      label: "候选人状态",
+      label: "第一轮状态",
       prop: "candidateState",
       type: "input",
       addDisplay: false,
@@ -120,21 +98,19 @@
       minWidth: '100px'
     },
     {
+      label: "第一轮结束时间",
+      prop: "candidateCutoffTimeEnd",
+      type: "input",
+      minWidth: '170px'
+    },
+    {
       label: "评优数量",
       prop: "evaluateNum",
       type: "input",
       minWidth: '100px'
     },
     {
-      label: "评优评先截止时间",
-      prop: "evaluateCutoffTime",
-      type: "date",
-      format: "YYYY-MM-DD HH:mm:ss",
-      valueFormat: "YYYY-MM-DD HH:mm:ss",
-      minWidth: '200px'
-    },
-    {
-      label: "评优评选状态",
+      label: "第二轮状态",
       prop: "evaluateState",
       type: "input",
       addDisplay: false,
@@ -144,6 +120,12 @@
         return status[value]
       },
       minWidth: '100px'
+    },
+    {
+      label: "第二轮结束时间",
+      prop: "evaluateCutoffTimeEnd",
+      type: "input",
+      minWidth: '170px'
     },
     {
       label: "创建人",
@@ -273,21 +255,8 @@
       minWidth: '100px',
       slot: 'true',
       formatter: (row, value) => {
-        let num = 0
-        if (value === void 0) {
-          num = 0
-        } else {
-          if (!row.type) {
-            value.forEach(item => {
-              num += Number(item.val)
-            })
-          } else {
-            row.candidateNum.forEach(item => {
-              num += Number(item.users.length)
-            })
-          }
-        }
-        return num + '人'
+        
+        return 0
       },
     },
     {
@@ -311,15 +280,7 @@
       minWidth: '100px'
     },
     {
-      label: "评优评先截止时间",
-      prop: "evaluateCutoffTime",
-      type: "date",
-      format: "YYYY-MM-DD HH:mm:ss",
-      valueFormat: "YYYY-MM-DD HH:mm:ss",
-      minWidth: '200px'
-    },
-    {
-      label: "评优评选状态",
+      label: "评选状态",
       prop: "evaluateState",
       type: "input",
       addDisplay: false,
@@ -331,6 +292,11 @@
       minWidth: '100px'
     },
     {
+      label: "截止时间",
+      prop: "candidateCutoffTimeEnd",
+      minWidth: '200px'
+    },
+    {
       label: "创建人",
       prop: "createUser",
       type: "input",
diff --git a/src/views/evaluate/components/addAssessors.vue b/src/views/evaluate/components/addAssessors.vue
new file mode 100644
index 0000000..eefb446
--- /dev/null
+++ b/src/views/evaluate/components/addAssessors.vue
@@ -0,0 +1,166 @@
+<template>
+    <el-dialog v-model="props.params.visible" :title="`${tipInfo.evaluateTaskName}-评定人列表`" width="50%" destroy-on-close>
+        <div class="tips">
+            <el-tag style="width: 100%;" size="large">当前评优任务:{{ tipInfo.evaluateTaskName }}</el-tag>
+            <div class="tags">
+                <el-tag size="large" class="item">候选人姓名:{{ tipInfo.userName }}</el-tag>
+                <el-tag size="large" class="item">候选人部门:{{ tipInfo.deptName }}</el-tag>
+                <el-tag size="large" class="item">候选人职位:{{ tipInfo.postName }}</el-tag>
+            </div>
+        </div>
+        <avue-crud :data="table.data" :option="tableOption" v-model:page="table.page">
+            <template #menu-left>
+                <el-button type="primary" icon="el-icon-plus" @click="assessorDialog">新增评定人</el-button>
+            </template>
+        </avue-crud>
+        <selectAssessor v-model:params="selectAssessorParams" @refresh="refresh" />
+    </el-dialog>
+</template>
+
+<script setup>
+import { getAssessorList } from '@/api/evaluate/evaluateTask'
+import { ElMessage } from 'element-plus';
+import { markRaw, reactive, watch } from 'vue';
+import selectAssessor from './selectAssessor.vue';
+
+
+const props = defineProps({
+    params: {
+        type: Object,
+        default: () => {
+            return {
+                visible: false,
+                taskInfo: {},
+                candidateInfo: {}
+            }
+        }
+    }
+})
+
+const tableOption = markRaw({
+    height: '240',
+    calcHeight: 30,
+    tip: false,
+    searchShow: true,
+    searchMenuSpan: 6,
+    border: true,
+    index: true,
+    viewBtn: false,
+    addBtn: false,
+    editBtn: false,
+    delBtn: false,
+    selection: false,
+    dialogClickModal: false,
+    menuFixed: 'right',
+    labelWidth: '70',
+    menu: false,
+    column: [
+        {
+            label: '任务id',
+            prop: 'evaluateTaskId',
+            type: 'input',
+            hide: true,
+        },
+        {
+            label: '候选人id',
+            prop: 'userId',
+            type: 'input',
+            hide: true,
+        },
+        {
+            label: '候选人姓名',
+            prop: 'userName',
+            type: 'input'
+        },
+        {
+            label: '部门id',
+            prop: 'deptId',
+            type: 'input',
+            hide: true,
+        },
+        {
+            label: '部门名称',
+            prop: 'deptName',
+            type: 'input'
+        },
+        {
+            label: '职位名称',
+            prop: 'postName',
+            type: 'input'
+        }
+    ]
+})
+
+const tipInfo = reactive({})
+
+const table = reactive({
+    data: [],
+    page: {
+        current: 1,
+        size: 10,
+        total: 10
+    },
+})
+
+const selectAssessorParams = reactive({
+    visible: false,
+    evaluateCandidateId: ''
+})
+
+const initData = () => {
+    const { current, size } = table.page
+    const { id } = props.params.candidateInfo
+    getAssessorList(current, size, id).then(res => {
+        const result = res.data.data
+        table.data = result.records
+        table.page.total = result.total
+    }, error => {
+        ElMessage.error(error)
+    })
+}
+
+const refresh = () => {
+    table.page.total = 0
+    initData()
+}
+
+const assessorDialog = () => {
+    selectAssessorParams.visible = true
+    selectAssessorParams.evaluateCandidateId = props.params.candidateInfo.id
+}
+
+watch(() => props.params.visible, (val) => {
+    if (!val) return
+    const { evaluateTaskName } = props.params.taskInfo
+    const { postName, deptName, userName } = props.params.candidateInfo
+    tipInfo.evaluateTaskName = evaluateTaskName
+    tipInfo.postName = postName
+    tipInfo.deptName = deptName
+    tipInfo.userName = userName
+    initData()
+
+}, {
+    deep: true
+})
+
+</script>
+
+<style lang="scss" scoped>
+.tips {
+    margin-bottom: 15px;
+
+    .tags {
+        display: flex;
+        width: 100%;
+        margin: 5px 0;
+
+        .item {
+            flex: 1;
+
+            &:nth-child(2) {
+                margin: 0 5px;
+            }
+        }
+    }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/evaluate/components/addCandidate.vue b/src/views/evaluate/components/addCandidate.vue
index 45986e2..5825a94 100644
--- a/src/views/evaluate/components/addCandidate.vue
+++ b/src/views/evaluate/components/addCandidate.vue
@@ -1,206 +1,223 @@
 <template>
-    <el-dialog v-model="params.visible" title="新增候选人" width="60%" destroy-on-close>
-        <avue-crud v-model="form" :option="option" :data="data" v-model:page="table.page" :table-loading="table.loading"
-            @row-save="rowSave" @selection-change="selectionChange" @on-load="onLoad">
-            <template #menu="{ row }">
-                <el-popconfirm title="是否确认删除当前候选人?" @confirm="rowDel(row)">
-                    <template #reference>
-                        <el-button text plan type="primary" icon="el-icon-delete">删除</el-button>
-                    </template>
-                </el-popconfirm>
-            </template>
-        </avue-crud>
+    <el-dialog v-model="props.dialogParams.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.dialogParams.visible = false">取消</el-button>
+            <el-button type="primary" @click="submit">确定</el-button>
+        </template>
     </el-dialog>
 </template>
 
 <script setup>
-import { computed, getCurrentInstance, reactive, ref, watch } from 'vue';
-import _ from 'lodash'
-import { ElMessage } from 'element-plus'
-import {
-    getList
-} from '@/api/system/user';
-import {
-    getCandidateList,
-    addCandidate,
-    removeCandidate
-} from '@/api/evaluate/evaluateTask'
+import { computed, markRaw, reactive, ref, watch } from 'vue';
+import { getDeptLazyTree } from '@/api/system/dept.js'
+import { getList } from '@/api/system/user.js'
+import { addCandidate } from '@/api/evaluate/evaluateTask'
+import { ElMessage } from 'element-plus';
 
-const dataSourceStatus = {
-    0: '系统分配',
-    1: '手动添加'
-}
-
-const config = getCurrentInstance().appContext.config.globalProperties
-
-const $props = defineProps({
-    params: {
+const props = defineProps({
+    dialogParams: {
         type: Object,
-        default: () => ({
-            visible: false,
-            type: 0,
-            data: {},
-        }),
-    }
-})
-
-const $emit = defineEmits(['refreshTable'])
-
-const data = ref([])
-const form = ref()
-const table = reactive({
-    loading: false,
-    page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
+        default: () => { }
     },
-    selectionList: [],
 })
 
-const option = reactive({
-    height: '300',
-    tip: false,
-    searchShow: true,
-    searchMenuSpan: 6,
-    border: true,
-    index: true,
-    viewBtn: false,
-    addBtn: true,
-    editBtn: false,
-    delBtn: false,
-    selection: false,
-    refreshBtn: false,
-    dialogClickModal: false,
-    menuFixed: 'right',
-    labelWidth: 100,
-    column: [
+const emits = defineEmits(['refresh'])
+
+const formRef = ref(null)
+
+const form = reactive({
+    userId: '',
+    userName: '',
+    deptId: '',
+    deptName: '',
+    postName: ''
+})
+
+const rules = markRaw({
+    userId: [
         {
-            label: '候选人姓名',
-            prop: 'userId',
-            type: 'select',
-            dicData: [],
-            props: {
-                label: 'name',
-                value: 'id'
-            },
-            control: (val, row) => {
-                const { findObject } = config
-                const column = findObject(option.column, 'userId') || []
-                const params = column.dicData.find(item => item.id === val)
-                if (!params) return
-                row.deptName = params.deptName
-                row.postName = params.postName
-                row.userName = params.name
-            },
-            rules: [
-                {
-                    required: true,
-                    message: '请选择候选人',
-                    trigger: 'blur',
-                },
-            ]
-        },
+            required: true,
+            message: '请选择候选人',
+            trigger: 'click',
+        }
+    ],
+    deptId: [
         {
-            label: '部门',
-            prop: 'deptName',
-            type: 'input',
-            disabled: true,
-        },
-        {
-            label: '部门',
-            prop: 'postName',
-            type: 'input',
-            disabled: true,
-        },
-        {
-            label: '数据来源',
-            prop: 'dataSource',
-            type: 'input',
-            display: false,
-            formatter: (row) => {
-                return dataSourceStatus[row.dataSource] || '系统分配'
-            },
+            required: true,
+            message: '请选择部门',
+            trigger: 'click',
         }
     ]
 })
 
-
-const initData = () => {
-    const { findObject } = config
-    const column = findObject(option.column, 'userId');
-    getList(1, 999999, { userType: 2 }).then(res => {
-        column.dicData = res.data.data.records
-    })
-}
-
-const rowSave = (row, done, loading) => {
-    const { data: { id, taskName } } = $props.params
-    const value = data.value.find(item => item.userId === row.userId)
-    if (value) {
-        ElMessage.warning('当前候选人已存在,不可重复添加!!')
-        loading()
-        return
-    }
-    addCandidate({
-        evaluateTaskId: id,
-        evaluateTaskName: taskName,
-        ...row,
-        dataSource: 1
-    }).then(res => {
-        ElMessage.success('新增候选人成功');
-        onLoad(table.page);
-        done();
-    }, error => {
-        loading();
-        console.log(error);
-    })
-}
-
-const rowDel = ({ id }) => {
-    removeCandidate(id).then(res => {
-        ElMessage.success('删除当前候选人成功');
-        onLoad(table.page);
-    }, error => {
-        ElMessage.error(error);
-        console.log(error);
-    })
-}
-
-const selectionChange = (list) => {
-    table.selectionList = list;
-}
-
-const onLoad = (page, params = {}) => {
-    table.loading = true;
-
-    let values = {
-        evaluateTaskId: $props.params.data.id,
-        ...params
-    };
-    getCandidateList(page.currentPage, page.pageSize, values).then(res => {
-        const candidateRes = res.data.data;
-        table.page.total = candidateRes.total;
-        data.value = candidateRes.records;
-        table.loading = false;
-    });
-}
-
-watch(() => $props.params.visible, (val) => {
-    val && initData();
-}, {
-    deep: true,
-    immediate: true
+const requestParams = reactive({
+    evaluateTaskId: '',
+    evaluateTaskName: '',
+    userId: '',
+    userName: '',
+    deptId: '',
+    deptName: '',
+    postName: ''
 })
 
-const ids = computed(() => {
-    let ids = [];
-    table.selectionList.forEach(ele => {
-        ids.push(ele.id);
-    });
-    return ids.join(',');
+// 当前部门
+const currentDeptId = 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)
+            resovle(res)
+        } else {
+            const { value } = node
+            const res = await initDept(value)
+            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('添加候选人失败')
+        addCandidate(requestParams).then(res => {
+            ElMessage.success('添加候选人成功')
+            props.dialogParams.visible = false
+            emits('refresh')
+        }, error => {
+            ElMessage.error(error)
+        })
+    })
+}
+
+const dialogClose = () => {
+    formRef.value.resetFields()
+}
+
+watch(() => props.dialogParams.visible, (val) => {
+    if (!val) return
+    const { evaluateTaskId, evaluateTaskName } = props.dialogParams.taskParams
+    requestParams.evaluateTaskName = evaluateTaskName
+    requestParams.evaluateTaskId = evaluateTaskId
+}, {
+    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/components/addDialog.vue b/src/views/evaluate/components/addDialog.vue
index f60bc69..33dca40 100644
--- a/src/views/evaluate/components/addDialog.vue
+++ b/src/views/evaluate/components/addDialog.vue
@@ -1,5 +1,5 @@
 <template>
-    <el-dialog v-model="params.visible" :title="params.title" width="70%" destroy-on-close @close="dialogClose">
+    <el-dialog v-model="params.visible" :title="params.title" width="50%" destroy-on-close @close="dialogClose">
         <div class="content">
             <el-form :model="addForm" label-width="170px" :rules="rules" ref="addFormRef">
                 <el-form-item label="任务名称:" prop="taskName">
@@ -11,51 +11,10 @@
                 <el-form-item label="认定标准描述:" prop="remark">
                     <el-input type="textarea" v-model="addForm.remark" placeholder="请输入认定标准描述"></el-input>
                 </el-form-item>
-                <el-form-item :label="params.type ? '评定人:' : '候选部门:'" prop="candidateNum">
-                    <el-select :disabled="!addForm.taskName" v-model="selectGroup" value-key="deptId" multiple style="width: 100%;" placeholder="请选择候选部门"
-                        collapse-tags collapse-tags-tooltip :max-collapse-tags="4">
-                        <el-option v-for="dept in depts" :key="dept.deptId"
-                            :label="dept.employees.length === 0 ? (dept.deptName + '(当前部门下员工人数为0)') : dept.deptName"
-                            :value="dept" :disabled="dept.employees.length === 0"></el-option>
-                    </el-select>
-                    <div class="select-list">
-                        <div v-if="!addForm.taskName">
-                            <el-alert title="请先填写任务名称" type="warning" style="margin-top: 15px;" />
-                        </div>
-                        <div v-else>
-                            <el-form-item label-width="130px" v-for="content in selectGroup" :key="content.deptId"
-                                :label="content.deptName" required class="select-item">
-                                <span v-if="!params.type">
-                                    <el-input-number min="0" :max="content.employees.length || Infinity"
-                                        v-model="content.val" controls-position="right" placeholder="请输入候选人数量"
-                                        class="select-num"></el-input-number>
-                                </span>
-                                <el-select v-model="content.users" value-key="id" multiple collapse-tags
-                                    collapse-tags-tooltip :max-collapse-tags="4"
-                                    :placeholder="params.type ? '请选择评定人' : '请选择候选人'">
-                                    <div class="allSelected">
-                                        <el-checkbox @change="handleEmployeeChange($event, content)">全选</el-checkbox>
-                                    </div>
-                                    <el-option v-for="employee in content.employees" :key="employee.id"
-                                        :label="employee.name" :value="employee"></el-option>
-                                </el-select>
-                                <el-button type="primary" @click="assessorDialog(content)"
-                                    v-if="!params.type">设置评选人</el-button>
-                            </el-form-item>
-                        </div>
-
-                    </div>
-                </el-form-item>
                 <el-form-item :label="`${params.type ? '评优截止日期' : '第一次评优截止日期'}`" prop="candidateCutoffTime">
                     <el-date-picker v-model="addForm.candidateCutoffTime" type="datetimerange" placeholder="请选择截止时间"
                         start-placeholder="请选择开始时间" end-placeholder="请选择结束时间" format="YYYY-MM-DD HH:mm:ss"
                         valueFormat="YYYY-MM-DD HH:mm:ss" style="width: 100%;" />
-                </el-form-item>
-                <el-form-item label="评优数量:" prop="evaluateNum">
-                    <el-input-number min="0" :max="(params.type ? false : maxEvaluateNum) || Infinity"
-                        v-model="addForm.evaluateNum" controls-position="right"
-                        :placeholder="`请输入评优数量${params.type ? '' : '(最多可选' + maxEvaluateNum + '人)'}`"
-                        class="evaluateNum-input"></el-input-number>
                 </el-form-item>
                 <el-form-item label="是否需要进行二次评优:" prop="isAgain" v-if="!params.type">
                     <el-radio-group v-model="addForm.isAgain">
@@ -78,21 +37,14 @@
             </span>
         </template>
     </el-dialog>
-    <set-assessor :params="assessorDialogParams"></set-assessor>
 </template>
 
 <script>
 import website from '@/config/website';
-import { getDeptTree } from '@/api/system/dept';
 import { add, update } from '@/api/evaluate/evaluateTask';
-import { getList } from '@/api/system/user.js';
 import _ from 'lodash';
-import setAssessor from './setAssessor.vue';
 
 export default {
-    components: {
-        setAssessor
-    },
     props: {
         params: {
             type: Object,
@@ -102,7 +54,6 @@
                     title: '新增',
                     isEdit: false,
                     type: 0,
-                    taskData: {},
                     addForm: {},
                 };
             },
@@ -130,13 +81,6 @@
                 evaluateCutoffTime: '',
                 evaluateState: '',
                 isAgain: null,
-                createUser: '',
-                createDept: '',
-                createTime: '',
-                updateUser: '',
-                updateTime: '',
-                status: '',
-                isDeleted: '',
             },
             rules: {
                 taskName: [
@@ -151,14 +95,8 @@
                 type: [
                     { required: true, message: '请选择评优类型', trigger: 'blur' }
                 ],
-                candidateNum: [
-                    { required: true, message: '请选择候选人', trigger: 'click' }
-                ],
                 candidateCutoffTime: [
                     { required: true, message: '请选择候选人截止日期', trigger: 'click' },
-                ],
-                evaluateNum: [
-                    { required: true, message: '请输入评优数量', trigger: 'click' }
                 ],
                 isAgain: [
                     { required: true, message: '请选择是否进行二次评优', trigger: 'click' }
@@ -167,17 +105,12 @@
                     { required: true, message: '请选择评优截止时间', trigger: 'click' },
                 ],
             },
-            maxEvaluateNum: 0,
-            assessorDialogParams: {
-                visible: false,
-                data: []
-            }
+            maxEvaluateNum: 0
         };
     },
     watch: {
         'params.visible': {
             handler(val) {
-                val && this.initData(website.tenantId);
                 this.addForm = this.params.addForm;
                 val && (this.addForm.type = this.params.type + '')
                 if (this.params.isEdit) {
@@ -188,65 +121,30 @@
             deep: true,
             immediate: true,
         },
-        selectGroup: {
-            handler(val) {
-                // this.addForm.candidateNum = 0;
-                // this.addForm.candidateEntities = []
-                val.forEach(item => {
-                    //     const candidates = []
-                    //     item.users.forEach(user => {
-                    //         users.push({
-                    //             id: user.id,
-                    //             name: user.name,
-                    //         });
-                    //     });
-                    // if (!this.params.type) {
-                    //     this.maxEvaluateNum += (item.val * 1);
-                    // } else {
-                    //     this.maxEvaluateNum += item.users.length;
-                    // }
-                    // this.addForm.candidateNum.push({
-                    //     deptId: item.deptId,
-                    //     deptName: item.deptName,
-                    //     val: this.params.type ? item.users.length : item.val,
-                    //     users,
-                    // });
-                });
-            },
-            deep: true,
-        },
     },
     methods: {
         submitOrEdit() {
-            const { candidateNum } = this.addForm
-            const isExist = candidateNum.find(item => item.val === void 0 || item.val === 0 || item.users.length === 0)
-            candidateNum.forEach(candidate => {
-                if (candidate.val > candidate.users.length) {
-                    candidate.val = candidate.users.length
-                }
-            })
-            if (isExist) {
-                this.$message.warning(`${isExist.deptName}候选人人数不可为空或者0`)
-            } else {
-                Object.keys(this.addForm).forEach(key => {
-                    if (['evaluateCutoffTime', 'candidateCutoffTime'].includes(key)) {
-                        const [start, end] = this.addForm[key]
-                        if (key === 'candidateCutoffTime') {
-                            this.addForm.candidateCutoffTimeStart = start
-                            this.addForm.candidateCutoffTimeEnd = end
-                        } else if (this.addForm.isAgain) {
-                            this.addForm.evaluateCutoffTimeStart = start
-                            this.addForm.evaluateCutoffTimeEnd = end
-                        }
-                    }
-                })
-                this.params.isEdit ? this.handleEdit() : this.handleSubmit()
-            }
+            this.params.isEdit ? this.handleEdit() : this.handleSubmit()
         },
         handleSubmit() {
             this.$refs.addFormRef.validate(valid => {
-                this.params.type && (this.addForm.evaluateState = 1)
-                valid && add(this.addForm).then(
+                this.params.type && (data.evaluateState = 1)
+                if (!valid) return
+                const data = _.cloneDeep(this.addForm)
+                Object.keys(data).forEach(key => {
+                    if (['candidateCutoffTime', 'evaluateCutoffTime'].includes(key)) {
+                        const [start, end] = this.addForm[key]
+                        if (key === 'candidateCutoffTime') {
+                            data.candidateCutoffTimeStart = start
+                            data.candidateCutoffTimeEnd = end
+                        } else {
+                            data.evaluateCutoffTimeStart = start
+                            data.evaluateCutoffTimeEnd = end
+                        }
+                        delete data[key]
+                    }
+                })
+                add(data).then(
                     () => {
                         this.$message({
                             type: 'success',
@@ -290,79 +188,10 @@
             });
             this.params.visible = false;
         },
-        async initData(tenantId) {
-            const deptTreeRes = await getDeptTree(tenantId)
-            let deptList = []
-            const cloneDeptTreeRes = _.cloneDeep(deptTreeRes.data.data)
-            // 扁平化deptTree
-            cloneDeptTreeRes.forEach(item => {
-                deptList.push(item);
-                if (item.children) {
-                    item.children.forEach(ic => {
-                        ic.title = item.title + '/' + ic.title;
-                    })
-                    deptList = deptList.concat(item.children);
-                    delete item.children;
-                }
-            })
-            const depts_list = _.cloneDeep(deptList)
-            this.depts = []
-            for (const dept of depts_list) {
-                const employeeRes = await getList(1, 99999, { userType: 2 }, dept.id)
-                const { records } = employeeRes.data.data
-                this.depts.push({
-                    deptId: dept.id,
-                    deptName: dept.title,
-                    users: [],
-                    employees: records
-                });
-            }
-            const params = _.cloneDeep(this.params.addForm.candidateNum) || []
-            const newParams = params.map(item => {
-                const value = this.depts.find(dept => item.deptId === dept.deptId);
-                item.employees = value?.employees || [];
-                return item
-            })
-            let defaultUsers = []
-            newParams.forEach(item => {
-                const users = item.users.filter(user => item.employees.find(employee => employee.id === user.id))
-                // 判断当前item.users和users的区别
-                defaultUsers = item.users.filter(iUser => !users.includes(iUser))
-                // 改变为修改后的users
-                item.users = users
-            })
-            const resParams = newParams.filter(item => item.employees.length > 0 && item.users.length > 0)
-            this.selectGroup = resParams
-            // 是否有修改的user, 有的话去修改
-            defaultUsers.length > 0 && update(this.addForm)
-        },
-        handleEmployeeChange(val, content) {
-            console.log(this.params);
-            if (val) {
-                content.users = []
-                content.employees.forEach(item => {
-                    content.users.push({
-                        id: item.id,
-                        name: item.name
-                    })
-                })
-            } else {
-                content.users = []
-            }
-        },
         dialogClose() {
             this.selectGroup = []
             this.$refs.addFormRef.resetFields()
         },
-        assessorDialog(value) {
-            if (value.users.length == 0) {
-                return this.$message.warning('请选择候选人')
-            }
-            this.assessorDialogParams = {
-                visible: true,
-                data: value
-            }
-        }
     },
 };
 </script>
diff --git a/src/views/evaluate/components/selectAssessor.vue b/src/views/evaluate/components/selectAssessor.vue
new file mode 100644
index 0000000..0167ba2
--- /dev/null
+++ b/src/views/evaluate/components/selectAssessor.vue
@@ -0,0 +1,226 @@
+<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 { addAssessorSubmit } from '@/api/evaluate/evaluateTask'
+import { ElMessage } from 'element-plus';
+
+const props = defineProps({
+    params: {
+        type: Object,
+        default: () => {
+            return {
+                visible: false,
+                evaluateCandidateId: ''
+            }
+        }
+    },
+})
+
+const emits = defineEmits(['refresh'])
+
+const formRef = ref(null)
+
+const form = reactive({
+    userId: '',
+    userName: '',
+    deptId: '',
+    deptName: '',
+    postName: ''
+})
+
+const rules = markRaw({
+    userId: [
+        {
+            required: true,
+            message: '请选择候选人',
+            trigger: 'click',
+        }
+    ],
+    deptId: [
+        {
+            required: true,
+            message: '请选择部门',
+            trigger: 'click',
+        }
+    ]
+})
+
+const requestParams = reactive({
+    evaluateCandidateId: '',
+    userId: '',
+    userName: '',
+    deptId: '',
+    deptName: '',
+    postName: ''
+})
+
+// 当前部门
+const currentDeptId = 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)
+            resovle(res)
+        } else {
+            const { value } = node
+            const res = await initDept(value)
+            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 => {
+        console.log(requestParams);
+        if (!valid) return ElMessage.error('添加评选人失败')
+        addAssessorSubmit(requestParams).then(res => {
+            ElMessage.success('添加评选人成功')
+            props.params.visible = false
+            emits('refresh')
+        }, error => {
+            ElMessage.error(error)
+        })
+    })
+}
+
+const dialogClose = () => {
+    formRef.value.resetFields()
+}
+
+watch(() => props.params.visible, (val) => {
+    if (!val) return
+    requestParams.evaluateCandidateId = props.params.evaluateCandidateId
+}, {
+    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/components/setAssessor.vue b/src/views/evaluate/components/setAssessor.vue
deleted file mode 100644
index 48395d8..0000000
--- a/src/views/evaluate/components/setAssessor.vue
+++ /dev/null
@@ -1,74 +0,0 @@
-<template>
-    <el-dialog v-model="props.params.visible" title="评定人设置" width="50%" destroy-on-close>
-        <avue-crud :data="table.data" :option="option">
-            <template #menu="{ row }">
-                <el-button type="primary" text icon="el-icon-plus">添加评定人</el-button>
-            </template>
-        </avue-crud>
-    </el-dialog>
-</template>
-
-<script setup>
-import { markRaw, reactive, watch } from 'vue';
-
-const props = defineProps({
-    params: {
-        type: Object,
-        default: () => {
-            return {
-                visible: false,
-                data: []
-            }
-        },
-    }
-})
-
-const table = reactive({
-    data: [],
-})
-
-const option = markRaw({
-    height: '300',
-    calcHeight: 30,
-    tip: false,
-    searchShow: true,
-    searchMenuSpan: 6,
-    border: true,
-    index: true,
-    viewBtn: false,
-    addBtn: false,
-    editBtn: false,
-    delBtn: false,
-    selection: false,
-    dialogClickModal: false,
-    menuWidth: 130,
-    header: false,
-    column: [
-        {
-            label: "姓名",
-            prop: 'name',
-            type: 'input',
-            width: 100
-        },
-        {
-            label: '评定人',
-            type: 'input'
-        }
-    ]
-})
-
-const initTableData = (data) => {
-    const { users } = data
-    table.data = users
-}
-
-watch(() => props.params.visible, (val) => {
-    val && initTableData(props.params.data)
-}, {
-    deep: true,
-    immediate: true
-})
-
-</script>
-
-<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/src/views/evaluate/components/taskSetting.vue b/src/views/evaluate/components/taskSetting.vue
new file mode 100644
index 0000000..c178dc4
--- /dev/null
+++ b/src/views/evaluate/components/taskSetting.vue
@@ -0,0 +1,168 @@
+<template>
+    <el-dialog v-model="props.params.visible" :title="`${taskParams.evaluateTaskName}-候选人列表`" width="60%" destroy-on-close
+        align-center>
+        <avue-crud :data="table.data" :option="candidatesOptions" v-model:page="table.page" @refresh-change="refreshChange">
+            <template #menu-left>
+                <el-button type="primary" icon="el-icon-plus" @click="addCandidateDialog">新增候选人</el-button>
+            </template>
+            <template #menu="{ row }">
+                <el-button type="primary" icon="el-icon-plus" text plain @click="addAssessor(row)">添加评定人</el-button>
+                <el-popconfirm width="200px" title="是否删除当前候选人?" @confirm="rowDel(row)">
+                    <template #reference>
+                        <el-button type="danger" icon="el-icon-delete" text plain>删除</el-button>
+                    </template>
+                </el-popconfirm>
+            </template>
+        </avue-crud>
+        <addCandidate v-model:dialogParams="dialogParams" @refresh="refreshChange" />
+        <addAssessors v-model:params="dialogAssessorParams" @refresh="refreshChange" />
+    </el-dialog>
+</template>
+
+<script setup>
+import addCandidate from './addCandidate.vue';
+import addAssessors from './addAssessors.vue';
+import { markRaw, reactive, watch } from 'vue';
+import { getCandidateList, removeCandidate } from '@/api/evaluate/evaluateTask'
+import { ElMessage } from 'element-plus';
+
+const dialogParams = reactive({
+    visible: false,
+    taskParams: {}
+})
+
+const props = defineProps({
+    params: {
+        type: Object,
+        default: () => ({
+            visible: false,
+            task: {}
+        }),
+    },
+})
+
+const candidatesOptions = markRaw({
+    height: '400',
+    calcHeight: 30,
+    tip: false,
+    searchShow: true,
+    searchMenuSpan: 6,
+    border: true,
+    index: true,
+    viewBtn: false,
+    addBtn: false,
+    editBtn: false,
+    delBtn: false,
+    selection: false,
+    dialogClickModal: false,
+    menuFixed: 'right',
+    labelWidth: '70',
+    column: [
+        {
+            label: '任务id',
+            prop: 'evaluateTaskId',
+            type: 'input',
+            hide: true,
+        },
+        {
+            label: '任务名称',
+            prop: 'evaluateTaskName',
+            type: 'input'
+        },
+        {
+            label: '候选人id',
+            prop: 'userId',
+            type: 'input',
+            hide: true,
+        },
+        {
+            label: '候选人姓名',
+            prop: 'userName',
+            type: 'input'
+        },
+        {
+            label: '部门id',
+            prop: 'deptId',
+            type: 'input',
+            hide: true,
+        },
+        {
+            label: '部门名称',
+            prop: 'deptName',
+            type: 'input'
+        },
+        {
+            label: '职位名称',
+            prop: 'postName',
+            type: 'input'
+        }
+    ]
+})
+
+const table = reactive({
+    data: [],
+    page: {
+        current: 1,
+        size: 10,
+        total: 0
+    }
+})
+
+const taskParams = reactive({
+    evaluateTaskId: '',
+    evaluateTaskName: '',
+})
+
+const addCandidateDialog = () => {
+    dialogParams.visible = true
+    dialogParams.taskParams = taskParams
+}
+
+const initTableData = () => {
+    const { current, size } = table.page
+    getCandidateList(current, size, { evaluateTaskId: taskParams.evaluateTaskId }).then(res => {
+        const resultData = res.data.data
+        table.data = resultData.records
+        table.page.total = resultData.total
+    })
+}
+
+const refreshChange = () => {
+    table.data = [],
+        table.page.total = 0
+    initTableData()
+}
+
+const dialogAssessorParams = reactive({
+    visible: false,
+    taskInfo: {},
+    candidateInfo: {}
+})
+
+const addAssessor = (row) => {
+    dialogAssessorParams.visible = true
+    dialogAssessorParams.taskInfo = taskParams
+    dialogAssessorParams.candidateInfo = row
+}
+
+const rowDel = (row) => {
+    removeCandidate(row.id).then(res => {
+        ElMessage.success('删除候选人成功')
+        refreshChange()
+    }, error => {
+        ElMessage.error(error)
+    })
+}
+
+watch(() => props.params.visible, (val) => {
+    if (!val) return
+    const { id, taskName } = props.params.task
+    taskParams.evaluateTaskId = id
+    taskParams.evaluateTaskName = taskName
+    initTableData()
+}, {
+    deep: true
+})
+</script>
+
+<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/src/views/evaluate/components/viewEvaluateDetail.vue b/src/views/evaluate/components/viewEvaluateDetail.vue
index 1b352f8..d22cf1e 100644
--- a/src/views/evaluate/components/viewEvaluateDetail.vue
+++ b/src/views/evaluate/components/viewEvaluateDetail.vue
@@ -1,388 +1,10 @@
 <template>
-    <el-dialog title="信息预览" v-model="params.visible" width="70%">
-        <div class="descriptions">
-            <div class="descriptions-item" v-for="item in taskDateil" :key="item.prop" :style="{ width: item.width }">
-                <div class="label">{{ item.title }}</div>
-                <div class="value" v-if="!item.isSlot">{{ item.value }}</div>
-                <div class="table" v-else>
-                    <template v-if="item.evaluateState === 2">
-                        <avue-crud :option="item.option" :data="item.data" ref="crud" @current-change="currentChange"
-                            @size-change="sizeChange" @refresh-change="refreshChange"></avue-crud>
-                    </template>
-                    <template v-else>当前任务暂未结束</template>
-                </div>
-            </div>
-        </div>
-    </el-dialog>
+
 </template>
 
 <script setup>
-import { reactive, watch, getCurrentInstance, ref } from 'vue';
-import {
-    getCandidateList,
-    getFinallyResult,
-    getSectionFinallyResult
-} from '@/api/evaluate/evaluateTask'
-import _ from 'lodash'
 
-const { findObject } = getCurrentInstance().appContext.config.globalProperties;
-
-
-const props = defineProps({
-    params: {
-        type: Object,
-        default: () => ({
-            visible: false,
-            data: {},
-        }),
-    }
-})
-
-const page = reactive({
-    current: 1,
-    size: 10,
-    total: 0
-})
-
-const taskDateil = ref(null)
-
-const personOption = reactive([
-    {
-        title: '任务名称',
-        prop: 'taskName',
-        value: '',
-        width: 'calc(100% / 3)'
-    },
-    {
-        title: '任务类别',
-        prop: 'taskType',
-        value: '',
-        width: 'calc(100% / 3)'
-    },
-    {
-        title: '评定标准',
-        prop: 'remark',
-        value: '',
-        width: 'calc(100% / 3)'
-    },
-    {
-        title: '候选人截止日期',
-        prop: 'candidateCutoffTime',
-        value: '',
-        width: '50%'
-    },
-    {
-        title: '评优截止日期',
-        prop: 'evaluateCutoffTime',
-        value: '',
-        width: '50%'
-    },
-    {
-        title: '候选人状态',
-        prop: 'candidateState',
-        value: '',
-        width: 'calc(100% / 3)'
-    },
-    {
-        title: '评优评先状态',
-        prop: 'evaluateState',
-        value: '',
-        width: 'calc(100% / 3)'
-    },
-    {
-        title: '评优数量',
-        prop: 'evaluateNum',
-        value: '',
-        width: 'calc(100% / 3)'
-    },
-    {
-        title: '候选人数量',
-        prop: 'candidateNum',
-        value: '',
-        width: '100%'
-    },
-    {
-        title: '候选结果',
-        prop: 'candidateResult',
-        value: '',
-        width: '100%'
-    },
-    {
-        title: '最终评定结果',
-        prop: 'finallyResult',
-        isSlot: true,
-        width: '100%',
-        evaluateState: 0,
-        data: [],
-        option: {
-            height: 260,
-            calcHeight: 30,
-            tip: false,
-            searchShow: true,
-            border: true,
-            index: true,
-            dialogClickModal: false,
-            menu: false,
-            menuLeft: false,
-            header: false,
-            menuFixed: 'right',
-            column: [{
-                label: '评优项目',
-                prop: 'evaluateTaskName',
-                type: 'input',
-            },
-            {
-                label: '候选人',
-                prop: 'userName',
-                type: 'input',
-            },
-            {
-                label: '部门',
-                prop: 'deptName',
-                type: 'input'
-            },
-            {
-                label: '票数',
-                prop: 'voteNum',
-                type: 'input'
-            }],
-        }
-    }
-])
-
-const sectionOption = reactive([
-    {
-        title: '任务名称',
-        prop: 'taskName',
-        value: '',
-        width: 'calc(100% / 3)'
-    },
-    {
-        title: '任务类别',
-        prop: 'taskType',
-        value: '',
-        width: 'calc(100% / 3)'
-    },
-    {
-        title: '评定标准',
-        prop: 'remark',
-        value: '',
-        width: 'calc(100% / 3)'
-    },
-    {
-        title: '候选人截止日期',
-        prop: 'candidateCutoffTime',
-        value: '',
-        width: '50%'
-    },
-    {
-        title: '评优截止日期',
-        prop: 'evaluateCutoffTime',
-        value: '',
-        width: '50%'
-    },
-    {
-        title: '评优评先状态',
-        prop: 'evaluateState',
-        value: '',
-        width: '50%'
-    },
-    {
-        title: '评优数量',
-        prop: 'evaluateNum',
-        value: '',
-        width: '50%'
-    },
-    {
-        title: '评优人数量',
-        prop: 'candidateNum',
-        value: '',
-        width: '100%'
-    },
-    {
-        title: '最终评定结果',
-        prop: 'finallyResult',
-        isSlot: true,
-        width: '100%',
-        evaluateState: 0,
-        data: [],
-        option: {
-            height: 260,
-            calcHeight: 30,
-            tip: false,
-            searchShow: true,
-            border: true,
-            index: true,
-            dialogClickModal: false,
-            menu: false,
-            menuLeft: false,
-            header: false,
-            menuFixed: 'right',
-            column: [{
-                label: '评优项目',
-                prop: 'evaluateTaskName',
-                type: 'input',
-            },
-            {
-                label: '部门',
-                prop: 'deptName',
-                type: 'input'
-            },
-            {
-                label: '票数',
-                prop: 'voteNum',
-                type: 'input'
-            }],
-        }
-    }
-])
-
-watch(() => props.params.visible, (val) => {
-    if (!val) return
-    initData()
-}, {
-    deep: true
-})
-
-const candidateList = () => {
-    let values = {
-        evaluateTaskId: props.params.data.id
-    };
-    return getCandidateList(1, 99999, values).then(res => {
-        const candidateRes = res.data.data.records;
-        return candidateRes
-    });
-}
-
-const getFinallyList = () => {
-    const { type } = props.params
-    const { id, evaluateNum } = props.params.data
-    const params = {
-        evaluateTaskId: id,
-        current: 1,
-        size: evaluateNum,
-        type: !type ? 2 : 1
-    }
-    return (!type ? getFinallyResult(params) : getSectionFinallyResult(params)).then(res => {
-        return res.data.data.records
-    })
-}
-
-const initData = async () => {
-    const data = props.params.data
-    taskDateil.value = !props.params.type ? personOption : sectionOption
-    const status = {
-        0: '未开始',
-        1: '进行中',
-        2: '已完成'
-    }
-
-    for (const item of taskDateil.value) {
-        item.value = data[item.prop] || '暂未完善'
-
-        if (['candidateState', 'evaluateState'].includes(item.prop)) {
-            item.value = status[data[item.prop]]
-            if (item.prop === 'evaluateState') {
-                const obj = taskDateil.value.find(s => s.prop === 'finallyResult')
-                obj.evaluateState = data[item.prop]
-            }
-        }
-        
-        if (item.prop === 'candidateNum') {
-            const candidateNumStrArr = []
-            const { candidateNum } = _.cloneDeep(data)
-            candidateNum.forEach(item => {
-                const userList = []
-                item.users.forEach(user => {
-                    userList.push(user.name)
-                })
-                candidateNumStrArr.push(`${item.deptName}(${item.users.length}人):${userList.join('、')}`)
-            })
-            item.value = candidateNumStrArr.join('\n')
-        }
-
-        if (item.prop === 'candidateResult') {
-            const res = await candidateList()
-            if (res.length == 0) {
-                item.value = '暂无候选人'
-            } else {
-                const candidates = {}
-                const candidateStrArr = []
-                const { candidateNum } = data
-                candidateNum.forEach(candidate => {
-                    res.forEach(r => {
-                        const value = candidate.users.find(user => user.id === r.userId)
-                        if (value) {
-                            if (candidates[candidate.deptName] === void 0) {
-                                candidates[candidate.deptName] = []
-                            }
-                            candidates[candidate.deptName].push(value.name)
-                        }
-                    })
-                })
-                Object.keys(candidates).forEach(key => { candidateStrArr.push(`${key}(${candidates[key].length}人):${candidates[key].join('、')}`) })
-                item.value = candidateStrArr.join('\n')
-                console.log(candidateStrArr.join('\n'));
-            }
-        }
-
-        if (item.prop === 'finallyResult') {
-            const res = await getFinallyList()
-            item.data = res
-        }
-    }
-
-    console.log(taskDateil.value);
-
-}
 </script>
 
 <style lang="scss" scoped>
-.descriptions {
-    width: 100%;
-    display: flex;
-    flex-wrap: wrap;
-
-    border: {
-        top: 1px solid #eeeded;
-        right: 1px solid #eeeded;
-    }
-
-
-    .descriptions-item {
-        display: flex;
-        box-sizing: border-box;
-
-        border: {
-            bottom: 1px solid #eeeded;
-            left: 1px solid #eeeded;
-        }
-
-        .label,
-        .value {
-            padding: 10px 5px;
-            display: flex;
-            align-items: center;
-        }
-
-        .label {
-            width: 100px;
-            flex-shrink: 0;
-            white-space: nowrap;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            background-color: aliceblue;
-            border-right: 1px solid #eeeded;
-        }
-
-        .value {
-            white-space: pre-line;
-        }
-
-        .table {
-            padding: 10px;
-            width: calc(100% - 20px);
-        }
-    }
-}
 </style>
\ No newline at end of file
diff --git a/src/views/evaluate/evaluateTask.vue b/src/views/evaluate/evaluateTask.vue
index 2de84f1..eefa465 100644
--- a/src/views/evaluate/evaluateTask.vue
+++ b/src/views/evaluate/evaluateTask.vue
@@ -13,37 +13,21 @@
         <!-- <el-button type="warning" plain icon="el-icon-download" @click="handleExport">导出</el-button> -->
       </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" text plain icon="el-icon-setting" @click="taskSettingDialog(row)">任务配置</el-button>
+        <!-- <el-button type="primary" text plain icon="el-icon-view" @click="viewDateilDialog(row)">详情</el-button> -->
         <!-- <el-button type="primary" text plain icon="el-icon-edit" @click="editDialog(row)">编辑</el-button> -->
         <el-button type="primary" text plain icon="el-icon-position" @click="publicTimeBtn(row)"
           v-if="row.candidateState === 2 && row.evaluateState === 0">发布</el-button>
-        <el-button type="primary" v-if="row.type === 0 && row.candidateState === 2 && row.evaluateState === 0" text plain icon="el-icon-plus"
-          @click="addCandidateHandle(row)">新增候选人</el-button>
         <!-- <el-button type="primary" text plain icon="el-icon-download">导出</el-button> -->
         <el-button type="danger" text plain icon="el-icon-delete" @click="rowDel(row)">删除</el-button>
       </template>
     </avue-crud>
-    <!-- 发布弹窗 -->
-    <el-dialog v-model="dialogVisible" title="发布" width="500px">
-      <el-form :model="publicForm" :rules="publicRules" ref="publicFormRef">
-        <el-form-item label="评优评先截止时间:" prop="publicData">
-          <el-date-picker v-model="publicForm.publicData" type="datetime" placeholder="请选择截止时间"
-            value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%;" />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="dialogVisible = false">取消</el-button>
-          <el-button type="primary" @click="timeSubmit">确认</el-button>
-        </span>
-      </template>
-    </el-dialog>
     <!-- 新增编辑弹窗 -->
-    <addDialog :params="addParams" @refreshTable="this.onLoad" />
-    <!-- 新增候选人 -->
-    <addCandidate :params="addCandidateParams" @refreshTable="this.onLoad" />
+    <add-dialog :params="addParams" @refreshTable="this.onLoad" />
+    <!-- 候选人添加及配置 -->
+    <task-setting :params="taskSettingParams" />
     <!-- 预览弹窗 -->
-    <viewEvaluateDetail :params="viewEvaluateDetailParams" />
+    <!-- <viewEvaluateDetail :params="viewEvaluateDetailParams" /> -->
   </basic-container>
 </template>
 
@@ -57,15 +41,14 @@
 import { dateNow } from '@/utils/date';
 import NProgress from 'nprogress';
 import 'nprogress/nprogress.css';
-import addDialog from './components/addDialog.vue';
-import addCandidate from './components/addCandidate.vue';
+import addDialog from './components/addDialog.vue';;
 import viewEvaluateDetail from './components/viewEvaluateDetail.vue';
-import { getDeptTree } from '@/api/system/dept';
+import taskSetting from './components/taskSetting.vue';
 
 export default {
   components: {
     addDialog,
-    addCandidate,
+    taskSetting,
     viewEvaluateDetail
   },
   data() {
@@ -83,16 +66,6 @@
       selectionList: [],
       option: option,
       data: [],
-      // 发布弹窗
-      dialogVisible: false,
-      publicForm: {
-        publicData: '',
-      },
-      publicRules: {
-        publicData: [
-          { required: true, message: '请选择发布时间', trigger: 'click' },
-        ]
-      },
       isAddDialogVisible: false,
       addParams: {},
       viewParams: {},
@@ -111,8 +84,8 @@
           },
         ],
       },
-      // 新增候选人params
-      addCandidateParams: {},
+      // 任务设置参数
+      taskSettingParams: {},
       // 信息预览弹窗
       viewEvaluateDetailParams: {},
     };
@@ -333,66 +306,15 @@
         this.selectionClear();
       });
     },
-    deptData() {
-      return getDeptTree(this.website.tenantId).then(deptResult => {
-        const result = deptResult.data.data;
-        let deptList = [];
-        result.forEach(dept => {
-          if (dept.children) {
-            deptList = result.concat(dept.children);
-            delete dept.children;
-          } else {
-            deptList.push(dept);
-          }
-        });
-        return deptList;
-      });
-    },
-    publicTimeBtn(row) {
-      this.rowData = row;
-      this.dialogVisible = true;
-    },
-    // 发布
-    timeSubmit() {
-      this.$refs.publicFormRef.validate(valid => {
-        if (!valid) return
-        const { id } = this.rowData;
-        const params = {
-          id,
-          // candidateState: 1,
-          evaluateState: 1,
-          evaluateCutoffTime: this.publicForm.publicData,
-        };
-        update(params).then(
-          res => {
-            this.$message({
-              type: 'success',
-              message: '操作成功!',
-            });
-            this.refreshChange();
-          },
-          error => {
-            this.$message({
-              type: 'success',
-              message: error,
-            });
-          }
-        );
-        this.dialogVisible = false;
-      })
-    },
-    addCandidateHandle(row) {
-      this.addCandidateParams = {
-        visible: true,
-        type: 0,
-        data: {
-          ...row
-        }
-      }
-    },
     tabChange(value) {
       this.defaultTaskType = value.prop;
     },
+    taskSettingDialog(row) {
+      this.taskSettingParams = {
+        visible: true,
+        task: row
+      }
+    }
   },
 };
 </script>

--
Gitblit v1.9.3