| | |
| | | name: "Attendance", |
| | | component: () => import("@/views/attendance/index"), |
| | | meta: { |
| | | title: "考勤汇总表", |
| | | title: "学员考勤汇总表", |
| | | icon: "dashboard" |
| | | }, |
| | | }, ], |
| | |
| | | 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", |
| New file |
| | |
| | | <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> |