web/manager/src/views/seller/bill/bill-detail.vue
Chopper711 376a3223dc fix: 优化积分商品添加页面和对账单详情页面的功能 (master)
- 移除积分商品添加页面的冗余标题
- 将兑换时间选择器替换为活动时间范围选择器
- 简化验证规则,使用rangeTime替代单独的开始和结束时间
- 调整批量删除按钮和其他按钮的样式格式
- 在对账单详情页面添加删除消息提示框功能
2025-02-21 16:09:14 +08:00

729 lines
21 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>
<div>
<Card>
<p slot="title">结算单详情</p>
<div class="flex flex_align_item">
<div class="procedure">
<div class="procedure_item" v-for="(item, index) in billStatusStep">
<div class="icon" :class="item.className">
<Icon type="md-checkmark" size="14" v-if="item.className==='' || bill.billStatus === 'COMPLETE'" />
<span v-else>{{index + 1}}</span>
</div>
<div class="text">{{item.title}}</div>
</div>
</div>
<div>
<Button v-if="bill.billStatus == 'CHECK'" type="success" @click="pass()" style="margin-left: 10px;">付款</Button>
<Button type="info" @click="download()" style="margin-left: 10px;">下载账单</Button>
</div>
</div>
</Card>
<Card class="mt_10">
<p slot="title">账单详细</p>
<table>
<tbody>
<tr v-for="(item,index) in data" :key="index">
<td>{{ item.name }}</td>
<td>{{ item.value }}</td>
</tr>
</tbody>
</table>
<div>
<h3 class="ml_10">结算详细</h3>
<Table :columns="billColumns" :data="billData"></Table>
<div class="bill-detail-price">
<div class="flex bill-item">
</div>
</div>
</div>
</Card>
<Card class="mt_10">
<Tabs active-key="tab" type="card">
<Tab-pane label="结算单流水" name="order">
<Table :loading="loading" border :columns="orderColumns" :data="orderData" ref="table"></Table>
<Row type="flex" justify="end" class="mt_10">
<Page :current="orderParam.pageNumber" :total="orderTotal" :page-size="orderParam.pageSize"
@on-change="orderChangePage" @on-page-size-change="orderChangePageSize" size="small" show-total
show-elevator></Page>
</Row>
</Tab-pane>
</Tabs>
</Card>
</div>
</template>
<script>
import * as filters from "@/utils/filters";
import * as API_Shop from "@/api/shops";
export default {
name: "bill-detail",
data() {
return {
loading: false,
billColumns: [
{
title: '结算金额',
key: 'billPrice',
align: 'center',
width: 200,
fixed: 'left',
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.billPrice, "¥")
);
},
},
{
title: '收入',
key: 'pay',
align: 'center',
children: [
{
title: '用户实付',
key: 'orderPrice',
align: 'center',
width: 200,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.orderPrice, "¥")
);
},
}, {
title: '平台优惠券补贴',
key: 'siteCouponCommission',
align: 'center',
width: 200,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.siteCouponCommission, "¥")
);
},
}, {
title: '积分商品补贴',
key: 'pointSettlementPrice',
align: 'center',
width: 200,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.pointSettlementPrice, "¥")
);
},
}, {
title: '砍价商品补贴',
key: 'kanjiaSettlementPrice',
align: 'center',
width: 200,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.kanjiaSettlementPrice, "¥")
);
},
}, {
title: '分销佣金',
key: 'distributionCommission',
align: 'center',
width: 200,
render: (h, params) => {
return h("priceColorScheme", {
props: {
value: (0 - params.row.distributionCommission),
color: this.$mainColor
}
});
},
}, {
title: '平台服务费',
key: 'commissionPrice',
align: 'center',
width: 200,
render: (h, params) => {
return h("priceColorScheme", {
props: {
value: (0 - params.row.commissionPrice),
color: this.$mainColor
}
});
},
},
]
},
{
title: '退款',
key: 'refund',
align: 'center',
children: [
{
title: '退款金额',
key: 'refundPrice',
align: 'center',
width: 200,
render: (h, params) => {
return h("priceColorScheme", {props: {value: (0 - params.row.refundPrice), color: this.$mainColor}});
},
}, {
title: '退单返还平台优惠券补贴',
key: 'siteCouponRefundCommission',
align: 'center',
width: 200,
render: (h, params) => {
return h("priceColorScheme", {
props: {
value: (0 - params.row.siteCouponRefundCommission),
color: this.$mainColor
}
});
},
}, {
title: '退单返还积分商品补贴',
key: 'pointRefundSettlementPrice',
align: 'center',
width: 200,
render: (h, params) => {
return h("priceColorScheme", {
props: {
value: (0 - params.row.pointRefundSettlementPrice),
color: this.$mainColor
}
});
},
}, {
title: '退单返还砍价商品补贴',
key: 'kanjiaRefundSettlementPrice',
align: 'center',
width: 200,
render: (h, params) => {
return h("priceColorScheme", {
props: {
value: (0 - params.row.kanjiaRefundSettlementPrice),
color: this.$mainColor
}
});
},
}, {
title: '退单返还分销佣金',
key: 'distributionRefundCommission',
align: 'center',
width: 200,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.distributionRefundCommission, "¥")
);
},
}, {
title: '退单返还平台服务费',
key: 'refundCommissionPrice',
align: 'center',
width: 200,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.refundCommissionPrice, "¥")
);
},
},
]
},
],
billData: [
{
billPrice: 0,
orderPrice: 0,
siteCouponCommission: 0,
pointSettlementPrice: 0,
kanjiaSettlementPrice: 0,
distributionCommission: 0,
commissionPrice: 0,
refundPrice: 0,
siteCouponRefundCommission: 0,
pointRefundSettlementPrice: 0,
kanjiaRefundSettlementPrice: 0,
distributionRefundCommission: 0,
refundCommissionPrice: 0
},
],
columns: [
// 表头
{
title: "项目",
key: "name",
width: 250,
},
{
title: "值",
key: "value",
},
],
data: [
// 数据
{
name: "计算中",
value: 0,
},
{
name: "计算中",
value: 0,
},
{
name: "计算中",
value: 0,
},
{
name: "计算中",
value: 0,
},
{
name: "计算中",
value: 0,
},
{
name: "计算中",
value: 0,
},
{
name: "计算中",
value: 0,
},
{
name: "计算中",
value: 0,
},
{
name: "计算中",
value: 0,
},
],
id: "", // 账单id
bill: {}, // 账单详情
orderData: [], // 订单列表
orderParam: {
// 请求参数
pageNumber: 1, // 当前页数
pageSize: 10, // 页面大小
sort: "id", // 默认排序字段
order: "desc", // 默认排序方式
// flowType: "PAY",
startDate: null,
endDate: null,
},
orderColumns: [
{
title: '结算信息',
key: 'pay',
align: 'center',
children: [
{
title: "时间",
key: "createTime",
},
{
title: "订单编号",
key: "orderSn",
width: 250,
},
{
title: "子订单号",
key: "orderItemSn",
width: 250,
},
{
title: "类型",
key: "flowType",
render: (h, params) => {
if (params.row.flowType == "PAY") {
return h("div", [
h("tag", {props: {color: "blue"}}, "收款"),
]);
} else {
return h("div", [
h("tag", {props: {color: "magenta"}}, "退款"),
]);
}
}
},
{
title: "结算金额",
key: "billPrice",
render: (h, params) => {
if (params.row.flowType == "PAY") {
return h("div", this.$options.filters.unitPrice(params.row.billPrice, "¥")
);
} else {
return h("priceColorScheme", {props: {value: (0 - params.row.billPrice), color: this.$mainColor}});
}
},
},
]
},
{
title: '收入',
key: 'pay',
align: 'center',
children: [{
title: "补贴",
key: "billPrice",
render: (h, params) => {
if (params.row.pointSettlementPrice == 0) {
return h("div", "-");
} else if (params.row.flowType == "PAY") {
return h("div", this.$options.filters.unitPrice((params.row.pointSettlementPrice + params.row.kanjiaSettlementPrice + params.row.siteCouponCommission), "¥")
);
} else {
return h("priceColorScheme", {props: {value: (0 - (params.row.pointSettlementPrice + params.row.kanjiaSettlementPrice + params.row.siteCouponCommission))}});
}
},
},
{
title: "用户实付",
key: "billPrice",
render: (h, params) => {
if (params.row.flowType == "PAY") {
return h("div", this.$options.filters.unitPrice(params.row.finalPrice, "¥")
);
} else {
return h("priceColorScheme", {props: {value: (0 - params.row.finalPrice)}});
}
},
},
{
title: "合计",
key: "billPrice",
render: (h, params) => {
if (params.row.flowType == "PAY") {
return h("div", this.$options.filters.unitPrice(params.row.finalPrice, "¥")
);
} else {
return h("priceColorScheme", {props: {value: (0 - params.row.finalPrice)}});
}
},
},
]
},
{
title: '支出',
key: 'pay',
align: 'center',
children: [{
title: "平台服务费",
key: "billPrice",
render: (h, params) => {
if (params.row.commissionPrice == 0) {
return h("div", "-");
} else if (params.row.flowType == "PAY") {
return h("priceColorScheme", {props: {value: (0 - params.row.commissionPrice)}});
} else {
return h("div", this.$options.filters.unitPrice(params.row.commissionPrice, "¥"));
}
},
},
{
title: "分销佣金",
key: "distributionRebate",
render: (h, params) => {
if (params.row.distributionRebate == 0) {
return h("div", "-");
} else if (params.row.flowType == "PAY") {
return h("priceColorScheme", {props: {value: (0 - params.row.distributionRebate)}});
} else {
return h("div", this.$options.filters.unitPrice(params.row.distributionRebate, "¥"));
}
},
},
{
title: "合计",
key: "billPrice",
render: (h, params) => {
if (params.row.flowType == "PAY") {
return h("priceColorScheme", {props: {value: (0 - (params.row.commissionPrice + params.row.distributionRebate))}});
} else {
return h("div", this.$options.filters.unitPrice((params.row.commissionPrice + params.row.distributionRebate), "¥"));
}
},
}]
}
],
orderTotal: 0, // 订单总数
refundTotal: 0, // 退款单总数
// 结算单状态枚举模拟数据
billStatusList: [
{ status: 'OUT', value: '已出账', title: '生成账单' },
{ status: 'CHECK', value: '已对账', title: '商家对账' },
{ status: 'PAY', value: '已付款', title: '平台付款' },
{ status: 'COMPLETE', value: '已完成', title: '结算完成' },
],
// 结算单状态步骤
billStatusStep: []
};
},
methods: {
// 结算单状态
getBillStatusStep() {
this.billStatusStep = [];
let current = '', myCur = false, myIdx = 0;
this.billStatusList.map((item, index) => {
if (item.status === this.bill.billStatus) {
myCur = true; myIdx = index; current = '';
} else {
if (!myCur) {
current = '';
} else {
if (myIdx+1 === index) {
current = 'current';
} else {
current = 'future';
}
}
}
let temp = { ...item, className: current };
this.billStatusStep.push (temp);
});
if (this.bill.billStatus === 'COMPLETE') {
this.billStatusStep[this.billStatusStep.length-1].className = 'current';
}
},
//订单页数发生变化
orderChangePage(v) {
this.orderParam.pageNumber = v;
this.getOrder();
},
//订单每页条数变化
orderChangePageSize(v) {
this.orderParam.pageNumber = 1;
this.orderParam.pageSize = v;
this.getOrder();
},
//平台审核通过(审核通过及付款)
pass() {
this.$Modal.confirm({
title: "结算单付款",
// 记得确认修改此处
content: "确定结算单已付款?",
loading: true,
onOk: () => {
API_Shop.pay(this.id).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success(res.message);
this.init();
}
});
},
});
},
//下载账单
download() {
API_Shop.downloadBill(this.id).then((res) => {
const blob = new Blob([res], {
type: "application/vnd.ms-excel;charset=utf-8",
});
//对于<a>标签,只有 Firefox 和 Chrome内核 支持 download 属性
//IE10以上支持blob但是依然不支持download
if ("download" in document.createElement("a")) {
//支持a标签download的浏览器
const link = document.createElement("a"); //创建a标签
link.download = "结算单-"+this.id+".xls"; //a标签添加属性
link.style.display = "none";
link.href = URL.createObjectURL(blob);
document.body.appendChild(link);
link.click(); //执行下载
URL.revokeObjectURL(link.href); //释放url
document.body.removeChild(link); //释放标签
} else {
navigator.msSaveBlob(blob, fileName);
}
})
.catch((err) => {
console.log(err);
});
},
init() {
this.id = this.$route.query.id;
this.getDetail();
},
getDetail() {
API_Shop.getBuyBillDetail(this.id).then((res) => {
if (res.success) {
this.bill = res.result;
//初始化表格
this.initTable();
//初始化订单信息
this.orderParam.startDate = this.bill.startTime;
this.orderParam.endDate = this.bill.endTime;
this.getOrder();
// 结算单状态步骤
this.getBillStatusStep();
}
});
},
// 账单详细
initTable() {
let bill = this.bill;
this.data[0].name = "结算单状态";
this.data[0].value = filters.unixSellerBillStatus(bill.billStatus);
this.data[1].name = "结算单号";
this.data[1].value = bill.sn;
this.data[2].name = "店铺名称";
this.data[2].value = bill.storeName;
this.data[3].name = "起止日期";
this.data[3].value = bill.startTime + "~" + bill.endTime;
this.data[4].name = "银行开户名";
this.data[4].value = bill.bankAccountName;
this.data[5].name = "银行账号";
this.data[5].value = bill.bankAccountNumber;
this.data[6].name = "开户行支行名称";
this.data[6].value = bill.bankName;
this.data[7].name = "支行联行号";
this.data[7].value = bill.bankCode;
this.data[8].name = "支付时间";
this.data[8].value = bill.payTime === null ? "未付款" : bill.payTime;
this.billData[0].billPrice = this.bill.billPrice;
this.billData[0].orderPrice = this.bill.orderPrice;
this.billData[0].siteCouponCommission = this.bill.siteCouponCommission;
this.billData[0].pointSettlementPrice = this.bill.pointSettlementPrice;
this.billData[0].kanjiaSettlementPrice = this.bill.kanjiaSettlementPrice;
this.billData[0].distributionCommission = this.bill.distributionCommission;
this.billData[0].commissionPrice = this.bill.commissionPrice;
this.billData[0].refundPrice = this.bill.refundPrice;
this.billData[0].siteCouponRefundCommission = this.bill.siteCouponRefundCommission;
this.billData[0].pointRefundSettlementPrice = this.bill.pointRefundSettlementPrice;
this.billData[0].kanjiaRefundSettlementPrice = this.bill.kanjiaRefundSettlementPrice;
this.billData[0].distributionRefundCommission = this.bill.distributionRefundCommission;
this.billData[0].refundCommissionPrice = this.bill.refundCommissionPrice;
},
getOrder() {
API_Shop.getStoreFlow(this.id, this.orderParam).then((res) => {
if (res.result) {
this.orderData = res.result.records;
this.orderTotal = res.result.total;
}
});
this.orderTotal = this.orderData.length;
},
},
mounted() {
this.init();
},
};
</script>
<style scoped lang="scss">
.flex {
justify-content: space-between;
flex-wrap: wrap;
> p {
width: 50%;
margin: 15px 0;
}
}
.tips-status {
padding: 10px;
font-size: 14px;
> span {
font-weight: bold;
margin-right: 8px;
}
> span:nth-of-type(2) {
color: $theme_color;
}
}
table {
font-size: 14px;
margin-left: 40px;
tr {
font-size: 12px;
height: 40px;
padding: 10px;
td:nth-child(1) {
width: 120px;
}
}
}
.bill-detail-price {
display: flex;
align-items: center;
flex-wrap: wrap;
padding: 10px;
> span {
font-size: 14px;
text-align: center;
width: 200px;
margin-bottom: 20px;
}
.increase-color {
color: green;
margin-top: 5px
}
.theme_color {
margin-top: 5px
}
}
.procedure {
display: flex;
align-items: center;
justify-content: flex-start;
font-size: 14px;
font-weight: bold;
margin: 12px 0 12px 20px;
.procedure_item {
width: 160px;
display: flex;
align-items: center;
justify-content: center;
.icon {
width: 24px;
height: 24px;
text-align: center;
line-height: 24px;
border-radius: 50%;
margin-right: 14px;
font-weight: normal;
background-color: #e6f7ff;
color: #1890ff;
}
.current {
background-color: #2d8cf0;
color: #ffffff;
}
.future {
background-color: #f7f7f7;
color: #515a6e;
}
.text {
}
}
}
</style>