Files
medical-mall/pages/mall/merchant/mock/merchant-mock-data.uts
2026-04-13 11:32:31 +08:00

941 lines
41 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 机构端统一 mock 数据源
*
* 开关说明:
* USE_MOCK = true → 各页面使用此文件数据,不请求 Supabase
* USE_MOCK = false → 各页面走原有 Supabase 请求逻辑
*
* 联动锚点(改动此处会自动同步各页面):
* 待接单订单数 = PENDING_SHIPMENT_COUNT = 3
* 退款中订单数 = REFUND_COUNT = 2
* 低库存商品数 = LOW_STOCK_COUNT = 3
* 已售罄商品数 = OUT_OF_STOCK_COUNT = 2
* 未回复评价数 = PENDING_REVIEW_COUNT = 4
*/
// ─── Mock 总开关 ───────────────────────────────────────────────
export const USE_MOCK = true
// ─── 稳定 mock merchantId无登录时使用 ──────────────────────
export const MOCK_MERCHANT_ID = 'mock-merchant-0001-0000-000000000001'
// ─── 联动锚点常量 ───────────────────────────────────────────────
export const PENDING_SHIPMENT_COUNT = 3
export const REFUND_COUNT = 2
export const LOW_STOCK_COUNT = 3
export const OUT_OF_STOCK_COUNT = 2
export const PENDING_REVIEW_COUNT = 4
// ════════════════════════════════════════════════════════════
// 一、店铺信息
// ════════════════════════════════════════════════════════════
export type MockShopInfoType = {
id: string
merchant_id: string
shop_name: string
shop_logo: string
shop_banner: string
description: string
contact_name: string
contact_phone: string
rating_avg: number
total_sales: number
status: number
}
export const MOCK_SHOP_INFO: MockShopInfoType = {
id: 'mock-shop-0001',
merchant_id: MOCK_MERCHANT_ID,
shop_name: '骅锋医养综合服务中心',
shop_logo: '/static/images/default-shop.png',
shop_banner: '/static/images/default-banner.png',
description: '专注居家养老、慢病管理与康复护理一体化服务',
contact_name: '李医师',
contact_phone: '020-88888888',
rating_avg: 4.8,
total_sales: 386,
status: 1
}
export const MOCK_TODAY_STATS = {
orders: 7,
sales: 2340.00,
visitors: 42,
conversion: 17
}
export const MOCK_PENDING_COUNTS = {
pending_shipment: PENDING_SHIPMENT_COUNT,
refund_requests: REFUND_COUNT,
low_stock: LOW_STOCK_COUNT,
pending_reviews: PENDING_REVIEW_COUNT
}
// ════════════════════════════════════════════════════════════
// 二、订单 mock 数据
// ════════════════════════════════════════════════════════════
export type MockOrderItemType = {
id: string
order_id: string
product_id: string
sku_id: string
product_name: string
sku_name: string
price: number
quantity: number
image_url: string
sku_snapshot: string
}
export type MockOrderType = {
id: string
order_no: string
user_id: string
merchant_id: string
order_status: number
total_amount: number
product_amount: number
shipping_fee: number
paid_amount: number
shipping_address: string
remark: string
created_at: string
updated_at: string
items: MockOrderItemType[]
}
// 服务订单 mockstatus: 2=待接单/待上门, 3=服务中, 4=已完成)
// 其中 待接单=3条, 服务中=4条, 已完成=8条 → tab计数对齐
export const MOCK_ORDERS: MockOrderType[] = [
// ── 待接单 3 条 ──────────────────────────────────────────
{
id: 'order-001', order_no: 'SV2026041300001',
user_id: 'user-001', merchant_id: MOCK_MERCHANT_ID,
order_status: 2, total_amount: 380.00, product_amount: 380.00,
shipping_fee: 0, paid_amount: 380.00,
shipping_address: '广州市天河区天河路123号 李奶奶',
remark: '老人行动不便,请护士上午到访',
created_at: '2026-04-13T08:15:00+08:00', updated_at: '2026-04-13T08:15:00+08:00',
items: [{
id: 'item-001-1', order_id: 'order-001', product_id: 'prod-001',
sku_id: '', product_name: '居家上门护理(半日)', sku_name: '标准护理套餐',
price: 380.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-002', order_no: 'SV2026041300002',
user_id: 'user-002', merchant_id: MOCK_MERCHANT_ID,
order_status: 2, total_amount: 260.00, product_amount: 260.00,
shipping_fee: 0, paid_amount: 260.00,
shipping_address: '广州市越秀区东风东路456号 张爷爷',
remark: '高血压患者,需携带血压计',
created_at: '2026-04-13T09:30:00+08:00', updated_at: '2026-04-13T09:30:00+08:00',
items: [
{
id: 'item-002-1', order_id: 'order-002', product_id: 'prod-002',
sku_id: '', product_name: '血压血糖监测服务', sku_name: '',
price: 180.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
},
{
id: 'item-002-2', order_id: 'order-002', product_id: 'prod-003',
sku_id: '', product_name: '慢病随访服务', sku_name: '',
price: 80.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}
]
},
{
id: 'order-003', order_no: 'SV2026041300003',
user_id: 'user-003', merchant_id: MOCK_MERCHANT_ID,
order_status: 2, total_amount: 520.00, product_amount: 520.00,
shipping_fee: 0, paid_amount: 520.00,
shipping_address: '广州市海珠区工业大道789号 王阿姨',
remark: '术后第7天需换药处理',
created_at: '2026-04-13T10:00:00+08:00', updated_at: '2026-04-13T10:00:00+08:00',
items: [{
id: 'item-003-1', order_id: 'order-003', product_id: 'prod-004',
sku_id: '', product_name: '术后伤口护理', sku_name: '标准换药套餐',
price: 260.00, quantity: 2, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
// ── 服务中 4 条 ──────────────────────────────────────────
{
id: 'order-004', order_no: 'SV2026041200004',
user_id: 'user-004', merchant_id: MOCK_MERCHANT_ID,
order_status: 3, total_amount: 1200.00, product_amount: 1200.00,
shipping_fee: 0, paid_amount: 1200.00,
shipping_address: '广州市番禺区市桥街101号 陈老先生',
remark: '每周三次康复训练',
created_at: '2026-04-12T14:00:00+08:00', updated_at: '2026-04-12T14:30:00+08:00',
items: [{
id: 'item-004-1', order_id: 'order-004', product_id: 'prod-005',
sku_id: '', product_name: '上门康复护理(月套餐)', sku_name: '基础康复12次',
price: 1200.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-005', order_no: 'SV2026041200005',
user_id: 'user-005', merchant_id: MOCK_MERCHANT_ID,
order_status: 3, total_amount: 450.00, product_amount: 450.00,
shipping_fee: 0, paid_amount: 450.00,
shipping_address: '广州市白云区棠景街202号 刘奶奶',
remark: '糖尿病足护理,注意消毒',
created_at: '2026-04-12T09:00:00+08:00', updated_at: '2026-04-12T11:00:00+08:00',
items: [
{
id: 'item-005-1', order_id: 'order-005', product_id: 'prod-006',
sku_id: '', product_name: '糖尿病足专项护理', sku_name: '',
price: 280.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
},
{
id: 'item-005-2', order_id: 'order-005', product_id: 'prod-002',
sku_id: '', product_name: '血压血糖监测服务', sku_name: '',
price: 170.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}
]
},
{
id: 'order-006', order_no: 'SV2026041100006',
user_id: 'user-006', merchant_id: MOCK_MERCHANT_ID,
order_status: 3, total_amount: 680.00, product_amount: 680.00,
shipping_fee: 0, paid_amount: 680.00,
shipping_address: '广州市荔湾区荔湾路303号 赵大伯',
remark: '卒中后遗症,肢体功能训练',
created_at: '2026-04-11T10:30:00+08:00', updated_at: '2026-04-11T14:00:00+08:00',
items: [{
id: 'item-006-1', order_id: 'order-006', product_id: 'prod-005',
sku_id: '', product_name: '上门康复护理(月套餐)', sku_name: '进阶康复8次',
price: 680.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-007', order_no: 'SV2026041100007',
user_id: 'user-007', merchant_id: MOCK_MERCHANT_ID,
order_status: 3, total_amount: 320.00, product_amount: 320.00,
shipping_fee: 0, paid_amount: 320.00,
shipping_address: '广州市黄埔区科学城404号 孙阿姨',
remark: '鼻饲护理,按时喂食',
created_at: '2026-04-11T08:00:00+08:00', updated_at: '2026-04-11T08:00:00+08:00',
items: [{
id: 'item-007-1', order_id: 'order-007', product_id: 'prod-007',
sku_id: '', product_name: '鼻饲营养护理', sku_name: '',
price: 320.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
// ── 已完成 8 条 ──────────────────────────────────────────
{
id: 'order-008', order_no: 'SV2026041000008',
user_id: 'user-001', merchant_id: MOCK_MERCHANT_ID,
order_status: 4, total_amount: 180.00, product_amount: 180.00,
shipping_fee: 0, paid_amount: 180.00,
shipping_address: '广州市天河区天河路123号 李奶奶',
remark: '', created_at: '2026-04-10T09:00:00+08:00', updated_at: '2026-04-10T12:00:00+08:00',
items: [{
id: 'item-008-1', order_id: 'order-008', product_id: 'prod-002',
sku_id: '', product_name: '血压血糖监测服务', sku_name: '',
price: 180.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-009', order_no: 'SV2026040900009',
user_id: 'user-008', merchant_id: MOCK_MERCHANT_ID,
order_status: 4, total_amount: 560.00, product_amount: 560.00,
shipping_fee: 0, paid_amount: 560.00,
shipping_address: '广州市增城区荔城街505号 郑爷爷',
remark: '', created_at: '2026-04-09T10:00:00+08:00', updated_at: '2026-04-09T15:00:00+08:00',
items: [{
id: 'item-009-1', order_id: 'order-009', product_id: 'prod-008',
sku_id: '', product_name: '术后营养指导4次', sku_name: '',
price: 280.00, quantity: 2, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-010', order_no: 'SV2026040800010',
user_id: 'user-009', merchant_id: MOCK_MERCHANT_ID,
order_status: 4, total_amount: 260.00, product_amount: 260.00,
shipping_fee: 0, paid_amount: 260.00,
shipping_address: '广州市从化区街口街606号 吴阿姨',
remark: '', created_at: '2026-04-08T14:00:00+08:00', updated_at: '2026-04-08T16:30:00+08:00',
items: [{
id: 'item-010-1', order_id: 'order-010', product_id: 'prod-003',
sku_id: '', product_name: '慢病随访服务', sku_name: '',
price: 130.00, quantity: 2, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-011', order_no: 'SV2026040700011',
user_id: 'user-010', merchant_id: MOCK_MERCHANT_ID,
order_status: 4, total_amount: 980.00, product_amount: 980.00,
shipping_fee: 0, paid_amount: 980.00,
shipping_address: '广州市南沙区南沙街707号 何老先生',
remark: '', created_at: '2026-04-07T09:00:00+08:00', updated_at: '2026-04-07T17:00:00+08:00',
items: [
{
id: 'item-011-1', order_id: 'order-011', product_id: 'prod-001',
sku_id: '', product_name: '居家上门护理(半日)', sku_name: '',
price: 380.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
},
{
id: 'item-011-2', order_id: 'order-011', product_id: 'prod-008',
sku_id: '', product_name: '术后营养指导4次', sku_name: '',
price: 300.00, quantity: 2, image_url: '/static/images/default-product.png', sku_snapshot: ''
}
]
},
{
id: 'order-012', order_no: 'SV2026040600012',
user_id: 'user-002', merchant_id: MOCK_MERCHANT_ID,
order_status: 4, total_amount: 430.00, product_amount: 430.00,
shipping_fee: 0, paid_amount: 430.00,
shipping_address: '广州市越秀区东风东路456号 张爷爷',
remark: '', created_at: '2026-04-06T10:00:00+08:00', updated_at: '2026-04-06T12:30:00+08:00',
items: [{
id: 'item-012-1', order_id: 'order-012', product_id: 'prod-009',
sku_id: '', product_name: '中医调理推拿3次', sku_name: '',
price: 430.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-013', order_no: 'SV2026040500013',
user_id: 'user-011', merchant_id: MOCK_MERCHANT_ID,
order_status: 4, total_amount: 350.00, product_amount: 350.00,
shipping_fee: 0, paid_amount: 350.00,
shipping_address: '广州市花都区新华街808号 冯奶奶',
remark: '', created_at: '2026-04-05T14:30:00+08:00', updated_at: '2026-04-05T16:00:00+08:00',
items: [{
id: 'item-013-1', order_id: 'order-013', product_id: 'prod-006',
sku_id: '', product_name: '糖尿病足专项护理', sku_name: '',
price: 350.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-014', order_no: 'SV2026040400014',
user_id: 'user-012', merchant_id: MOCK_MERCHANT_ID,
order_status: 4, total_amount: 480.00, product_amount: 480.00,
shipping_fee: 0, paid_amount: 480.00,
shipping_address: '广州市番禺区大石街909号 蒋大伯',
remark: '', created_at: '2026-04-04T09:00:00+08:00', updated_at: '2026-04-04T14:00:00+08:00',
items: [{
id: 'item-014-1', order_id: 'order-014', product_id: 'prod-004',
sku_id: '', product_name: '术后伤口护理', sku_name: '',
price: 240.00, quantity: 2, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-015', order_no: 'SV2026040300015',
user_id: 'user-003', merchant_id: MOCK_MERCHANT_ID,
order_status: 4, total_amount: 680.00, product_amount: 680.00,
shipping_fee: 0, paid_amount: 680.00,
shipping_address: '广州市海珠区工业大道789号 王阿姨',
remark: '', created_at: '2026-04-03T10:00:00+08:00', updated_at: '2026-04-03T15:30:00+08:00',
items: [{
id: 'item-015-1', order_id: 'order-015', product_id: 'prod-005',
sku_id: '', product_name: '上门康复护理(月套餐)', sku_name: '',
price: 680.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
}
]
// 售后订单 mockstatus: 0=退款中, 6=退款完成)
// 退款中=2条, 退款完成=3条
export const MOCK_AFTERSALE_ORDERS: MockOrderType[] = [
{
id: 'order-ref-001', order_no: 'SV2026041300R01',
user_id: 'user-004', merchant_id: MOCK_MERCHANT_ID,
order_status: 0, total_amount: 380.00, product_amount: 380.00,
shipping_fee: 0, paid_amount: 380.00,
shipping_address: '广州市番禺区市桥街101号 陈老先生',
remark: '家属临时有事,申请取消本次上门服务',
created_at: '2026-04-13T07:00:00+08:00', updated_at: '2026-04-13T07:30:00+08:00',
items: [{
id: 'item-ref-001-1', order_id: 'order-ref-001', product_id: 'prod-001',
sku_id: '', product_name: '居家上门护理(半日)', sku_name: '',
price: 380.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-ref-002', order_no: 'SV2026041200R02',
user_id: 'user-005', merchant_id: MOCK_MERCHANT_ID,
order_status: 0, total_amount: 180.00, product_amount: 180.00,
shipping_fee: 0, paid_amount: 180.00,
shipping_address: '广州市白云区棠景街202号 刘奶奶',
remark: '重复下单需退一单',
created_at: '2026-04-12T16:00:00+08:00', updated_at: '2026-04-12T16:10:00+08:00',
items: [{
id: 'item-ref-002-1', order_id: 'order-ref-002', product_id: 'prod-002',
sku_id: '', product_name: '血压血糖监测服务', sku_name: '',
price: 180.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-ref-003', order_no: 'SV2026041000R03',
user_id: 'user-008', merchant_id: MOCK_MERCHANT_ID,
order_status: 6, total_amount: 260.00, product_amount: 260.00,
shipping_fee: 0, paid_amount: 260.00,
shipping_address: '广州市增城区荔城街505号 郑爷爷',
remark: '服务已退款', created_at: '2026-04-10T10:00:00+08:00', updated_at: '2026-04-11T09:00:00+08:00',
items: [{
id: 'item-ref-003-1', order_id: 'order-ref-003', product_id: 'prod-003',
sku_id: '', product_name: '慢病随访服务', sku_name: '',
price: 130.00, quantity: 2, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-ref-004', order_no: 'SV2026040800R04',
user_id: 'user-009', merchant_id: MOCK_MERCHANT_ID,
order_status: 6, total_amount: 430.00, product_amount: 430.00,
shipping_fee: 0, paid_amount: 430.00,
shipping_address: '广州市从化区街口街606号 吴阿姨',
remark: '', created_at: '2026-04-08T09:00:00+08:00', updated_at: '2026-04-09T10:00:00+08:00',
items: [{
id: 'item-ref-004-1', order_id: 'order-ref-004', product_id: 'prod-009',
sku_id: '', product_name: '中医调理推拿3次', sku_name: '',
price: 430.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
},
{
id: 'order-ref-005', order_no: 'SV2026040600R05',
user_id: 'user-010', merchant_id: MOCK_MERCHANT_ID,
order_status: 6, total_amount: 320.00, product_amount: 320.00,
shipping_fee: 0, paid_amount: 320.00,
shipping_address: '广州市南沙区南沙街707号 何老先生',
remark: '', created_at: '2026-04-06T14:00:00+08:00', updated_at: '2026-04-07T09:00:00+08:00',
items: [{
id: 'item-ref-005-1', order_id: 'order-ref-005', product_id: 'prod-007',
sku_id: '', product_name: '鼻饲营养护理', sku_name: '',
price: 320.00, quantity: 1, image_url: '/static/images/default-product.png', sku_snapshot: ''
}]
}
]
// 最近5条订单供 profile 使用,复用上面 MOCK_ORDERS 前5条数据结构
export type MockProfileOrderType = {
id: string
order_no: string
order_status: number
total_amount: number
created_at: string
items: MockOrderItemType[]
}
export function getMockRecentOrders() : MockProfileOrderType[] {
const result: MockProfileOrderType[] = []
const src = MOCK_ORDERS
const cnt = src.length < 5 ? src.length : 5
for (let i = 0; i < cnt; i++) {
result.push({
id: src[i].id,
order_no: src[i].order_no,
order_status: src[i].order_status,
total_amount: src[i].total_amount,
created_at: src[i].created_at,
items: src[i].items
} as MockProfileOrderType)
}
return result
}
// 订单 tab 计数(由 MOCK_ORDERS 推导,不手写)
export function getMockOrderTabCounts() : { pending: number, inprogress: number, completed: number, total: number } {
let pending = 0, inprogress = 0, completed = 0
for (let i = 0; i < MOCK_ORDERS.length; i++) {
const s = MOCK_ORDERS[i].order_status
if (s === 2) pending++
else if (s === 3) inprogress++
else if (s === 4) completed++
}
return { pending, inprogress, completed, total: MOCK_ORDERS.length }
}
// 售后 tab 计数
export function getMockAftersaleTabCounts() : { refunding: number, refunded: number, total: number } {
let refunding = 0, refunded = 0
for (let i = 0; i < MOCK_AFTERSALE_ORDERS.length; i++) {
const s = MOCK_AFTERSALE_ORDERS[i].order_status
if (s === 0) refunding++
else if (s === 6) refunded++
}
return { refunding, refunded, total: MOCK_AFTERSALE_ORDERS.length }
}
// ════════════════════════════════════════════════════════════
// 三、库存 mock 数据
// ════════════════════════════════════════════════════════════
export type MockInventoryProductType = {
id: string
name: string
main_image_url: string
total_stock: number
warning_stock: number
}
// 12条覆盖正常/低库存/售罄
// 低库存3条stock<=warning_stock且>0售罄2条stock=0
export const MOCK_INVENTORY_PRODUCTS: MockInventoryProductType[] = [
{ id: 'prod-001', name: '居家上门护理(半日)', main_image_url: '/static/images/default-product.png', total_stock: 20, warning_stock: 5 },
{ id: 'prod-002', name: '血压血糖监测服务', main_image_url: '/static/images/default-product.png', total_stock: 30, warning_stock: 8 },
{ id: 'prod-003', name: '慢病随访服务', main_image_url: '/static/images/default-product.png', total_stock: 25, warning_stock: 5 },
{ id: 'prod-004', name: '术后伤口护理', main_image_url: '/static/images/default-product.png', total_stock: 4, warning_stock: 5 }, // 低库存1
{ id: 'prod-005', name: '上门康复护理(月套餐)', main_image_url: '/static/images/default-product.png', total_stock: 8, warning_stock: 10 }, // 低库存2
{ id: 'prod-006', name: '糖尿病足专项护理', main_image_url: '/static/images/default-product.png', total_stock: 3, warning_stock: 5 }, // 低库存3
{ id: 'prod-007', name: '鼻饲营养护理', main_image_url: '/static/images/default-product.png', total_stock: 0, warning_stock: 3 }, // 售罄1
{ id: 'prod-008', name: '术后营养指导4次', main_image_url: '/static/images/default-product.png', total_stock: 0, warning_stock: 3 }, // 售罄2
{ id: 'prod-009', name: '中医调理推拿3次', main_image_url: '/static/images/default-product.png', total_stock: 15, warning_stock: 5 },
{ id: 'prod-010', name: '老年心理疏导服务', main_image_url: '/static/images/default-product.png', total_stock: 18, warning_stock: 5 },
{ id: 'prod-011', name: '居家药品管理服务', main_image_url: '/static/images/default-product.png', total_stock: 22, warning_stock: 5 },
{ id: 'prod-012', name: '紧急呼叫响应服务', main_image_url: '/static/images/default-product.png', total_stock: 50, warning_stock: 10 }
]
// 从 mock 推导 stats与页面 loadStats 逻辑完全一致)
export function getMockInventoryStats() : { totalProducts: number, lowStock: number, outOfStock: number } {
let total = 0, low = 0, out = 0
for (let i = 0; i < MOCK_INVENTORY_PRODUCTS.length; i++) {
const p = MOCK_INVENTORY_PRODUCTS[i]
total++
if (p.total_stock === 0) out++
else if (p.total_stock <= p.warning_stock) low++
}
return { totalProducts: total, lowStock: low, outOfStock: out }
}
// ════════════════════════════════════════════════════════════
// 四、评价 mock 数据
// ════════════════════════════════════════════════════════════
export type MockReviewType = {
id: string
product_id: string
product_name: string
user_id: string
user_name: string
user_avatar: string
rating: number
content: string
images: string // JSON 字符串数组,与 parseImages() 兼容
reply: string
created_at: string
}
// 10条4条待回复reply=''6条已回复reply非空
// PENDING_REVIEW_COUNT = 4 与此处一致
export const MOCK_REVIEWS: MockReviewType[] = [
// ── 待回复 4 条 ──
{
id: 'review-001', product_id: 'prod-001', product_name: '居家上门护理(半日)',
user_id: 'user-001', user_name: '李*敏', user_avatar: '',
rating: 5, content: '护士非常专业,老人很配合,感谢!态度好服务细心,以后还会预约。',
images: '[]', reply: '', created_at: '2026-04-13T11:00:00+08:00'
},
{
id: 'review-002', product_id: 'prod-005', product_name: '上门康复护理(月套餐)',
user_id: 'user-006', user_name: '赵*强', user_avatar: '',
rating: 4, content: '康复师技术不错,父亲恢复得挺好,就是希望每次时长能再长一点。',
images: '[]', reply: '', created_at: '2026-04-12T16:00:00+08:00'
},
{
id: 'review-003', product_id: 'prod-002', product_name: '血压血糖监测服务',
user_id: 'user-007', user_name: '孙*华', user_avatar: '',
rating: 5, content: '每次都准时上门,测量数据详细,还会给我们讲解注意事项,非常满意。',
images: '[]', reply: '', created_at: '2026-04-11T09:30:00+08:00'
},
{
id: 'review-004', product_id: 'prod-009', product_name: '中医调理推拿3次',
user_id: 'user-002', user_name: '张*国', user_avatar: '',
rating: 4, content: '推拿师手法到位,推完肩颈轻松很多,就是预约时间有点难排。',
images: '[]', reply: '', created_at: '2026-04-10T14:00:00+08:00'
},
// ── 已回复 6 条 ──
{
id: 'review-005', product_id: 'prod-004', product_name: '术后伤口护理',
user_id: 'user-003', user_name: '王*兰', user_avatar: '',
rating: 5, content: '术后第一次用这个服务,护士很专业,换药很痛但很快,恢复良好。',
images: '[]', reply: '感谢您的信任!我们护理团队会继续为您提供专业服务,祝恢复顺利!',
created_at: '2026-04-09T10:00:00+08:00'
},
{
id: 'review-006', product_id: 'prod-006', product_name: '糖尿病足专项护理',
user_id: 'user-005', user_name: '刘*珍', user_avatar: '',
rating: 5, content: '护士很有耐心,每次都会叮嘱注意事项,妈妈的伤口恢复得很好。',
images: '["\/static\/images\/default-product.png"]',
reply: '您好!感谢反馈,糖尿病足护理需要长期坚持,我们会持续陪伴您和家人。',
created_at: '2026-04-08T11:00:00+08:00'
},
{
id: 'review-007', product_id: 'prod-008', product_name: '术后营养指导4次',
user_id: 'user-009', user_name: '吴*秀', user_avatar: '',
rating: 5, content: '营养师给出的饮食方案很合理,家人按方案调整饮食后状态好多了!',
images: '[]', reply: '谢谢您的认可!合理饮食是术后恢复的关键,有任何问题随时联系我们。',
created_at: '2026-04-07T09:00:00+08:00'
},
{
id: 'review-008', product_id: 'prod-003', product_name: '慢病随访服务',
user_id: 'user-008', user_name: '郑*明', user_avatar: '',
rating: 4, content: '随访很规律,每次记录都很详细,给老人建立了完整的健康档案。',
images: '[]', reply: '感谢您的评价!定期随访是管理慢性病的重要手段,我们会继续做好记录工作。',
created_at: '2026-04-06T14:00:00+08:00'
},
{
id: 'review-009', product_id: 'prod-007', product_name: '鼻饲营养护理',
user_id: 'user-011', user_name: '冯*莲', user_avatar: '',
rating: 5, content: '护士操作非常规范,每次来都会检查设备是否正常,很放心。',
images: '[]', reply: '您好!鼻饲护理需要严格操作规范,感谢您的信任,我们会坚持做好每一次服务。',
created_at: '2026-04-05T10:00:00+08:00'
},
{
id: 'review-010', product_id: 'prod-001', product_name: '居家上门护理(半日)',
user_id: 'user-012', user_name: '蒋*华', user_avatar: '',
rating: 5, content: '服务很贴心,护士会提前电话确认时间,上门也十分准时,赞!',
images: '[]', reply: '感谢您的五星好评!准时守约是我们的基本承诺,期待下次继续为您服务。',
created_at: '2026-04-04T15:00:00+08:00'
}
]
// filter 逻辑(与页面 currentFilter 对齐)
export function getMockReviews(filter: string) : MockReviewType[] {
if (filter === 'pending') {
const result: MockReviewType[] = []
for (let i = 0; i < MOCK_REVIEWS.length; i++) {
if (MOCK_REVIEWS[i].reply === '') result.push(MOCK_REVIEWS[i])
}
return result
}
if (filter === 'replied') {
const result: MockReviewType[] = []
for (let i = 0; i < MOCK_REVIEWS.length; i++) {
if (MOCK_REVIEWS[i].reply !== '') result.push(MOCK_REVIEWS[i])
}
return result
}
return MOCK_REVIEWS
}
// ════════════════════════════════════════════════════════════
// 五、统计 mock 数据
// ════════════════════════════════════════════════════════════
export type MockTrendItemType = {
day: string
amount: number
}
// 趋势数据today/week/month 三档
export const MOCK_TREND_TODAY: MockTrendItemType[] = [
{ day: '08时', amount: 260 }, { day: '09时', amount: 380 },
{ day: '10时', amount: 520 }, { day: '11时', amount: 180 },
{ day: '14时', amount: 350 }, { day: '15时', amount: 430 },
{ day: '16时', amount: 220 }
]
export const MOCK_TREND_WEEK: MockTrendItemType[] = [
{ day: '周一', amount: 680 }, { day: '周二', amount: 1200 },
{ day: '周三', amount: 980 }, { day: '周四', amount: 1560 },
{ day: '周五', amount: 2340 }, { day: '周六', amount: 800 },
{ day: '周日', amount: 420 }
]
export const MOCK_TREND_MONTH: MockTrendItemType[] = [
{ day: '4/1', amount: 2100 }, { day: '4/2', amount: 1800 },
{ day: '4/3', amount: 2680 }, { day: '4/4', amount: 3200 },
{ day: '4/5', amount: 1950 }, { day: '4/6', amount: 2460 },
{ day: '4/7', amount: 980 }
]
// 热门服务ID与inventory对齐由orders中统计派生
export type MockStatProductType = {
id: string
name: string
image: string
sales: number
revenue: number
}
export const MOCK_HOT_PRODUCTS: MockStatProductType[] = [
{ id: 'prod-005', name: '上门康复护理(月套餐)', image: '/static/images/default-product.png', sales: 38, revenue: 45600 },
{ id: 'prod-001', name: '居家上门护理(半日)', image: '/static/images/default-product.png', sales: 52, revenue: 19760 },
{ id: 'prod-002', name: '血压血糖监测服务', image: '/static/images/default-product.png', sales: 67, revenue: 12060 },
{ id: 'prod-004', name: '术后伤口护理', image: '/static/images/default-product.png', sales: 29, revenue: 13920 },
{ id: 'prod-009', name: '中医调理推拿3次', image: '/static/images/default-product.png', sales: 24, revenue: 10320 }
]
// 统计概览today/week/month 三档)
export function getMockStats(range: string) : { todaySales: string, todayOrders: number, todayVisitors: number, conversionRate: number } {
if (range === 'today') {
return { todaySales: '2340.00', todayOrders: 7, todayVisitors: 42, conversionRate: 17 }
}
if (range === 'week') {
return { todaySales: '7980.00', todayOrders: 28, todayVisitors: 165, conversionRate: 17 }
}
// month
return { todaySales: '31250.00', todayOrders: 98, todayVisitors: 620, conversionRate: 16 }
}
export function getMockTrendData(range: string) : MockTrendItemType[] {
if (range === 'today') return MOCK_TREND_TODAY
if (range === 'week') return MOCK_TREND_WEEK
return MOCK_TREND_MONTH
}
// ════════════════════════════════════════════════════════════
// 六、结算 mock 数据
// ════════════════════════════════════════════════════════════
export type MockRecordType = {
id: string
title: string
amount: number
type: string // 'order'=收支记录, 'withdraw'=结算/补贴记录
created_at: string
}
export const MOCK_BALANCE = '12680.50'
export const MOCK_FINANCE_STATS = {
todayRevenue: '2340.00',
monthRevenue: '31250.00',
pendingWithdraw: '4200.00'
}
export const MOCK_FINANCE_RECORDS: MockRecordType[] = [
// ── type=order 收支记录 ──
{ id: 'rec-001', title: '订单收入 SV2026041300001', amount: 380.00, type: 'order', created_at: '2026-04-13T08:20:00+08:00' },
{ id: 'rec-002', title: '订单收入 SV2026041300002', amount: 260.00, type: 'order', created_at: '2026-04-13T09:35:00+08:00' },
{ id: 'rec-003', title: '订单收入 SV2026041300003', amount: 520.00, type: 'order', created_at: '2026-04-13T10:05:00+08:00' },
{ id: 'rec-004', title: '退款扣减 SV2026041300R01', amount: -380.00, type: 'order', created_at: '2026-04-13T07:35:00+08:00' },
{ id: 'rec-005', title: '退款扣减 SV2026041200R02', amount: -180.00, type: 'order', created_at: '2026-04-12T16:15:00+08:00' },
{ id: 'rec-006', title: '订单收入 SV2026041200004', amount: 1200.00, type: 'order', created_at: '2026-04-12T14:05:00+08:00' },
{ id: 'rec-007', title: '订单收入 SV2026041200005', amount: 450.00, type: 'order', created_at: '2026-04-12T09:05:00+08:00' },
{ id: 'rec-008', title: '订单收入 SV2026041100006', amount: 680.00, type: 'order', created_at: '2026-04-11T10:35:00+08:00' },
// ── type=withdraw 结算/补贴记录 ──
{ id: 'rec-009', title: '长者关怀补贴拨付', amount: 2000.00, type: 'withdraw', created_at: '2026-04-10T09:00:00+08:00' },
{ id: 'rec-010', title: '月度服务结算', amount: 8600.00, type: 'withdraw', created_at: '2026-04-01T10:00:00+08:00' },
{ id: 'rec-011', title: '医保结算入账', amount: 3200.00, type: 'withdraw', created_at: '2026-03-28T14:00:00+08:00' },
{ id: 'rec-012', title: '申请提现', amount: -5000.00, type: 'withdraw', created_at: '2026-03-25T09:00:00+08:00' },
{ id: 'rec-013', title: '医保结算入账', amount: 2800.00, type: 'withdraw', created_at: '2026-03-15T10:00:00+08:00' }
]
// tab 过滤record 或 withdraw
export function getMockFinanceRecords(tab: string) : MockRecordType[] {
if (tab === 'record') {
const result: MockRecordType[] = []
for (let i = 0; i < MOCK_FINANCE_RECORDS.length; i++) {
if (MOCK_FINANCE_RECORDS[i].type === 'order') result.push(MOCK_FINANCE_RECORDS[i])
}
return result
}
if (tab === 'withdraw') {
const result: MockRecordType[] = []
for (let i = 0; i < MOCK_FINANCE_RECORDS.length; i++) {
if (MOCK_FINANCE_RECORDS[i].type === 'withdraw') result.push(MOCK_FINANCE_RECORDS[i])
}
return result
}
return MOCK_FINANCE_RECORDS
}
// ════════════════════════════════════════════════════════════
// 七、促销活动 mock 数据
// ════════════════════════════════════════════════════════════
export type MockPromotionType = {
id: string
name: string
type: string // 'coupon' | 'seckill' | 'group'(与 tab 对应)
discount_text: string
start_time: string
end_time: string
status: number // 0=未开始, 1=进行中, 2=已结束
received_count: number
}
export const MOCK_PROMOTIONS: MockPromotionType[] = [
// ── coupon 护理套餐券 ──
{ id: 'promo-001', name: '居家护理体验满减券', type: 'coupon', discount_text: '满300减50', start_time: '2026-04-01T00:00:00+08:00', end_time: '2026-04-30T23:59:59+08:00', status: 1, received_count: 42 },
{ id: 'promo-002', name: '康复护理月套餐优惠券', type: 'coupon', discount_text: '满1000减120', start_time: '2026-04-10T00:00:00+08:00', end_time: '2026-05-10T23:59:59+08:00', status: 1, received_count: 18 },
{ id: 'promo-003', name: '护理新人首单优惠', type: 'coupon', discount_text: '首单立减80元', start_time: '2026-03-01T00:00:00+08:00', end_time: '2026-03-31T23:59:59+08:00', status: 2, received_count: 156 },
// ── seckill 康复体验 ──
{ id: 'promo-004', name: '上门康复体验特惠', type: 'seckill', discount_text: '原价380限时198', start_time: '2026-04-13T10:00:00+08:00', end_time: '2026-04-13T22:00:00+08:00', status: 1, received_count: 7 },
{ id: 'promo-005', name: '血压血糖检测体验价', type: 'seckill', discount_text: '9.9元体验', start_time: '2026-04-15T09:00:00+08:00', end_time: '2026-04-15T18:00:00+08:00', status: 0, received_count: 0 },
{ id: 'promo-006', name: '长者推拿体验', type: 'seckill', discount_text: '原价150体验价59', start_time: '2026-03-20T09:00:00+08:00', end_time: '2026-03-20T20:00:00+08:00', status: 2, received_count: 23 },
// ── group 慢病管理服务包 ──
{ id: 'promo-007', name: '高血压慢病三人拼团包', type: 'group', discount_text: '3人拼团享8.5折', start_time: '2026-04-05T00:00:00+08:00', end_time: '2026-04-20T23:59:59+08:00', status: 1, received_count: 9 },
{ id: 'promo-008', name: '糖尿病管理服务季包', type: 'group', discount_text: '2人拼团9折', start_time: '2026-04-20T00:00:00+08:00', end_time: '2026-05-20T23:59:59+08:00', status: 0, received_count: 0 },
{ id: 'promo-009', name: '慢病管理年度健康计划', type: 'group', discount_text: '3人拼团享7折', start_time: '2026-02-01T00:00:00+08:00', end_time: '2026-03-31T23:59:59+08:00', status: 2, received_count: 34 }
]
// tab 过滤(与 currentTab 对应)
export function getMockPromotions(tab: string) : MockPromotionType[] {
const result: MockPromotionType[] = []
for (let i = 0; i < MOCK_PROMOTIONS.length; i++) {
if (MOCK_PROMOTIONS[i].type === tab) result.push(MOCK_PROMOTIONS[i])
}
return result
}
// 订单筛选(供 orders.uvue 使用)
export function getMockOrdersByStatus(status: number) : MockOrderType[] {
if (status === -2) return MOCK_ORDERS // 全部
const result: MockOrderType[] = []
for (let i = 0; i < MOCK_ORDERS.length; i++) {
if (MOCK_ORDERS[i].order_status === status) result.push(MOCK_ORDERS[i])
}
return result
}
export function getMockAftersaleByStatus(status: number) : MockOrderType[] {
if (status === -3) return MOCK_AFTERSALE_ORDERS // 全部售后
const result: MockOrderType[] = []
for (let i = 0; i < MOCK_AFTERSALE_ORDERS.length; i++) {
if (MOCK_AFTERSALE_ORDERS[i].order_status === status) result.push(MOCK_AFTERSALE_ORDERS[i])
}
return result
}
// ════════════════════════════════════════════════════════════
// 八、关怀等级 & 服务对象 mock 数据
// ════════════════════════════════════════════════════════════
export type MockMemberLevelType = {
id: string
name: string
discount_rate: number
level_rank: number
}
export type MockUserInfoType = {
id: string
username: string
email: string
nickname: string | null
avatar_url: string | null
phone: string | null
tier_id: string | null
tier_name: string | null
}
// 关怀等级 4 档
export const MOCK_MEMBER_LEVELS: MockMemberLevelType[] = [
{ id: 'level-001', name: '普通关怀', discount_rate: 1.0, level_rank: 1 },
{ id: 'level-002', name: '银发关怀', discount_rate: 0.95, level_rank: 2 },
{ id: 'level-003', name: '金牌关怀', discount_rate: 0.90, level_rank: 3 },
{ id: 'level-004', name: '白金尊享', discount_rate: 0.85, level_rank: 4 }
]
// 服务对象 12 人4 人有等级tier_id 非空8 人暂无等级
// tier_name 通过 tier_id 与 MOCK_MEMBER_LEVELS 对应
export const MOCK_SERVICE_USERS: MockUserInfoType[] = [
// ── 已设置关怀等级 4 人(排在前面) ──
{
id: 'user-001', username: 'li_min',
email: 'limin@example.com',
nickname: '李敏奶奶',
avatar_url: '',
phone: '13800000001',
tier_id: 'level-004',
tier_name: '白金尊享'
},
{
id: 'user-004', username: 'chen_lao',
email: '',
nickname: '陈伯伯',
avatar_url: '',
phone: '13800000004',
tier_id: 'level-003',
tier_name: '金牌关怀'
},
{
id: 'user-005', username: 'liu_zhen',
email: '',
nickname: '刘珍阿姨',
avatar_url: '',
phone: '13800000005',
tier_id: 'level-002',
tier_name: '银发关怀'
},
{
id: 'user-006', username: 'zhao_qiang',
email: 'zhaoqiang@example.com',
nickname: '赵强大伯',
avatar_url: '',
phone: '13800000006',
tier_id: 'level-001',
tier_name: '普通关怀'
},
// ── 未设置关怀等级 8 人 ──
{
id: 'user-002', username: 'zhang_guo',
email: '',
nickname: '张国爷爷',
avatar_url: '',
phone: '13800000002',
tier_id: null,
tier_name: null
},
{
id: 'user-003', username: 'wang_lan',
email: '',
nickname: '王兰阿姨',
avatar_url: '',
phone: '13800000003',
tier_id: null,
tier_name: null
},
{
id: 'user-007', username: 'sun_hua',
email: 'sunhua@example.com',
nickname: '孙华叔叔',
avatar_url: '',
phone: '13800000007',
tier_id: null,
tier_name: null
},
{
id: 'user-008', username: 'zheng_ming',
email: '',
nickname: '郑明爷爷',
avatar_url: '',
phone: '13800000008',
tier_id: null,
tier_name: null
},
{
id: 'user-009', username: 'wu_xiu',
email: '',
nickname: '吴秀奶奶',
avatar_url: '',
phone: '13800000009',
tier_id: null,
tier_name: null
},
{
id: 'user-010', username: 'he_lao',
email: '',
nickname: '何老先生',
avatar_url: '',
phone: '13800000010',
tier_id: null,
tier_name: null
},
{
id: 'user-011', username: 'feng_lian',
email: '',
nickname: '冯莲奶奶',
avatar_url: '',
phone: '13800000011',
tier_id: null,
tier_name: null
},
{
id: 'user-012', username: 'jiang_hua',
email: '',
nickname: '蒋华大伯',
avatar_url: '',
phone: '13800000012',
tier_id: null,
tier_name: null
}
]