123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- <script setup lang="ts">
- defineOptions({
- name: "AssessmentRank"
- });
- import { ref, onMounted } from "vue";
- import { Search } from "@element-plus/icons-vue";
- import {
- getAssessmentPageList,
- getPageScoreInfoByAssessment
- } from "@/api/manage";
- import { ElMessage } from "element-plus";
- import { useRouter } from "vue-router";
- import { useAppStoreHook } from "@/store/modules/app";
- // 考核活动点击交互
- const activityList: any = ref([]);
- const activeActivity = ref(0);
- const activeObj = ref({});
- const myTable = ref(null);
- const handleActiveActivity = (item: any, index: number) => {
- tableData.value = [];
- myTable.value && myTable.value.clearSort();
- activeActivity.value = index;
- activeObj.value = item;
- getPageScoreInfoByAssessmentApi(item);
- };
- // 考核活动数据
- const getAssessmentPageListApi = async (name = "") => {
- const params: {
- pageNumber: number;
- pageSize: number;
- assessmentType: number;
- name?: string;
- } = {
- pageNumber: 1,
- pageSize: 999999,
- assessmentType: 0 // 0:员工,1:部门,2:医疗组,3:部门负责人
- };
- if (name) {
- params.name = name;
- }
- const { code, msg, data } = await getAssessmentPageList(params);
- if (code === 200) {
- activityList.value = data.records || [];
- if (activityList.value && activityList.value.length) {
- handleActiveActivity(activityList.value[0], 0);
- }
- } else {
- ElMessage.error(msg);
- }
- };
- onMounted(() => {
- getAssessmentPageListApi();
- });
- const handleSearch = () => {
- getAssessmentPageListApi(searchKeyword.value);
- };
- // 右侧列表
- const searchKeyword = ref("");
- const averageScore = ref<number | string>(0);
- const tableData = ref<any>([]);
- const getPageScoreInfoByAssessmentApi = async (
- obj: any = {},
- sort: any = { type: 1 }
- ) => {
- const params = {
- assessmentId: obj.id,
- assessmentType: `${obj.assessmentType}`,
- ...sort
- };
- const { code, msg, data = [] } = await getPageScoreInfoByAssessment(params);
- if (code === 200) {
- tableData.value = data;
- if (tableData.value.length) {
- let allCount = 0;
- tableData.value.forEach(item => {
- if (item.changeScore) {
- allCount += Number(item.changeScore);
- } else if (item.score) {
- allCount += Number(item.score);
- }
- });
- let resultNum: number | string = allCount / tableData.value.length;
- if (
- resultNum.toString().split(".")[1] &&
- resultNum.toString().split(".")[1].length > 3
- ) {
- resultNum = resultNum.toFixed(3);
- }
- averageScore.value = resultNum;
- }
- } else {
- tableData.value = [];
- }
- };
- // 跳转到数据明细
- const router = useRouter();
- const toDetail = (row: any = {}) => {
- router.push({
- path: "/draw/children/worker/dataDetail",
- query: {
- mid: row.templateId,
- id: activityList.value[activeActivity.value].id,
- mname: row.templateName,
- name: activityList.value[activeActivity.value].name
- }
- });
- useAppStoreHook().toggleSideBar(false, "关闭");
- };
- // 倒叙
- const handleSortChange = ({ column, prop, order }) => {
- fetchSortedData(order);
- };
- const fetchSortedData = sortOrder => {
- console.log(sortOrder, "sssss");
- let params: any = {};
- if (sortOrder) {
- params.type = sortOrder === "ascending" ? 1 : 2; // 1 从低到高 2从高到底
- } else {
- params.type = 1;
- }
- getPageScoreInfoByAssessmentApi(activeObj.value, params);
- };
- </script>
- <template>
- <div class="assessment-rank flex">
- <div class="search-section mr-4">
- <el-input
- v-model="searchKeyword"
- placeholder="考核活动名称"
- class="w-64"
- :suffix-icon="Search"
- clearable
- @keyup.enter="handleSearch"
- />
- <div class="search-section-list">
- <p
- v-for="(item, index) in activityList"
- :key="item.id"
- class="mt-4 cursor-pointer overflow-hidden text-ellipsis whitespace-nowrap"
- :style="{ color: activeActivity === index ? '#0052d9' : '#333' }"
- @click="handleActiveActivity(item, index)"
- >
- {{ item.name }}
- </p>
- </div>
- </div>
- <el-card class="w-full">
- <template #header>
- <div class="flex justify-between items-center">
- <span class="text-base font-medium">平均得分: </span>
- <span>{{ averageScore }}</span>
- </div>
- </template>
- <el-table
- ref="myTable"
- :data="tableData"
- style="width: 100%"
- border
- @sort-change="handleSortChange"
- >
- <el-table-column type="index" label="排名" width="80" align="center" />
- <el-table-column prop="templateName" label="考核模板" min-width="200">
- <template #default="{ row }">
- <el-button type="primary" link @click="toDetail(row)">
- {{ row.templateName }}
- </el-button>
- </template>
- </el-table-column>
- <el-table-column prop="deptName" label="科室" min-width="150" />
- <el-table-column prop="userName" label="员工" min-width="150">
- <template #default="{ row }">
- <el-button type="primary" link @click="toDetail(row)">
- {{ row.userName }}
- </el-button>
- </template>
- </el-table-column>
- <el-table-column
- prop="score"
- label="实际得分"
- width="120"
- align="right"
- sortable="custom"
- >
- <template #default="{ row }">
- <span>{{ row.changeScore || row.score }}</span>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
- </div>
- </template>
- <style scoped lang="scss">
- .assessment-rank {
- padding: 20px 0;
- }
- .search-section {
- flex-shrink: 0;
- width: 200px;
- .search-section-list {
- height: calc(100vh - 250px);
- margin-top: 20px;
- overflow: auto;
- }
- }
- :deep(.el-card__header) {
- padding: 15px 20px;
- }
- </style>
|