Files
aida_front/src/component/Administrator/Transaction/TransactionTable.vue

593 lines
18 KiB
Vue

<template>
<div class="admin_page">
<div class="admin_table_search" :style="{height:isAwayOrUnfold?'7rem':''}">
<div class="admin_state">
<div class="admin_state_item">
<span>Create Time:</span>
<a-range-picker
style="width: 250px"
class="range_picker"
v-model:value="rangePickerValue"
:placeholder="[
$t('HistoryPage.StartDate'),
$t('HistoryPage.EndDate'),
]"
valueFormat="YYYY-MM-DD"
>
<template #suffixIcon>
<span
class="icon iconfont range_picker_icon icon-rili"
></span>
</template>
</a-range-picker>
</div>
<div class="admin_state_item">
<span>Country or Region:</span>
<a-select
v-model:value="country"
:allowClear="true"
show-search
style="width: 250px"
:filter-option="filterOption"
placeholder="Select Item..."
max-tag-count="responsive"
:options="countryList"
></a-select>
</div>
<div class="admin_state_item">
<span>City:</span>
<a-select
v-model:value="city"
:allowClear="true"
show-search
style="width: 250px"
:filter-option="filterOption"
placeholder="Select Item..."
max-tag-count="responsive"
:options="cityList"
></a-select>
</div>
<div class="admin_state_item">
<span>Payment Amount:</span>
<input
v-model="payerTotal"
placeholder="Please enter payment amount"
@keydown.enter="gettrialList"
type="text"
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>platform:</span>
<a-select
v-model:value="platform"
size="large"
style="width: 250px"
optionFilterProp="label"
:options="platformList"
placeholder="Please select"
allowClear
show-search
></a-select>
</div>
<div class="admin_state_item">
<span>Status:</span>
<a-select
v-model:value="status"
size="large"
style="width: 250px"
optionFilterProp="label"
:options="statusList"
placeholder="Please select"
allowClear
show-search
></a-select>
</div>
<div class="admin_state_item">
<span>Type:</span>
<a-select
v-model:value="type"
size="large"
style="width: 250px"
optionFilterProp="label"
:options="articleCategoryList"
placeholder="Please select"
allowClear
show-search
></a-select>
</div>
<div class="admin_state_item">
<span>Total Amount: {{ totalPayer }}</span>
</div>
</div>
<div class="admin_search">
<div class="admin_search_item" @click="searchHistoryList" :style="{height:isAwayOrUnfold?'4rem':''}">
Search
</div>
<div class="admin_search_item" @click="downloadTransaction">
Export
</div>
</div>
<div class="admin_state_list">
<div
class="admin_state_list_item"
@click="lastGeTrialList('year')"
>
Nearly a year
</div>
<div
class="admin_state_list_item"
@click="lastGeTrialList('month')"
>
Last month
</div>
<div
class="admin_state_list_item"
@click="lastGeTrialList('week')"
>
Last week
</div>
</div>
</div>
<div class="awayOrUnfold" :class="{active:isAwayOrUnfold}">
<span class="icon iconfont menu_icon icon-xiala" @click="()=>isAwayOrUnfold = !isAwayOrUnfold"></span>
</div>
<div class="admin_table_content" ref="historyTable">
<a-table
@resizeColumn="handleResizeColumn"
:loading="tableLoading"
:columns="columns"
:data-source="dataList"
:scroll="{ y: historyTableHeight }"
@change="changePage"
:showSorterTooltip='false'
:pagination="{
showSizeChanger: true,
current: currentPage,
pageSize: pageSize,
total: total,
showQuickJumper: true,
bordered: false,
}"
>
<template #bodyCell="{ column, text, record, index }">
<div class="operate_list" v-if="column?.Operations">
<div v-if="record.status == 'Success'" :class="{success:record.status == 'Success'}">
<i class="fi fi-ss-check-circle"></i>{{ record.status }}
</div>
<div v-if="record.status == 'Pending'" :class="{pending:record.status == 'Pending'}">
<i class="fi fi-br-hourglass-end"></i>{{ record.status }}
</div>
<div v-if="record.status == 'Fail'" :class="{fail:record.status == 'Fail'}">
<i class="fi fi-ss-cross-circle"></i>{{ record.status }}
</div>
</div>
</template>
</a-table>
</div>
</div>
</template>
<script lang="ts">
import {
defineComponent,
ref,
createVNode,
computed,
reactive,
toRefs,
onMounted,
} from "vue";
import { formatTime } from "@/tool/util";
import { useStore } from "vuex";
import { Https } from "@/tool/https";
import {getCookie,clonAllCookie} from '@/tool/cookie'
export default defineComponent({
components: {},
setup() {
const store:any = useStore()
let filter: any = reactive({
dataList: [],
tableLoading: false,
allCountry:[],
cityList: computed(()=>{
return store.state.adminPage.city
}),
countryList: computed(()=>{
return store.state.adminPage.country
}),
isAwayOrUnfold:false,
});
let filterData: any = reactive({
rangePickerValue: [],
currentPage: 1,
pageSize: 10,
total: 0,
country: "",
city:"",
payerTotal: "",
platform: "",
order: "", //'Ascending 升序 Descending 降序'
orderBy:'',
status: "",
type: "",
totalPayer:0,
});
let selectList=reactive({
platformList:[
{
label: "all",
value: "",
},
{
label:'PayPal',
value:'PayPal',
},
{
label:'Stripe',
value:'Stripe',
},
{
label:'Alipay-HK',
value:'Alipay-HK',
},
],
statusList:[
{
label: "all",
value: "",
},
{
label:'Success',
value:'Success',
},
{
label:'Fail',
value:'Fail',
},
{
label:'Pending',
value:'Pending',
},
],
articleCategoryList:[
{
label: "all",
value: "",
},
{
label:'new',
value:'new',
},
{
label:'renewal',
value:'renewal',
},
{
label:'credits',
value:'credits',
},
],
})
let renameData: any = ref({}); //修改名字选中的数据
const columns: any = computed(() => {
return [
{
title: "Id",
align: "center",
dataIndex: "id",
key: "id",
width:100,
fixed: "left",
sorter: true,
},
{
title: "Payer",
align: "center",
dataIndex: "payer",
key: "payer",
width:150,
ellipsis:true,
},
{
title: "Platform",
align: "center",
dataIndex: "platform",
key: "platform",
width:150,
ellipsis:true,
},
{
title: "Email",
align: "center",
dataIndex: "email",
key: "email",
width:200,
ellipsis:true,
},{
title: "Payment Amount",
align: "center",
dataIndex: "payerTotal",
key: "payerTotal",
width:150,
ellipsis:true,
},
{
title: "Type",
align: "center",
dataIndex: "type",
key: "type",
width:150,
ellipsis:true,
},
{
title: "Payment Method",
align: "center",
dataIndex: "paymentMethod",
key: "paymentMethod",
width:150,
ellipsis:true,
},
{
title: "last4",
key: "last4",
width:120,
align: "center",
dataIndex: "last4",
// slots:{customRender:'action'}
},
// {
// title: 'User Type',
// align: "center",
// dataIndex: "systemUser",
// key: "systemUser",
// width:100,
// customRender: (record: any) => {
// let str;
// if (record.value == 0) {
// str = "visitor";
// } else if (record.value == 1) {
// str = "yearly";
// } else if (record.value == 2) {
// str = "monthly";
// } else if (record.value == 3) {
// str = "trial";
// } else if (record.value == 4) {
// str = "userInEvent";
// }
// return str;
// },
// },
{
title: "City",
align: "center",
dataIndex: "city",
key: "city",
width:150,
ellipsis:true
},
{
title: "Country or Region",
align: "center",
dataIndex: "country",
key: "country",
width:200,
ellipsis:true
},
{
title: "Create Time",
align: "center",
dataIndex: "createTime",
key: "createTime",
width:150,
ellipsis:true,
},
{
title: "Status",
align: "center",
dataIndex: "status",
key: "status",
fixed: "right",
width:150,
Operations: true,
ellipsis:true,
}
];
});
//改变页码
let changePage = (e: any, filters:any, sorter:any) => {
filterData.currentPage = e.current;
filterData.pageSize = e.pageSize;
if(sorter.order){
if(sorter.columnKey == 'id'){
filterData.orderBy = 'id'
}else if(sorter.columnKey == "createDate"){
filterData.orderBy = 'time'
}else if(sorter.columnKey == "credits"){
filterData.orderBy = 'credits'
}
}
if(sorter.order){
filterData.order = sorter.order == "descend" ? "DESC" : "ASC";
}else{
filterData.order = ''
}
gettrialList();
};
//查询列表
let searchHistoryList = () => {
filterData.currentPage = 1;
gettrialList();
};
let clearHistoryList = () => {
filterData.rangePickerValue = [],
filterData.currentPage = 1,
filterData.pageSize = 10,
filterData.total = 0,
filterData.city = "",
filterData.country = "",
filterData.payerTotal = ""
filterData.order = "" //'Ascending 升序 Descending 降序'
filterData.orderBy = "" //'Ascending 升序 Descending 降序'
filterData.platform = ""
filterData.status = ""
filterData.type = ""
};
let setHistoryListData = () => {
let startDate: any = filterData.rangePickerValue?.[0]
? filterData.rangePickerValue[0] + " " + "00:00:00"
: "";
let endDate: any = filterData.rangePickerValue?.[1]
? filterData.rangePickerValue[1] + " " + "23:59:59"
: "";
console.log(startDate);
let data = {
order: filterData.order,
orderBy: filterData.orderBy,
"city": filterData.city,
"country": filterData.country,
startTime: startDate,
endTime: endDate,
"id": 0,
page: filterData.currentPage,
"payerTotal": filterData.payerTotal,
"platform": filterData.platform,
size: filterData.pageSize,
"status": filterData.status,
"type": filterData.type
};
return data;
};
//获取列表
let gettrialList = () => {
filter.tableLoading = true;
let data = setHistoryListData();
Https.axiosPost(Https.httpUrls.queryTransaction, data).then(
(rv: any) => {
if (rv) {
// this.dataList = rv
filter.dataList = rv.content;
filterData.total = rv.total;
filter.tableLoading = false;
filterData.totalPayer = rv.content.reduce((total: number, item: any) => {
const value = item && item.status === 'Success' ? parseFloat(item.payerTotal) : 0;
return total + (isNaN(value) ? 0 : value);
}, 0);
// this.workspaceItem.position = this.singleTypeList[0].label
}
}
);
};
//导出报表
let downloadTransaction = () => {
filter.tableLoading = true;
let data = setHistoryListData();
Https.axiosPost(Https.httpUrls.queryTransactionDownload, data).then(
(rv: any) => {
if (rv) {
fetch(rv)
.then(response => response.blob()) // 将响应转换为 Blob 对象
.then(blob => {
// 创建一个指向 Blob 对象的 URL
const link = document.createElement('a');
link.href = URL.createObjectURL(blob); // 将 Blob 对象转换为可下载的 URL
link.download = 'transaction'; // 设置文件名
filter.tableLoading = false;
link.click(); // 触发下载
URL.revokeObjectURL(link.href); // 释放 URL 对象
})
}
}
);
};
let lastGeTrialList = (str: string) => {
clearHistoryList();
let currentDate = new Date();
let currentTimestamp = Math.floor(currentDate.getTime() / 1000);
// 计算30天前的时间戳
let thirtyDaysAgoTimestamp;
if (str == "year") {
thirtyDaysAgoTimestamp = currentTimestamp - 360 * 24 * 60 * 60;
} else if (str == "month") {
thirtyDaysAgoTimestamp = currentTimestamp - 30 * 24 * 60 * 60;
} else if (str == "week") {
thirtyDaysAgoTimestamp = currentTimestamp - 7 * 24 * 60 * 60;
}
// filterData.rangePickerValue[0] = formatTime(
// thirtyDaysAgoTimestamp,
// "YYYY-MM-DD"
// );
filterData.rangePickerValue = [formatTime(thirtyDaysAgoTimestamp,'YYYY-MM-DD'),formatTime(currentTimestamp,'YYYY-MM-DD')]
gettrialList();
};
let filterOption = (input: any, option: any) => {
// 使用 option.label 进行搜索
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
onMounted(() => {
let allCountry: any = sessionStorage.getItem("allCountry");
if (allCountry) {
filter.allCountry = JSON.parse(allCountry);
}
gettrialList();
});
return {
...toRefs(filter),
...toRefs(filterData),
...toRefs(selectList),
columns,
renameData,
changePage,
searchHistoryList,
lastGeTrialList,
gettrialList,
downloadTransaction,
filterOption,
};
},
data() {
return {
historyTableHeight: 0,
handleResizeColumn: (w: any, col: any) => {
col.width = w;
},
};
},
mounted() {
let historyTable: any = this.$refs.historyTable;
this.historyTableHeight = historyTable.clientHeight - 200;
},
methods: {},
});
</script>
<style lang="less" scoped>
.admin_page .admin_table_search .admin_state {
display: flex;
flex-wrap: wrap;
}
:deep(.operate_list){
.fi{
font-size: 2rem;
margin-right: 1rem;
}
.success{
.fi-ss-check-circle{
color: #3ab45c;
}
}
.pending{
.fi-ss-check-circle{
color: #ffc628;
}
}
.fail{
.fi-ss-check-circle{
color: #ff0000;
}
}
}
</style>