| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 | <template>  <div class="educationStatistics">    <NavBar/>    <div class="statistics-container">      <org-tree v-model="orgId" @change="getOrgDataList"></org-tree>      <van-row>        <van-col span="12">          <van-cell title="开始时间" @click="showStartPicker = true" is-link arrow-direction="down"                    :value="startWeekStr"/>          <van-popup v-model="showStartPicker" position="bottom" custom-style="height: 20%;">            <week-date-type :defaults="defaults" @onConfirm="onStartTimeConfirm" @onCancel="onCancel"/>          </van-popup>        </van-col>        <van-col span="12">          <van-cell title="结束时间" @click="showEndPicker = true" is-link arrow-direction="down" :value="endWeekStr"/>          <van-popup v-model="showEndPicker" position="bottom" custom-style="height: 20%;">            <week-date-type :defaults="defaults" @onConfirm="onEntTimeConfirm" @onCancel="onCancel"/>          </van-popup>        </van-col>      </van-row>      <div class="card-list">        <empty v-if="!dataList || dataList.length === 0"/>        <ve-table          v-else          maxHeight="calc(100vh - 252px)"          fixedHeader          borderX          borderY          borderAround          :columns="columns"          :table-data="dataList"        />      </div>    </div>  </div></template><script>import NavBar from '@/components/NavBar'import OrgTree from '@/components/orgTree'import dateCell from '@/components/dateCell'import selectCell from '@/components/selectCell'import WeekDateType from "views/menu/monitorStatistics/components/WeekDateType.vue";import dayjs from "dayjs";import {selectMonitorReport} from "api/toConsult";export default {  components: {    WeekDateType,    NavBar,    OrgTree,    dateCell,    selectCell  },  data() {    return {      orgId: '',      showStartPicker: false,      showEndPicker: false,      startWeekStr: '', //年份      endWeekStr: '', //年份      startTime: new Date(),      endTime: new Date(),      defaults: new Date(),      prop: {        label: 'name',        value: 'id'      },      loading: false,      columns: [        {          field: 'index',          key: 'index',          title: '序号',          width: 50,          align: 'center',          renderBodyCell: ({row, column, rowIndex}, h) => {            return ++rowIndex          }        },        {field: 'orgName', key: 'a', title: '单位名称', align: 'center'},        {field: 'planAccessNumber', key: 'b', title: '应调阅次数', align: 'center'},        {field: 'realityAccessNumber', key: 'c', title: '调阅次数', align: 'center'},        {field: 'accessRate', key: 'd', title: '完成率', align: 'center'}      ],      dataList: []    }  },  created() {  },  mounted() {    this.initData()  },  computed: {},  methods: {    dayjs,    formatter(type, val) {      if (type === 'month') {        return `${val}月`;      } else if (type === 'year') {        return `${val}年`;      }      return val;    },    initData() {      this.orgId = JSON.parse(window.sessionStorage.getItem('SET_USER_ORGID')) + '';      this.initializeDates();      this.getDataList();    },    //机构搜索    getOrgDataList(val) {      this.orgId = val      this.getDataList()    },    getDataList() {      let data = {        orgId: this.orgId || '',        startDate: dayjs(this.startTime).startOf('day').format('YYYY-MM-DD'),        endDate: dayjs(this.endTime).endOf('day').format('YYYY-MM-DD'),      }      selectMonitorReport(data).then(res => {        if (res.data.length > 0){          let arr=res.data;          // 将百分比字符串转换为数字          arr.forEach(item => {            item.accessRate = parseFloat(item.accessRate).toFixed(2);          });          // 根据percentage字段进行降序排列          arr.sort((a, b) => b.accessRate - a.accessRate);          // 将排序后的数字转换回带有百分比符号的字符串          arr.forEach(item => {            item.accessRate = `${item.accessRate}%`;          });          // 重新赋值给dataList          this.dataList = arr;        }else {          this.dataList = []        }      })    },    //搜索选择状态时触发    onStartTimeConfirm(value, index) {      // 假设 value 是一个对象,其中包含了 text 属性      const weekText = value[1].text;      this.startTime = value[1].weekStart;      this.startWeekStr = this.getWeekStr(weekText)      this.showStartPicker = false; // 关闭弹窗      if (!this.validateDates()) {        // 显示错误消息        this.$toast('开始时间不能晚于结束时间!');        this.showStartPicker=true;        return;      }      this.getDataList();    },    //搜索选择状态时触发    onEntTimeConfirm(value, index) {      // 假设 value 是一个对象,其中包含了 text 属性      const weekText = value[1].text;      this.endTime = value[1].weekEnd;      this.endWeekStr = this.getWeekStr(weekText);      this.showEndPicker = false; // 关闭弹窗      if (!this.validateDates()) {        // 显示错误消息        this.$toast('开始时间不能晚于结束时间!');        this.showEndPicker=true;        return;      }      console.log(this.startTime, this.endTime)      this.getDataList();    },    onCancel() {      this.showStartPicker = false;      this.showEndPicker = false;    },    //日期格式    formatDate(date) {      return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`    },    initializeDates() {      const today = dayjs();      const startOfYear = today.startOf('year');      const startOfWeek = today.startOf('week');      const weekOfYear = Math.ceil(startOfWeek.diff(startOfYear, 'weeks', true) + 1);      this.startWeekStr = `第${weekOfYear}周`;      this.endWeekStr = `第${weekOfYear}周`;      this.startTime = today.startOf('week').toDate();      this.endTime = today.endOf('week').toDate();    },    validateDates() {      if (!this.startWeekStr || !this.endWeekStr) {        return;      }      // 将周数字符串转换为数字进行比较      const startWeekNumber = parseInt(this.startWeekStr.replace(/[第周]/g, ''), 10);      const endWeekNumber = parseInt(this.endWeekStr.replace(/[第周]/g, ''), 10);      // 开始时间晚于结束时间,显示错误消息或重新打开弹窗      return startWeekNumber <= endWeekNumber;    },    getWeekStr(text) {      if (!text) {        return '';      }      const weekMatch = text.match(/第(\d+)周/);      if (weekMatch && weekMatch[1]) {        return `第${weekMatch[1]}周`;      }      return '';    },  }}</script><style lang="scss">.van-cell-group {  margin-bottom: 20px;}.van-cell-group:last-child {  margin-bottom: 0;}.vue-table-root {  tr,  td,  th {    font-size: 25px !important;    color: #666 !important;  }}</style><style lang="scss" scoped>.educationStatistics {}.statistics-container {}.card-list {  padding: 20px;  height: calc(100vh - 420px);  overflow: hidden;}.card-num {  display: flex;  align-items: center;  font-size: 28px;  color: #009dff;}.flex-box {  display: flex;  align-items: center;  > div {    margin-right: 40px;  }}.search-flex {  display: flex;  align-items: center;  justify-content: space-between;  > div {    width: 50%;  }}.van-cell__value {  color: black;  text-align: left;}</style>
 |