| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 | <template>  <div class="m-container">    <h2>      <el-page-header @back="onCancel" content="练习时长详情"></el-page-header>    </h2>    <div class="m-core">      <!-- 搜索标题 -->      <saveform        :inline="true"        ref="searchForm"        class="searchForm"        :model.sync="searchForm"      >        <el-form-item prop="dates">          <el-select            class="multiple"            v-model.trim="searchForm.organId"            filterable            clearable            placeholder="请选择分部"          >            <el-option              v-for="(item, index) in selects.branchs"              :key="index"              :label="item.name"              :value="item.id"            ></el-option>          </el-select>        </el-form-item>        <el-form-item prop="dates">          <!-- @change="changeWeek" -->          <el-date-picker            :clearable="false"            v-model="searchForm.dates"            value-format="yyyy-MM-dd"            :picker-options="{              firstDayOfWeek: 1,              disabledDate(time) {                return time.getTime() >= nowIndex;              }            }"            type="daterange"            style="width: 405px"            range-separator="至"            start-placeholder="开始日期"            end-placeholder="结束日期"          >          </el-date-picker>        </el-form-item>        <el-form-item>          <el-button @click="search" type="danger">搜索</el-button>          <el-button @click="onReSet" type="primary">重置</el-button>        </el-form-item>      </saveform>      <!-- 分组添加柱状图  -->      <el-button        type="primary"        @click="exportQuestion"        style="margin: 0 0 16px"        v-permission="'export/managerDownload/numDetail'"        >导出</el-button      >      <div class="tableWrap">        <el-table          :data="tableList"          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"        >          <el-table-column width="120px" align="center" prop="id" label="排名">            <template slot-scope="scope">              <div>                {{ scope.$index + 1 }}              </div>            </template>          </el-table-column>          <el-table-column            align="center"            prop="teacherName"            label="声部老师"          ></el-table-column>          <el-table-column align="center" prop="normalNum" label="会员人数">            <template slot-scope="scope">              <div>{{ scope.row.normalNum }}人</div>            </template>          </el-table-column>          <el-table-column            align="center"            prop="trainStudentNum"            label="练习人数"          >            <template slot-scope="scope">              <div>{{ scope.row.trainStudentNum }}人</div>            </template></el-table-column          >          <el-table-column align="center" prop="trainRate" label="练习率">            <template slot-scope="scope">              <div>{{ scope.row.trainRate }}%</div>            </template>          </el-table-column>          <el-table-column align="center" prop="id" label="≤60分钟">            <template slot-scope="scope">              <div>{{ scope.row.train1 }}人</div>            </template></el-table-column          >          <el-table-column align="center" prop="id" label="60~120分钟">            <template slot-scope="scope">              <div>{{ scope.row.train2 }}人</div>            </template>          </el-table-column>          <el-table-column align="center" prop="id" label="120~240分钟">            <template slot-scope="scope">              <div>{{ scope.row.train3 }}人</div>            </template>          </el-table-column>          <el-table-column align="center" prop="id" label=">240分钟">            <template slot-scope="scope">              <div>{{ scope.row.train4 }}人</div>            </template>          </el-table-column>          <el-table-column align="center" prop="id" label="平均练习时长">            <template slot-scope="scope">              <div>{{ scope.row.avgTrainTime }}分钟</div>            </template>          </el-table-column>          <el-table-column align="center" prop="id" label="练习达标占比">            <template slot-scope="scope">              <div>{{ scope.row.trainStandRate }}%</div>            </template>          </el-table-column>        </el-table>      </div>    </div>  </div></template><script>import { Export } from "@/utils/downLoadFile";import saveform from "@/components/save-form";import dayjs from "dayjs";import histogram from "v-charts/lib/histogram.common";import { getNowDateAndMonday, getNowDateAndSunday } from "@/utils/utils";import { cloudTeacherSumDetail } from "../api";let nowTime = new Date();nowTime =  nowTime.getFullYear() +  "-" +  (nowTime.getMonth() + 1) +  "-" +  nowTime.getDate();export const getTimes = (times, keys = []) => {  if (times && times.length) {    return {      [keys[0] || "start"]: dayjs(times[0]).format("YYYY-MM-DD"),      [keys[1] || "start"]: dayjs(times[1]).format("YYYY-MM-DD")    };  }  return {};};export default {  components: { saveform, "ve-histogram": histogram },  name: "helpCategory",  data() {    return {      nowIndex: dayjs(dayjs().format("YYYY-MM-DD")).valueOf(),      searchForm: {        dates: [          dayjs()            .subtract(1, "day")            .format("YYYY-MM-DD"),          dayjs()            .subtract(1, "day")            .format("YYYY-MM-DD")        ],        organId: ""      },      tableList: [],      activeName: "first",      specialList: []    };  },  async mounted() {    const query = this.$route.query;    this.searchForm.organId = query.organId ? Number(query.organId) : "";    await this.$store.dispatch("setBranchs");    const arr = [36, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 54, 56];    this.specialList = this.selects.branchs.filter(item => {      return arr.indexOf(item.id) == -1;    });    // this.searchForm.dates.push(getNowDateAndMonday(nowTime));    // this.searchForm.dates.push(getNowDateAndSunday(nowTime));    this.getList();  },  methods: {    exportQuestion() {      const { dates, organId } = this.searchForm;      Export(        this,        {          url: "/api-web/export/managerDownload",          fileName: "云教练练习时长.xls",          method: "post",          params: {            exportEnum: "EXPORT_CLOUD_TEACHER_SUM_DETAIL",            ...getTimes(dates, ["startDate", "endDate"]),            organId          }        },        "您确定导出云教练练习时长?"      );    },    search() {      this.$refs.searchForm.validate(valid => {        this.pageInfo = {          ...this.pageInfo,          page: 1        };        this.getList();      });    },    onCancel() {      this.$store.dispatch("delVisitedViews", this.$route);      this.$router.push({        path: "/cloudDate?tabrouter=exerciseDuration"      });    },    onReSet() {      this.pageInfo = {        ...this.pageInfo,        page: 1      };      this.$refs.searchForm.resetFields();      // this.searchForm.dates.push(getNowDateAndMonday(nowTime));      // this.searchForm.dates.push(getNowDateAndSunday(nowTime));      this.getList();    },    getDefaultTime() {      const dayjs = this.$helpers.dayjs;      let nowDate = dayjs(new Date()).format("YYYY-MM-DD");      let lastWeek = dayjs(nowDate)        .subtract(1, "week")        .format("YYYY-MM-DD");      this.searchForm.dates = [        getNowDateAndMonday(lastWeek),        getNowDateAndSunday(nowDate)      ];    },    changeWeek(val) {      if (val) {        // this.searchForm.dates = [        //   getNowDateAndMonday(val[0]),        //   getNowDateAndSunday(val[1])        // ];      } else {        this.getDefaultTime();      }    },    async getList() {      // cloudTeacherSumDetail      try {        const { dates, organId } = this.searchForm;        let params = {          ...getTimes(dates, ["startDate", "endDate"]),          organId        };        const res = await cloudTeacherSumDetail({          page: 1,          rows: 10,          ...params        });        this.tableList = [];        this.tableList = res.data.rows || [];      } catch {}    }  }};</script><style lang="scss" scoped>::v-deep .el-date-editor.el-input {  width: 100% !important;}::v-deep .el-select {  width: 100% !important;}::v-deep .el-table .cell {  display: -webkit-box;  overflow: hidden;  max-height: 45px;  text-overflow: ellipsis;  -webkit-line-clamp: 3;  -webkit-box-orient: vertical;}::v-deep .el-dialog__body {  padding: 10px 20px;}.newBand {  display: inline-block;}::v-deep .el-tabs__active-bar {  background-color: transparent !important;}::v-deep.el-tabs__nav-wrap {  &:after {    background-color: transparent !important;  }}/*去掉切换时el-tab-pane底部的蓝色下划线*/::v-deep .el-tabs__nav-wrap::after {  background-color: transparent !important;}/*去掉tabs底部的下划线*/</style>
 |