|
@@ -0,0 +1,324 @@
|
|
|
+<template>
|
|
|
+ <div class="newQueryTable">
|
|
|
+ <el-table v-el-table-infinite-scroll="load" :data="filteredTableData" :summary-method="getSummaries" :span-method="tableSpanMethod" stripe :show-summary="showSummary" border @cell-click="cellClick" :cell-class-name="cellClass" ref="table" height="100%" class="table infinite-list">
|
|
|
+ <el-table-column v-for="(item, index) in tableColsCopy" :sortable="item.needSort ? true : false" :key="index" :prop="item.columnName" :label="item.columnLabel" :show-overflow-tooltip="showOverflowTooltip">
|
|
|
+ <template #header>
|
|
|
+ <span class="colTips">
|
|
|
+ <el-tooltip :content="item.columnDescribe" placement="top">
|
|
|
+ <span>{{ item.columnLabel }}</span>
|
|
|
+ </el-tooltip>
|
|
|
+ </span>
|
|
|
+ <span v-if="item.needFilters">
|
|
|
+ <el-popover placement="bottom" trigger="click" @show="popoverShowHandler(item.columnName)" @hide="popoverHideHandler">
|
|
|
+ <i slot="reference" :class="[
|
|
|
+ 'filter-arrow',
|
|
|
+ 'el-icon-arrow-down',
|
|
|
+ arrowClass(item.columnName),
|
|
|
+ ]" />
|
|
|
+ <el-form>
|
|
|
+ <el-form-item :label="item.columnLabel">
|
|
|
+ <el-select v-model="filterValues[item.columnName]" size="small" placeholder="筛选" default-first-option filterable clearable>
|
|
|
+ <el-option v-for="(option, optionIndex) in tableDataFilters[
|
|
|
+ item.columnName
|
|
|
+ ]" :key="option.value + optionIndex" :value="option.value" :label="option.text" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </el-popover>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import pf from '@/layout/mixin/publicFunc';
|
|
|
+import { setTableFilters } from "@/utils/table";
|
|
|
+import { getToken } from '@/utils/auth';
|
|
|
+import { getAuthData } from "@/utils/validate";
|
|
|
+export default {
|
|
|
+ name: 'NewQueryTable',
|
|
|
+ mixins: [pf],
|
|
|
+ props: {
|
|
|
+ // 是否显示合计行
|
|
|
+ showSummary: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ // 不换行,溢出隐藏
|
|
|
+ showOverflowTooltip: {
|
|
|
+ type: Boolean,
|
|
|
+ default: true,
|
|
|
+ },
|
|
|
+ isTable: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ tableTag: {
|
|
|
+ type: Object,
|
|
|
+ default: () => { }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ data () {
|
|
|
+ return {
|
|
|
+ page: 0,
|
|
|
+ pageSize: 20,
|
|
|
+ queryId: '',
|
|
|
+ noMore: false,
|
|
|
+ loading: false,
|
|
|
+ tableCols: [], //表头数据
|
|
|
+ tableData: [], //表格数据
|
|
|
+ tableColsCopy: [], //表头数据缓存
|
|
|
+ tableDataFilters: {}, //表头-下拉数据
|
|
|
+ filterValues: {}, //表头-下拉-选中数据
|
|
|
+ tableDataCopy: [], //缓存table数据
|
|
|
+ tableGroups: [], //表格分组数据
|
|
|
+ colShowFilter: "", //表头-下拉-箭头
|
|
|
+ spanArr: [], //表格分组数据缓存
|
|
|
+ pos: 0, //表格分组计数
|
|
|
+ dataContent: [],
|
|
|
+ authBtns: [],
|
|
|
+ authBtnCol: [],
|
|
|
+ authBtnColName: [],
|
|
|
+ }
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ //设置表头-下拉-选中数据
|
|
|
+ filteredTableData () {
|
|
|
+ return this.tableData.filter((item) => {
|
|
|
+ let flag = true;
|
|
|
+ Object.entries(this.filterValues).forEach(([key, value]) => {
|
|
|
+ if (value !== "" && item[key] !== value) {
|
|
|
+ flag = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return flag;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ tableTag: {
|
|
|
+ handler (val) {
|
|
|
+ this.getQuery(this.AqueryId, val)
|
|
|
+ },
|
|
|
+ deep: true
|
|
|
+ }
|
|
|
+ },
|
|
|
+ mounted () {
|
|
|
+ this.getColumnData()
|
|
|
+ this.setCellClick()
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ //获取表头数据
|
|
|
+ async getColumnData () {
|
|
|
+ try {
|
|
|
+ const { code, returnData } = await this.getQueryList(SERVICE_ID.sysUserAuthId, [{
|
|
|
+ user_id: getToken('userid'),
|
|
|
+ auth_id: this.AauthId
|
|
|
+ }]);
|
|
|
+ if (code == 0) {
|
|
|
+ if (returnData && returnData.length) {
|
|
|
+ this.$store.dispatch('auth/changeAuthMsg', returnData)
|
|
|
+ this.tableCols = returnData.sort((a, b) => b.orderNumber - a.orderNumber);
|
|
|
+ this.tableColsCopy = this.tableCols.filter((item) => item.needShow);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ this.$message.error("获取表头数据失败");
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //获取表格数据
|
|
|
+ async getQuery (id, dataContent) {
|
|
|
+ try {
|
|
|
+ this.loading = true;
|
|
|
+ this.queryId = id;
|
|
|
+ this.dataContent = dataContent;
|
|
|
+ const { code, returnData } = await this.getQueryList(id, dataContent, ++this.page, this.pageSize);
|
|
|
+ if (code == 0) {
|
|
|
+ if (returnData.length === 0) {
|
|
|
+ this.page--;
|
|
|
+ this.noMore = true;
|
|
|
+ this.loading = false;
|
|
|
+ }
|
|
|
+ this.tableData.push(...returnData);
|
|
|
+ setTimeout(() => {
|
|
|
+ this.initTableData();
|
|
|
+ this.loading = false;
|
|
|
+ }, 100);
|
|
|
+ } else {
|
|
|
+ this.page--;
|
|
|
+ this.loading = false;
|
|
|
+ this.$message.error("获取表格数据失败");
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ this.page--;
|
|
|
+ this.loading = false;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ load () {
|
|
|
+ if (this.isTable) {
|
|
|
+ if (this.noMore || this.loading) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.getQuery(this.queryId, this.dataContent, ++this.page, this.pageSize);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ setCellClick () {
|
|
|
+ const { auth_id } = this.$route.meta
|
|
|
+ const { arrs } = getAuthData(auth_id)
|
|
|
+ const table = arrs.filter(item => item.auth_type == 4)
|
|
|
+ if (table && table.length) {
|
|
|
+ const obj = table[0]
|
|
|
+ const { arrs } = getAuthData(obj.auth_id)
|
|
|
+ console.log(arrs)
|
|
|
+ this.authBtnCol = arrs.filter(item => Number(item.service_type) == 6)
|
|
|
+ if (this.authBtnCol.length) {
|
|
|
+ this.authBtnCol.forEach(item => {
|
|
|
+ this.authBtnColName.push(item.relation_data)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //初始化表格
|
|
|
+ initTableData () {
|
|
|
+ this.tableDataCopy = _.cloneDeep(this.tableData);
|
|
|
+ const datas = _.cloneDeep(this.tableColsCopy);
|
|
|
+ // const reqUts = [];
|
|
|
+ datas.forEach(async (item) => {
|
|
|
+ this.tableDataFilters[item.columnName] = [];
|
|
|
+ if (item.needGroup) {
|
|
|
+ this.tableGroups.push(item.columnName);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ setTableFilters(this.tableData, this.tableDataFilters);
|
|
|
+ this.tableGroup(this.tableData);
|
|
|
+ },
|
|
|
+ //分组
|
|
|
+ tableGroup (tableData) {
|
|
|
+ const spanArr = [];
|
|
|
+ let pos = 0;
|
|
|
+ let ifYj = this.tableGroups[0];
|
|
|
+ for (let i = 0; i < tableData.length; i++) {
|
|
|
+ if (i === 0) {
|
|
|
+ spanArr.push(1);
|
|
|
+ } else {
|
|
|
+ if (tableData[i][ifYj] === tableData[i - 1][ifYj]) {
|
|
|
+ spanArr[pos] += 1;
|
|
|
+ spanArr.push(0);
|
|
|
+ } else {
|
|
|
+ spanArr.push(1);
|
|
|
+ pos = i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.spanArr = spanArr;
|
|
|
+ this.pos = pos;
|
|
|
+ },
|
|
|
+ popoverShowHandler (prop) {
|
|
|
+ this.colShowFilter = prop;
|
|
|
+ },
|
|
|
+ popoverHideHandler () {
|
|
|
+ this.colShowFilter = "";
|
|
|
+ },
|
|
|
+ //设置表头-下拉-箭头样式
|
|
|
+ arrowClass () {
|
|
|
+ return function (prop) {
|
|
|
+ let classString = "";
|
|
|
+ if (this.colShowFilter === prop) {
|
|
|
+ return "arrow-active";
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ Object.entries(this.tableDataFilters).find(
|
|
|
+ ([key, arr]) => this.filterValues[prop]
|
|
|
+ )
|
|
|
+ ) {
|
|
|
+ classString += "arrow-blue";
|
|
|
+ }
|
|
|
+ return classString;
|
|
|
+ };
|
|
|
+ },
|
|
|
+ //合计
|
|
|
+ getSummaries (param) {
|
|
|
+ const { columns, data } = param;
|
|
|
+ const sums = [];
|
|
|
+ columns.forEach((column, index) => {
|
|
|
+ this.tableColsCopy.forEach((p) => {
|
|
|
+ if (column.property == p.columnName && p.needCount) {
|
|
|
+ const values = data.map((item) => Number(item[column.property]));
|
|
|
+ if (!values.every((value) => isNaN(value))) {
|
|
|
+ sums[index] = values.reduce((prev, curr) => {
|
|
|
+ const value = Number(curr);
|
|
|
+ if (!isNaN(value)) {
|
|
|
+ return prev + curr;
|
|
|
+ } else {
|
|
|
+ return prev;
|
|
|
+ }
|
|
|
+ }, 0);
|
|
|
+ sums[index] += "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ return sums;
|
|
|
+ },
|
|
|
+ //分组
|
|
|
+ tableSpanMethod ({ row, column, rowIndex, columnIndex }) {
|
|
|
+ if (this.tableGroups.includes(column["property"])) {
|
|
|
+ const _row = this.spanArr[rowIndex];
|
|
|
+ const _col = _row > 0 ? 1 : 0;
|
|
|
+ return {
|
|
|
+ rowspan: _row,
|
|
|
+ colspan: _col,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //表格-设置单元格样式
|
|
|
+ cellClass ({ row, column, rowIndex, columnIndex }) {
|
|
|
+ if (this.authBtnColName.includes(column.property)) {
|
|
|
+ return 'is-click-btn'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //表格-单元格点击
|
|
|
+ cellClick (row, column) {
|
|
|
+ const dataBtns = this.authBtnCol
|
|
|
+ if (dataBtns && dataBtns.length) {
|
|
|
+ const clickBtn = dataBtns.filter(item => item.relation_data == column.property)[0]
|
|
|
+ if (clickBtn) {
|
|
|
+ const { open_method, route_info, pass_parameters } = clickBtn
|
|
|
+ if (open_method == 2) {
|
|
|
+ if (pass_parameters) {
|
|
|
+ const query = pass_parameters.split(',')
|
|
|
+ const obj = {}
|
|
|
+ query.forEach(item => {
|
|
|
+ obj[item] = row[item]
|
|
|
+ })
|
|
|
+ this.$router.push({
|
|
|
+ path: route_info,
|
|
|
+ query: obj
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.newQueryTable {
|
|
|
+ height: 100%;
|
|
|
+ ::v-deep .table {
|
|
|
+ .is-click-btn {
|
|
|
+ .cell {
|
|
|
+ color: #409eff;
|
|
|
+ cursor: pointer;
|
|
|
+ position: relative;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|