Files
temu-plugin/src/view/sale/LogisticFee.vue
liushiwei bbde4e3f3f 调整
2024-10-30 09:42:08 +08:00

418 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<ai-list class="list" v-loading="isLoading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading">
<ai-title
slot="title"
title="物流统计"
tips="数据来源于“履约服务账单->明细->缴费记录”"
isShowBottomBorder>
</ai-title>
<template slot="content">
<div class="content">
<ai-search-bar>
<template #left>
<div class="search-item">
<label>缴费完成时间</label>
<el-date-picker
v-model="searchDate"
type="daterange"
range-separator=""
start-placeholder="开始时间"
end-placeholder="结束时间">
</el-date-picker>
</div>
</template>
<template #right>
<el-button type="primary" @click="beforeGetList">加载</el-button>
</template>
</ai-search-bar>
<ai-card title="数据概览" style="padding-bottom: 40px;">
<div>
<el-row :gutter="20">
<el-col :span="6">
<div>
<el-statistic
group-separator=","
:precision="2"
:value="totalLogisticFee"
title="物流总费用"
>
</el-statistic>
</div>
</el-col>
<el-col :span="6">
<div>
<el-statistic
title="备货单总数"
:value="totalOrders"
>
</el-statistic>
</div>
</el-col>
<el-col :span="6">
<div>
<el-statistic
title="发货时填写总重量(KG)"
:value="totalWriteWeight"
>
</el-statistic>
</div>
</el-col>
<el-col :span="6">
<div>
<el-statistic
title="最终计费总重量(KG)"
:value="totalFinalWeight"
>
</el-statistic>
</div>
</el-col>
</el-row>
</div>
</ai-card>
<ai-card title="店铺分布" style="padding-bottom: 40px;">
<ai-table
:isShowPagination="false"
:tableData="tableData"
:col-configs="colConfigs"
:total="tableData.length"
height="500"
style="margin-top: 8px;"
@getList="() => {}">
</ai-table>
</ai-card>
<ai-card title="运费分布" style="padding-bottom: 40px;">
<ai-table
:isShowPagination="false"
:tableData="logisticTableData"
:col-configs="logisticColConfigs"
:total="tableData.length"
height="500"
style="margin-top: 8px;"
@getList="() => {}">
</ai-table>
</ai-card>
</div>
</template>
</ai-list>
</template>
<script>
import { Message } from 'element-ui'
import {sendChromeAPIMessage } from '@/api/chromeApi'
export default {
name: 'LogisticFee',
data () {
return {
searchDate: [],
reqData: {
pageNum: 1,
pageSize: 100
},
totalLogisticFee: 0.0,
totalOrders: 0,
totalWriteWeight: 0.0,
totalFinalWeight: 0.0,
colConfigs: [
{ prop: 'mallName', label: '店铺名称', align: 'left' },
{ prop: 'wayBillCount', label: '备货单数', align: 'left', sortable: true, 'sort-method': (a, b) => a.wayBillCount - b.wayBillCount },
{ prop: 'writeWeight', label: '填写重量(KG)', align: 'left', sortable: true, 'sort-method': (a, b) => a.writeWeight - b.writeWeight },
{ prop: 'weight', label: '实际重量(KG)', align: 'left', sortable: true, 'sort-method': (a, b) => a.weight - b.weight },
{ prop: 'amount', label: '物流费用', align: 'left', sortable: true, 'sort-method': (a, b) => a.amount - b.amount }
],
logisticColConfigs: [
{ prop: 'company', label: '物流公司', align: 'left' },
{ prop: 'writeWeight', label: '填写总重量(KG)', align: 'left', sortable: true, 'sort-method': (a, b) => a.writeWeight - b.writeWeight },
{ prop: 'weight', label: '实际总重量(KG)', align: 'left', sortable: true, 'sort-method': (a, b) => a.weight - b.weight },
{ prop: 'amount', label: '物流费用', align: 'left', sortable: true, 'sort-method': (a, b) => a.amount - b.amount }
],
isLoading: false,
tableData: [],
logisticTableData: [],
transList: [],
mallWayBillList: [],
logisticFeeList: []
}
},
methods: {
beforeGetList() {
this.$userCheck().then(() => {
this.toLoad()
}).catch((err) => {
})
},
async toLoad() {
if (!this.searchDate) {
Message.error("请选择时间范围")
return
}
this.reqData.pageNum = 1
this.tableData = []
this.logisticTableData = []
this.isLoading = true
this.totalLogisticFee = 0.0
this.totalOrders = 0
this.totalWriteWeight = 0.0
this.totalFinalWeight = 0.0
this.transList = []
this.mallWayBillList = []
this.logisticFeeList = []
let startTime = this.searchDate[0].getTime()
let endTime = this.searchDate[1].getTime() + 86400000 - 1
await this.getLogisticFee(startTime, endTime)
this.totalLogisticFee = Math.round(this.totalLogisticFee * 100)/100
this.totalFinalWeight = Math.round(this.totalFinalWeight * 100)/100
this.isLoading = false
},
async getLogisticFee(startTime, endTime) {
let res = await sendChromeAPIMessage({
url: `api/merchant/warehouse/express/pay/bill/list`,
needMallId: true,
mallId: this.$store.state.mallList[0].mallId,
data: {
...this.reqData,
sucTimeStart: startTime,
sucTimeEnd: endTime
}})
if (res.errorCode == 1000000) {
for (let i = 0; i < res.result.list.length; i++) {
let item = res.result.list[i]
this.totalLogisticFee += item.amount
this.transList.push({ptransId: item.ptransId, chargeType: item.chargeType} )
}
if ((this.reqData.pageSize * this.reqData.pageNum) < res.result.total) {
this.reqData.pageNum ++
await this.getLogisticFee(startTime, endTime)
} else {
await this.getLogisticDetail()
await this.getLogisticWeightDetail()
this.calcLogiticData()
}
}
},
async getLogisticDetail() {
for (let i = 0; i < this.transList.length; i++) {
let res = await sendChromeAPIMessage({
url: `api/merchant/warehouse/express/pay/bill/detail/list`,
needMallId: true,
mallId: this.$store.state.mallList[0].mallId,
data: {
chargeType: this.transList[i].chargeType,
pageSize: 100,
pageNum: 1,
ptransId: this.transList[i].ptransId
}})
if (res.errorCode == 1000000) {
for (let k = 0; k < res.result.list.length; k++) {
let item = res.result.list[k]
let flag = false
for (let j = 0; j < this.tableData.length; j++) {
if (this.tableData[j].mallId == item.mallId) {
flag = true
this.tableData[j].amount += item.amount
this.tableData[j].wayBillCount += item.wayBillCount
this.tableData[j].amount = Math.round(this.tableData[j].amount * 100)/100
this.totalOrders += item.wayBillCount
break
}
}
if (!flag) {
this.tableData.push({
mallId: item.mallId,
mallName: item.mallName,
amount: item.amount,
wayBillCount: item.wayBillCount,
weight: 0.0,
writeWeight: 0.0
})
this.totalOrders += item.wayBillCount
}
await this.getWayBillList(item.transId, item.mallId)
}
}
}
},
async getWayBillList(transId, mallId) {
let pageNum = 1
let pageSize = 100
while(true) {
let res = await sendChromeAPIMessage({
url: `api/merchant/warehouse/express/bill/detail/list`,
needMallId: true,
mallId: this.$store.state.mallList[0].mallId,
data: {
pageNum: pageNum,
pageSize: pageSize,
billStatus: 2,
mallId: mallId,
transId: transId
}})
if (res.errorCode == 1000000) {
let flag = false
for (let i = 0; i < this.logisticFeeList.length; i++) {
if (this.logisticFeeList[i].mallId == mallId) {
flag = true
for (let j = 0; j < res.result.list.length; j++) {
this.logisticFeeList[i].billList.push({
sn: res.result.list[j].mainWayBillSn,
amount: res.result.list[j].amount,
company: null,
waight: 0.0
})
}
break
}
}
if (!flag) {
let temp = {
mallId: mallId,
billList: []
}
for (let j = 0; j < res.result.list.length; j++) {
temp.billList.push({
sn: res.result.list[j].mainWayBillSn,
amount: res.result.list[j].amount,
company: null,
weight: 0.0,
writeWeight: 0.0
})
}
this.logisticFeeList.push(temp)
}
if (pageNum * pageSize < res.result.total) {
pageNum ++
} else {
break
}
}
}
},
async getLogisticWeightDetail() {
for (let i = 0; i < this.logisticFeeList.length; i++) {
let page = 1
let weight = 0.0
let writeWeight = 0.0
while(true) {
let tempList = []
for (let j = (page-1)*20; j < this.logisticFeeList[i].billList.length; j++) {
tempList.push(this.logisticFeeList[i].billList[j].sn)
if (tempList.length % 20 == 0) {
break
}
}
if (tempList.length == 0) break
let res = await sendChromeAPIMessage({
url: `bgSongbird-api/supplier/delivery/feedback/queryWaitConfirmWeightExpressList`,
needMallId: true,
mallId: this.logisticFeeList[i].mallId,
anti: true,
data: {
pageNo: 1,
pageSize: 20,
platformExpressMainSnList: tempList,
displayStatus: 100
}})
if (res.errorCode == 1000000) {
for (let ii = 0; ii < res.result.list.length; ii++) {
for (let jj = 0; jj < this.logisticFeeList[i].billList.length; jj++) {
if (this.logisticFeeList[i].billList[jj].sn == res.result.list[ii].expressDeliverySn) {
this.logisticFeeList[i].billList[jj].company = res.result.list[ii].expressCompany
this.logisticFeeList[i].billList[jj].weight = res.result.list[ii].realExpressWeight / 1000
this.logisticFeeList[i].billList[jj].writeWeight = res.result.list[ii].predictTotalPackageWeight / 1000
this.totalFinalWeight += res.result.list[ii].realExpressWeight / 1000
this.totalWriteWeight += res.result.list[ii].predictTotalPackageWeight / 1000
writeWeight += res.result.list[ii].predictTotalPackageWeight / 1000
weight += res.result.list[ii].realExpressWeight / 1000
break
}
}
}
page++
}
}
for (let kk = 0; kk < this.tableData.length; kk++) {
if (this.tableData[kk].mallId == this.logisticFeeList[i].mallId) {
this.tableData[kk].weight = Math.round(weight * 100)/100
this.tableData[kk].writeWeight = Math.round(writeWeight * 100)/100
break
}
}
}
},
calcLogiticData() {
for (let i = 0; i < this.logisticFeeList.length; i++) {
for (let j = 0; j < this.logisticFeeList[i].billList.length; j++) {
let flag = false
for (let x = 0; x < this.logisticTableData.length; x++) {
if (this.logisticTableData[x].company == this.logisticFeeList[i].billList[j].company) {
flag = true
this.logisticTableData[x].writeWeight += this.logisticFeeList[i].billList[j].writeWeight
this.logisticTableData[x].weight += this.logisticFeeList[i].billList[j].weight
this.logisticTableData[x].amount += this.logisticFeeList[i].billList[j].amount
break
}
}
if (!flag) {
console.log(this.logisticFeeList[i].mallId, this.logisticFeeList[i].billList[j], this.logisticFeeList[i].billList[j].company)
this.logisticTableData.push({
company: this.logisticFeeList[i].billList[j].company,
writeWeight: this.logisticFeeList[i].billList[j].writeWeight,
weight: this.logisticFeeList[i].billList[j].weight,
amount: this.logisticFeeList[i].billList[j].amount,
weightPercent: 0.0,
amountPercent: 0.0
})
}
}
}
for (let j = 0; j < this.logisticTableData.length; j++) {
this.logisticTableData[j].weight = Math.round(this.logisticTableData[j].weight * 100)/100
this.logisticTableData[j].amount = Math.round(this.logisticTableData[j].amount * 100)/100
this.logisticTableData[j].company = this.logisticTableData[j].company || '退回服务费'
}
}
}
}
</script>
<style scoped lang="scss">
.list {
.title-right {
display: flex;
align-items: center;
& > div:first-child {
margin-right: 20px;
}
}
::v-deep.ai-list {
.ai-list__content--right-wrapper {
background: transparent;
box-shadow: none;
padding: 0!important;
}
}
}
</style>