From cc4f8046f4fab83306e7514367de7a6ad424e493 Mon Sep 17 00:00:00 2001
From: zhanghua <314079846@qq.com>
Date: 星期二, 28 十月 2025 22:59:05 +0800
Subject: [PATCH] 班级考勤汇总表

---
 src/views/classAttendance/index.vue |  245 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/router/index.js                 |   17 +++
 2 files changed, 260 insertions(+), 2 deletions(-)

diff --git a/src/router/index.js b/src/router/index.js
index 1b273c8..d2d6b89 100644
--- a/src/router/index.js
+++ b/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",
diff --git a/src/views/classAttendance/index.vue b/src/views/classAttendance/index.vue
new file mode 100644
index 0000000..ec1c844
--- /dev/null
+++ b/src/views/classAttendance/index.vue
@@ -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>
\ No newline at end of file

--
Gitblit v1.8.0