2023-08-06 16:50:17 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
|
|
|
|
|
|
<ai-list class="list">
|
|
|
|
|
|
<ai-title
|
|
|
|
|
|
slot="title"
|
|
|
|
|
|
title="销售数据"
|
|
|
|
|
|
isShowBottomBorder>
|
|
|
|
|
|
</ai-title>
|
|
|
|
|
|
<template slot="content">
|
|
|
|
|
|
<ai-search-bar>
|
|
|
|
|
|
<template #left>
|
2023-08-08 02:13:54 +08:00
|
|
|
|
<div class="search-item">
|
|
|
|
|
|
<label style="width:90px">店铺:</label>
|
|
|
|
|
|
<el-select v-model="mallId" @change="beforeGetList" placeholder="请选择">
|
|
|
|
|
|
<el-option
|
|
|
|
|
|
v-for="item in $store.state.mallList"
|
|
|
|
|
|
:key="item.mallId"
|
|
|
|
|
|
:label="item.mallName"
|
|
|
|
|
|
:value="item.mallId">
|
|
|
|
|
|
</el-option>
|
|
|
|
|
|
</el-select>
|
|
|
|
|
|
</div>
|
2023-08-06 16:50:17 +08:00
|
|
|
|
</template>
|
|
|
|
|
|
<template #right>
|
|
|
|
|
|
<json-excel
|
|
|
|
|
|
:data="list"
|
|
|
|
|
|
:fields="jsonFields"
|
|
|
|
|
|
:before-generate = "startDownload"
|
|
|
|
|
|
name="销售数据.xls"
|
|
|
|
|
|
worksheet="销售统计">
|
2023-08-07 13:51:28 +08:00
|
|
|
|
<el-button type="primary">导出销售数据</el-button>
|
2023-08-06 16:50:17 +08:00
|
|
|
|
</json-excel>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
</ai-search-bar>
|
2023-08-14 17:21:31 +08:00
|
|
|
|
<div>
|
2023-08-14 23:30:05 +08:00
|
|
|
|
<ai-card :hideTitle="true" :panel="true">
|
2023-08-14 17:21:31 +08:00
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
|
<el-col :span="6">
|
2023-08-14 23:30:05 +08:00
|
|
|
|
<div><el-statistic title="今天销量" :value="todayTotal"></el-statistic></div>
|
2023-08-14 17:21:31 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="6">
|
2023-08-14 23:30:05 +08:00
|
|
|
|
<div><el-statistic title="今天销售额" group-separator="," :precision="2" :value="todayMoney"></el-statistic></div>
|
2023-08-14 17:21:31 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="6">
|
2023-08-14 23:30:05 +08:00
|
|
|
|
<div><el-statistic title="库存总量" :value="inventoryTotal"></el-statistic></div>
|
2023-08-14 17:21:31 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="6">
|
2023-08-14 23:30:05 +08:00
|
|
|
|
<div><el-statistic title="库存总额" group-separator="," :precision="2" :value="inventoryMoeny"></el-statistic></div>
|
2023-08-14 17:21:31 +08:00
|
|
|
|
</el-col>
|
|
|
|
|
|
</el-row>
|
2023-08-14 23:30:05 +08:00
|
|
|
|
</ai-card>
|
2023-08-14 17:21:31 +08:00
|
|
|
|
</div>
|
2023-08-06 16:50:17 +08:00
|
|
|
|
<ai-table
|
|
|
|
|
|
:isShowPagination="false"
|
|
|
|
|
|
:tableData="list"
|
|
|
|
|
|
:col-configs="colConfigs"
|
|
|
|
|
|
:total="list.length"
|
|
|
|
|
|
style="margin-top: 8px;"
|
|
|
|
|
|
@getList="() => {}">
|
|
|
|
|
|
</ai-table>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
</ai-list>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
|
import {sendChromeAPIMessage} from '@/api/chromeApi'
|
|
|
|
|
|
import JsonExcel from 'vue-json-excel'
|
|
|
|
|
|
import { Message } from 'element-ui'
|
|
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
|
name: 'ExportSaleData',
|
|
|
|
|
|
|
|
|
|
|
|
data () {
|
|
|
|
|
|
return {
|
|
|
|
|
|
list: [],
|
2023-08-08 02:13:54 +08:00
|
|
|
|
mallId: '',
|
2023-08-06 16:50:17 +08:00
|
|
|
|
pageSize: 10,
|
|
|
|
|
|
currentPage: 1,
|
2023-08-14 23:30:05 +08:00
|
|
|
|
todayTotal: 0,
|
|
|
|
|
|
todayMoney: 0.0,
|
|
|
|
|
|
inventoryTotal: 0,
|
|
|
|
|
|
inventoryMoeny: 0.0,
|
2023-08-06 16:50:17 +08:00
|
|
|
|
colConfigs: [
|
|
|
|
|
|
{
|
|
|
|
|
|
prop: 'productName',
|
|
|
|
|
|
label: '商品名称',
|
2023-08-14 17:21:31 +08:00
|
|
|
|
"show-overflow-tooltip": true,
|
|
|
|
|
|
width: '300px',
|
2023-08-06 16:50:17 +08:00
|
|
|
|
align: 'left'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
prop: 'productId',
|
|
|
|
|
|
label: 'SPU',
|
|
|
|
|
|
align: 'center'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
prop: 'productSkcId',
|
|
|
|
|
|
label: 'SKC',
|
|
|
|
|
|
align: 'center'
|
|
|
|
|
|
},
|
2023-08-14 17:21:31 +08:00
|
|
|
|
{
|
|
|
|
|
|
prop: 'productSkuId',
|
|
|
|
|
|
label: 'SKU ID',
|
|
|
|
|
|
align: 'center'
|
|
|
|
|
|
},
|
2023-08-06 16:50:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
prop: 'className',
|
|
|
|
|
|
label: 'SKU属性',
|
|
|
|
|
|
align: 'center'
|
|
|
|
|
|
},
|
2023-08-14 17:21:31 +08:00
|
|
|
|
{
|
|
|
|
|
|
prop: 'isVerifyPrice',
|
|
|
|
|
|
label: '开款核价状态',
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
format: v => v ? '核价通过': '核价未通过 / 无法备货'
|
|
|
|
|
|
},
|
2023-08-06 16:50:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
prop: 'supplierPrice',
|
|
|
|
|
|
label: '申报价格(CNY)',
|
|
|
|
|
|
align: 'center',
|
2023-08-14 17:21:31 +08:00
|
|
|
|
format: v => v / 100,
|
|
|
|
|
|
fixed: "right"
|
2023-08-06 16:50:17 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
2023-08-14 17:21:31 +08:00
|
|
|
|
prop: 'warehouseInventoryNum',
|
|
|
|
|
|
label: '仓内可用库存',
|
2023-08-06 16:50:17 +08:00
|
|
|
|
align: 'center',
|
2023-08-14 17:21:31 +08:00
|
|
|
|
fixed: "right"
|
2023-08-06 16:50:17 +08:00
|
|
|
|
},
|
2023-08-14 17:21:31 +08:00
|
|
|
|
{
|
|
|
|
|
|
prop: 'productTotalPrice',
|
2023-08-14 23:30:05 +08:00
|
|
|
|
label: '库存货值(CNY)',
|
2023-08-14 17:21:31 +08:00
|
|
|
|
align: 'center',
|
|
|
|
|
|
fixed: "right"
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2023-08-06 16:50:17 +08:00
|
|
|
|
],
|
|
|
|
|
|
jsonFields: {
|
|
|
|
|
|
"商品名称": "productName",
|
|
|
|
|
|
"SPU": "productId",
|
|
|
|
|
|
"SKC": "productSkcId",
|
2023-08-14 17:21:31 +08:00
|
|
|
|
"SKU ID": "productSkuId",
|
2023-08-06 16:50:17 +08:00
|
|
|
|
"SKU属性": "className",
|
|
|
|
|
|
"申报价格(CNY)": {
|
|
|
|
|
|
"field": "supplierPrice",
|
|
|
|
|
|
callback: (value) => {
|
|
|
|
|
|
return value /100;
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
"SKU货号": "skuExtCode",
|
|
|
|
|
|
"开款核价状态": {
|
|
|
|
|
|
"field": "isVerifyPrice",
|
|
|
|
|
|
callback: (value) => {
|
|
|
|
|
|
return value ? '核价通过': '核价未通过 / 无法备货';
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
"缺货数量": "lackQuantity",
|
|
|
|
|
|
"建议备货量": "adviceQuantity",
|
|
|
|
|
|
"可售天数": "availableSaleDays",
|
|
|
|
|
|
"库存可售天数": "availableSaleDaysFromInventory",
|
|
|
|
|
|
"仓内库存可售天数": "warehouseAvailableSaleDays",
|
|
|
|
|
|
"近7日用户加购数量": "inCartNumber7d",
|
|
|
|
|
|
"用户累计加购数量": "inCardNumber",
|
|
|
|
|
|
"已订阅待提醒到货": "nomsgSubsCntCntSth",
|
|
|
|
|
|
"销售数据 - 今日": "todaySaleVolume",
|
|
|
|
|
|
"销售数据 - 近7日": "lastSevenDaysSaleVolume",
|
|
|
|
|
|
"销售数据 - 近30天": "lastThirtyDaysSaleVolume",
|
|
|
|
|
|
"库存数据 - 仓内可用库存": "inventoryNumInfo.warehouseInventoryNum",
|
|
|
|
|
|
"库存数据 - 仓内暂不可用库存": "inventoryNumInfo.unavailableWarehouseInventoryNum",
|
|
|
|
|
|
"库存数据 - 已发货库存": "inventoryNumInfo.waitReceiveNum",
|
|
|
|
|
|
"库存数据 - 已下单待发货库存": "inventoryNumInfo.waitDeliveryInventoryNum",
|
|
|
|
|
|
"库存数据 - 待审核备货库存": "inventoryNumInfo.waitApproveInventoryNum",
|
|
|
|
|
|
"VMI备货单数 - 待发货": "vmiOrderInfo.waitDeliveryNum",
|
|
|
|
|
|
"VMI备货单数 - 在途单数": "vmiOrderInfo.transportationNum",
|
|
|
|
|
|
"VMI备货单数 - 发货延迟": "vmiOrderInfo.deliveryDelayNum",
|
|
|
|
|
|
"VMI备货单数 - 到货延迟": "vmiOrderInfo.arrivalDelayNum",
|
|
|
|
|
|
"非VMI备货单数 - 待发货": "notVmiOrderInfo.waitDeliveryNum",
|
|
|
|
|
|
"非VMI备货单数 - 在途单数": "notVmiOrderInfo.transportationNum",
|
|
|
|
|
|
"非VMI备货单数 - 发货延迟": "notVmiOrderInfo.deliveryDelayNum",
|
|
|
|
|
|
"非VMI备货单数 - 到货延迟": "notVmiOrderInfo.arrivalDelayNum",
|
2023-08-14 17:21:31 +08:00
|
|
|
|
"备货逻辑": "purchaseConfig",
|
2023-08-14 23:30:05 +08:00
|
|
|
|
"库存货值(CNY)": "productTotalPrice",
|
2023-08-06 16:50:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
components: {
|
|
|
|
|
|
JsonExcel
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
created () {
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
methods: {
|
2023-08-08 02:13:54 +08:00
|
|
|
|
beforeGetList() {
|
|
|
|
|
|
this.list = []
|
2023-08-14 23:30:05 +08:00
|
|
|
|
this.todayMoney = 0.0
|
|
|
|
|
|
this.todayTotal = 0
|
|
|
|
|
|
this.inventoryMoeny = 0.0
|
|
|
|
|
|
this.inventoryTotal = 0
|
2023-08-08 02:13:54 +08:00
|
|
|
|
if (!this.mallId) {
|
|
|
|
|
|
Message.error("请先选择店铺")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2023-08-09 00:55:57 +08:00
|
|
|
|
this.$userCheck(this.mallId).then(() => {
|
|
|
|
|
|
this.getList()
|
|
|
|
|
|
}).catch((err) => {
|
|
|
|
|
|
console.log(err)
|
2023-08-08 02:13:54 +08:00
|
|
|
|
})
|
|
|
|
|
|
},
|
2023-08-06 16:50:17 +08:00
|
|
|
|
getList () {
|
|
|
|
|
|
sendChromeAPIMessage({
|
|
|
|
|
|
url: 'marvel-mms/cn/api/kiana/venom/sales/management/list',
|
|
|
|
|
|
needMallId: true,
|
2023-08-08 02:13:54 +08:00
|
|
|
|
mallId: this.mallId,
|
2023-08-06 16:50:17 +08:00
|
|
|
|
data: {
|
|
|
|
|
|
pageNo: this.currentPage,
|
|
|
|
|
|
pageSize: this.pageSize,
|
|
|
|
|
|
isLack: 0,
|
|
|
|
|
|
priceAdjustRecentDays: 7
|
|
|
|
|
|
}}).then((res) => {
|
|
|
|
|
|
if (res.errorCode == 1000000) {
|
|
|
|
|
|
for(let i = 0;i < res.result.subOrderList.length; i++) {
|
|
|
|
|
|
let item = res.result.subOrderList[i];
|
|
|
|
|
|
let data = {};
|
|
|
|
|
|
data.productName = item.productName;
|
|
|
|
|
|
data.productId = item.productId;
|
|
|
|
|
|
data.productSkcId = item.productSkcId;
|
|
|
|
|
|
data.purchaseConfig = item.purchaseConfig;
|
|
|
|
|
|
|
|
|
|
|
|
for(let j = 0;j < item.skuQuantityDetailList.length; j++) {
|
2023-08-14 17:21:31 +08:00
|
|
|
|
data = {...data, ...item.skuQuantityDetailList[j],
|
|
|
|
|
|
productTotalPrice: ((item.skuQuantityDetailList[j].supplierPrice / 100) * item.skuQuantityDetailList[j].inventoryNumInfo.warehouseInventoryNum).toFixed(2),
|
|
|
|
|
|
warehouseInventoryNum: item.skuQuantityDetailList[j].inventoryNumInfo.warehouseInventoryNum}
|
2023-08-14 23:30:05 +08:00
|
|
|
|
|
|
|
|
|
|
this.todayTotal += item.skuQuantityDetailList[j].todaySaleVolume
|
|
|
|
|
|
this.todayMoney += new Number(((item.skuQuantityDetailList[j].supplierPrice / 100) * item.skuQuantityDetailList[j].todaySaleVolume).toFixed(2))
|
|
|
|
|
|
this.inventoryTotal += item.skuQuantityDetailList[j].inventoryNumInfo.warehouseInventoryNum
|
|
|
|
|
|
this.inventoryMoeny += new Number(((item.skuQuantityDetailList[j].supplierPrice / 100) * item.skuQuantityDetailList[j].inventoryNumInfo.warehouseInventoryNum).toFixed(2))
|
2023-08-06 16:50:17 +08:00
|
|
|
|
this.list.push(data);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (this.pageSize == res.result.subOrderList.length) {
|
|
|
|
|
|
this.currentPage ++
|
2023-08-14 23:30:05 +08:00
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
this.getList()
|
|
|
|
|
|
}, 1000)
|
2023-08-06 16:50:17 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
Message.success('销售数据加载完成,可进行导出')
|
|
|
|
|
|
}
|
2023-08-09 02:32:02 +08:00
|
|
|
|
} else {
|
2023-08-14 23:30:05 +08:00
|
|
|
|
Message.error("【拼多多】" + res.errorMsg + ", 请重新尝试加载")
|
2023-08-06 16:50:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
|
|
|
|
|
startDownload() {
|
|
|
|
|
|
this.$http.post('/api/malluser/info').then(res => {
|
|
|
|
|
|
if (res.code == 0) {
|
|
|
|
|
|
this.$store.commit('setUserInfo', res.data)
|
|
|
|
|
|
if (res.data.flag != 1) {
|
|
|
|
|
|
Message.error('您的账号未激活或已失效,请激活后使用')
|
|
|
|
|
|
this.$store.commit('setActiveDlgShow', true)
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
2023-08-14 17:21:31 +08:00
|
|
|
|
.like {
|
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
|
font-size: 25px;
|
|
|
|
|
|
display: inline-block;
|
|
|
|
|
|
}
|
2023-08-06 16:50:17 +08:00
|
|
|
|
</style>
|