order-api.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import { apiPost } from "@/lib/api";
  2. export type OrderStatus = 1 | 2 | 3 | 4 | 5;
  3. export type OrderRecord = {
  4. id: string;
  5. serial: string;
  6. amount: number;
  7. status: OrderStatus;
  8. addTime: string;
  9. payTime: string;
  10. details: string;
  11. };
  12. export type OrderPage = {
  13. current: number;
  14. row: number;
  15. total: number;
  16. };
  17. export type OrderListResult = {
  18. list: OrderRecord[];
  19. page: OrderPage;
  20. };
  21. function pickList(raw: unknown): unknown[] {
  22. if (!raw || typeof raw !== "object") return [];
  23. const o = raw as Record<string, unknown>;
  24. const inner = o.data ?? o.list ?? o.rows ?? o.records;
  25. if (Array.isArray(inner)) return inner;
  26. if (inner && typeof inner === "object") {
  27. const x = inner as Record<string, unknown>;
  28. if (Array.isArray(x.list)) return x.list;
  29. if (Array.isArray(x.records)) return x.records;
  30. if (Array.isArray(x.rows)) return x.rows;
  31. }
  32. return [];
  33. }
  34. function normalizeDetails(value: unknown): string {
  35. if (typeof value === "string" && value.trim()) return value.trim();
  36. if (Array.isArray(value)) {
  37. return value
  38. .map((v) => (typeof v === "string" ? v.trim() : ""))
  39. .filter(Boolean)
  40. .join("、");
  41. }
  42. if (value && typeof value === "object") {
  43. const o = value as Record<string, unknown>;
  44. const name = o.title ?? o.name ?? o.goodsName ?? o.courseName;
  45. if (typeof name === "string" && name.trim()) return name.trim();
  46. }
  47. return "-";
  48. }
  49. function pickPage(raw: unknown, fallback: { current: number; row: number }): OrderPage {
  50. if (!raw || typeof raw !== "object") {
  51. return { current: fallback.current, row: fallback.row, total: 0 };
  52. }
  53. const o = raw as Record<string, unknown>;
  54. const fromData =
  55. o.data && typeof o.data === "object" && o.data !== null
  56. ? (o.data as Record<string, unknown>)
  57. : null;
  58. const page =
  59. (fromData?.page && typeof fromData.page === "object" ? fromData.page : null) ??
  60. (o.page && typeof o.page === "object" ? o.page : null);
  61. const current = Number(
  62. (page as Record<string, unknown> | null)?.current ??
  63. (page as Record<string, unknown> | null)?.pageNum ??
  64. fallback.current,
  65. );
  66. const row = Number(
  67. (page as Record<string, unknown> | null)?.row ??
  68. (page as Record<string, unknown> | null)?.size ??
  69. fallback.row,
  70. );
  71. const total = Number((page as Record<string, unknown> | null)?.total ?? 0);
  72. return {
  73. current: Number.isFinite(current) && current > 0 ? current : fallback.current,
  74. row: Number.isFinite(row) && row > 0 ? row : fallback.row,
  75. total: Number.isFinite(total) && total >= 0 ? total : 0,
  76. };
  77. }
  78. export function getOrderStatusLabel(status: number): string {
  79. const map: Record<number, string> = {
  80. 1: "未支付",
  81. 2: "已支付",
  82. 3: "支付失败",
  83. 4: "已过期",
  84. 5: "已取消",
  85. };
  86. return map[status] ?? `状态${status}`;
  87. }
  88. export async function fetchOrderList(page: {
  89. current: number;
  90. row: number;
  91. } = {
  92. current: 1,
  93. row: 10,
  94. }): Promise<OrderListResult> {
  95. const current = Number.isFinite(page.current) ? Math.max(1, page.current) : 1;
  96. const row = Number.isFinite(page.row) ? Math.max(1, page.row) : 10;
  97. const raw = await apiPost<
  98. unknown,
  99. {
  100. page: { current: number; row: number };
  101. }
  102. >("/order/search/list", {
  103. page: {
  104. current,
  105. row,
  106. },
  107. });
  108. const list = pickList(raw);
  109. const out: OrderRecord[] = [];
  110. for (const item of list) {
  111. if (!item || typeof item !== "object") continue;
  112. const o = item as Record<string, unknown>;
  113. const id = String(o.id ?? o.orderId ?? o.tradeId ?? o.serial ?? "").trim();
  114. const serial = String(o.serial ?? o.orderNo ?? o.tradeNo ?? o.id ?? "").trim();
  115. if (!serial || !id) continue;
  116. const amountRaw = o.amount ?? o.payAmount ?? o.totalAmount ?? 0;
  117. const amount = typeof amountRaw === "number" ? amountRaw : Number(amountRaw) || 0;
  118. const statusRaw = Number(o.status ?? o.payStatus ?? 1);
  119. const status: OrderStatus =
  120. statusRaw === 1 || statusRaw === 2 || statusRaw === 3 || statusRaw === 4 || statusRaw === 5
  121. ? statusRaw
  122. : 1;
  123. const addTime = String(o.addTime ?? o.createTime ?? o.createdAt ?? "").trim();
  124. const payTime = String(o.payTime ?? o.paidAt ?? "").trim();
  125. const details = normalizeDetails(o.details ?? o.detail ?? o.goodsName ?? o.courseName);
  126. out.push({
  127. id,
  128. serial,
  129. amount,
  130. status,
  131. addTime,
  132. payTime,
  133. details,
  134. });
  135. }
  136. return {
  137. list: out,
  138. page: pickPage(raw, { current, row }),
  139. };
  140. }
  141. export async function cancelOrder(id: string): Promise<void> {
  142. await apiPost("/order/cancel", { id });
  143. }
  144. export async function generateOrderByGoodId(goodsId: string): Promise<void> {
  145. await apiPost("/order/generated", { goodsId });
  146. }