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