zhanghua
2025-10-28 cc4f8046f4fab83306e7514367de7a6ad424e493
班级考勤汇总表
1个文件已修改
1个文件已添加
262 ■■■■■ 已修改文件
src/router/index.js 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/classAttendance/index.vue 245 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js
@@ -127,7 +127,7 @@
      name: "Attendance",
      component: () => import("@/views/attendance/index"),
      meta: {
        title: "考勤汇总表",
        title: "学员考勤汇总表",
        icon: "dashboard"
      },
    }, ],
@@ -140,10 +140,23 @@
      name: "AttendanceDay",
      component: () => import("@/views/attendanceDay/index"),
      meta: {
        title: "考勤日报表",
        title: "学员考勤日报表",
        icon: "example"
      },
    }, ],
  },{
    path: "/",
    component: Layout,
    redirect: "/class_attendance",
    children: [{
      path: "/class_attendance",
      name: "ClassAttendance",
      component: () => import("@/views/classAttendance/index"),
      meta: {
        title: "班级考勤汇总表",
        icon: "dashboard"
      },
    }, ],
  },
  // {
  //   path: "/educational",
src/views/classAttendance/index.vue
New file
@@ -0,0 +1,245 @@
<template>
    <div class="app-container">
        <div style="display: flex">
            <div>
                <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期"
                    end-placeholder="结束日期" value-format="yyyy-MM-dd" style="margin-right: 10px" @change="dateChange"
                    :picker-options="pickerOptions">
                </el-date-picker>
            </div>
            <div style="margin: auto; margin-left: 30px !important">
                <el-button type="primary" size="small" @click="handleExport">导出报表</el-button>
            </div>
        </div>
        <div style="height: calc(100vh - 168px)">
            <el-table v-loading="listLoading" :data="list" element-loading-text="Loading" @expand-change="expandChange"
                fit height="100%">
                <el-table-column label="班级" prop="className" width="180">
                </el-table-column>
                <el-table-column label="课包" prop="className" width="180">
                </el-table-column>
                <el-table-column label="出勤率" prop="A1" width="180">
                </el-table-column>
                <el-table-column label="到课" prop="A2" width="180">
                </el-table-column>
                <el-table-column label="请假" min-width="200" prop="A3">
                </el-table-column>
                <el-table-column label="缺勤" prop="A4" min-width="100">
                </el-table-column>
                <el-table-column label="教师" prop="className" width="180">
                </el-table-column>
            </el-table>
        </div>
        <div>
            <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
                :current-page="data.pageIn.index + 1" :page-sizes="[10, 20, 30, 40]" :page-size="data.pageIn.size"
                layout="total, sizes, prev, pager, next, jumper" :total="total">
            </el-pagination>
        </div>
    </div>
</template>
<script>
import { getData } from "@/api/attendance";
export default {
    filters: {
        statusFilter(status) {
            const statusMap = {
                published: "success",
                draft: "gray",
                deleted: "danger",
            };
            return statusMap[status];
        },
    },
    components: {},
    data() {
        return {
            dateRange: [],
            list: null,
            studentList: [],
            listLoading: true,
            studentLoading: true,
            activeName: "all",
            total: 0,
            data: {
                staffId: JSON.parse(localStorage.getItem("selectStaff")).id,
                keyword: "",
                reportType: "day",
                pageIn: {
                    //可选,如果是分页查询,需要加上。
                    index: 0, //必选
                    size: 10, //每页的大小。默认20
                    sorts: {
                        name: "p.name,CONVERT(s.begin_time,date)", //排序字段名称
                        direction: "ASC", //排序方向
                    },
                },
            },
            dialogVisible: false,
            pickerOptions: {
                shortcuts: [{
                    text: '最近一周',
                    onClick(picker) {
                        const end = new Date();
                        const start = new Date();
                        start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
                        picker.$emit('pick', [start, end]);
                    }
                }, {
                    text: '最近一个月',
                    onClick(picker) {
                        const end = new Date();
                        const start = new Date();
                        start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
                        picker.$emit('pick', [start, end]);
                    }
                }, {
                    text: '最近三个月',
                    onClick(picker) {
                        const end = new Date();
                        const start = new Date();
                        start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
                        picker.$emit('pick', [start, end]);
                    }
                }]
            },
        };
    },
    created() {
        this.setDate();
        this.fetchData();
    },
    methods: {
        /** 将时间选择器默认选为当天的日期 */
        setDate() {
            const today = new Date()
            const yesterday = new Date(today)
            yesterday.setDate(yesterday.getDate() - 1)
            let year = yesterday.getFullYear();
            let month = String(yesterday.getMonth() + 1).padStart(2, "0");
            let day = String(yesterday.getDate()).padStart(2, "0");
            let formattedDate = `${year}-${month}-${day}`;
            this.dateRange.push(formattedDate);
            this.dateRange.push(formattedDate);
        },
        setFormattedDate(selfdate) {
        },
        handleExport() {
            if (this.dateRange.length == 0) {
                this.$message.warning("请选择日期范围");
                return;
            }
            this.download(
                "exportAttendanceReport?staffId=" + this.data.staffId + "&startDate=" +
                this.dateRange[0] +
                "&endDate=" +
                this.dateRange[1] +
                "&type=" +
                this.data.reportType,
                {},
                `学员考勤报表导出_${new Date().getTime()}.xlsx`
            );
        },
        handleImport() {
            this.dialogVisible = true;
        },
        dateChange() {
            this.data.pageIn.index = 0;
            this.fetchData();
        },
        fetchData() {
            this.listLoading = true;
            this.data.beginDate = this.dateRange[0].replaceAll("-", "/");
            this.data.endDate = this.dateRange[1].replaceAll("-", "/");
            this.list = [{ "className": "一班", "A1": "90%", "A2": 1, "A3": 0, "A4": 0 },
            { "className": "二班", "A1": "90%", "A2": 1, "A3": 0, "A4": 0 },
            { "className": "三班", "A1": "90%", "A2": 1, "A3": 0, "A4": 0 },
            { "className": "四班", "A1": "90%", "A2": 1, "A3": 0, "A4": 0 }
            ]
            this.listLoading = false;
            // getData(this.data).then((response) => {
            //     this.list = response.data.findPlayerAttendanceSummary.ls;
            //     this.total = response.data.findPlayerAttendanceSummary.pageOut.total;
            //     this.listLoading = false;
            // });
        },
        handleSizeChange(val) {
            this.data.pageIn.size = val;
            this.handleClick();
        },
        handleCurrentChange(val) {
            this.data.pageIn.index = val - 1;
            this.handleClick();
        },
        handleClick(tab, event) {
            this.data.staffId = JSON.parse(localStorage.getItem("selectStaff")).id;
            if (this.activeName == "pendingFees") {
                this.listLoading = true;
                getRenew(this.data).then((response) => {
                    this.list = response.data.findRenewPlayerAcc.ls;
                    this.total = response.data.findRenewPlayerAcc.pageOut.total;
                    this.listLoading = false;
                });
            } else if (this.activeName == "expired") {
                this.listLoading = true;
                getExpire(this.data).then((response) => {
                    this.list = response.data.findPlayerExpire.ls;
                    this.total = response.data.findPlayerExpire.pageOut.total;
                    this.listLoading = false;
                });
            } else if (this.activeName == "all") {
                this.fetchData();
            } else if (this.activeName == "deactivated") {
                this.listLoading = true;
                let data = {
                    itemType: "PLAYER",
                    staffId: JSON.parse(localStorage.getItem("selectStaff")).id,
                    keyword: this.data.keyword,
                    pageIn: { ...this.data.pageIn },
                };
                getDeleted(data).then((response) => {
                    this.list = response.data.findDeletedItem.ls;
                    this.total = response.data.findDeletedItem.pageOut.total;
                    this.listLoading = false;
                });
            }
        },
        goDetails(row) {
            this.$router.push({
                name: "StudentDetails",
                query: {
                    id: row.id,
                },
            });
        },
        showCreate() {
            this.$refs.studentCreate.showDialog();
        },
        changeType(type) {
            switch (type) {
                case 0:
                    return "班课";
                case 1:
                    return "约课";
                case 2:
                    return "场地";
                default:
                    return "-";
            }
        },
        expandChange(row, expandedRows, expanded) {
            this.studentList = [{ "studentName": "学员", "a1": "90%", "a2": 1, "a3": 0, "a4": 0 },
            { "studentName": "学员", "a1": "90%", "a2": 1, "a3": 0, "a4": 0 },
            { "studentName": "学员", "a1": "90%", "a2": 1, "a3": 0, "a4": 0 }
            ]
            this.studentLoading = false
        }
    },
};
</script>