zhanghua
2025-02-11 59d30d49f2a37c294ee98e495de9bc42dcdfe6ce
src/views/attendance/index.vue
@@ -1,221 +1,231 @@
<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>