From d13cebe7fbadd396e91a989af331df8a8e7b40f8 Mon Sep 17 00:00:00 2001
From: xieb <vip_xiaobin810@163.com>
Date: Tue, 21 Jan 2025 11:40:42 +0800
Subject: [PATCH] 考核结果查看详情

---
 src/views/evaluate/components/viewEvaluateDetail.vue |  367 ++++++++++++++++++++--------------------------------
 1 files changed, 142 insertions(+), 225 deletions(-)

diff --git a/src/views/evaluate/components/viewEvaluateDetail.vue b/src/views/evaluate/components/viewEvaluateDetail.vue
index d0657b2..fa20021 100644
--- a/src/views/evaluate/components/viewEvaluateDetail.vue
+++ b/src/views/evaluate/components/viewEvaluateDetail.vue
@@ -1,262 +1,179 @@
 <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>
-                    <avue-crud :option="item.option" :data="item.data" ref="crud" @current-change="currentChange"
-                        @size-change="sizeChange" @refresh-change="refreshChange"></avue-crud>
-                </div>
-            </div>
-        </div>
-    </el-dialog>
+    <el-drawer v-model="props.params.visible" @open="openDrawer" direction="rtl" size="50%">
+        <template #header>
+            <div class="drawer-title">{{ props.params.data?.taskName || '评优任务详情' }}</div>
+        </template>
+        <el-collapse v-model="collapseParams.activeNames">
+            <el-collapse-item v-if="!type()" title="当前任务评优奖项" name="1">
+                <ul class="type-list">
+                    <li class="type-item">
+                        <div class="title">奖项</div>
+                        <div class="introduction">认定标准</div>
+                        <div class="number">名额</div>
+                    </li>
+                    <li class="type-item" v-for="(item, index) in collapseParams.categoryEntities" :key="index">
+                        <div class="title">{{ item.categoryName }}</div>
+                        <el-tooltip effect="dark" placement="top">
+                            <template #content>
+                                <p style="max-width: 500px;">{{ item.standard }}</p>
+                            </template>
+                            <div class="introduction">
+                                {{ item.standard }}
+                            </div>
+                        </el-tooltip>
+
+                        <div class="number">{{ item.peopleNum }}人</div>
+                    </li>
+                </ul>
+            </el-collapse-item>
+            <el-collapse-item v-if="!type()" name="2">
+                <template #title>
+                    第一轮候选结果
+                    <el-tag 
+                        style="margin-left: 10px;" 
+                        :type="status[props.params.data.candidateState].type">
+                        当前状态:{{ status[props.params.data.candidateState].text }}
+                    </el-tag>
+                </template>
+                <firstRoundResult :params="{ data: props.params.data }" />
+            </el-collapse-item>
+            <el-collapse-item name="3">
+                <template #title>
+                    最终评优结果
+                    <el-tag 
+                        style="margin-left: 10px;" 
+                        :type="status[props.params.data.evaluateState].type">
+                        当前状态:{{ status[props.params.data.evaluateState].text }}
+                    </el-tag>
+                </template>
+                <secondRoundResult :params="{ data: props.params.data }" />
+            </el-collapse-item>
+        </el-collapse>
+    </el-drawer>
 </template>
 
 <script setup>
-import { reactive, watch } from 'vue';
-import {
-    getCandidateList,
-    getFinallyResult
-} from '@/api/evaluate/evaluateTask'
+import firstRoundResult from './firstRoundResult.vue';
+import secondRoundResult from './secondRoundResult.vue';
+import { inject, markRaw, onMounted, reactive } from 'vue';
+import { getEcList } from '@/api/evaluate/evaluateTask'
 
 const props = defineProps({
     params: {
         type: Object,
-        default: () => ({
-            visible: false,
-            data: {},
-        }),
+        default: () => {
+            return {
+                visible: false,
+                data: {}
+            }
+        }
     }
 })
 
-const page = reactive({
+const type = inject('type')
+
+const status = markRaw({
+    0: {
+        text: '未开始',
+        type: 'warning'
+    },
+    1: {
+        text: '进行中',
+        type: 'success'
+    },
+    2: {
+        text: '已完成',
+        type: 'primary'
+    },
+})
+
+const collapseParams = reactive({
+    activeNames: ['1'],
+    categoryEntities: []
+})
+
+const pageParams = reactive({
     current: 1,
     size: 10,
     total: 0
 })
 
-const taskDateil = 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: '50%'
-    },
-    {
-        title: '评优评先状态',
-        prop: 'evaluateState',
-        value: '',
-        width: '50%'
-    },
-    {
-        title: '候选结果',
-        prop: 'candidateResult',
-        value: '',
-        width: '100%'
-    },
-    {
-        title: '最终评定结果',
-        prop: 'finallyResult',
-        isSlot: true,
-        width: '100%',
-        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: '',
-                //     type: 'input',
-                // },
-                {
-                    label: '候选人',
-                    prop: 'userName',
-                    type: 'input',
-                },
-                {
-                    label: '部门',
-                    prop: 'deptName',
-                    type: 'input'
-                },
-                {
-                    label: '票数',
-                    prop: 'voteNum',
-                    type: 'input'
-                }
-            ]
-        }
-    }
-])
-
-watch(() => props.params.visible, (val) => {
-    val && initData()
-}, {
-    deep: true
+const currentTaskParams = reactive({
+    data: {}
 })
 
-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 { id, evaluateNum } = props.params.data
-    const params = {
-        evaluateTaskId: id,
-        current: 1,
-        size: evaluateNum
-    }
-    return getFinallyResult(params).then(res => {
-        return res.data.data.records
+const openDrawer = () => {
+    const { id } = props.params.data
+    const { current, size } = pageParams
+    getEcList(current, size, id).then(ecResult => {
+        const { code, data: { records } } = ecResult.data
+        if (code !== 200) return this.$message.error('评优类别加载失败')
+        collapseParams.categoryEntities = records
     })
+    currentTaskParams.data = props.params.data
+    collapseParams.activeNames = !type() ? ['1'] : ['3']
 }
 
-const initData = async () => {
-    const data = props.params.data
-    const status = {
-        0: '未开始',
-        1: '进行中',
-        2: '已完成'
-    }
-
-    for (const item of taskDateil) {
-        item.value = data[item.prop] || '暂未完善'
-
-        if (['candidateState', 'evaluateState'].includes(item.prop)) {
-            item.value = status[item.value]
-        }
-
-        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(item.data);
-        }
-    }
-
-    // 获取当前数据
-}
 </script>
 
 <style lang="scss" scoped>
-.descriptions {
+$borderColor: var(--el-border-color);
+
+.drawer-title {
+    border-left: 3px solid #409eff;
+    padding-left: 10px;
+}
+
+.type-list {
+    margin: 0;
+    padding: 0;
+    list-style-type: none;
     width: 100%;
-    display: flex;
-    flex-wrap: wrap;
+    border: 1px solid $borderColor;
+    border-radius: var(--el-border-radius-base);
+    box-sizing: border-box;
 
-    border: {
-        top: 1px solid #eeeded;
-        right: 1px solid #eeeded;
-    }
-
-
-    .descriptions-item {
+    .type-item {
         display: flex;
-        box-sizing: border-box;
+        height: 40px;
+        line-height: 40px;
+        text-align: center;
 
-        border: {
-            bottom: 1px solid #eeeded;
-            left: 1px solid #eeeded;
-        }
-
-        .label,
-        .value {
-            padding: 10px 5px;
-            display: flex;
-            align-items: center;
-        }
-
-        .label {
-            width: 100px;
+        div {
+            border-bottom: 1px solid $borderColor;
             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);
+        .title {
+            flex: 2;
+        }
+
+        .introduction {
+            flex: 5;
+            flex-shrink: 0;
+
+            border: {
+                right: 1px solid $borderColor;
+                left: 1px solid $borderColor;
+            }
+        }
+
+        .number {
+            flex: 1;
+        }
+
+        .tool {
+            flex: 2;
+            border-left: 1px solid $borderColor;
+        }
+
+        &:last-child {
+            div {
+                border-bottom: 0;
+            }
         }
     }
 }

--
Gitblit v1.9.3