Files
shencaisuan/html/tixianlist.html
T
2026-06-04 11:43:41 +08:00

451 lines
17 KiB
HTML

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title id="page-title">彩先知 - 提现记录</title>
<script src="../public/css/layui/layui.js"></script>
<script src="../config.js"></script>
<script src="../utils/ApiClient.js"></script>
<script src="../utils/DateUtil.js"></script>
<script src="../utils/CommonUtil.js"></script>
<link rel="stylesheet" href="../public/css/layui/css/layui.css" />
<link rel="stylesheet" href="../public/css/public.css" />
<link rel="stylesheet" href="../public/css/publish.css" />
<link rel="stylesheet" href="../public/css/pagination.css" />
<link rel="stylesheet" href="../public/css/tixianlist.css" />
</head>
<body>
<nav class="topbar" id="navbar">
<div class="topbar__inner">
<a href="index.html" class="topbar__brand">
<img src="../images/home-logo.png" alt="彩先知" class="topbar__logo" />
</a>
<div class="topbar__nav" id="navLotteryItems"></div>
<div class="topbar__user">
<div id="notLoggedInBox" class="topbar__guest">
<a href="login.html" class="topbar__btn topbar__btn--ghost">登录</a>
<a href="reg.html" class="topbar__btn topbar__btn--primary">免费注册</a>
</div>
<div id="loggedInBox" class="topbar__logged tl-hidden">
<a href="usercenter.html" class="topbar__profile">
<img id="userAvatar" src="../public/img/userimg.png" alt="" class="topbar__avatar" />
<div class="topbar__meta">
<span id="userName" class="topbar__uname">用户</span>
<span id="userLevel" class="topbar__ubadge">会员</span>
</div>
</a>
<button class="topbar__btn topbar__btn--logout" onclick="logout()">退出登录</button>
</div>
</div>
</div>
</nav>
<main class="cxz-main">
<div class="cxz-breadcrumb">
<a href="index.html">首页</a><span class="sep">></span>
<a href="usercenter.html">个人中心</a><span class="sep">></span>
<a href="tixian.html">提现</a><span class="sep">></span>
<span>提现记录</span>
</div>
<section class="tl-card">
<div class="tl-header">
<div>
<div class="tl-title">提现记录</div>
<div class="tl-desc">查看销售余额、专家余额的提现申请进度和收款方式。</div>
</div>
<a class="tl-back-link" href="tixian.html">返回提现</a>
</div>
<div class="tl-filter-bar">
<div class="tl-filter-group">
<span>状态</span>
<div class="tl-segment" id="statusFilters"></div>
</div>
<div class="tl-filter-group">
<span>来源</span>
<div class="tl-segment" id="sourceFilters"></div>
</div>
</div>
<div class="tl-summary">
<div class="tl-summary-item">
<span>记录总数</span>
<strong id="recordTotal">0</strong>
</div>
<div class="tl-summary-item">
<span>本页金额</span>
<strong id="pageAmount">0.00 元</strong>
</div>
<div class="tl-summary-item">
<span>当前筛选</span>
<strong id="filterSummary">全部状态 / 全部来源</strong>
</div>
</div>
<div class="tl-table-wrap">
<table class="tl-table" id="withdrawTable">
<thead>
<tr>
<th>申请单号</th>
<th>提现来源</th>
<th>提现方式</th>
<th>金额</th>
<th>收款账户</th>
<th>状态</th>
<th>申请时间</th>
</tr>
</thead>
<tbody></tbody>
</table>
<div class="tl-empty" id="emptyState">
<div class="tl-empty-icon">¥</div>
<div class="tl-empty-title">暂无提现记录</div>
<div class="tl-empty-desc">当前筛选条件下还没有提现申请。</div>
</div>
</div>
<div class="tl-pagination cxz-pagination" id="withdrawPagination"></div>
</section>
</main>
<footer class="site-footer">
<div class="site-footer__inner">
<img src="../images/home-logo.png" alt="彩先知" class="site-footer__logo" />
<p id="copyright-info">彩先知以开奖数据、免费文章、资讯推荐为核心</p>
<div class="site-footer__meta">
<a id="beian" class="tl-beian-link" href="https://beian.miit.gov.cn/" target="_blank">工信部备案号</a>
<span id="additional-info">本站仅供数据分析参考</span>
</div>
</div>
</footer>
<button class="gotop" id="backTop" type="button" onclick="window.scrollTo({ top: 0, behavior: 'smooth' })"></button>
<script>
const $ = layui.$;
const statusOptions = [
{ value: "", label: "全部" },
{ value: "reviewing", label: "审核中" },
{ value: "success", label: "成功" },
{ value: "failed", label: "失败" },
{ value: "cancelled", label: "取消" },
];
const sourceOptions = [
{ value: "", label: "全部" },
{ value: "sales", label: "销售余额" },
{ value: "expert", label: "专家余额" },
];
const statusTextMap = {
0: "审核中",
1: "成功",
2: "失败",
3: "取消",
reviewing: "审核中",
success: "成功",
failed: "失败",
cancelled: "取消",
};
const statusClassMap = {
0: "reviewing",
1: "success",
2: "failed",
3: "cancelled",
reviewing: "reviewing",
success: "success",
failed: "failed",
cancelled: "cancelled",
};
const sourceTextMap = {
sales: "销售余额",
expert: "专家余额",
};
const methodTextMap = {
alipay: "支付宝",
wechat: "微信收款码",
wechat_qr: "微信收款码",
bank: "银行卡",
bank_card: "银行卡",
};
let currentPage = 1;
let pageSize = 10;
let totalRow = 0;
let currentStatus = "";
let currentSource = "";
function logout() {
localStorage.removeItem("token");
window.location.reload();
}
function isSuccess(res) {
return ApiClient.isSuccess ? ApiClient.isSuccess(res) : res && (res.code === 0 || res.code === 200);
}
function pickData(res) {
return ApiClient.pickData ? ApiClient.pickData(res) : res && res.data;
}
function asArray(value) {
return ApiClient.asArray ? ApiClient.asArray(value) : Array.isArray(value) ? value : value ? [value] : [];
}
function escapeHtml(value) {
return String(value == null ? "" : value)
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#39;");
}
function fieldValue(item, keys) {
for (let i = 0; i < keys.length; i += 1) {
const value = item && item[keys[i]];
if (value !== undefined && value !== null && value !== "") return value;
}
return "";
}
function money(value) {
const number = Number(value || 0);
return Number.isFinite(number) ? number.toFixed(2) : "0.00";
}
function checkLogin() {
const token = CommonUtil.getAuthToken ? CommonUtil.getAuthToken() : localStorage.getItem("token");
if (!token) {
window.location.href = "login.html";
return;
}
$("#notLoggedInBox").addClass("tl-hidden");
$("#loggedInBox").removeClass("tl-hidden");
CommonUtil.getCurrentUserDetail(
function (data) {
$("#userName").text(data.nickName || data.nickname || "用户");
$("#userLevel").text(data.isExpert === "1" ? "专家" : "会员");
if (data.avatar) $("#userAvatar").attr("src", data.avatar);
},
function () {
$("#notLoggedInBox").removeClass("tl-hidden");
$("#loggedInBox").addClass("tl-hidden");
},
);
}
function renderNav() {
ApiClient.get(ApiClient.API.homeNav).then(function (res) {
if (!isSuccess(res) || !res.data) return;
const $nav = $("#navLotteryItems").empty();
$.each(asArray(pickData(res)), function (_, item) {
if (item.type && item.type !== "lottery") return;
const code = item.code || item.suoxie || "";
if (!code) return;
$nav.append('<a href="cai.html?id=' + encodeURIComponent(code) + '" class="topbar__nav-link">' + escapeHtml(item.name || item.lotteryName || code) + "</a>");
});
});
}
function renderFilters() {
renderSegment("#statusFilters", statusOptions, currentStatus, function (value) {
currentStatus = value;
currentPage = 1;
loadWithdrawList();
});
renderSegment("#sourceFilters", sourceOptions, currentSource, function (value) {
currentSource = value;
currentPage = 1;
loadWithdrawList();
});
updateFilterSummary();
}
function renderSegment(selector, options, selectedValue, onChange) {
const $wrap = $(selector).empty();
$.each(options, function (_, item) {
const $button = $('<button class="tl-segment-btn" type="button"></button>');
$button.text(item.label);
$button.toggleClass("active", item.value === selectedValue);
$button.on("click", function () {
onChange(item.value);
renderFilters();
});
$wrap.append($button);
});
}
function updateFilterSummary() {
const statusLabel = statusOptions.find((item) => item.value === currentStatus)?.label || "全部";
const sourceLabel = sourceOptions.find((item) => item.value === currentSource)?.label || "全部";
$("#filterSummary").text(statusLabel + "状态 / " + sourceLabel + "来源");
}
function getRecords(data, res) {
return asArray(data.records || data.rows || data.list || res.records || res.rows || res.list || data);
}
function getTotal(data, records, res) {
return Number(data.total || data.totalRow || data.totalCount || data.count || res.total || res.totalRow || res.totalCount || res.count || records.length || 0);
}
function getRecordNo(item) {
return fieldValue(item, ["withdrawNo", "orderNo", "flowNo", "serialNo", "tradeNo", "id"]) || "--";
}
function getAmount(item) {
return Number(fieldValue(item, ["amount", "withdrawAmount", "money", "applyAmount", "flowAmount"]) || 0);
}
function getStatus(item) {
return fieldValue(item, ["status", "withdrawStatus", "auditStatus"]);
}
function getStatusText(item) {
const status = getStatus(item);
return fieldValue(item, ["statusText", "withdrawStatusText", "auditStatusText"]) || statusTextMap[status] || statusTextMap[String(status)] || "--";
}
function getStatusClass(item) {
const status = getStatus(item);
return statusClassMap[status] || statusClassMap[String(status)] || "normal";
}
function getSourceText(item) {
const source = fieldValue(item, ["sourceWallet", "walletType"]);
return fieldValue(item, ["sourceWalletText", "walletTypeText"]) || sourceTextMap[source] || source || "--";
}
function getMethodText(item) {
const method = fieldValue(item, ["withdrawType", "receiveType", "paymentType"]);
return fieldValue(item, ["withdrawTypeText", "receiveTypeText", "paymentTypeText"]) || methodTextMap[method] || method || "--";
}
function getReceiveAccountText(item) {
const direct = fieldValue(item, ["receiveAccountText", "receiveAccount", "accountNo", "alipayAccount", "bankCardNo"]);
if (direct && typeof direct !== "object") return direct;
const receiveAccount = item.receiveAccountInfo || item.receiveAccountVO || (typeof item.receiveAccount === "object" ? item.receiveAccount : {}) || {};
const method = fieldValue(item, ["withdrawType", "receiveType"]);
if (method === "bank") {
return [receiveAccount.bankName, receiveAccount.bankCardNo].filter(Boolean).join(" ") || "--";
}
return fieldValue(receiveAccount, ["alipayAccount", "wechatAccount", "accountNo", "realName"]) || "--";
}
function getCreateTime(item) {
const time = fieldValue(item, ["createTime", "createdTime", "applyTime", "submitTime", "updateTime"]);
return DateUtil.formatDateTimeToYMDHM(time) || time || "--";
}
function loadWithdrawList() {
const params = {
pageNum: currentPage,
pageSize: pageSize,
};
if (currentStatus) params.status = currentStatus;
if (currentSource) params.sourceWallet = currentSource;
$("#withdrawTable").addClass("loading");
ApiClient.get(ApiClient.API.walletWithdrawList, params)
.then(function (res) {
if (!isSuccess(res)) throw new Error(res.msg || "获取提现记录失败");
const data = pickData(res) || res || {};
const records = getRecords(data, res);
totalRow = getTotal(data, records, res);
renderTable(records);
renderPagination();
})
.catch(function (err) {
layui.layer.msg(err.message || "获取提现记录失败", { icon: 2 });
totalRow = 0;
renderTable([]);
renderPagination();
})
.finally(function () {
$("#withdrawTable").removeClass("loading");
});
}
function renderTable(records) {
const $tbody = $("#withdrawTable tbody").empty();
let pageAmount = 0;
if (!records.length) {
$("#withdrawTable").addClass("tl-table-hidden");
$("#emptyState").addClass("show");
$(".tl-summary").addClass("is-hidden");
} else {
$("#withdrawTable").removeClass("tl-table-hidden");
$("#emptyState").removeClass("show");
$(".tl-summary").removeClass("is-hidden");
}
$.each(records, function (_, item) {
const amount = getAmount(item);
pageAmount += Math.abs(amount);
const $row = $("<tr></tr>");
$row.html(
"<td>" + escapeHtml(getRecordNo(item)) + "</td>" +
"<td>" + escapeHtml(getSourceText(item)) + "</td>" +
"<td>" + escapeHtml(getMethodText(item)) + "</td>" +
'<td class="tl-amount">-' + escapeHtml(money(Math.abs(amount))) + " 元</td>" +
"<td>" + escapeHtml(getReceiveAccountText(item)) + "</td>" +
'<td><span class="tl-status ' + getStatusClass(item) + '">' + escapeHtml(getStatusText(item)) + "</span></td>" +
"<td>" + escapeHtml(getCreateTime(item)) + "</td>",
);
$tbody.append($row);
});
$("#recordTotal").text(totalRow);
$("#pageAmount").text(money(pageAmount) + " 元");
updateFilterSummary();
}
function renderPagination() {
if (totalRow <= 0) {
$("#withdrawPagination").empty().addClass("is-hidden");
return;
}
$("#withdrawPagination").removeClass("is-hidden");
layui.use("laypage", function () {
layui.laypage.render({
elem: "withdrawPagination",
count: totalRow,
limit: pageSize,
curr: currentPage,
layout: ["prev", "page", "next"],
jump: function (obj, first) {
if (first) return;
currentPage = obj.curr;
loadWithdrawList();
},
});
});
}
function initFromUrl() {
const query = new URLSearchParams(window.location.search);
const status = query.get("status") || "";
const sourceWallet = query.get("sourceWallet") || "";
if (statusOptions.some((item) => item.value === status)) currentStatus = status;
if (sourceOptions.some((item) => item.value === sourceWallet)) currentSource = sourceWallet;
}
$(window).on("scroll", function () {
$(window).scrollTop() > 320 ? $("#backTop").addClass("is-visible") : $("#backTop").removeClass("is-visible");
});
$(function () {
checkLogin();
renderNav();
initFromUrl();
renderFilters();
CommonUtil.loadPageConfig({ ads: false, links: false });
CommonUtil.requireAuth(function () {
loadWithdrawList();
});
});
</script>
</body>
</html>