diff --git a/app/(dashboard)/dashboard/shop/income/page.tsx b/app/(dashboard)/dashboard/shop/income/page.tsx new file mode 100644 index 0000000..e0f33f0 --- /dev/null +++ b/app/(dashboard)/dashboard/shop/income/page.tsx @@ -0,0 +1,112 @@ +import { ArrowDownLeft, ArrowUpRight, CreditCard, DollarSign } from "lucide-react" +import { Badge } from "@/components/ui/badge" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table" +import { mockOrders, mockTransactions } from "@/lib/mock-data" + +export default function ShopIncomePage() { + const completedOrders = mockOrders.filter((o) => o.status === "completed") + const totalIncome = completedOrders.reduce((acc, order) => acc + order.totalPrice, 0) + + const currentMonth = new Date().getMonth() + const thisMonthIncome = completedOrders + .filter((o) => new Date(o.completedAt || "").getMonth() === currentMonth) + .reduce((acc, order) => acc + order.totalPrice, 0) + + const pendingSettlement = mockOrders + .filter((o) => ["in_progress", "pending_close", "pending_review"].includes(o.status)) + .reduce((acc, order) => acc + order.totalPrice, 0) + + return ( +
+

收入统计

+ +
+ + + 总收入 + + + +
¥{totalIncome.toFixed(2)}
+
+
+ + + 本月收入 + + + +
¥{thisMonthIncome.toFixed(2)}
+
+
+ + + 待结算 + + + +
¥{pendingSettlement.toFixed(2)}
+
+
+
+ + + + 交易明细 + + + + + + 类型 + 描述 + 金额 + 时间 + + + + {mockTransactions.map((transaction) => ( + + +
+ {transaction.amount > 0 ? ( + + ) : ( + + )} + 0 ? "default" : "secondary"}> + {transaction.type === "topup" + ? "充值" + : transaction.type === "payment" + ? "支付" + : transaction.type === "income" + ? "收入" + : transaction.type === "withdrawal" + ? "提现" + : "退款"} + +
+
+ {transaction.description} + 0 ? "text-green-600" : "text-red-600"}> + {transaction.amount > 0 ? "+" : ""} + {transaction.amount} + + {new Date(transaction.createdAt).toLocaleString()} +
+ ))} +
+
+
+
+
+ ) +} diff --git a/app/(dashboard)/dashboard/shop/orders/page.tsx b/app/(dashboard)/dashboard/shop/orders/page.tsx new file mode 100644 index 0000000..c637423 --- /dev/null +++ b/app/(dashboard)/dashboard/shop/orders/page.tsx @@ -0,0 +1,117 @@ +import { AlertCircle, CheckCircle, Clock, ListOrdered } from "lucide-react" +import Link from "next/link" +import { Badge } from "@/components/ui/badge" +import { Button } from "@/components/ui/button" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table" +import { statusLabels } from "@/lib/constants" +import { mockOrders } from "@/lib/mock-data" + +export default function ShopOrdersPage() { + const totalOrders = mockOrders.length + const activeOrders = mockOrders.filter((o) => + [ + "pending_payment", + "pending_accept", + "in_progress", + "pending_close", + "pending_review", + ].includes(o.status), + ).length + const completedOrders = mockOrders.filter((o) => o.status === "completed").length + const disputedOrders = mockOrders.filter((o) => o.status === "disputed").length + + return ( +
+
+

订单总览

+
+ +
+ + + 总订单 + + + +
{totalOrders}
+
+
+ + + 进行中 + + + +
{activeOrders}
+
+
+ + + 已完成 + + + +
{completedOrders}
+
+
+ + + 争议订单 + + + +
{disputedOrders}
+
+
+
+ + + + 订单列表 + + + + + + 服务名称 + 客户 + 打手 + 状态 + 金额 + 创建时间 + 操作 + + + + {mockOrders.map((order) => ( + + {order.service.title} + {order.consumerName} + {order.playerName} + + {statusLabels[order.status]} + + ¥{order.totalPrice} + {new Date(order.createdAt).toLocaleDateString()} + + + + + ))} + +
+
+
+
+ ) +} diff --git a/app/(dashboard)/dashboard/shop/rules/page.tsx b/app/(dashboard)/dashboard/shop/rules/page.tsx new file mode 100644 index 0000000..c365a1a --- /dev/null +++ b/app/(dashboard)/dashboard/shop/rules/page.tsx @@ -0,0 +1,143 @@ +"use client" + +import { Save } from "lucide-react" +import { useState } from "react" +import { Button } from "@/components/ui/button" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select" +import { Switch } from "@/components/ui/switch" +import { mockShops } from "@/lib/mock-data" + +export default function ShopRulesPage() { + const shop = mockShops[0] + + const [allowMultiShop, setAllowMultiShop] = useState(shop.allowMultiShop) + const [allowIndependentOrders, setAllowIndependentOrders] = useState(shop.allowIndependentOrders) + const [dispatchMode, setDispatchMode] = useState(shop.dispatchMode) + const [commissionType, setCommissionType] = useState(shop.commissionType) + const [commissionValue, setCommissionValue] = useState(shop.commissionValue.toString()) + + const handleSave = () => { + alert("设置已保存") + } + + return ( +
+
+

规则设置

+ +
+ +
+ + + 员工权限 + + +
+ + +
+
+ + +
+
+
+ + + + 派单设置 + + +
+ + +

+ 手动指派需要店主确认分配;自动匹配将根据打手状态自动分单 +

+
+
+
+ + + + 抽成设置 + + +
+
+ + +
+
+ +
+ setCommissionValue(e.target.value)} + /> +
+ {commissionType === "percentage" ? "%" : "元"} +
+
+
+
+
+
+
+
+ ) +} diff --git a/components/dashboard-sidebar.tsx b/components/dashboard-sidebar.tsx index 8f3172b..1cf025e 100644 --- a/components/dashboard-sidebar.tsx +++ b/components/dashboard-sidebar.tsx @@ -1,6 +1,16 @@ "use client" -import { Gamepad2, LayoutDashboard, ListOrdered, Palette, Store, Users } from "lucide-react" +import { + ClipboardList, + Gamepad2, + LayoutDashboard, + ListOrdered, + Palette, + Settings, + Store, + TrendingUp, + Users, +} from "lucide-react" import Link from "next/link" import { usePathname } from "next/navigation" import { cn } from "@/lib/utils" @@ -15,6 +25,9 @@ const ownerLinks = [ { href: "/dashboard", label: "概览", icon: LayoutDashboard }, { href: "/dashboard/services", label: "服务管理", icon: ListOrdered }, { href: "/dashboard/shop", label: "店铺管理", icon: Store }, + { href: "/dashboard/shop/orders", label: "订单总览", icon: ClipboardList }, + { href: "/dashboard/shop/income", label: "收入统计", icon: TrendingUp }, + { href: "/dashboard/shop/rules", label: "规则设置", icon: Settings }, { href: "/dashboard/shop/employees", label: "员工管理", icon: Users }, { href: "/dashboard/shop/templates", label: "模板编辑", icon: Palette }, ]