350 lines
11 KiB
JavaScript
Raw Normal View History

// 订单明细页面JavaScript
class OrderListManager {
constructor() {
// 统一从 AppUtils.resolveUserId() 解析
this.userId = AppUtils.resolveUserId();
if (!this.userId) {
alert("未获取到用户ID请重新登录");
// 可选location.href = "login.html";
return;
}
this.lastId = null;
this.pageSize = 10;
this.hasMore = true;
this.loading = false;
this.currentRefundOrderId = null;
this.init();
}
init() {
this.bindEvents();
this.displayUserId();
this.loadOrderList();
}
bindEvents() {
// 加载更多按钮事件
document.getElementById("loadMoreBtn").addEventListener("click", () => {
this.loadOrderList();
});
// 退单弹窗事件
document.getElementById("cancelRefund").addEventListener("click", () => {
this.hideRefundModal();
});
document.getElementById("confirmRefund").addEventListener("click", () => {
this.processRefund();
});
// 点击弹窗外部关闭
document.getElementById("refundModal").addEventListener("click", (e) => {
if (e.target.id === "refundModal") {
this.hideRefundModal();
}
});
}
displayUserId() {
const userIdElement = document.getElementById("userIdDisplay");
if (userIdElement && this.userId) {
userIdElement.textContent = `用户ID: ${AppUtils.obfuscateUserId(this.userId)}`;
}
}
async loadOrderList() {
if (this.loading || !this.hasMore) return;
this.loading = true;
this.showLoading();
try {
const requestData = {
userId: this.userId,
lastId: this.lastId,
pageSize: this.pageSize
};
// 调用后端API
const response = await fetch(
AppConfig.sPayMallUrl + "/api/v1/alipay/query_user_order_list",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(requestData)
}
);
const result = await response.json();
if (result.code === "0000" && result.data) {
this.renderOrderList(result.data.orderList, this.lastId === null);
this.hasMore = result.data.hasMore;
this.lastId = result.data.lastId;
// 更新加载更多按钮状态
this.updateLoadMoreButton();
} else {
this.showError("加载订单列表失败: " + (result.info || "未知错误"));
}
} catch (error) {
console.error("加载订单列表出错:", error);
this.showError("网络错误,请稍后重试");
} finally {
this.loading = false;
this.hideLoading();
}
}
renderOrderList(orders, isFirstLoad = false) {
const orderListElement = document.getElementById("orderList");
const emptyStateElement = document.getElementById("emptyState");
if (isFirstLoad) {
orderListElement.innerHTML = "";
}
if (orders && orders.length > 0) {
emptyStateElement.style.display = "none";
orders.forEach((order) => {
const orderElement = this.createOrderElement(order);
orderListElement.appendChild(orderElement);
});
} else if (isFirstLoad) {
emptyStateElement.style.display = "block";
}
}
createOrderElement(order) {
const orderDiv = document.createElement("div");
orderDiv.className = "order-item";
orderDiv.innerHTML = `
<div class="order-header">
<div class="order-id" onclick="orderManager.copyOrderId('${order.orderId}')" title="点击复制订单号">
订单号: <span class="order-id-text">${order.orderId}</span>
<span class="copy-icon">📋</span>
</div>
<div class="order-status status-${order.status}">${this.getStatusText(order.status)}</div>
</div>
<div class="order-content">
<div class="product-name">${order.productName || "商品名称"}</div>
<div class="order-details">
<div class="order-time">${this.formatTime(order.orderTime)}</div>
<div class="pay-amount">¥${order.payAmount || order.totalAmount}</div>
</div>
</div>
<div class="order-actions">
<button class="refund-btn"
onclick="orderManager.showRefundModal('${order.orderId}')"
${order.status === "CLOSE" ? "disabled" : ""}>
${order.status === "CLOSE" ? "已关闭" : "申请退单"}
</button>
</div>
`;
return orderDiv;
}
getStatusText(status) {
const statusMap = {
CREATE: "新创建",
PAY_WAIT: "等待支付",
PAY_SUCCESS: "支付成功",
DEAL_DONE: "交易完成",
CLOSE: "已关闭",
WAIT_REFUND: "退款中"
};
return statusMap[status] || status;
}
formatTime(timeStr) {
if (!timeStr) return "";
const date = new Date(timeStr);
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(
date.getDate()
).padStart(2, "0")} ${String(date.getHours()).padStart(2, "0")}:${String(
date.getMinutes()
).padStart(2, "0")}`;
}
updateLoadMoreButton() {
const loadMoreBtn = document.getElementById("loadMoreBtn");
if (this.hasMore) {
loadMoreBtn.style.display = "block";
loadMoreBtn.disabled = false;
loadMoreBtn.textContent = "加载更多";
} else {
loadMoreBtn.style.display = "none";
}
}
showRefundModal(orderId) {
this.currentRefundOrderId = orderId;
document.getElementById("refundModal").style.display = "flex";
}
hideRefundModal() {
document.getElementById("refundModal").style.display = "none";
this.currentRefundOrderId = null;
}
async processRefund() {
if (!this.currentRefundOrderId) return;
this.showLoading();
try {
const requestData = {
userId: this.userId,
orderId: this.currentRefundOrderId
};
const response = await fetch(
AppConfig.sPayMallUrl + "/api/v1/alipay/refund_order",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(requestData)
}
);
const result = await response.json();
if (result.code === "0000" && result.data && result.data.success) {
this.showSuccess("退单成功");
this.hideRefundModal();
// 重新加载订单列表
this.refreshOrderList();
} else {
this.showError("退单失败: " + (result.info || result.data?.message || "未知错误"));
}
} catch (error) {
console.error("退单操作出错:", error);
this.showError("网络错误,请稍后重试");
} finally {
this.hideLoading();
}
}
refreshOrderList() {
this.lastId = null;
this.hasMore = true;
document.getElementById("orderList").innerHTML = "";
this.loadOrderList();
}
showLoading() {
document.getElementById("loadingTip").style.display = "block";
}
hideLoading() {
document.getElementById("loadingTip").style.display = "none";
}
showError(message) {
alert("错误: " + message);
}
showSuccess(message) {
alert("成功: " + message);
}
// 复制订单号功能
copyOrderId(orderId) {
if (navigator.clipboard) {
navigator.clipboard
.writeText(orderId)
.then(() => {
this.showToast("订单号已复制到剪贴板");
})
.catch((err) => {
console.error("复制失败:", err);
this.fallbackCopyTextToClipboard(orderId);
});
} else {
this.fallbackCopyTextToClipboard(orderId);
}
}
// 兼容旧浏览器的复制方法
fallbackCopyTextToClipboard(text) {
const textArea = document.createElement("textarea");
textArea.value = text;
textArea.style.position = "fixed";
textArea.style.left = "-999999px";
textArea.style.top = "-999999px";
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
const successful = document.execCommand("copy");
if (successful) {
this.showToast("订单号已复制到剪贴板");
} else {
this.showToast("复制失败,请手动复制");
}
} catch (err) {
console.error("复制失败:", err);
this.showToast("复制失败,请手动复制");
}
document.body.removeChild(textArea);
}
// 显示提示消息
showToast(message) {
// 移除已存在的提示
const existingToast = document.querySelector(".copy-toast");
if (existingToast) {
existingToast.remove();
}
// 创建新的提示元素
const toast = document.createElement("div");
toast.className = "copy-toast";
toast.textContent = message;
toast.style.cssText = `
position: fixed;
top: 20px;
left: 50%;
transform: translateX(-50%);
background: #333;
color: white;
padding: 12px 20px;
border-radius: 6px;
z-index: 1000;
font-size: 14px;
opacity: 0;
transition: opacity 0.3s ease;
`;
document.body.appendChild(toast);
// 显示动画
setTimeout(() => {
toast.style.opacity = "1";
}, 100);
// 3秒后移除
setTimeout(() => {
toast.style.opacity = "0";
setTimeout(() => {
if (toast.parentNode) {
toast.parentNode.removeChild(toast);
}
}, 300);
}, 3000);
}
}
// 页面加载完成后初始化
let orderManager;
document.addEventListener("DOMContentLoaded", function () {
orderManager = new OrderListManager();
});