product.vue 8.06 KB
<template>
    <div class="stat-shop">
        <layout-body>
            <p slot="title">商品看板</p>
            <layout-filter class="box-filter" :inline="true" :col="1">
                <filter-item label="时间">
                    <Date-picker
                        type="daterange"
                        v-model="dateRange"
                        format="yyyy-MM-dd"
                        placeholder="选择开始结束日期"></Date-picker>
                    <div class="quick">
                        <a href="javascript:;" @click="() => {changeLimit(7)}">近7天</a>
                        <a href="javascript:;" @click="() => {changeLimit(30)}">近30天</a>
                    </div>
                    <div class="brand-select-container">
                        <span>选择品牌: </span>
                        <Select v-model="brandId" style="width: 200px;">
                            <Option value="0">请选择品牌</Option>
                            <Option v-for="item in brandList" :value="item.id" :key="item.id">
                                {{item.brandName}}
                            </Option>
                        </Select>
                    </div>

                    <Poptip trigger="hover" placement="bottom-end">
                        <div slot="content">
                            * 仅支持历史数据,时间跨度不得超过30天
                        </div>
                        <Button type="primary" @click="exportFile">导出</Button>
                    </Poptip>
                </filter-item>
            </layout-filter>
            <layout-list>
                <Table border :columns="tableCols" :data="tableData"></Table>
                <Page :total="pageData.total" :current="pageData.current"
                      @on-change="pageChange" :page-size="20" show-total></Page>
            </layout-list>
        </layout-body>
    </div>
</template>

<script>
    import moment from 'moment';
    import productStore from './store';
    import ProductService from 'services/statistics/product-service';

    export default {
        data() {
            return productStore.call(this);
        },
        created() {
            this.productService = new ProductService();
        },
        mounted() {
            this.loadData();
        },
        watch: {
            date() {
                this.loadData();
            },
            day(newDay) {
                let curDay = moment().format('YYYY-MM-DD');

                if (newDay === this.beginDate || !newDay) {

                    return;
                }

                this.dateRange = newDay !== this.curDay ? [newDay, curDay] : [newDay, newDay];

            },
            dateRange(newDate) {
                this.beginDate = moment(Array.isArray(newDate) ? newDate[0] : newDate).format('YYYY-MM-DD');
                this.endDate = moment(Array.isArray(newDate) ? newDate[1] : newDate).format('YYYY-MM-DD');
                this.day = this.beginDate === this.endDate === this.today ? '' : this.beginDate;
                this.pageData.current = 1;
                this.list();
            },
            brandId() {
              this.list();
            }
        },
        methods: {
            loadData() {
                this.list();
                this.getBrandList();
            },
            changeLimit(limit) {
                this.dateRange = [this[`day${limit}`], this.today];
                this.pageData.current = 1;
            },
            pageChange(page) {
                this.pageData.current = page;
                this.list();
            },
            filtersParams() {
                let params = {};
                let pageNo = this.pageData.current;
                let pageSize = this.pageData.pageSize;

                params.pageSize = this.pageData.pageSize;
                params.pageNo = this.pageData.current;

                return Promise.resolve({
                    params,
                    pageNo,
                    pageSize
                });
            },
            getBrandList() {
              return this.productService.queryBrandsByShopId().then(result => {
                this.brandList = result.data;
              })
            },
            list() {
                this.$Loading.start();

                return this.filtersParams().then((params) => {
                    let filter = {
                        begin: this.beginDate,
                        end: this.endDate,
                        pageNo: params.pageNo,
                    };
                    if (this.brandId && this.brandId !== '0') {
                      filter = Object.assign({}, filter, {brandId: this.brandId});
                    }
                    return this.productService.getShopOverview(filter);
                }).then(result => {
                    if (!result.data) {
                        result.data = {
                            pageNo: 1,
                            pageSize: 1,
                            totalCount: 1,
                            totalPage: 1,
                            records: []
                        }
                    }
                    this.pageData.total = result.data.totalCount;
                    this.pageData.current = result.data.pageNo;
                    this.tableData = result.data.records;
                    this.$Loading.finish();
                }).catch(() => {
                    this.$Loading.finish();
                });
            },
            exportFile() {
                let param = {};

                param.begin = this.beginDate;
                param.end = this.endDate;
                param.platform = '1,2,3,4';
                if (this.brandId && this.brandId !== '0') {
                    param.brandId = this.brandId;
                }

                const href = '/Api/platform/exportOneShopProductOverview?queryConf=' +
                    JSON.stringify(param);

                window.open(href, '_blank');
            }
        }
    };
</script>

<style lang="scss">
    .stat-shop {
        .ivu-tabs-tabpane {
            height: 400px;
            position: relative;
        }
    }

    .layout-container {
        min-height: 200px;
        margin: 15px;
        overflow: hidden;
        background: #fff;
        border-radius: 4px;

        .layout-filter .line {
            border-top: none;
            margin-bottom: 0;
        }
    }

    .shop-card {
        margin-top: 10px;
        margin-bottom: 10px;
    }

    .box-title {
        font-weight: 700;
        color: #495060;
        font-size: 16px;
        line-height: 22px;
        margin: 5px;

        &:before {
            content: " ";
            display: inline-block;
            width: 5px;
            margin-right: 2px;
            height: 22px;
            vertical-align: top;
            background-color: #999;
        }
    }

    .box-item {
        width: 90%;
        height: 50px;
        padding: 0 0 0 15px;
        line-height: 50px;
        font-size: 14px;
        overflow: hidden;
        border-radius: 5px;
        color: #fff;
        margin-bottom: 10px;

        .box-item-label {
            display: inline-block;
            min-width: 75px;
            vertical-align: top;
            font-weight: normal;
        }

        .box-item-value {
            font-size: 20px;
            font-weight: 600;
        }

        i {
            display: inline-block;
            width: 20px;
            height: 20px;
            font-size: 22px;
            text-align: center;
            margin-top: -7px;
            vertical-align: middle;
            margin-right: 3px;
        }
    }

    .box-filter {
        .ivu-date-picker {
            margin-left: 0;
            width: 220px !important;
        }

        .quick {
            display: inline-block;
            margin-left: 20px;
            margin-right: 50px;

            a {
                margin-right: 5px;
            }
        }

        .brand-select-container {
            display: inline-block;
            width: 280px;
        }
    }

    .ivu-table-cell {
        padding-left: 6px;
        padding-right: 6px;
    }
</style>