| | |
| | | <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" |
| | | > |
| | | </el-date-picker> |
| | | </div> |
| | | <div style="margin: auto; margin-left: 30px !important"> |
| | | <el-button type="primary" size="small" @click="handleExport" |
| | | >导出报表</el-button |
| | | > |
| | | </div> |
| | | <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" |
| | | > |
| | | </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" |
| | | fit |
| | | height="100%" |
| | | > |
| | | <el-table-column label="学员姓名" prop="playerName" width="180"> |
| | | </el-table-column> |
| | | <el-table-column label="出勤情况" prop="state" width="180"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="课包/会员卡" |
| | | min-width="200" |
| | | prop="voucherName" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column label="课时消耗" prop="qty" min-width="100"> |
| | | </el-table-column> |
| | | <el-table-column label="课费消耗" prop="amt" min-width="100"> |
| | | </el-table-column> |
| | | <el-table-column label="课程性质" min-width="100"> |
| | | <template slot-scope="scope"> |
| | | {{ changeType(scope.row.sessionType) }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="教师" prop="staffName" min-width="100"> |
| | | </el-table-column> |
| | | <el-table-column label="教室" prop="placeName" min-width="100"> |
| | | </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> |
| | | <div style="height: calc(100vh - 168px)"> |
| | | <el-table |
| | | v-loading="listLoading" |
| | | :data="list" |
| | | element-loading-text="Loading" |
| | | fit |
| | | height="100%" |
| | | > |
| | | <el-table-column label="学员姓名" prop="playerName" width="180"> |
| | | </el-table-column> |
| | | <el-table-column label="出勤情况" prop="state" width="180"> |
| | | </el-table-column> |
| | | <el-table-column label="课包/会员卡" min-width="200" prop="voucherName"> |
| | | </el-table-column> |
| | | <el-table-column label="课时消耗" prop="qty" min-width="100"> |
| | | </el-table-column> |
| | | <el-table-column label="课费消耗" prop="amt" min-width="100"> |
| | | </el-table-column> |
| | | <el-table-column label="课程性质" min-width="100"> |
| | | <template slot-scope="scope"> |
| | | {{ changeType(scope.row.sessionType) }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="教师" prop="staffName" min-width="100"> |
| | | </el-table-column> |
| | | <el-table-column label="教室" prop="placeName" min-width="100"> |
| | | </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, |
| | | listLoading: true, |
| | | activeName: "all", |
| | | total: 0, |
| | | data: { |
| | | staffId: JSON.parse(localStorage.getItem("selectStaff")).id, |
| | | keyword: "", |
| | | pageIn: { |
| | | //可选,如果是分页查询,需要加上。 |
| | | index: 0, //必选 |
| | | size: 10, //每页的大小。默认20 |
| | | sorts: { |
| | | name: "p.name", //排序字段名称 |
| | | direction: "ASC", //排序方向 |
| | | }, |
| | | filters: { |
| | | statusFilter(status) { |
| | | const statusMap = { |
| | | published: "success", |
| | | draft: "gray", |
| | | deleted: "danger", |
| | | }; |
| | | return statusMap[status]; |
| | | }, |
| | | }, |
| | | dialogVisible: false, |
| | | }; |
| | | }, |
| | | created() { |
| | | this.setDate(); |
| | | this.fetchData(); |
| | | }, |
| | | methods: { |
| | | /** 将时间选择器默认选为当天的日期 */ |
| | | setDate() { |
| | | let currentDate = new Date(); |
| | | |
| | | let year = currentDate.getFullYear(); |
| | | let month = String(currentDate.getMonth() + 1).padStart(2, "0"); |
| | | let day = String(currentDate.getDate()).padStart(2, "0"); |
| | | |
| | | let formattedDate = `${year}/${month}/${day}`; |
| | | this.dateRange.push(formattedDate); |
| | | this.dateRange.push(formattedDate); |
| | | }, |
| | | 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], |
| | | {}, |
| | | `学员考勤日报表导出_${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("-", "/"); |
| | | |
| | | 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.findPlayerRenew.ls; |
| | | this.total = response.data.findPlayerRenew.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 }, |
| | | components: {}, |
| | | data() { |
| | | return { |
| | | dateRange: [], |
| | | list: null, |
| | | listLoading: true, |
| | | activeName: "all", |
| | | total: 0, |
| | | data: { |
| | | staffId: JSON.parse(localStorage.getItem("selectStaff")).id, |
| | | keyword: "", |
| | | pageIn: { |
| | | //可选,如果是分页查询,需要加上。 |
| | | index: 0, //必选 |
| | | size: 10, //每页的大小。默认20 |
| | | sorts: { |
| | | name: "p.name", //排序字段名称 |
| | | direction: "ASC", //排序方向 |
| | | }, |
| | | }, |
| | | }, |
| | | dialogVisible: false, |
| | | }; |
| | | 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, |
| | | 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], |
| | | {}, |
| | | `学员考勤报表导出_${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("-", "/"); |
| | | |
| | | 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.findPlayerRenew.ls; |
| | | this.total = response.data.findPlayerRenew.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 "-"; |
| | | } |
| | | }, |
| | | }, |
| | | showCreate() { |
| | | this.$refs.studentCreate.showDialog(); |
| | | }, |
| | | changeType(type) { |
| | | switch (type) { |
| | | case 0: |
| | | return "班课"; |
| | | case 1: |
| | | return "约课"; |
| | | case 2: |
| | | return "场地"; |
| | | default: |
| | | return "-"; |
| | | } |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |