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/addCandidate.vue |  383 ++++++++++++++++++++++++++++--------------------------
 1 files changed, 200 insertions(+), 183 deletions(-)

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

--
Gitblit v1.9.3